using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using UnitTestSharp; namespace Ariadne.Generator.UnitTests { public class ScriptClassTests : TestFixture { public const string Mission = @" public partial class Mission : Arc { protected override void Run(World world) { step: while (!world.Open.Contains(""go"")) { Yield(); } Helper(); } }"; public const string Helper = "public partial class Mission { private void Helper() { Yield(); } }"; public static ScriptClass Script() { CSharpCompilation compilation = GeneratorRun.Compile(("Mission.cs", Mission), ("Helper.cs", Helper)); return ScriptClass.Create(compilation.GetTypeByMetadataName("Mission"), compilation); } public static MethodDeclarationSyntax Method(ScriptClass script, string name) { return script.Methods.Values.Single(method => method.Identifier.Text == name); } public class ModelForTests : TestFixture { public void NodesOfOneTree_ShareOneModel() { ScriptClass script = Script(); SyntaxList statements = script.RunSyntax.Body.Statements; CheckTrue(script.ModelFor(statements[0]) == script.ModelFor(statements[1])); CheckTrue(script.ModelFor(statements[0]) == script.ModelFor(script.RunSyntax)); } public void NodesOfDifferentTrees_GetTheirOwnModels() { ScriptClass script = Script(); MethodDeclarationSyntax helper = Method(script, "Helper"); CheckTrue(script.ModelFor(script.RunSyntax) != script.ModelFor(helper)); CheckTrue(script.ModelFor(helper).SyntaxTree == helper.SyntaxTree); } } public class IsYieldTests : TestFixture { public void InvocationAskedAboutTwice_AnswersTheSameBothTimes() { ScriptClass script = Script(); InvocationExpressionSyntax yield = script.RunSyntax.DescendantNodes() .OfType().Single(call => call.Expression.ToString() == "Yield"); InvocationExpressionSyntax helper = script.RunSyntax.DescendantNodes() .OfType().Single(call => call.Expression.ToString() == "Helper"); CheckTrue(script.IsYield(yield)); CheckTrue(script.IsYield(yield)); CheckFalse(script.IsYield(helper)); CheckFalse(script.IsYield(helper)); } } public class PassageCalledTests : TestFixture { public void InvocationAskedAboutTwice_AnswersTheSameBothTimes() { ScriptClass script = Script(); InvocationExpressionSyntax helper = script.RunSyntax.DescendantNodes() .OfType().Single(call => call.Expression.ToString() == "Helper"); CheckEqual("Helper", script.PassageCalled(helper).Name); CheckEqual("Helper", script.PassageCalled(helper).Name); } } } }