private static void TestAndCompareOutput(VisualScriptAsset visualScriptAsset, string expectedOutput, Action <dynamic> testCode) { // Compile var compilerResult = VisualScriptCompiler.Generate(visualScriptAsset, new VisualScriptCompilerOptions { Class = "TestClass", }); using (var textWriter = new StringWriter()) { Console.SetOut(textWriter); // Create class var testInstance = CreateInstance(new[] { compilerResult.SyntaxTree }); // Execute method testCode(testInstance); // Check output textWriter.Flush(); Assert.That(textWriter.ToString(), Is.EqualTo(expectedOutput)); // Restore Console.Out var standardOutput = new StreamWriter(Console.OpenStandardOutput()); standardOutput.AutoFlush = true; Console.SetOut(standardOutput); } }
public void TestCustomCode() { var visualScript = new VisualScriptAsset(); // Build blocks var functionStart = new FunctionStartBlock(); var writeTrue = new CustomCodeBlock { Code = "System.Console.Write(true);" }; var method = new Method { Name = "Test" }; method.Blocks.Add(functionStart); method.Blocks.Add(writeTrue); // Generate slots foreach (var block in method.Blocks) { block.Value.GenerateSlots(block.Value.Slots, new SlotGeneratorContext()); } // Build links method.Links.Add(new Link(functionStart, writeTrue)); visualScript.Methods.Add(method); // Test TestAndCompareOutput(visualScript, "True", testInstance => testInstance.Test()); }
public void TestVariableGet() { var visualScript = new VisualScriptAsset(); var condition = new Property("bool", "Condition"); visualScript.Properties.Add(condition); // Build blocks // TODO: Switch to a simple Write(variable) later, so that we don't depend on ConditionalBranchBlock for this test? var functionStart = new FunctionStartBlock(); var conditionGet = new VariableGet { Name = condition.Name }; var conditionalBranch = new ConditionalBranchBlock(); var writeTrue = new CustomCodeBlock { Code = "System.Console.Write(true);" }; var writeFalse = new CustomCodeBlock { Code = "System.Console.Write(false);" }; var method = new Method { Name = "Test" }; method.Blocks.Add(functionStart); method.Blocks.Add(conditionGet); method.Blocks.Add(conditionalBranch); method.Blocks.Add(writeTrue); method.Blocks.Add(writeFalse); // Generate slots foreach (var block in method.Blocks) { block.Value.GenerateSlots(block.Value.Slots, new SlotGeneratorContext()); } // Build links method.Links.Add(new Link(functionStart, conditionalBranch)); method.Links.Add(new Link(conditionGet.ValueSlot, conditionalBranch.ConditionSlot)); method.Links.Add(new Link(conditionalBranch.TrueSlot, writeTrue)); method.Links.Add(new Link(conditionalBranch.FalseSlot, writeFalse)); visualScript.Methods.Add(method); // Test TestAndCompareOutput(visualScript, "True", testInstance => { testInstance.Condition = true; testInstance.Test(); }); TestAndCompareOutput(visualScript, "False", testInstance => { testInstance.Condition = false; testInstance.Test(); }); }