using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Collections.Generic; namespace YesNt.Interpreter.Tests; [TestClass] public class FunctionStatementsTests { [TestMethod] public void FunctionCallWithInParameterTest() { List lines = [ "goto main", "func echo:", "global result = %in", "return", "label main:", "call echo with hello", "${result}" ]; YesNtAssert.IsLastLineEqual(lines, "hello"); } [TestMethod] public void HasInAndHasOutTokensTest() { List lines = [ "goto main", "func probe:", "global hasInBefore = %has_in", "var consume = %in", "global hasInAfter = %has_in", "push_out ${hasInBefore}", "push_out ${hasInAfter}", "return", "label main:", "call probe with x", "var hasOut = %has_out", "${hasOut}" ]; YesNtAssert.IsLastLineEqual(lines, "True"); } [TestMethod] public void OutParameterReadTest() { List lines = [ "goto main", "func make:", "push_out out_value", "return", "label main:", "call make with anything", "var value = %out", "${value}" ]; YesNtAssert.IsLastLineEqual(lines, "out_value"); } [TestMethod] public void OutParameterWithoutValueFailsTest() { List lines = [ "var x = %out" ]; YesNtAssert.ContainsTerminationMessage(lines, "No out argument in stack"); } [TestMethod] public void InParameterOutsideFunctionFailsTest() { List lines = [ "var x = %in" ]; YesNtAssert.ContainsTerminationMessage(lines, "Statement not allowed outside of function"); } [TestMethod] public void ReturnOutsideFunctionFailsTest() { List lines = [ "return" ]; YesNtAssert.ContainsTerminationMessage(lines, "Statement not allowed outside of function"); } [TestMethod] public void PushOutOutsideFunctionFailsTest() { List lines = [ "push_out value" ]; YesNtAssert.ContainsTerminationMessage(lines, "Statement not allowed outside of function"); } [TestMethod] public void FunctionWithoutColonFailsTest() { List lines = [ "func missing" ]; YesNtAssert.ContainsTerminationMessage(lines, "Invalid statement"); } [TestMethod] public void NestedFunctionDefinitionFailsTest() { List lines = [ "func outer:", "func inner:", "return" ]; YesNtAssert.ContainsTerminationMessage(lines, "Nested functions are not allowed"); } [TestMethod] public void ClearCallStackRunsTest() { List lines = [ "clear_call_stack", "var result = ok", "${result}" ]; YesNtAssert.IsLastLineEqual(lines, "ok"); } }