def test_not_equal(): src = """ func main() { var a = 1; println(a != 1); } """ assert run_capture_stdout(src) == "False\n"
def test_rand_range(): src = """ func main() { var a: number = rand(1,4); println(a); } """ assert run_capture_stdout(src) in ["1\n", "2\n", "3\n", "4\n"]
def test_str_index(): src = """ func main() { var a: string = "Hello World"; println(a[4]); } """ assert run_capture_stdout(src) == "o\n"
def test_str_index_negative(): src = """ func main() { var a: string = "Hello World"; println(a[-1]); } """ assert run_capture_stdout(src) == "d\n"
def test_access_zeroed_array(): src = """ func main() { var a: array[100]; println(a[40]); } """ assert run_capture_stdout(src) == "0\n"
def test_rand_max(): src = """ func main() { var a: number = rand(2); println(a); } """ assert run_capture_stdout(src) in ["2\n", "1\n", "0\n"]
def test_smaller_or_equal(): src = """ func main() { var a = 1; println(a <= 2); println(a <= 0); } """ assert run_capture_stdout(src) == "True\nFalse\n"
def test_arithmetic_assignment_sub(): src = """ func main() { var a = 5; a -= 10; println(a); } """ assert run_capture_stdout(src) == "-5\n"
def test_arithmetic_sub_negative(): src = """ func main() { var a = 5; a = a--1; println(a); } """ assert run_capture_stdout(src) == "6\n"
def test_arithmetic_add_negative_no_space(): src = """ func main() { var a = 5; a = a + -1; println(a); } """ assert run_capture_stdout(src) == "4\n"
def test_arithmetic_mult(): src = """ func main() { var a = 5; a = a * 5; println(a); } """ assert run_capture_stdout(src) == "25\n"
def test_str_dynamic_index(): src = """ func main() { var a: string = "Hello World"; var i: number = 3 println(a[i]); } """ assert run_capture_stdout(src) == "l\n"
def test_string_concat_multi(): src = """ func main() { var a = "Hello"; a = a + " " + "World"; println(a); } """ assert run_capture_stdout(src) == "Hello World\n"
def test_func_call_2_params(): src = """ func hello(a: string, b: string): string { return "Sup"; } func main() { println(hello("Hello", "World")); } """ assert run_capture_stdout(src) == "Sup\n"
def test_implicit_number_return(): src = """ func add(a: number, b: number) { a + b; } func main() { println(add(5, 6)); } """ assert run_capture_stdout(src) == "11\n"
def test_implicit_string_return(): src = """ func hello(): string { "Hello"; } func main() { println(hello()); } """ assert run_capture_stdout(src) == "Hello\n"
def test_cursed_arrays(): src = """ func get_item(i: number) { if (i == 0) { return a; } if (i == 1) { return b; } if (i == 2) { return c; } } func set_item(i: number, value: number) { if (i == 0) { a = value; } if (i == 1) { b = value; } if (i == 2) { c = value; } } func main() { var max: number = 3; var a: number = 0; var b: number = 0; var c: number = 0; var i: number = 0; // Set array while (i < max) { set_item(i, i + 42); i = i + 1; } // Print array i = 0; while (i < max) { println(get_item(i)); i = i + 1; } } """ assert run_capture_stdout(src) == "42\n43\n44\n"
def test_nested_call_hell(): src = """ func a(n: number) { return b(n + 1); } func b(n: number) { return c(n + 1); } func c(n: number) { return d(n + 1); } func d(n: number) { return n + 1; } func main() { print(a(4)); } """ assert run_capture_stdout(src) == "8"
def test_init_array_with_value(): src = """ func main() { var a: array[100] = "[->+<]"; print(a[0]); print(a[1]); print(a[2]); print(a[3]); print(a[4]); print(a[5]); } """ assert run_capture_stdout(src) == "[->+<]"
def test_increment_in_parent_scope(): src = """ func main() { var a = 0; incr_a(); // This will print '10'. println(a); } func incr_a() { a = a + 1; a = a + 9; } """ assert run_capture_stdout(src) == "10\n"
def test_string_concat_func(): src = """ func say_hello_to(name: string): string { return "Hello " + name; } func ask(question: string): string { return "The computer asks you: " + question; } func main() { println(say_hello_to("Kereltje") + "\\n" + ask("How is the weather?")); } """ assert run_capture_stdout(src) == "15\n"
def test_set_array(): src = """ func main() { var a: array[100]; a[40] = "H"; a[41] = "e"; a[42] = "l"; a[43] = "l"; a[44] = "o"; var i: number = 40; while (i <= 44) { print(a[i]); i = i + 1; } } """ assert run_capture_stdout(src) == "Hello"
def test_increment_in_scope(): src = """ func main() { var a = 0; incr_a(); // This will print '0'. println("main:"); println(a); } func incr_a() { var a = 0; a = a + 1; a = a + 9; println("incr_a:"); println(a); } """ assert run_capture_stdout(src) == "incr_a:\n10\nmain:\n0\n"
def test_multi_scope(): src = """ func main() { var a = "Root"; { var a = "First"; println(a); } { var a = "Second"; println(a); } { println(a); } println(a); } """ assert run_capture_stdout(src) == "First\nSecond\nRoot\nRoot\n"
def test_odd_even(): src = """ func odd(n:number):bool{ if(n==0){return false;} return even(n - 1);} func even(n: number): bool { if (n == 0) { return true; } return odd(n - 1); } func main() { println(odd(4)); println(odd(5)); println(even(4)); println(even(5)); } """ assert run_capture_stdout(src) == "false\ntrue\ntrue\nfalse\n"
def test_array_len(): src = """ func array_length(a: array) { var len: number = 0; while (true) { # We can't inline the 'a[len]' line in the condition, because this language is shit. var c = a[len]; if (c == 0) { return len; } len = len + 1; } } func main() { var arr: array[300] = "Hello world"; println(array_length(arr)); } """ assert run_capture_stdout(src) == "11\n"
def test_manual_division(): src = """ func division(a: number, b: number): number { var c: number = 0; a = a - b; while (a >= 0) { a = a - b; c = c + 1; } return c; } func main() { println(division(10,1)); println(division(10,2)); println(division(10,3)); println(division(10,10)); println(division(10,20)); } """ assert run_capture_stdout(src) == "10\n5\n3\n1\n0\n"
def test_brainfuck(): src = """ func array_length(a: array) { var len: number = 0; while (true) { # We can't inline the 'a[len]' line in the condition. var c = a[len]; if (c == 0) { return len; } len = len + 1; } } func main() { var program: array[300] = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; var cells: array[30000]; var op_ptr: number = 0; var cell_ptr : number = 0; var len = array_length(program); //print("Program length: "); //println(len); while (op_ptr < len) { var command = program[op_ptr]; if (command == ">") { cell_ptr = cell_ptr + 1; } if (command == "<") { cell_ptr = cell_ptr - 1; } if (command == "+") { var t = cells[cell_ptr]; t = t + 1; if (t > 255) { t = 0; } cells[cell_ptr] = t; } if (command == "-") { var t = cells[cell_ptr]; t = t - 1; if (t < 0) { t = 255; } cells[cell_ptr] = t; } if (command == ".") { print(cells[cell_ptr]); } // command == "," is not supported, because we don't have a stdin if (command == "[") { var t = cells[cell_ptr]; if (t == 0) { # Not implemented return 1; } } if (command == "]") { var t = cells[cell_ptr]; if (t != 0) { # Not implemented return 1; } } op_ptr = op_ptr + 1; } } """ assert run_capture_stdout(src) == "Hello World!"