using System.Collections.Generic; using System.IO; using NUnit.Framework; using Amanotes.Core; using UnityEngine; namespace Amanotes.AmaDev.Tests { [TestFixture] internal class AmaDevSettingsTests { private const string TestCscPath = "Assets/csc.rsp"; private string originalCscContent; private bool cscExisted; private AmaDevSettings settings; [SetUp] public void SetUp() { cscExisted = File.Exists(TestCscPath); originalCscContent = cscExisted ? File.ReadAllText(TestCscPath) : null; settings = ScriptableObject.CreateInstance(); } [TearDown] public void TearDown() { if (settings != null) { try { Object.DestroyImmediate(settings); } catch (System.Exception) { } settings = null; } if (cscExisted) File.WriteAllText(TestCscPath, originalCscContent); else if (File.Exists(TestCscPath)) File.Delete(TestCscPath); } [Test] public void ParseCscRspSymbols_EmptyFile_ReturnsEmptySet() { File.WriteAllText(TestCscPath, ""); var result = AmaDevSettings.ParseCscRspSymbols(); Assert.AreEqual(0, result.Count); } [Test] public void ParseCscRspSymbols_SingleDefine_ParsesCorrectly() { File.WriteAllText(TestCscPath, "-define:MY_SYMBOL"); var result = AmaDevSettings.ParseCscRspSymbols(); Assert.AreEqual(1, result.Count); Assert.IsTrue(result.Contains("MY_SYMBOL")); } [Test] public void ParseCscRspSymbols_MultipleDefines_ParsesAll() { File.WriteAllText(TestCscPath, "-define:SYM_A;SYM_B;SYM_C"); var result = AmaDevSettings.ParseCscRspSymbols(); Assert.AreEqual(3, result.Count); Assert.IsTrue(result.Contains("SYM_A")); Assert.IsTrue(result.Contains("SYM_B")); Assert.IsTrue(result.Contains("SYM_C")); } [Test] public void ParseCscRspSymbols_NonDefineLines_Ignored() { File.WriteAllText(TestCscPath, "-nowarn:0169\n-define:REAL_SYM\n-unsafe"); var result = AmaDevSettings.ParseCscRspSymbols(); Assert.AreEqual(1, result.Count); Assert.IsTrue(result.Contains("REAL_SYM")); } [Test] public void ParseCscRspSymbols_FileDoesNotExist_ReturnsEmptySet() { if (File.Exists(TestCscPath)) File.Delete(TestCscPath); var result = AmaDevSettings.ParseCscRspSymbols(); Assert.AreEqual(0, result.Count); } [Test] public void GatherExpectedSymbols_OnlyEnabledSymbols_Collected() { settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "ENABLED", enabled = true }); settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "DISABLED", enabled = false }); var result = AmaDevSettings.GatherExpectedSymbols(settings); Assert.AreEqual(1, result.Count); Assert.IsTrue(result.Contains("ENABLED")); } [Test] public void GatherExpectedSymbols_LoggerDisabled_TagsNotCollected() { settings.logV2.enabled = false; settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "LOG_TAG", enabled = true }); var result = AmaDevSettings.GatherExpectedSymbols(settings); Assert.AreEqual(0, result.Count); } [Test] public void GatherExpectedSymbols_LoggerEnabled_EnabledTagsCollected() { settings.logV2.enabled = true; settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "TAG_ON", enabled = true }); settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "TAG_OFF", enabled = false }); var result = AmaDevSettings.GatherExpectedSymbols(settings); Assert.AreEqual(1, result.Count); Assert.IsTrue(result.Contains("TAG_ON")); } [Test] public void GatherExpectedSymbols_DuplicateNames_Deduplicated() { settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "SHARED", enabled = true }); settings.logV2.enabled = true; settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "SHARED", enabled = true }); var result = AmaDevSettings.GatherExpectedSymbols(settings); Assert.AreEqual(1, result.Count); } [Test] public void IsCscInSync_MatchingContent_ReturnsTrue() { settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "A", enabled = true }); settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "B", enabled = true }); File.WriteAllText(TestCscPath, "-define:A;B"); Assert.IsTrue(AmaDevSettings.IsCscInSync(settings)); } [Test] public void IsCscInSync_MismatchedContent_ReturnsFalse() { settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "A", enabled = true }); File.WriteAllText(TestCscPath, "-define:A;B"); Assert.IsFalse(AmaDevSettings.IsCscInSync(settings)); } [Test] public void IsCscInSync_EmptySettingsNoFile_ReturnsTrue() { if (File.Exists(TestCscPath)) File.Delete(TestCscPath); Assert.IsTrue(AmaDevSettings.IsCscInSync(settings)); } [Test] public void IsCscInSync_OrderIndependent_ReturnsTrue() { settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "Z", enabled = true }); settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "A", enabled = true }); File.WriteAllText(TestCscPath, "-define:A;Z"); Assert.IsTrue(AmaDevSettings.IsCscInSync(settings)); } [Test] public void ReadSymbols_LoggerTagInCsc_TagEnabledAfterSync() { File.WriteAllText(TestCscPath, "-define:AUDIO;UI"); settings.logV2.enabled = true; settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "AUDIO", enabled = false }); settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "UI", enabled = false }); settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "NET", enabled = true }); settings.ReadSymbols(); Assert.IsTrue(settings.logV2.tags[0].enabled, "AUDIO should be enabled"); Assert.IsTrue(settings.logV2.tags[1].enabled, "UI should be enabled"); Assert.IsFalse(settings.logV2.tags[2].enabled, "NET should be disabled"); } [Test] public void ReadSymbols_LoggerDisabled_TagsNotSynced() { File.WriteAllText(TestCscPath, "-define:AUDIO"); settings.logV2.enabled = false; settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "AUDIO", enabled = false }); settings.ReadSymbols(); Assert.IsFalse(settings.logV2.tags[0].enabled); } [Test] public void ReadSymbols_TagNotInSymbolsList_StillSyncsFromCsc() { File.WriteAllText(TestCscPath, "-define:ONLY_TAG"); settings.logV2.enabled = true; settings.logV2.tags.Add(new AmaDevSettings.SymbolInfo { name = "ONLY_TAG", enabled = false }); settings.ReadSymbols(); Assert.IsTrue(settings.logV2.tags[0].enabled, "Tag should sync from csc.rsp directly"); } [Test] public void Write_DuplicateSymbols_DeduplicatedInOutput() { settings.symbolDefine.symbols.Add(new AmaDevSettings.SymbolInfo { name = "DUP", enabled = true }); var tags = new List { new AmaDevSettings.SymbolInfo { name = "DUP", enabled = true } }; settings.symbolDefine.Write(tags); var content = File.ReadAllText(TestCscPath); int count = 0; int idx = 0; while ((idx = content.IndexOf("DUP", idx)) >= 0) { count++; idx += 3; } Assert.AreEqual(1, count, "Duplicate should appear only once"); } } }