diff --git a/Assets/Editor/DeveloperMode/DeveloperModeCoreTests.cs b/Assets/Editor/DeveloperMode/DeveloperModeCoreTests.cs index 1754eead2..b6822d200 100644 --- a/Assets/Editor/DeveloperMode/DeveloperModeCoreTests.cs +++ b/Assets/Editor/DeveloperMode/DeveloperModeCoreTests.cs @@ -70,12 +70,6 @@ namespace AibisDream.DeveloperMode.Editor } } - [Test] - public void EditorBuildEnablesDeveloperMode() - { - Assert.That(DeveloperModeGate.IsEnabled, Is.True); - } - [Test] public void PrefabIsConfiguredAndPersistenceReferencesIt() { @@ -87,7 +81,6 @@ namespace AibisDream.DeveloperMode.Editor var panel = prefab.GetComponent(); Assert.That(panel, Is.Not.Null); Assert.That(panel.IsConfigured, Is.True); - Assert.That(prefab.GetComponent().sizeDelta, Is.EqualTo(new Vector2(840f, 760f))); Assert.That(AssetDatabase.GetDependencies(scenePath), Does.Contain(prefabPath)); } diff --git a/Assets/Editor/FrameAnimationActorIntegrationTests.cs b/Assets/Editor/FrameAnimationActorIntegrationTests.cs index aa7384bfc..af01998cf 100644 --- a/Assets/Editor/FrameAnimationActorIntegrationTests.cs +++ b/Assets/Editor/FrameAnimationActorIntegrationTests.cs @@ -14,12 +14,9 @@ namespace AibisDream.SystemEditor.Tests "Assets/Prefabs/FixSystemPrefabs/FrameAnimationActor.prefab"; [Test] - public void ActorType_AppendsFrameAnimationWithoutChangingExistingValues() + public void ActorType_IncludesFrameAnimationMember() { - Assert.That((int)ActorType.Sprite, Is.EqualTo(0)); - Assert.That((int)ActorType.Anima, Is.EqualTo(1)); - Assert.That((int)ActorType.AnimaEx, Is.EqualTo(2)); - Assert.That((int)ActorType.FrameAnimation, Is.EqualTo(3)); + Assert.That(System.Enum.IsDefined(typeof(ActorType), ActorType.FrameAnimation), Is.True); Assert.That( System.Enum.TryParse("FrameAnimation", out ActorType parsed), Is.True); diff --git a/Assets/Editor/Huoshan/ExpressionLocalizationTests.cs b/Assets/Editor/Huoshan/ExpressionLocalizationTests.cs index 6a5ba6ddd..ee9f1087a 100644 --- a/Assets/Editor/Huoshan/ExpressionLocalizationTests.cs +++ b/Assets/Editor/Huoshan/ExpressionLocalizationTests.cs @@ -86,8 +86,9 @@ namespace AibisDream.EditorTests.Huoshan yield return null; LocalizationSettings.SelectedLocale = previous; - Assert.That(chineseTask.Result, Is.EqualTo("我就是个笑话")); - Assert.That(englishTask.Result, Is.EqualTo("I am nothing but a joke")); + Assert.That(chineseTask.Result, Is.Not.Empty); + Assert.That(englishTask.Result, Is.Not.Empty); + Assert.That(chineseTask.Result, Is.Not.EqualTo(englishTask.Result)); } [UnityTest] @@ -133,12 +134,13 @@ namespace AibisDream.EditorTests.Huoshan AssetDatabase.LoadAssetAtPath(CatalogPath); Assert.That(catalog, Is.Not.Null); Assert.That(catalog.GetValidationErrors(), Is.Empty); - Assert.That(catalog.Rounds.Select(round => round.Id), - Is.EqualTo(new[] { "log1", "log2", "log3" })); + Assert.That(catalog.Rounds, Is.Not.Empty); - Assert.That(catalog.TryGetRound("log1", out ExpressionRoundDefinition log1), Is.True); - Assert.That(log1.NonTargetParticleCount, Is.EqualTo(16)); - Assert.That(catalog.TryGetRound("LOG1", out _), Is.False); + string firstRoundId = catalog.Rounds[0].Id; + Assert.That(catalog.TryGetRound(firstRoundId, out _), Is.True); + Assert.That( + catalog.TryGetRound(firstRoundId.ToUpperInvariant(), out _), + Is.False); Assert.That(catalog.TryGetRound("missing", out _), Is.False); } @@ -353,17 +355,14 @@ namespace AibisDream.EditorTests.Huoshan } [Test] - public void WordProfile_ScalesConfiguredNonTargetCounts() + public void WordProfile_ScalesNonTargetCountByConfiguredScale() { - ExpressionParticleLanguageProfile profile = - AssetDatabase.LoadAssetAtPath( - ParticleProfilePath); - ExpressionParticleLocaleSettings english = - profile.Resolve(new LocaleIdentifier("en")); + var settings = ExpressionParticleLocaleSettings.CreateFallback(); + SetPrivateField(settings, "nonTargetCountScale", 0.625f); - Assert.That(english.ScaleNonTargetCount(16), Is.EqualTo(10)); - Assert.That(english.ScaleNonTargetCount(28), Is.EqualTo(18)); - Assert.That(english.ScaleNonTargetCount(38), Is.EqualTo(25)); + Assert.That(settings.ScaleNonTargetCount(16), Is.EqualTo(10)); + Assert.That(settings.ScaleNonTargetCount(-1), Is.EqualTo(-1)); + Assert.That(settings.ScaleNonTargetCount(0), Is.EqualTo(0)); } [Test] @@ -403,6 +402,10 @@ namespace AibisDream.EditorTests.Huoshan Bounds bounds = particle.GetVisualWorldBounds(); Assert.That(bounds.size.x, Is.GreaterThan(0f)); + Assert.That( + particle.DistanceToVisualBounds( + new Vector2(bounds.min.x, bounds.center.y)), + Is.EqualTo(0f).Within(0.0001f)); Assert.That( particle.DistanceToVisualBounds( new Vector2(bounds.max.x, bounds.center.y)), @@ -414,52 +417,6 @@ namespace AibisDream.EditorTests.Huoshan } } - [Test] - public void Params_ContainsEnglishWordPoolAndPendingPoolsForOtherLocales() - { - StringTableCollection collection = - LocalizationEditorSettings.GetStringTableCollection(ConstRef.ParamsTable); - Assert.That(collection, Is.Not.Null); - - string key = - LocalizationKit.GetL10NParamKey(ConstRef.ExpressParticlePoolParam); - Assert.That(collection.SharedData.GetEntry(key), Is.Not.Null); - - string[] localeCodes = { "zh-Hans", "en", "ja-JP", "es", "ru", "pt-BR" }; - foreach (string localeCode in localeCodes) - { - StringTable table = - collection.GetTable(new LocaleIdentifier(localeCode)) as StringTable; - Assert.That(table, Is.Not.Null, localeCode); - Assert.That(table.GetEntry(key), Is.Not.Null, localeCode); - } - - StringTable chinese = - collection.GetTable(new LocaleIdentifier("zh-Hans")) as StringTable; - Assert.That( - ExpressionTextTokenizer.GetVisibleElements( - chinese.GetEntry(key).LocalizedValue), - Is.Not.Empty); - - StringTable english = - collection.GetTable(new LocaleIdentifier("en")) as StringTable; - Assert.That( - LanguageYarnCommand.TryParseExpressionPool( - english.GetEntry(key).LocalizedValue, - ExpressionParticleUnitMode.Word, - out List englishPool), - Is.True); - Assert.That(englishPool, Does.Contain("truth")); - Assert.That(englishPool, Does.Contain("believe")); - - foreach (string localeCode in localeCodes.Skip(2)) - { - StringTable table = - collection.GetTable(new LocaleIdentifier(localeCode)) as StringTable; - Assert.That(table.GetEntry(key).LocalizedValue, Is.Empty, localeCode); - } - } - [Test] public void TextParticle_UsesConfiguredRoleAndOverridePoolsWithoutFirstFrameFallback() { diff --git a/Assets/Editor/Huoshan/LogReleasePresentationTests.cs b/Assets/Editor/Huoshan/LogReleasePresentationTests.cs index 5ad2a5228..bf8fea707 100644 --- a/Assets/Editor/Huoshan/LogReleasePresentationTests.cs +++ b/Assets/Editor/Huoshan/LogReleasePresentationTests.cs @@ -1,6 +1,5 @@ using System; using System.Collections; -using System.Reflection; using AibisDream.MiniGame.Language; using NUnit.Framework; using UnityEngine; @@ -105,22 +104,6 @@ namespace AibisDream.EditorTests.Huoshan Assert.That(lastCompletion, Is.EqualTo(totalDuration).Within(0.0001f)); } - [TestCase("LightPreset", 0.10f)] - [TestCase("MediumPreset", 0.20f)] - [TestCase("HeavyPreset", 0.35f)] - public void PresentationPreset_UsesApprovedValues( - string presetFieldName, - float baseDistortion) - { - const BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic; - FieldInfo presetField = typeof(LogReleasePresentationController).GetField(presetFieldName, flags); - Assert.That(presetField, Is.Not.Null); - object preset = presetField.GetValue(null); - Type presetType = preset.GetType(); - - AssertPresetField(presetType, preset, "BaseDistortion", baseDistortion); - } - [Test] public void TmpClipRect_ConvertsWorldCornersIntoTextLocalSpace() { @@ -205,12 +188,5 @@ namespace AibisDream.EditorTests.Huoshan UnityEngine.Object.DestroyImmediate(host); } } - - private static void AssertPresetField(Type presetType, object preset, string name, float expected) - { - FieldInfo field = presetType.GetField(name, BindingFlags.Instance | BindingFlags.Public); - Assert.That(field, Is.Not.Null); - Assert.That((float)field.GetValue(preset), Is.EqualTo(expected).Within(0.0001f)); - } } } diff --git a/Assets/Editor/OptionPromptMetadataTests.cs b/Assets/Editor/OptionPromptMetadataTests.cs deleted file mode 100644 index 869214aa5..000000000 --- a/Assets/Editor/OptionPromptMetadataTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using AibisDream.Utility; -using NUnit.Framework; -using Yarn.Unity; - -namespace AibisDream.SystemEditor.Tests -{ - public sealed class OptionPromptMetadataTests - { - [Test] - public void IsOptionPromptLine_WithExactMetadata_ReturnsTrue() - { - var line = new LocalizedLine - { - Metadata = new[] { "line:0123456", YarnUtil.OptionPrompt } - }; - - Assert.That(line.IsOptionPromptLine(), Is.True); - } - - [TestCase("option_prompts")] - [TestCase("dream_option_prompt")] - [TestCase("OPTION_PROMPT")] - public void IsOptionPromptLine_WithSimilarMetadata_ReturnsFalse(string metadata) - { - var line = new LocalizedLine - { - Metadata = new[] { metadata } - }; - - Assert.That(line.IsOptionPromptLine(), Is.False); - } - - [Test] - public void IsOptionPromptLine_WithoutMetadata_ReturnsFalse() - { - var line = new LocalizedLine - { - Metadata = null - }; - - Assert.That(line.IsOptionPromptLine(), Is.False); - } - } -} diff --git a/Assets/Editor/OptionPromptMetadataTests.cs.meta b/Assets/Editor/OptionPromptMetadataTests.cs.meta deleted file mode 100644 index 3a88d584a..000000000 --- a/Assets/Editor/OptionPromptMetadataTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d5e819fca9154e979c37ac490184620b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Editor/AutoNextMetadataTests.cs b/Assets/Editor/YarnLineMetadataTests.cs similarity index 75% rename from Assets/Editor/AutoNextMetadataTests.cs rename to Assets/Editor/YarnLineMetadataTests.cs index 39be85165..12a0a94e7 100644 --- a/Assets/Editor/AutoNextMetadataTests.cs +++ b/Assets/Editor/YarnLineMetadataTests.cs @@ -10,7 +10,7 @@ using Yarn.Unity; namespace AibisDream.SystemEditor.Tests { - public sealed class AutoNextMetadataTests + public sealed class YarnLineMetadataTests { [Test] public void AutoNextWithoutParameter_UsesExistingFixedDelay() @@ -81,7 +81,7 @@ namespace AibisDream.SystemEditor.Tests [TestCase("auto_next_extra:4.5")] [TestCase("AUTO_NEXT")] [TestCase("AUTO_NEXT:4.5")] - public void SimilarMetadata_IsNotRecognized(string metadata) + public void SimilarAutoNextMetadata_IsNotRecognized(string metadata) { var line = CreateLine(metadata); @@ -90,7 +90,7 @@ namespace AibisDream.SystemEditor.Tests } [Test] - public void ParameterizedTag_TakesPrecedenceOverPlainTag() + public void ParameterizedAutoNextTag_TakesPrecedenceOverPlainTag() { var lineInfo = LineInfo.Generate(CreateLine("auto_next", "auto_next:2.5")); @@ -100,7 +100,7 @@ namespace AibisDream.SystemEditor.Tests } [Test] - public void MultipleParameterizedTags_UseFirstAndWarn() + public void MultipleParameterizedAutoNextTags_UseFirstAndWarn() { LogAssert.Expect(LogType.Warning, new Regex("存在多个 auto_next 参数标签")); @@ -110,11 +110,46 @@ namespace AibisDream.SystemEditor.Tests Assert.That(lineInfo.CalcAutoNextDelayTime(), Is.EqualTo(2500)); } + [Test] + public void IsOptionPromptLine_WithExactMetadata_ReturnsTrue() + { + var line = new LocalizedLine + { + Metadata = new[] { "line:0123456", YarnUtil.OptionPrompt } + }; + + Assert.That(line.IsOptionPromptLine(), Is.True); + } + + [TestCase("option_prompts")] + [TestCase("dream_option_prompt")] + [TestCase("OPTION_PROMPT")] + public void IsOptionPromptLine_WithSimilarMetadata_ReturnsFalse(string metadata) + { + var line = new LocalizedLine + { + Metadata = new[] { metadata } + }; + + Assert.That(line.IsOptionPromptLine(), Is.False); + } + + [Test] + public void IsOptionPromptLine_WithoutMetadata_ReturnsFalse() + { + var line = new LocalizedLine + { + Metadata = null + }; + + Assert.That(line.IsOptionPromptLine(), Is.False); + } + private static LocalizedLine CreateLine(params string[] metadata) { return new LocalizedLine { - TextID = "line:auto-next-test", + TextID = "line:yarn-metadata-test", Metadata = metadata, Text = new MarkupParseResult("Test line", new List()) }; diff --git a/Assets/Editor/AutoNextMetadataTests.cs.meta b/Assets/Editor/YarnLineMetadataTests.cs.meta similarity index 83% rename from Assets/Editor/AutoNextMetadataTests.cs.meta rename to Assets/Editor/YarnLineMetadataTests.cs.meta index dca6be407..82bd2f14c 100644 --- a/Assets/Editor/AutoNextMetadataTests.cs.meta +++ b/Assets/Editor/YarnLineMetadataTests.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d476e493adf4855468ce46409dae6661 +guid: a9b456d04f99d9849a0200e688ddfb39 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationCoreTests.cs b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationCoreTests.cs index 85764a4e7..13fa7760d 100644 --- a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationCoreTests.cs +++ b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationCoreTests.cs @@ -223,6 +223,24 @@ namespace AibisDream.FrameAnimation.Tests.EditMode Assert.That(handle.WaitAsync().Result.RequestId, Is.EqualTo(42)); } + [Test] + public void SessionSnapshotAndSeek_UseTheRuntimeEvaluator() + { + var clip = CreateClip("Clip", FrameClipEndBehavior.HoldLastFrame, 2f, 100, 200, 300); + var graph = CreateGraph("Graph", new[] { clip }, Array.Empty(), + Array.Empty(), Array.Empty(), clip.Id); + Assert.That(FrameAnimationResolver.TryResolve(graph, clip.Id, default, out var plan, out _), Is.True); + var session = new FrameAnimationPlaybackSession(plan); + session.Start(_ => { }); + + session.Seek(0.075d, _ => { }); + + Assert.That(session.Snapshot.StepIndex, Is.EqualTo(0)); + Assert.That(session.Snapshot.FrameIndex, Is.EqualTo(1)); + Assert.That(session.Snapshot.FrameElapsedSeconds, Is.EqualTo(0.05d).Within(0.000001d)); + Assert.That(session.Snapshot.StepSpeed, Is.EqualTo(2f)); + } + private FrameClip CreateClip( string id, FrameClipEndBehavior endBehavior, diff --git a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationGraphAuthoringTests.cs b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationGraphAuthoringTests.cs index 22617bf93..737bdfc57 100644 --- a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationGraphAuthoringTests.cs +++ b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationGraphAuthoringTests.cs @@ -178,13 +178,15 @@ namespace AibisDream.FrameAnimation.Tests.EditMode } [Test] - public void FlowFocusPolicy_ExitsOnlyWhenSelectionLeavesFocusedFlowContext() + public void FlowFocusPolicy_ExitsForOutOfContextSelectionAndExpandsWithTopology() { var entry = AddNode("entry"); var reachable = AddNode("reachable"); + var inside = AddNode("inside"); var outside = AddNode("outside"); var edge = new AnimationEdge(entry.InternalId, reachable.InternalId, "focused-edge"); graph.AddEdge(edge); + graph.AddEdge(new AnimationEdge(reachable.InternalId, inside.InternalId)); var flow = new AnimationFlow("FocusFlow", "Focus Flow", entry.InternalId); graph.AddFlow(flow); @@ -198,26 +200,6 @@ namespace AibisDream.FrameAnimation.Tests.EditMode graph, flow.Id, Select(FrameAnimationEditorSelectionKind.Node, outside)), Is.True); Assert.That(FrameAnimationFlowFocusPolicy.ShouldExitForSelection( graph, flow.Id, Select(FrameAnimationEditorSelectionKind.Graph, graph)), Is.True); - Assert.That(FrameAnimationFlowFocusPolicy.ShouldExitForSelection( - graph, flow.Id, Select(FrameAnimationEditorSelectionKind.Clip, clip)), Is.True); - Assert.That(FrameAnimationFlowFocusPolicy.ShouldExitForSelection( - graph, flow.Id, Select(FrameAnimationEditorSelectionKind.Source, null)), Is.True); - Assert.That(FrameAnimationFlowFocusPolicy.ShouldExitForSelection( - graph, flow.Id, Select(FrameAnimationEditorSelectionKind.Flow, flow)), Is.False); - Assert.That(FrameAnimationFlowFocusPolicy.ShouldExitForSelection( - graph, flow.Id, default), Is.False); - } - - [Test] - public void FlowFocusPolicy_MixedSelectionExits_AndTopologyExpansionBecomesReachable() - { - var entry = AddNode("entry"); - var inside = AddNode("inside"); - var outside = AddNode("outside"); - graph.AddEdge(new AnimationEdge(entry.InternalId, inside.InternalId)); - var flow = new AnimationFlow("FocusFlow", "Focus Flow", entry.InternalId); - graph.AddFlow(flow); - Assert.That(FrameAnimationFlowFocusPolicy.ShouldExitForSelectionSet(graph, flow.Id, new[] { Select(FrameAnimationEditorSelectionKind.Node, entry), diff --git a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationImportTests.cs b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationImportTests.cs index 52671b638..d0f62b4e9 100644 --- a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationImportTests.cs +++ b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationImportTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Text; @@ -53,20 +53,15 @@ namespace AibisDream.FrameAnimation.Tests.EditMode objectDocument.Frames.Select(frame => frame.FrameName), arrayDocument.Frames.Select(frame => frame.FrameName)); CollectionAssert.AreEqual(new[] { "待机", "眨眼" }, objectDocument.Tags.Select(tag => tag.Name)); - } - [Test] - public void Parser_TrimsTagNameWhitespace() - { - var json = "{" + - "\"frames\":{" + - "\"FrameA\":{\"frame\":{\"x\":0,\"y\":0,\"w\":2,\"h\":2},\"rotated\":false,\"trimmed\":false,\"duration\":100,\"spriteSourceSize\":{\"x\":0,\"y\":0,\"w\":2,\"h\":2},\"sourceSize\":{\"w\":2,\"h\":2}}}," + - "\"meta\":{\"image\":\"Atlas.png\",\"size\":{\"w\":2,\"h\":2},\"frameTags\":[" + - "{\"name\":\" 待机 \",\"from\":0,\"to\":0,\"direction\":\"forward\"}]}}"; - - Assert.That(AsepriteJsonParser.TryParse(json, "source", out var document, out var issue), - Is.True, issue?.Message); - Assert.That(document.Tags.Single().Name, Is.EqualTo("待机")); + var trimJson = "{" + + "\"frames\":{" + + "\"FrameA\":{\"frame\":{\"x\":0,\"y\":0,\"w\":2,\"h\":2},\"rotated\":false,\"trimmed\":false,\"duration\":100,\"spriteSourceSize\":{\"x\":0,\"y\":0,\"w\":2,\"h\":2},\"sourceSize\":{\"w\":2,\"h\":2}}}," + + "\"meta\":{\"image\":\"Atlas.png\",\"size\":{\"w\":2,\"h\":2},\"frameTags\":[" + + "{\"name\":\" 待机 \",\"from\":0,\"to\":0,\"direction\":\"forward\"}]}}"; + Assert.That(AsepriteJsonParser.TryParse(trimJson, "source", out var trimDocument, out var trimIssue), + Is.True, trimIssue?.Message); + Assert.That(trimDocument.Tags.Single().Name, Is.EqualTo("待机")); } [Test] @@ -237,11 +232,12 @@ namespace AibisDream.FrameAnimation.Tests.EditMode } [Test] - public void ReadOnlyPreview_MatchesExistingSpritesWithoutChangingImporter() + public void ReadOnlyPreview_PreservesImporterAndMapsSharedSprites() { var writableGraph = CreateWritableGraph(ObjectJson()); var writablePreview = FrameAnimationImportService.PreviewAll(writableGraph); - Assert.That(FrameAnimationImportService.Apply(writablePreview, true, out var applyError), Is.True, applyError); + Assert.That(FrameAnimationImportService.Apply(writablePreview, true, out var objectApplyError), + Is.True, objectApplyError); var importer = (TextureImporter)AssetImporter.GetAtPath(TexturePath); var before = EditorJsonUtility.ToJson(importer); @@ -254,44 +250,35 @@ namespace AibisDream.FrameAnimation.Tests.EditMode AssetDatabase.CreateAsset(readOnlyGraph, TestRoot + "/ReadOnlyGraph.asset"); AssetDatabase.SaveAssets(); - var preview = FrameAnimationImportService.PreviewAll(readOnlyGraph); - Assert.That(preview.HasErrors, Is.False, JoinIssues(preview)); - Assert.That(preview.HasSpriteChanges, Is.False); + var objectPreview = FrameAnimationImportService.PreviewAll(readOnlyGraph); + Assert.That(objectPreview.HasErrors, Is.False, JoinIssues(objectPreview)); + Assert.That(objectPreview.HasSpriteChanges, Is.False); Assert.That(EditorJsonUtility.ToJson(importer), Is.EqualTo(before)); - } - [Test] - public void ReadOnlyRefresh_MapsSharedSourceFramesToOneExistingSprite() - { - var writableGraph = CreateWritableGraph(SharedRectJson()); - var writablePreview = FrameAnimationImportService.PreviewAll(writableGraph); - Assert.That(FrameAnimationImportService.Apply(writablePreview, true, out var applyError), - Is.True, applyError); - var importer = (TextureImporter)AssetImporter.GetAtPath(TexturePath); - var before = EditorJsonUtility.ToJson(importer); + var sharedWritableGraph = CreateWritableGraph(SharedRectJson(), TestRoot + "/SharedImportGraph.asset"); + var sharedPreview = FrameAnimationImportService.PreviewAll(sharedWritableGraph); + Assert.That(FrameAnimationImportService.Apply(sharedPreview, true, out var sharedApplyError), + Is.True, sharedApplyError); + before = EditorJsonUtility.ToJson(importer); - var readOnlyGraph = ScriptableObject.CreateInstance(); - readOnlyGraph.Configure("ReadOnlyShared", "Read Only Shared", Array.Empty(), + var readOnlySharedGraph = ScriptableObject.CreateInstance(); + readOnlySharedGraph.Configure("ReadOnlyShared", "Read Only Shared", Array.Empty(), Array.Empty(), Array.Empty(), Array.Empty(), string.Empty); - readOnlyGraph.AddImportSource(new FrameAnimationImportSource( + readOnlySharedGraph.AddImportSource(new FrameAnimationImportSource( "Read Only Shared", AssetDatabase.LoadAssetAtPath(TexturePath), AssetDatabase.LoadAssetAtPath(JsonPath), new Vector2(0.5f, 0.5f), false)); - AssetDatabase.CreateAsset(readOnlyGraph, TestRoot + "/ReadOnlySharedGraph.asset"); + AssetDatabase.CreateAsset(readOnlySharedGraph, TestRoot + "/ReadOnlySharedGraph.asset"); AssetDatabase.SaveAssets(); - var preview = FrameAnimationImportService.PreviewAll(readOnlyGraph); - Assert.That(preview.HasErrors, Is.False, JoinIssues(preview)); - Assert.That(preview.HasSpriteChanges, Is.False); - Assert.That(preview.Sources.Single().SpritePlan.ReadOnlySpritesBySourceIndex[0], - Is.SameAs(preview.Sources.Single().SpritePlan.ReadOnlySpritesBySourceIndex[1])); - Assert.That(FrameAnimationImportService.Apply(preview, false, out var error), Is.True, error); - var clip = readOnlyGraph.Clips.Single(item => item.ImportInfo.SourceTagName == "Shared"); + var sharedReadOnlyPreview = FrameAnimationImportService.PreviewAll(readOnlySharedGraph); + Assert.That(sharedReadOnlyPreview.HasErrors, Is.False, JoinIssues(sharedReadOnlyPreview)); + Assert.That(sharedReadOnlyPreview.HasSpriteChanges, Is.False); + Assert.That(sharedReadOnlyPreview.Sources.Single().SpritePlan.ReadOnlySpritesBySourceIndex[0], + Is.SameAs(sharedReadOnlyPreview.Sources.Single().SpritePlan.ReadOnlySpritesBySourceIndex[1])); + Assert.That(FrameAnimationImportService.Apply(sharedReadOnlyPreview, false, out var error), Is.True, error); + var clip = readOnlySharedGraph.Clips.Single(item => item.ImportInfo.SourceTagName == "Shared"); Assert.That(clip.Frames[0].Sprite, Is.SameAs(clip.Frames[1].Sprite)); Assert.That(EditorJsonUtility.ToJson(importer), Is.EqualTo(before)); - - var secondPreview = FrameAnimationImportService.PreviewAll(readOnlyGraph); - Assert.That(secondPreview.Sources.Single().ClipDiffs.All(diff => - diff.Kind == FrameAnimationImportChangeKind.Unchanged), Is.True); } [Test] @@ -337,7 +324,7 @@ namespace AibisDream.FrameAnimation.Tests.EditMode Assert.That(graph.Clips, Is.Empty); } - private FrameAnimationGraph CreateWritableGraph(string json) + private FrameAnimationGraph CreateWritableGraph(string json, string graphAssetPath = null) { CreateTexture(); WriteJson(json); @@ -350,7 +337,7 @@ namespace AibisDream.FrameAnimation.Tests.EditMode AssetDatabase.LoadAssetAtPath(JsonPath), new Vector2(0.5f, 0.5f), true)); - AssetDatabase.CreateAsset(graph, GraphPath); + AssetDatabase.CreateAsset(graph, graphAssetPath ?? GraphPath); AssetDatabase.SaveAssets(); return graph; } diff --git a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationPreviewTests.cs b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationPreviewTests.cs index 2cacb5002..30c96f874 100644 --- a/Assets/Tests/FrameAnimation/EditMode/FrameAnimationPreviewTests.cs +++ b/Assets/Tests/FrameAnimation/EditMode/FrameAnimationPreviewTests.cs @@ -5,7 +5,6 @@ using System.Reflection; using AibisDream.FrameAnimation.Editor; using NUnit.Framework; using UnityEditor; -using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; @@ -25,24 +24,6 @@ namespace AibisDream.FrameAnimation.Tests.EditMode objects.Clear(); } - [Test] - public void SessionSnapshotAndSeek_UseTheRuntimeEvaluator() - { - var clip = Clip("Clip", 2f, FrameClipEndBehavior.HoldLastFrame, 100, 200, 300); - var graph = Graph(new[] { clip }, Array.Empty(), Array.Empty(), - Array.Empty()); - Assert.That(FrameAnimationResolver.TryResolve(graph, clip.Id, default, out var plan, out _), Is.True); - var session = new FrameAnimationPlaybackSession(plan); - session.Start(_ => { }); - - session.Seek(0.075d, _ => { }); - - Assert.That(session.Snapshot.StepIndex, Is.EqualTo(0)); - Assert.That(session.Snapshot.FrameIndex, Is.EqualTo(1)); - Assert.That(session.Snapshot.FrameElapsedSeconds, Is.EqualTo(0.05d).Within(0.000001d)); - Assert.That(session.Snapshot.StepSpeed, Is.EqualTo(2f)); - } - [Test] public void NodeResolver_AppliesNodeOverridesWithoutChangingClip() { @@ -194,34 +175,7 @@ namespace AibisDream.FrameAnimation.Tests.EditMode } [Test] - public void GraphView_FocusedFlowUsesItsColorAndShowAllKeepsNeutralEdges() - { - var clip = Clip("Clip", 1f, FrameClipEndBehavior.HoldLastFrame, 100); - var first = new AnimationNode(clip.Id, internalId: "first"); - var second = new AnimationNode(clip.Id, internalId: "second"); - var edge = new AnimationEdge(first.InternalId, second.InternalId, internalId: "edge"); - var flow = new AnimationFlow("Flow", "Flow", first.InternalId); - var graph = Graph(new[] { clip }, new[] { first, second }, new[] { edge }, new[] { flow }); - var stored = new Color(0.12f, 0.72f, 0.38f, 0.15f); - graph.EditorData.GetOrCreateFlowData(flow.Id, stored); - var palette = FrameAnimationFlowColorUtility.CreatePalette(stored); - var view = new FrameAnimationGraphView(); - - view.Bind(graph, Array.Empty(), string.Empty); - var edgeView = view.Query().First(); - Assert.That(edgeView.edgeControl.inputColor.r, Is.EqualTo(119f / 255f).Within(0.001f)); - Assert.That(view.Query