public async Task InvokeMethodInterpreterRecursivityStackoverflowAsync() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) FirstMethod(1000) # A Stackoverflow must never happen if FirstMethod is ASYNC. END FUNCTION ASYNC FUNCTION FirstMethod(num) IF num > 1 THEN RETURN FirstMethod(num - 1) END IF RETURN num END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); await interpreter.StartDebugAsync(true); var expected1 = "[Log] End of the execution of the method 'FirstMethod'. Returned value : 0 (System.Int32)"; var result = interpreter.GetStateChangedHistoryString(); Assert.IsTrue(result.Contains(expected1)); Assert.AreEqual(null, interpreter.ProgramResult); await TestUtilities.TestAllRunningMode(null, inputCode); }
public async Task BinaryOperatorInterpreterAddition() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 2 + 3 # Should be 5 VARIABLE var2 = ""2"" + 3 # Should be 23 VARIABLE var3 = 2 + 3.0 # Should be 5 VARIABLE var4 = ""Hello"" + true # Should be HelloTrue END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var result = interpreter.GetStateChangedHistoryString(); Assert.IsNull(interpreter.Error); Assert.IsTrue(result.Contains("[Log] Variable 'var1' declared. Default value : 5 (System.Int32)")); Assert.IsTrue(result.Contains("[Log] Variable 'var2' declared. Default value : 23 (System.String)")); Assert.IsTrue(result.Contains("[Log] Variable 'var3' declared. Default value : 5 (System.Double)")); Assert.IsTrue(result.Contains("[Log] Variable 'var4' declared. Default value : HelloTrue (System.String)")); inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var4 = true + false # Should fail END FUNCTION"; interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); result = interpreter.GetStateChangedHistoryString(); Assert.IsTrue(result.Contains("[Error] Unexpected and unmanaged error has been detected : Operator '+' cannot be applied to operands of type 'bool' and 'bool'")); }
public async Task ProgramInterpreterInvokeExternMethod3() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) AWAIT MethodAsync(345, 5.0) END FUNCTION EXTERN FUNCTION Method1(arg) RETURN arg END FUNCTION ASYNC FUNCTION MethodAsync(value, timeToWait) VARIABLE var1 = AWAIT System.Threading.Tasks.Task.Delay(System.TimeSpan.FromSeconds(timeToWait)) RETURN value END FUNCTION"; using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var t = interpreter.StartDebugAsync(true); var result = await interpreter.InvokeMethod(true, "Method1", true, 123); Assert.AreEqual(123, result); // Idle is expected because InvokeMethod waits that the main // thread (used by Main()) is free before running. So the async // function is complete before reaching this assert. Assert.AreEqual(BaZicInterpreterState.Idle, interpreter.State); await interpreter.Stop(); Assert.AreEqual(BaZicInterpreterState.Stopped, interpreter.State); } }
public async Task ProgramInterpreterTestEntryPointMethod() { var parser = new BaZicParser(); var inputCode = @"FUNCTION Method1() END FUNCTION"; using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { await interpreter.StartDebugAsync(true); Assert.AreEqual(BaZicInterpreterState.Idle, interpreter.State); } inputCode = @"EXTERN FUNCTION Main(args[]) END FUNCTION EXTERN FUNCTION Main(args[]) END FUNCTION"; using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program)) { await interpreter.StartDebugAsync(true); Assert.IsInstanceOfType(interpreter.Error.Exception, typeof(SeveralEntryPointMethodException)); } }
public async Task BaZicInterpreterWithUiProgramBadControlAccessorUse() { var parser = new BaZicParser(); var inputCode = @" EXTERN FUNCTION Main(args[]) Button1.Content = ""Hello"" END FUNCTION"; var xamlCode = @" <Window xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" Name=""Window""> <Grid> <Button Name=""Button1""/> </Grid> </Window>"; var bazicProgram = (BaZicUiProgram)parser.Parse(inputCode, xamlCode, optimize: true).Program; var interpreter = new BaZicInterpreter(bazicProgram); await interpreter.StartDebugAsync(true); var exception = interpreter.Error.Exception; Assert.AreEqual("The variable 'Button1' does not exist or is not accessible.", exception.Message); }
public async Task PropertyReferenceInterpreter() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = ""Hello"".Length END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PropertyReferenceExpression'. [Log] Getting the property ''Hello' (type:System.String).Length'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Hello' (System.String). [Log] The expression returned the value '5' (System.Int32). [Log] Variable 'var1' declared. Default value : 5 (System.Int32) [Log] End of the execution of the method 'Main'. Returned value : ({Null}) [State] Idle "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = ""Hello"".length END FUNCTION"; interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); Assert.AreEqual("Unable to access to the property 'length' of the type 'System.String'.", interpreter.StateChangedHistory.Last().Error.Exception.InnerException.Message); }
public async Task ProgramInterpreterInvokeExternMethodUI12() { var parser = new BaZicParser(); var inputCode = @" VARIABLE globVar = 1 EXTERN FUNCTION Main(args[]) END FUNCTION EXTERN FUNCTION Method1() DO WHILE TRUE LOOP END FUNCTION"; var xamlCode = @" <Window xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" Name=""Window1""> <StackPanel> <Button Name=""Button1"" Content=""Hello""/> </StackPanel> </Window>"; using (var interpreter = new BaZicInterpreter(inputCode, xamlCode)) { var t = interpreter.StartDebugAsync(true); t = interpreter.InvokeMethod(true, "Method1", true); await Task.Delay(3000); Assert.AreEqual(BaZicInterpreterState.Running, interpreter.State); await interpreter.Stop(); Assert.AreEqual(BaZicInterpreterState.Stopped, interpreter.State); } using (var interpreter = new BaZicInterpreter(inputCode, xamlCode)) { var errors = await interpreter.Build(); Assert.IsNull(errors); var t = interpreter.StartReleaseAsync(true); t = interpreter.InvokeMethod(true, "Method1", true); await Task.Delay(10000); Assert.AreEqual(BaZicInterpreterState.Running, interpreter.State); await interpreter.Stop(); Assert.AreEqual(BaZicInterpreterState.Stopped, interpreter.State); } }
public async Task VariableReferenceInterpreter() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 1 VARIABLE var2 = var1 RETURN var2 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'var1' declared. Default value : 1 (System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'var2' declared. Default value : 1 (System.Int32) [Log] Executing a statement of type 'ReturnStatement'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Return : 1 (System.Int32) [Log] A Return statement or Break statement or Exception has been detected or thrown. Exiting the current block of statements. [Log] End of the execution of the method 'Main'. Returned value : 1 (System.Int32) [State] Idle "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); await TestUtilities.TestAllRunningMode("1", inputCode); }
public async Task MethodInterpreterAwait() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) AWAIT Main(NEW [1, 2, 3]) END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); Assert.AreEqual("Unable to await the method 'Main' because it is not marked as asynchronous.", interpreter.Error.Exception.Message); }
public async Task InvokeCoreMethodInterpreter3() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 123.toString() END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); Assert.AreEqual("The method 'toString' does not exist in the type 'System.Int32'.", interpreter.StateChangedHistory.Last().Error.Exception.InnerException.Message); }
public async Task BaZicInterpreterAssembliesLoad() { var program = new BaZicProgram(); program.WithAssemblies("FakeAssembly, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); var interpreter = new BaZicInterpreter(program); await interpreter.StartDebugAsync(true); var exception = (LoadAssemblyException)interpreter.Error.Exception; Assert.AreEqual("FakeAssembly, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", exception.AssemblyPath); Assert.AreEqual("Could not load file or assembly 'FakeAssembly, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.", exception.InnerException.Message); }
public async Task BaZicInterpreterDebugInformation() { var parser = new BaZicParser(); var inputCode = @" VARIABLE globVar = ""Hello"" EXTERN FUNCTION Main(args[]) RETURN SimpleRecursivity(5) END FUNCTION FUNCTION SimpleRecursivity(num) IF num < 1 THEN BREAKPOINT RETURN num ELSE RETURN SimpleRecursivity(num - 1) END IF END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); var t = interpreter.StartDebugAsync(true); await Task.Delay(2000); var debugInfo = interpreter.DebugInfos; Assert.IsNull(debugInfo); Assert.AreEqual(BaZicInterpreterState.Pause, interpreter.State); interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); t = interpreter.StartDebugAsync(true); Assert.IsNull(interpreter.DebugInfos); await Task.Delay(2000); debugInfo = interpreter.DebugInfos; Assert.IsNotNull(debugInfo); Assert.AreEqual(BaZicInterpreterState.Pause, interpreter.State); Assert.AreEqual(7, debugInfo.CallStack.Count); Assert.AreEqual(1, debugInfo.GlobalVariables.Count); Assert.AreEqual("SimpleRecursivity", debugInfo.CallStack.First().InvokeMethodExpression.MethodName.Identifier); Assert.AreEqual("num", debugInfo.CallStack.First().Variables.Single().Name); Assert.AreEqual(0, debugInfo.CallStack.First().Variables.Single().Value); Assert.AreEqual(5, debugInfo.CallStack[5].Variables.Single().Value); }
internal static async Task RunDebugOptimizedVerbose(List <string> resultReceiver, string inputBaZicCode, string xamlCode, params object[] args) { using (var interpreter = new BaZicInterpreter(inputBaZicCode, xamlCode, optimize: true)) { interpreter.SetDependencies("PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); await interpreter.StartDebugAsync(true, args); if (interpreter.Error != null) { throw interpreter.Error.Exception; } resultReceiver.Add(interpreter.ProgramResult?.ToString()); } }
public async Task BinaryOperatorInterpreterDivision() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 2 / 0 # Should fail END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var result = interpreter.GetStateChangedHistoryString(); Assert.IsTrue(result.Contains("[Error] Attempted to divide by zero.")); }
public async Task ProgramInterpreterInvokeExternMethod11() { var parser = new BaZicParser(); var inputCode = @" VARIABLE globVar = 1 EXTERN FUNCTION Main(args[]) DO WHILE TRUE LOOP END FUNCTION EXTERN FUNCTION Method1() RETURN TRUE END FUNCTION"; using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var t = interpreter.StartDebugAsync(true); t = interpreter.InvokeMethod(true, "Method1", true); await Task.Delay(3000); Assert.AreEqual(BaZicInterpreterState.Running, interpreter.State); await interpreter.Stop(); Assert.AreEqual(BaZicInterpreterState.Stopped, interpreter.State); } using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var t = interpreter.StartReleaseAsync(true); t = interpreter.InvokeMethod(true, "Method1", true); await Task.Delay(10000); Assert.AreEqual(BaZicInterpreterState.Running, interpreter.State); await interpreter.Stop(); Assert.AreEqual(BaZicInterpreterState.Stopped, interpreter.State); } }
public async Task ArrayIndexerInterpreter3() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 123 RETURN var1[0] END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '123' (System.Int32). [Log] Variable 'var1' declared. Default value : 123 (System.Int32) [Log] Executing a statement of type 'ReturnStatement'. [Log] Executing an expression of type 'ArrayIndexerExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '123' (System.Int32). [Error] Cannot apply indexing with [] to an expression of type 'Int32'. An array is expected. "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); }
private void RunProgramButton_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(BaZicCodeTextBox.Text)) { MessageBox.Show("There is no BaZic code to run."); return; } Logs = string.Empty; if (string.IsNullOrWhiteSpace(XamlCodeTextBox.Text)) { XamlCodeTextBox.Text = string.Empty; } var lexer = new BaZicLexer(); var parser = new BaZicParser(); var tokens = lexer.Tokenize(BaZicCodeTextBox.Text); var abstractSyntaxTree = parser.Parse(tokens, XamlCodeTextBox.Text, optimize: OptimizeCheckBox.IsChecked.Value); foreach (var issue in abstractSyntaxTree.Issues.InnerExceptions.OfType <BaZicParserException>()) { Log(issue.ToString()); } if (abstractSyntaxTree.Program != null && abstractSyntaxTree.Issues.InnerExceptions.OfType <BaZicParserException>().All(issue => issue.Level != Core.Enums.BaZicParserExceptionLevel.Error)) { RunProgramButton.Visibility = Visibility.Collapsed; RunProgramReleaseButton.Visibility = Visibility.Collapsed; OptimizeCheckBox.Visibility = Visibility.Collapsed; PauseButton.Visibility = Visibility.Visible; StopButton.Visibility = Visibility.Visible; _interpreter = new BaZicInterpreter(abstractSyntaxTree.Program); _interpreter.StateChanged += Interpreter_StateChanged; var t = _interpreter.StartDebugAsync(true); } else { Log("The program has not been interpreted."); } }
public async Task ExpressionStatementInterpreter() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) AWAIT System.Threading.Tasks.Task.Delay(System.TimeSpan.FromMilliseconds(500.0)) END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); var watch = new Stopwatch(); watch.Start(); await interpreter.StartDebugAsync(true); watch.Stop(); Assert.IsTrue(watch.ElapsedMilliseconds > 505); }
public async Task InvokeMethodInterpreter() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = Method1(""Hello"") VARIABLE var2 = MethodAsync(""Hello Async"", 3.0) VARIABLE var3 = AWAIT MethodAsync(""Hello Await Async"", 1.0) RETURN ""END OF MAIN METHOD"" END FUNCTION FUNCTION Method1(value) RETURN value END FUNCTION ASYNC FUNCTION MethodAsync(value, timeToWait) VARIABLE var1 = AWAIT System.Threading.Tasks.Task.Delay(System.TimeSpan.FromSeconds(timeToWait)) RETURN value END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); await interpreter.StartDebugAsync(true); var expected1 = "[Log] Variable 'var1' declared. Default value : Hello (System.String)"; var expected2 = "[Log] Variable 'var2' declared. Default value : System.Threading.Tasks.Task (System.Threading.Tasks.Task)"; var expected3 = "[Log] Variable 'var3' declared. Default value : Hello Await Async (System.String)"; var result = interpreter.GetStateChangedHistoryString(); Assert.IsTrue(result.Contains(expected1)); Assert.IsTrue(result.Contains(expected2)); Assert.IsTrue(result.Contains(expected3)); // The call of MethodAsync on var2 must finish after var3. Assert.IsTrue(result.IndexOf("[Log] Return : Hello Async (System.String)") > result.IndexOf("[Log] Return : Hello Await Async (System.String)")); Assert.IsTrue(result.IndexOf("[Log] Return : END OF MAIN METHOD (System.String)") > result.IndexOf("[Log] Return : Hello Await Async (System.String)")); Assert.IsTrue(result.IndexOf("[Log] Return : Hello Async (System.String)") > result.IndexOf("[Log] Return : END OF MAIN METHOD (System.String)")); Assert.AreEqual("END OF MAIN METHOD", interpreter.ProgramResult); await TestUtilities.TestAllRunningMode("END OF MAIN METHOD", inputCode); }
public async Task BaZicInterpreterSecurity() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = Localization.L.BaZic.AbstractSyntaxTree.InvalidNamespace RETURN var1 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PropertyReferenceExpression'. [Log] Getting the property 'Localization.L.BaZic.AbstractSyntaxTree.InvalidNamespace'. [Log] Executing an expression of type 'ClassReferenceExpression'. [Error] Unexpected and unmanaged error has been detected : Unable to load the type 'Localization.L.BaZic.AbstractSyntaxTree'. Does an assembly is missing? "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); }
public async Task BaZicInterpreterLifeCycle() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 1 VARIABLE Var1 = 2 RETURN var1 + Var1 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); Assert.AreEqual(BaZicInterpreterState.Ready, interpreter.StateChangedHistory[0].State); Assert.AreEqual(BaZicInterpreterState.Preparing, interpreter.StateChangedHistory[1].State); Assert.AreEqual(BaZicInterpreterState.Running, interpreter.StateChangedHistory[12].State); Assert.AreEqual(BaZicInterpreterState.Idle, interpreter.StateChangedHistory.Last().State); await TestUtilities.TestAllRunningMode("3", inputCode); }
public async Task BinaryOperatorInterpreterOrders() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 2 * 3 + 1 # Should be 7 VARIABLE var2 = 1 + 3 * 2 # Should be 7 VARIABLE var3 = var1 = var2 # Should be True VARIABLE var4 = 2 * (3 + 1) # Should be 8 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var result = interpreter.GetStateChangedHistoryString(); Assert.IsTrue(result.Contains("[Log] Variable 'var1' declared. Default value : 7 (System.Int32)")); Assert.IsTrue(result.Contains("[Log] Variable 'var2' declared. Default value : 7 (System.Int32)")); Assert.IsTrue(result.Contains("[Log] Variable 'var3' declared. Default value : True (System.Boolean)")); Assert.IsTrue(result.Contains("[Log] Variable 'var4' declared. Default value : 8 (System.Int32)")); }
public async Task VariableReferenceInterpreterVariableNotFound() { var parser = new BaZicParser(); var inputCode = new BaZicProgram() .WithMethods(new EntryPointMethod() .WithBody( new ReturnStatement(new VariableReferenceExpression("var1")) )); var interpreter = new BaZicInterpreter(inputCode); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'ReturnStatement'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Error] The variable 'var1' does not exist or is not accessible. "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); }
public async Task IterationInterpreterInfiniteLoop() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE file = NEW System.IO.FileStream(""LocalWebPage.html"", System.IO.FileMode.OpenOrCreate) DO LOOP WHILE True RETURN 1 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); var t = interpreter.StartDebugAsync(true); await Task.Delay(3000); try { File.ReadAllText("LocalWebPage.html"); // Must crash. Assert.Fail(); } catch (IOException) { } catch { Assert.Fail(); } await interpreter.Stop(); var fileContent = File.ReadAllText("LocalWebPage.html"); Assert.IsTrue(interpreter.GetStateChangedHistoryString().Contains("[Log] The user requests to stop the interpreter as soon as possible.")); Assert.IsTrue(interpreter.State == BaZicInterpreterState.Stopped); Assert.IsFalse(string.IsNullOrWhiteSpace(fileContent)); }
public async Task BinaryOperatorInterpreterLogic() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = False OR (True AND False) # Should be False VARIABLE var2 = False OR (True AND True AND True) # Should be True VARIABLE var3 = False OR (True OR False) # Should be True VARIABLE var4 = True AND (True OR False) # Should be True VARIABLE var5 = True AND (False OR False) # Should be True END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var result = interpreter.GetStateChangedHistoryString(); Assert.IsNull(interpreter.Error); Assert.IsTrue(result.Contains("[Log] Variable 'var1' declared. Default value : False (System.Boolean)")); Assert.IsTrue(result.Contains("[Log] Variable 'var2' declared. Default value : True (System.Boolean)")); Assert.IsTrue(result.Contains("[Log] Variable 'var3' declared. Default value : True (System.Boolean)")); Assert.IsTrue(result.Contains("[Log] Variable 'var4' declared. Default value : True (System.Boolean)")); Assert.IsTrue(result.Contains("[Log] Variable 'var5' declared. Default value : False (System.Boolean)")); inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var4 = ""Hello"" AND True # Should fail END FUNCTION"; interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); result = interpreter.GetStateChangedHistoryString(); Assert.IsTrue(result.Contains("[Error] Unexpected and unmanaged error has been detected : Cannot implicitly convert type 'string' to 'bool'")); }
public async Task ProgramInterpreterInvokeExternMethodUI15() { var inputCode = @" EXTERN FUNCTION Main(args[]) END FUNCTION EXTERN FUNCTION Method1() VARIABLE var1 = Button1.Content IF var1 = ""Hello"" THEN Button1.Content = ""Hello World"" var1 = Button1.Content IF var1 = ""Hello World"" THEN RETURN TRUE END IF END IF RETURN FALSE END FUNCTION # The XAML will be provided separatly"; var xamlCode = @" <StackPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> <Button Name=""Button1"" Content=""Hello""/> </StackPanel>"; var task1 = Task.Run(() => { using (var interpreter = new BaZicInterpreter(inputCode, xamlCode)) { var result = interpreter.InvokeMethod(true, "Method1", true).Result; Assert.IsNull(result); Assert.AreEqual("The variable 'Button1' does not exist or is not accessible.", interpreter.Error.Exception.Message); var t = interpreter.StartDebugAsync(true); result = interpreter.InvokeMethod(true, "Method1", true).Result; Assert.AreEqual(true, result); } }); var task2 = Task.Run(() => { using (var interpreter = new BaZicInterpreter(inputCode, xamlCode)) { var errors = interpreter.Build().Result; Assert.IsNull(errors); var result = interpreter.InvokeMethod(true, "Method1", true).Result; Assert.IsNull(result); Assert.AreEqual("Object reference not set to an instance of an object.", interpreter.Error.Exception.InnerException.Message); var t = interpreter.StartReleaseAsync(true); result = interpreter.InvokeMethod(true, "Method1", true).Result; Assert.AreEqual(true, result); } }); var task3 = Task.Run(() => { using (var interpreter = new BaZicInterpreter(inputCode, xamlCode)) { var t = interpreter.StartReleaseAsync(true); var result = interpreter.InvokeMethod(true, "Method1", true).Result; Assert.AreEqual(true, result); } }); await Task.WhenAll(task1, task2, task3); }
public async Task ArrayIndexerInterpreter4() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE list[] = NEW [""Hello"", ""World""] list[0] = ""Hi"" list[""Hey""] = ""Hey"" list.Add(""Foo"") IF list.ContainsKey(3) AND list[3] = ""Foo"" THEN RETURN list END IF THROW NEW System.Exception(""The list does not contains a key equals to 3"") END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Hello' (System.String). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'World' (System.String). [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 2)). [Log] Variable 'list' declared. Default value : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 2)) [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'list['0' (type:System.Int32)]' to ''Hi' (type:System.String)'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Hi' (System.String). [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 2)). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '0' (System.Int32). [Log] 'list['0' (type:System.Int32)]' is now equal to 'Hi'(type:System.String) [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'list['Hey' (type:System.String)]' to ''Hey' (type:System.String)'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Hey' (System.String). [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 2)). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Hey' (System.String). [Log] 'list['Hey' (type:System.String)]' is now equal to 'Hey'(type:System.String) [Log] Executing a statement of type 'ExpressionStatement'. [Log] Executing an expression of type 'InvokeCoreMethodExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 3)). [Log] Executing the argument values of the method. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Foo' (System.String). [Log] The expression returned the value '' ({Null}). [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'InvokeCoreMethodExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 4)). [Log] Executing the argument values of the method. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '3' (System.Int32). [Log] The expression returned the value 'True' (System.Boolean). [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'ArrayIndexerExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 4)). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '3' (System.Int32). [Log] The expression returned the value 'Foo' (System.String). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'Foo' (System.String). [Log] Doing an operation 'Equality'. [Log] The expression returned the value 'True' (System.Boolean). [Log] Doing an operation 'LogicalAnd'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'ReturnStatement'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 4)). [Log] Return : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 4)) [Log] A Return statement or Break statement or Exception has been detected or thrown. Exiting the current block of statements. [Log] End of the execution of the method 'Main'. Returned value : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 4)) [State] Idle "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); var list = (Dictionary <object, object>)interpreter.ProgramResult; Assert.AreEqual(4, list.Count); Assert.AreEqual("Hi", list[0]); Assert.AreEqual("World", list[1]); Assert.AreEqual("Hey", list["Hey"]); Assert.AreEqual("Foo", list[3]); await TestUtilities.TestAllRunningMode("System.Collections.Generic.Dictionary`2[System.Object,System.Object]", inputCode); }
public async Task ProgramInterpreterInvokeExternMethod9() { var parser = new BaZicParser(); var inputCode = @" VARIABLE globVar = 1 EXTERN FUNCTION Main(args[]) END FUNCTION EXTERN FUNCTION Method1() globVar = globVar + 1 RETURN globVar END FUNCTION"; using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var t = interpreter.StartDebugAsync(true); var result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(2, result); result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(3, result); } using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(2, result); result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(3, result); } using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var errors = await interpreter.Build(); Assert.IsNull(errors); var t = interpreter.StartReleaseAsync(true); var result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(2, result); result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(3, result); } using (var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program)) { var errors = await interpreter.Build(); Assert.IsNull(errors); var result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(2, result); result = await interpreter.InvokeMethod(true, "Method1", true); Assert.AreEqual(3, result); } }
public async Task ConditionInterpreter() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 IF Not True THEN var1 = 1 ELSE IF var1 = NULL THEN var1 = 2 # Should go there END IF END IF RETURN var1 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Variable 'var1' declared. Default value : {Null} [Log] Executing a statement of type 'ConditionStatement'. [Log] Executing the condition 'NOT 'True' (type:System.Boolean)'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Registering labels. [Log] Executing a statement of type 'ConditionStatement'. [Log] Executing the condition 'var1 == {null}'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '' ({Null}). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '' ({Null}). [Log] Doing an operation 'Equality'. [Log] The expression returned the value 'True' (System.Boolean). [Log] Registering labels. [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to ''2' (type:System.Int32)'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '2' (System.Int32). [Log] Variable 'var1' value set to : 2 (System.Int32) [Log] 'var1' is now equal to '2'(type:System.Int32) [Log] End of the execution of the condition 'var1 == {null}'. [Log] End of the execution of the condition 'NOT 'True' (type:System.Boolean)'. [Log] Executing a statement of type 'ReturnStatement'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '2' (System.Int32). [Log] Return : 2 (System.Int32) [Log] A Return statement or Break statement or Exception has been detected or thrown. Exiting the current block of statements. [Log] End of the execution of the method 'Main'. Returned value : 2 (System.Int32) [State] Idle "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); await TestUtilities.TestAllRunningMode("2", inputCode); parser = new BaZicParser(); inputCode = @"EXTERN FUNCTION Main(args[]) IF ""Hello"" THEN END IF END FUNCTION"; interpreter = new BaZicInterpreter(parser.Parse(inputCode, false).Program); await interpreter.StartDebugAsync(true); expectedLogs = @"[Error] Unable to perform a condition statement without a boolean value as conditional expression result."; Assert.IsTrue(interpreter.GetStateChangedHistoryString().Contains(expectedLogs)); }
public async Task IterationInterpreterInlined() { var parser = new BaZicParser(); var inputCode = @"EXTERN FUNCTION Main(args[]) VARIABLE var1 = 0 DO WHILE var1 < 10 var1 = var1 + 1 VARIABLE x = 1 LOOP RETURN var1 END FUNCTION"; var interpreter = new BaZicInterpreter(parser.Parse(inputCode, true).Program); await interpreter.StartDebugAsync(true); var expectedLogs = @"[State] Ready [State] Preparing [Log] Reference assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' loaded in the application domain. [Log] Reference assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' loaded in the application domain. [Log] Reference assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Reference assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' loaded in the application domain. [Log] Declaring global variables. [Log] Program's entry point detected. [State] Running [Log] Preparing to invoke the method 'Main'. [Log] Executing the argument values of the method. [Log] Executing an expression of type 'ArrayCreationExpression'. [Log] The expression returned the value 'BaZicProgramReleaseMode.ObservableDictionary' (BaZicProgramReleaseMode.ObservableDictionary (length: 0)). [Log] Invoking the synchronous method 'Main'. [Log] Variable 'args' declared. Default value : {Null} [Log] Variable 'args' value set to : BaZicProgramReleaseMode.ObservableDictionary (BaZicProgramReleaseMode.ObservableDictionary (length: 0)) [Log] Registering labels. [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '0' (System.Int32). [Log] Variable 'var1' declared. Default value : 0 (System.Int32) [Log] Executing a statement of type 'LabelDeclaration'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '0' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '0' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'var1' value set to : 1 (System.Int32) [Log] 'var1' is now equal to '1'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' declared. Default value : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '2' (System.Int32). [Log] Variable 'var1' value set to : 2 (System.Int32) [Log] 'var1' is now equal to '2'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '2' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '2' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '3' (System.Int32). [Log] Variable 'var1' value set to : 3 (System.Int32) [Log] 'var1' is now equal to '3'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '3' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '3' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '4' (System.Int32). [Log] Variable 'var1' value set to : 4 (System.Int32) [Log] 'var1' is now equal to '4'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '4' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '4' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '5' (System.Int32). [Log] Variable 'var1' value set to : 5 (System.Int32) [Log] 'var1' is now equal to '5'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '5' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '5' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '6' (System.Int32). [Log] Variable 'var1' value set to : 6 (System.Int32) [Log] 'var1' is now equal to '6'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '6' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '6' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '7' (System.Int32). [Log] Variable 'var1' value set to : 7 (System.Int32) [Log] 'var1' is now equal to '7'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '7' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '7' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '8' (System.Int32). [Log] Variable 'var1' value set to : 8 (System.Int32) [Log] 'var1' is now equal to '8'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '8' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '8' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '9' (System.Int32). [Log] Variable 'var1' value set to : 9 (System.Int32) [Log] 'var1' is now equal to '9'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '9' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'True' (System.Boolean). [Log] The expression returned the value 'False' (System.Boolean). [Log] Executing a statement of type 'AssignStatement'. [Log] Assign 'var1' to 'var1 + '1' (type:System.Int32)'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '9' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Doing an operation 'Addition'. [Log] The expression returned the value '10' (System.Int32). [Log] Variable 'var1' value set to : 10 (System.Int32) [Log] 'var1' is now equal to '10'(type:System.Int32) [Log] Executing a statement of type 'VariableDeclaration'. [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '1' (System.Int32). [Log] Variable 'x' value set to : 1 (System.Int32) [Log] Executing a statement of type 'GoToLabelStatement'. [Log] Jumping to the label '_A'. [Log] Executing a statement of type 'LabelConditionStatement'. [Log] Executing an expression of type 'NotOperatorExpression'. [Log] Executing an expression of type 'BinaryOperatorExpression'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Executing an expression of type 'PrimitiveExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Doing an operation 'LessThan'. [Log] The expression returned the value 'False' (System.Boolean). [Log] The expression returned the value 'True' (System.Boolean). [Log] Jumping to the label '_B'. [Log] Executing a statement of type 'ReturnStatement'. [Log] Executing an expression of type 'VariableReferenceExpression'. [Log] The expression returned the value '10' (System.Int32). [Log] Return : 10 (System.Int32) [Log] A Return statement or Break statement or Exception has been detected or thrown. Exiting the current block of statements. [Log] End of the execution of the method 'Main'. Returned value : 10 (System.Int32) [State] Idle "; Assert.AreEqual(expectedLogs, interpreter.GetStateChangedHistoryString()); await TestUtilities.TestAllRunningMode("10", inputCode); }