Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Assets/Tests/Demo/uLoopMCP.Tests.Demo.asmdef
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
"GUID:c956a21f824994ef087b6de566690b3d",
"GUID:4307f53044263cf4b835bd812fc161a4"
],
"includePlatforms": [
"Editor"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"autoReferenced": false,
"defineConstraints": [
"UNITY_INCLUDE_TESTS"
],
"versionDefines": [
{
"name": "com.unity.inputsystem",
Expand Down
103 changes: 103 additions & 0 deletions Assets/Tests/Editor/InputVisualizationCanvasPrefabTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#nullable enable
using System;
using System.IO;
using Newtonsoft.Json.Linq;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;

namespace io.github.hatayama.uLoopMCP
{
/// <summary>
/// Verifies that the shared input visualization prefab keeps attachable overlay components.
/// </summary>
public sealed class InputVisualizationCanvasPrefabTests
{
private const string PrefabPath =
"Packages/io.github.hatayama.uloopmcp/Runtime/Common/InputVisualizationCanvas.prefab";
private const string RuntimeAssemblyDefinitionPath =
"Packages/src/Runtime/uLoopMCP.Runtime.asmdef";
private const string SimulateMouseInputOverlayPrefabPath =
"Packages/src/Runtime/SimulateMouseInput/SimulateMouseInputOverlay.prefab";
private const string DemoMouseInputOverlayTesterMetaPath =
"Assets/Tests/Demo/DemoMouseInputOverlayTester.cs.meta";

[Test]
public void RuntimeAssemblyDefinition_WhenScanned_IsPrefabAttachableAndNotAutoReferenced()
{
// The runtime assembly must stay attachable for prefab scripts while avoiding implicit user assembly references.
JObject asmdef = JObject.Parse(ReadProjectText(RuntimeAssemblyDefinitionPath));
JToken? includePlatformsToken = asmdef["includePlatforms"];

Assert.That(includePlatformsToken, Is.Not.Null);
Assert.That(includePlatformsToken!.Type, Is.EqualTo(JTokenType.Array));
Assert.That(includePlatformsToken.HasValues, Is.False);
Assert.That(asmdef["autoReferenced"]?.Value<bool>(), Is.False);
}

[Test]
public void InputVisualizationCanvasPrefab_WhenInstantiated_HasOverlayReferences()
{
// Instantiation proves Unity can resolve the prefab scripts after import, not only in raw YAML.
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(PrefabPath);

Assert.That(prefab, Is.Not.Null);

UnityEngine.Object instantiatedObject = PrefabUtility.InstantiatePrefab(prefab);
Assert.That(instantiatedObject, Is.TypeOf<GameObject>());

GameObject instance = (GameObject)instantiatedObject;
try
{
InputVisualizationCanvas canvas = instance.GetComponent<InputVisualizationCanvas>();

Assert.That(canvas, Is.Not.Null);
Assert.That(canvas.KeyboardOverlay, Is.Not.Null);
Assert.That(canvas.MouseUiOverlay, Is.Not.Null);
Assert.That(canvas.MouseInputOverlay, Is.Not.Null);
Assert.That(canvas.RecordInputOverlayPresenter, Is.Not.Null);
Assert.That(canvas.ReplayInputOverlay, Is.Not.Null);
}
finally
{
UnityEngine.Object.DestroyImmediate(instance);
}
}

[Test]
public void SimulateMouseInputOverlayPrefab_WhenSerialized_DoesNotReferenceDemoTester()
{
// Package prefabs cannot reference demo/test scripts because consumers import only Packages/src.
string prefabText = ReadProjectText(SimulateMouseInputOverlayPrefabPath);
string demoTesterGuid = ReadMetaGuid(DemoMouseInputOverlayTesterMetaPath);

Assert.That(prefabText, Does.Not.Contain(demoTesterGuid));
}

private static string ReadProjectText(string relativePath)
{
string projectRoot = Path.GetFullPath(Path.Combine(Application.dataPath, ".."));
string absolutePath = Path.Combine(projectRoot, relativePath);

return File.ReadAllText(absolutePath);
}

private static string ReadMetaGuid(string relativePath)
{
string[] lines = ReadProjectText(relativePath).Split('\n');
const string Prefix = "guid: ";

for (int i = 0; i < lines.Length; i++)
{
string line = lines[i].Trim();
if (line.StartsWith(Prefix, StringComparison.Ordinal))
{
return line.Substring(Prefix.Length).Trim();
}
}

Assert.Fail("Meta file must contain a guid line");
return string.Empty;
}
}
}
11 changes: 11 additions & 0 deletions Assets/Tests/Editor/InputVisualizationCanvasPrefabTests.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

47 changes: 47 additions & 0 deletions Assets/Tests/Editor/RuntimeAssemblyBuildFilterTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using NUnit.Framework;
using UnityEditor;

namespace io.github.hatayama.uLoopMCP
{
/// <summary>
/// Verifies that the Player build callback removes only the prefab-only runtime assembly.
/// </summary>
public sealed class RuntimeAssemblyBuildFilterTests
{
[Test]
public void OnFilterAssemblies_WhenRuntimeAssemblyIsPresent_RemovesOnlyRuntimeAssembly()
{
RuntimeAssemblyBuildFilter filter = new RuntimeAssemblyBuildFilter();
string[] assemblies =
{
"/build/Managed/Assembly-CSharp.dll",
"/build/Managed/uLoopMCP.Runtime.dll",
"/build/Managed/UnityEngine.CoreModule.dll"
};

string[] filteredAssemblies = filter.OnFilterAssemblies(BuildOptions.None, assemblies);

Assert.That(filteredAssemblies, Is.EqualTo(new[]
{
"/build/Managed/Assembly-CSharp.dll",
"/build/Managed/UnityEngine.CoreModule.dll"
}));
}

[Test]
public void OnFilterAssemblies_WhenTestAssembliesAreIncluded_KeepsRuntimeAssembly()
{
RuntimeAssemblyBuildFilter filter = new RuntimeAssemblyBuildFilter();
string[] assemblies =
{
"/build/Managed/Assembly-CSharp.dll",
"/build/Managed/uLoopMCP.Runtime.dll",
"/build/Managed/uLoopMCP.Tests.PlayMode.dll"
};

string[] filteredAssemblies = filter.OnFilterAssemblies(BuildOptions.IncludeTestAssemblies, assemblies);

Assert.That(filteredAssemblies, Is.EqualTo(assemblies));
}
}
}
11 changes: 11 additions & 0 deletions Assets/Tests/Editor/RuntimeAssemblyBuildFilterTests.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Assets/Tests/Editor/uLoopMCP.Tests.Editor.asmdef
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"GUID:27619889b8ba8c24980f49ee34dbb44a",
"GUID:332048ead1ebf4658b9961338e5d68c3",
"GUID:290394860909340b7835eb7cc215ee75",
"GUID:c956a21f824994ef087b6de566690b3d",
"uLoopMCP.Editor.MetadataValidation"
],
"includePlatforms": [
Expand Down
Loading
Loading