|
|
|
@ -415,4 +415,67 @@ sayHi("Dear", "Reader");
|
|
|
|
System.setOut(standardOut)
|
|
|
|
System.setOut(standardOut)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
|
|
|
fun `Function should work with return statement`() {
|
|
|
|
|
|
|
|
val standardOut = System.out
|
|
|
|
|
|
|
|
val outputStreamCaptor = ByteArrayOutputStream()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.setOut(PrintStream(outputStreamCaptor))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
val code = """
|
|
|
|
|
|
|
|
fun fib(n) {
|
|
|
|
|
|
|
|
if (n <= 1) return n;
|
|
|
|
|
|
|
|
return fib(n - 1) + fib(n - 2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print fib(10);
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
val scanner = Scanner(code)
|
|
|
|
|
|
|
|
val tokens = scanner.scanTokens()
|
|
|
|
|
|
|
|
val parser = Parser(tokens)
|
|
|
|
|
|
|
|
val statements = parser.parse()
|
|
|
|
|
|
|
|
assertEquals(2, statements.size)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Interpreter().interpret(statements)
|
|
|
|
|
|
|
|
val output = outputStreamCaptor.toString().trim()
|
|
|
|
|
|
|
|
assertEquals("55", output)
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
System.setOut(standardOut)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
|
|
|
fun `Function should work with return statement in block`() {
|
|
|
|
|
|
|
|
val standardOut = System.out
|
|
|
|
|
|
|
|
val outputStreamCaptor = ByteArrayOutputStream()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.setOut(PrintStream(outputStreamCaptor))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
val code = """
|
|
|
|
|
|
|
|
fun fib(n) {
|
|
|
|
|
|
|
|
if (n <= 1) {
|
|
|
|
|
|
|
|
return n;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return fib(n - 1) + fib(n - 2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print fib(10);
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
val scanner = Scanner(code)
|
|
|
|
|
|
|
|
val tokens = scanner.scanTokens()
|
|
|
|
|
|
|
|
val parser = Parser(tokens)
|
|
|
|
|
|
|
|
val statements = parser.parse()
|
|
|
|
|
|
|
|
assertEquals(2, statements.size)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Interpreter().interpret(statements)
|
|
|
|
|
|
|
|
val output = outputStreamCaptor.toString().trim()
|
|
|
|
|
|
|
|
assertEquals("55", output)
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
System.setOut(standardOut)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|