123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- using System;
- using AssetBank.Editor.SchemaConverter.Data.Output;
- using AssetBank.Editor.Tools;
- using AssetBank.Settings;
- using System.Diagnostics;
- using System.IO;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- using NUnit.Framework;
- using UnityEditor;
- using UnityEngine;
- using Debug = UnityEngine.Debug;
- namespace AssetBank.Editor.SchemaConverter.Tests
- {
- [TestFixture]
- public class SchemaConverterTests
- {
- private const string SampleScenePath = "Assets/Scenes/SampleScene.unity";
- private string _tempDirectory;
- private string _rawJsonPath;
- private string _trimmedJsonPath;
- private string _hierarchyJsonPath;
- private string _hierarchyAndPrefabsJsonPath;
- private string _fullGraphJsonPath;
- [SetUp]
- public void SetUp()
- {
- _tempDirectory = Path.Combine("Library", "SchemaConverterTestTemp");
- Directory.CreateDirectory(_tempDirectory);
- _rawJsonPath = Path.Combine(_tempDirectory, "raw_scene.json");
- _trimmedJsonPath = Path.Combine(_tempDirectory, "trimmed_scene.json");
- _hierarchyJsonPath = Path.Combine(_tempDirectory, "hierarchy_only.json");
- _hierarchyAndPrefabsJsonPath = Path.Combine(_tempDirectory, "hierarchy_and_prefabs.json");
- _fullGraphJsonPath = Path.Combine(_tempDirectory, "full_graph.json");
- }
- [TearDown]
- public void TearDown()
- {
- if (Directory.Exists(_tempDirectory))
- {
- Directory.Delete(_tempDirectory, true);
- }
- }
- [Test, Order(1)]
- public void CanConvertSceneToRawJson()
- {
- var pythonExe = FindPythonExecutable();
- var conversionScript = GetConversionScriptPath();
-
- Assert.IsNotNull(pythonExe, "Python executable not found.");
- Assert.IsNotNull(conversionScript, "Conversion script 'convert_scene.py' not found.");
- var success = ExecutePythonConversion(SampleScenePath, _rawJsonPath, pythonExe, conversionScript);
-
- Assert.IsTrue(success, "Python conversion script failed to execute.");
- Assert.IsTrue(File.Exists(_rawJsonPath), "Raw JSON file was not created.");
- Assert.Greater(new FileInfo(_rawJsonPath).Length, 0, "Raw JSON file is empty.");
-
- Debug.Log($"Successfully created raw JSON at: {_rawJsonPath}");
- }
- [Test, Order(2)]
- public void CanTrimRawJson()
- {
- // Ensure the first step has run and created the file.
- if (!File.Exists(_rawJsonPath))
- {
- CanConvertSceneToRawJson();
- }
- Assert.IsTrue(File.Exists(_rawJsonPath), "Prerequisite step 'CanConvertSceneToRawJson' failed to produce an output file.");
- var rawJson = File.ReadAllText(_rawJsonPath);
- var settings = ProjectExporterSettings.GetOrCreateSettings();
-
- var trimmedJson = JsonDataTrimmer.Process(rawJson, settings);
-
- File.WriteAllText(_trimmedJsonPath, trimmedJson);
-
- Assert.IsTrue(File.Exists(_trimmedJsonPath), "Trimmed JSON file was not created.");
- Assert.Greater(new FileInfo(_trimmedJsonPath).Length, 0, "Trimmed JSON file is empty.");
-
- Debug.Log($"Successfully created trimmed JSON at: {_trimmedJsonPath}");
- }
- [Test, Order(3)]
- public void CanProcessHierarchyOnly()
- {
- // Ensure the prerequisite step has run.
- if (!File.Exists(_trimmedJsonPath))
- {
- CanTrimRawJson();
- }
- Assert.IsTrue(File.Exists(_trimmedJsonPath), "Prerequisite step 'CanTrimRawJson' failed to produce an output file.");
-
- var trimmedJson = File.ReadAllText(_trimmedJsonPath);
-
- // Run the conversion but only use the hierarchy part of the result.
- var sceneGraph = JsonSchemaConverter.ConvertToSceneGraph(trimmedJson);
- var hierarchyJson = JsonConvert.SerializeObject(sceneGraph.hierarchy, Formatting.Indented);
-
- File.WriteAllText(_hierarchyJsonPath, hierarchyJson);
-
- Assert.IsTrue(File.Exists(_hierarchyJsonPath), "Hierarchy-only JSON file was not created.");
- Assert.Greater(new FileInfo(_hierarchyJsonPath).Length, 2, "Hierarchy-only JSON file is empty (should be at least '[]').");
-
- Debug.Log($"Successfully created hierarchy-only JSON at: {_hierarchyJsonPath}");
- }
- [Test, Order(4)]
- public void CanProcessHierarchyAndPrefabs()
- {
- // Ensure the prerequisite step has run.
- if (!File.Exists(_trimmedJsonPath))
- {
- CanTrimRawJson();
- }
- Assert.IsTrue(File.Exists(_trimmedJsonPath), "Prerequisite step 'CanTrimRawJson' failed to produce an output file.");
-
- var trimmedJson = File.ReadAllText(_trimmedJsonPath);
-
- // Run the conversion and serialize the hierarchy and prefabs sections.
- var sceneGraph = JsonSchemaConverter.ConvertToSceneGraph(trimmedJson);
- var result = new JObject
- {
- ["hierarchy"] = JToken.FromObject(sceneGraph.hierarchy),
- ["prefabs"] = JToken.FromObject(sceneGraph.prefabs)
- };
- var outputJson = result.ToString(Formatting.Indented);
-
- File.WriteAllText(_hierarchyAndPrefabsJsonPath, outputJson);
-
- Assert.IsTrue(File.Exists(_hierarchyAndPrefabsJsonPath), "Hierarchy and prefabs JSON file was not created.");
- Assert.Greater(new FileInfo(_hierarchyAndPrefabsJsonPath).Length, 2, "Hierarchy and prefabs JSON file is empty.");
-
- Debug.Log($"Successfully created hierarchy and prefabs JSON at: {_hierarchyAndPrefabsJsonPath}");
- }
- [Test, Order(5)]
- public void CanProcessFullGraphSuccessfully()
- {
- // Ensure the prerequisite step has run.
- if (!File.Exists(_trimmedJsonPath))
- {
- CanTrimRawJson();
- }
- Assert.IsTrue(File.Exists(_trimmedJsonPath), "Prerequisite step 'CanTrimRawJson' failed to produce an output file.");
-
- var trimmedJson = File.ReadAllText(_trimmedJsonPath);
- // This test now asserts that the conversion completes WITHOUT throwing an exception.
- string finalJson = null;
- Assert.DoesNotThrow(() =>
- {
- finalJson = JsonSchemaConverter.Convert(trimmedJson);
- }, "The conversion process threw an unexpected exception.");
- File.WriteAllText(_fullGraphJsonPath, finalJson);
-
- Assert.IsTrue(File.Exists(_fullGraphJsonPath), "Full graph JSON file was not created.");
- Assert.Greater(new FileInfo(_fullGraphJsonPath).Length, 2, "Full graph JSON file is empty.");
-
- // A good final check is to ensure no warnings were generated.
- var sceneGraph = JsonConvert.DeserializeObject<SceneGraph>(finalJson);
- Assert.IsNull(sceneGraph.metadata.warnings, "The conversion generated unexpected warnings.");
-
- Debug.Log($"Successfully created full graph JSON at: {_fullGraphJsonPath}");
- }
-
- #region Helper Methods
- private string FindPythonExecutable()
- {
- var projectRoot = Path.GetDirectoryName(Application.dataPath);
- var venvPath = Path.Combine(projectRoot, "venv", "bin", "python3");
- if (File.Exists(venvPath)) return venvPath;
-
- venvPath = Path.Combine(projectRoot, "venv", "bin", "python");
- if (File.Exists(venvPath)) return venvPath;
- // Fallback for system python
- return "python3";
- }
- private string GetConversionScriptPath()
- {
- var guids = AssetDatabase.FindAssets("convert_scene");
- if (guids.Length == 0) return null;
-
- var projectRoot = Path.GetDirectoryName(Application.dataPath);
- return Path.Combine(projectRoot, AssetDatabase.GUIDToAssetPath(guids[0]));
- }
- private bool ExecutePythonConversion(string assetPath, string jsonOutputPath, string pythonExe, string scriptPath)
- {
- var projectRoot = Path.GetDirectoryName(Application.dataPath);
- var absoluteAssetPath = Path.Combine(projectRoot, assetPath);
- var arguments = $"\"{scriptPath}\" \"{absoluteAssetPath}\" \"{jsonOutputPath}\"";
- var process = new Process
- {
- StartInfo = new ProcessStartInfo
- {
- FileName = pythonExe,
- Arguments = arguments,
- RedirectStandardOutput = true,
- RedirectStandardError = true,
- UseShellExecute = false,
- CreateNoWindow = true
- }
- };
- process.Start();
- string error = process.StandardError.ReadToEnd();
- process.WaitForExit();
- if (process.ExitCode == 0) return true;
- Debug.LogError($"Failed to convert {assetPath}. Error: {error}");
- return false;
- }
-
- #endregion
- }
- }
|