def test_max(self): s = 'a = 1;' \ 'b = 3;' \ 'ret max(a, b);' self.assertEqual(3, interpret(s).to_py()) s = 'ret max([], [1]);' self.assertEqual([[1]], interpret(s).to_py()) s = 'a = "";' \ 'b = "a";' \ 'ret max(a, b);' self.assertEqual('a', interpret(s).to_py()) s = 'max(1, []);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPES_MAX) s = 'a = "a";' \ 'max(1, a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPES_MAX) s = 'a = "a";' \ 'max(a, []);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPES_MAX)
def test_round(self): s = 'a = 4.5;' \ 'ret round(a);' self.assertEqual(round(4.5), interpret(s).to_py()) s = 'a = 4.4;' \ 'ret round(a);' self.assertEqual(round(4.4), interpret(s).to_py()) s = 'a = 4.8;' \ 'ret round(a);' self.assertEqual(round(4.8), interpret(s).to_py()) s = 'a = 4.0;' \ 'ret round(a);' self.assertEqual(round(4.0), interpret(s).to_py()) s = 'a = [1, 2; 3, 4];' \ 'ret round(a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_ROUND) s = 'a = "a";' \ 'ret round(a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_ROUND)
def test_min(self): s = 'a = 1;' \ 'b = 3;' \ 'ret min(a, b);' self.assertEqual(1, interpret(s).to_py()) s = 'ret min([1], [1, 2, 3]);' self.assertEqual([[1]], interpret(s).to_py()) s = 'a = "";' \ 'b = "a";' \ 'ret min(a, b);' self.assertEqual('', interpret(s).to_py()) s = 'min(1, []);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPES_MIN) s = 'a = "a";' \ 'min(1, a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPES_MIN) s = 'a = "a";' \ 'min(a, []);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPES_MIN)
def test_change_global_var_inside_local_scope(self): s = 'a = 32;' \ '{' \ ' a = 0;' \ '}' \ 'ret a;' self.assertNotEqual(32, interpret(s).to_py()) self.assertEqual(0, interpret(s).to_py())
def test_single_idx(self): s = 'a = [1, 2, 3];' \ 'ret a[2];' self.assertEqual(3, interpret(s).to_py()) s = 'a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];' \ 'ret a[7];' self.assertEqual(8, interpret(s).to_py())
def test_double_idx(self): s = 'a = [1, 2, 3;' \ ' 3, 4, 5];' \ 'ret a[0, 2];' self.assertEqual(3, interpret(s).to_py()) s = 'a = [1, 2, 3;' \ ' 3, 4, 5];' \ 'ret a[1, 1];' self.assertEqual(4, interpret(s).to_py())
def test_column_colon_index(self): s = 'a = [1, 2, 3;' \ ' 4, 5, 6;' \ ' 7, 8, 9];' \ 'ret a[1, :];' self.assertEqual([[4, 5, 6]], interpret(s).to_py()) s = 'a = [1, 2, 3;' \ ' 4, 5, 6;' \ ' 7, 8, 9];' \ 'ret a[2, :];' self.assertEqual([[7, 8, 9]], interpret(s).to_py())
def test_row_colon_index(self): s = 'a = [1, 2, 3;' \ ' 4, 5, 6;' \ ' 7, 8, 9];' \ 'ret a[:, 0];' self.assertEqual([[1, 4, 7]], interpret(s).to_py()) s = 'a = [1, 2, 3;' \ ' 4, 5, 6;' \ ' 7, 8, 9];' \ 'ret a[:, 2];' self.assertEqual([[3, 6, 9]], interpret(s).to_py())
def test_single_idx_multiple_rows(self): s = 'a = [2, 4, 5;' \ ' 4, 7, 2;' \ ' 1, 72, 2];' \ 'ret a[7];' self.assertEqual(72, interpret(s).to_py()) s = 'a = [2, 4, 5, 2, 5, 7, 23;' \ ' 4, 7, 2, 2, 11, 34, 3;' \ ' 1, 72, 2, 7, 1, 0, 1];' \ 'ret a[12];' self.assertEqual(34, interpret(s).to_py())
def test_global_var_and_param(self): s = 'fun f(a) {' \ ' a = 1;' \ '}' \ 'a = 0;' \ 'f(1);' \ 'ret a;' self.assertEqual(0, interpret(s).to_py()) s = 'a = 0;' \ 'fun f(a)' \ ' a = 1;' \ 'f(1);' \ 'ret a;' self.assertEqual(0, interpret(s).to_py())
def test_string_as_argument(self): s = 'a = 0;' \ 'fun some_fun(s)' \ ' a = s;' \ 'some_fun("Hello");' \ 'ret a;' self.assertEqual('Hello', interpret(s).to_py())
def test_double_colon_index(self): s = 'a = [1, 2, 3;' \ ' 4, 5, 6;' \ ' 7, 8, 9];' \ 'ret a[:, :];' self.assertEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9]], interpret(s).to_py())
def test_false_condition(self): s = 'a = 10;' \ 'do {' \ ' a = a - 1;' \ '} while (a < 0);' \ 'ret a;' self.assertEqual(9, interpret(s).to_py())
def test_shape(self): s = 'ret shape([1, 2, 3; 4, 5, 6]);' self.assertEqual([[2, 3]], interpret(s).to_py()) s = 'ret shape(shape([1]));' self.assertEqual([[1, 2]], interpret(s).to_py()) s = 'shape(2);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_SHAPE) s = 'a = "a";' \ 'shape(a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_SHAPE)
def test_multirow_addition(self): s = 'a = [1; 2; 3; 4];' \ 'b = [4; 3; 2; 1];' \ 'ret a + b;' m = interpret(s) self.assertEqual((4, 1), m.shape) m = m.to_py() self.assertEqual([[5], [5], [5], [5]], m)
def test_add_nested_matrices(self): s = 'a = [1, [1, 2], 2];' \ 'b = [10, [1, 2], 3];' \ 'ret a + b;' m = interpret(s) self.assertEqual((1, 3), m.shape) m = m.to_py() self.assertEqual([[11, [[2, 4]], 5]], m)
def test_transpose(self): s = 'ret transpose([1, 2]);' self.assertEqual([[1], [2]], interpret(s).to_py()) s = 'ret transpose([1; 2]);' self.assertEqual([[1, 2]], interpret(s).to_py()) s = 'transpose(1);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_TRANSPOSE) s = 'a = "a";' \ 'transpose(a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_TRANSPOSE)
def test_simple(self): s = 'a = [1, 2];' \ 'b = [2, 4];' \ 'ret a + b;' m = interpret(s) self.assertEqual((1, 2), m.shape) m = m.to_py() self.assertEqual([[3, 6]], m)
def test_simple(self): s = 'a = 10;' \ 'while (a > 0) {' \ ' #print(a);\n' \ ' a = a - 1;' \ '}' \ 'ret a;' self.assertEqual(0, interpret(s).to_py())
def test_else_statement(self): s = 'a = 0;' \ 'if (1<0)' \ ' ;' \ 'else' \ ' a = a - 1;' \ 'ret a;' self.assertEqual(-1, interpret(s).to_py())
def test_factorial(self): s = 'fun factorial(n) {' \ ' if (n < 2)' \ ' ret 1;' \ ' else' \ ' ret n * factorial(n-1);' \ '}' \ 'ret factorial(10);' self.assertEqual(3628800, interpret(s).to_py())
def test_else_scope(self): s = 'a = 50;' \ 'b = 0;' \ 'if (a > 18) {' \ ' if (a < 48)' \ ' b = 1;' \ '}' \ 'else' \ ' b = 3;' \ 'ret b;' self.assertEqual(0, interpret(s).to_py())
def test_abs(self): s = 'a = -1;' \ 'ret abs(a);' self.assertEqual(1, interpret(s).to_py()) s = 'a = 1;' \ 'ret abs(a);' self.assertEqual(1, interpret(s).to_py()) s = 'a = [-1, -2];' \ 'abs(a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_ABS) s = 'a = "string";' \ 'abs(a);' should_fail(self, s, expected_error_code=ErrorCode.UNSUPPORTED_TYPE_ABS)
def test_len(self): s = 'a = [];' \ 'ret len(a);' self.assertEqual(0, interpret(s).to_py()) s = 'a = [1, 2, 3;' \ ' 4, 5, 6];' \ 'ret len(a);' self.assertEqual(6, interpret(s).to_py()) s = 'ret len("Hello");' self.assertEqual(5, interpret(s).to_py()) s = 'a = "Hello";' \ 'ret len(a);' self.assertEqual(5, interpret(s).to_py()) s = 'a = 1;' \ 'ret len(a);' should_fail(self, s, expected_error_code=ErrorCode.SCALAR_LEN)
def test_recursion_depth(self): s = 'fun recursion(depth) {' \ ' if (depth > 0) {' \ ' depth = depth - 1;' \ ' recursion(depth);' \ ' }' \ '}' \ 'recursion(100);' should_fail(self, s, expected_error_code=ErrorCode.MAX_RECURSION_DEPTH_EXCEED, expected_id='recursion') s = 'fun recursion(depth) {' \ ' if (depth > 0) {' \ ' depth = depth - 1;' \ ' recursion(depth);' \ ' }' \ '}' \ 'recursion(99);' interpret(s)
def test_scopes(self): s = 'a = 0;' \ 'fun f(a)' \ ' a = a + 1;' \ 'f(1);' \ 'ret a;' self.assertEqual(0, interpret(s).to_py()) s = 'a = 0;' \ 'fun f(a)' \ ' a = a + 1;' \ 'f(a);' \ 'ret a;' self.assertEqual(0, interpret(s).to_py()) s = 'a = 0;' \ 'fun f(a)' \ ' ret a + 1;' \ 'a = f(a);' \ 'ret a;' self.assertEqual(1, interpret(s).to_py())
def test_created_scope(self): s = 'if (1>0)' \ ' b = 0;' \ 'ret b;' self.assertEqual(0, interpret(s).to_py()) s = 'if (1>0) {' \ ' b = 0;' \ '}' \ 'ret b;' should_fail(self, s, expected_error_code=ErrorCode.ID_NOT_FOUND, expected_id='b')
def test_nested_if_statements(self): s = 'a = 40;' \ 'b = 0;' \ 'if (a > 18)' \ ' if (a < 48)' \ ' b = 1;' \ ' else' \ ' b = 2;' \ 'else' \ ' b = 3;' \ 'ret b;' self.assertEqual(1, interpret(s).to_py()) s = 'a = 50;' \ 'b = 0;' \ 'if (a > 18)' \ ' if (a < 48)' \ ' b = 1;' \ ' else' \ ' b = 2;' \ 'else' \ ' b = 3;' \ 'ret b;' self.assertEqual(2, interpret(s).to_py()) s = 'a = 18;' \ 'b = 0;' \ 'if (a > 18)' \ ' if (a < 48)' \ ' b = 1;' \ ' else' \ ' b = 2;' \ 'else' \ ' b = 3;' \ 'ret b;' self.assertEqual(3, interpret(s).to_py())
def test_change_global_var_inside_nested_local_scope(self): s = 'a = 22;' \ '{' \ ' b = 0;' \ ' {' \ ' a = 0;' \ ' b = 1;' \ ' {' \ ' a = b;' \ ' }' \ ' a = a + 2;' \ ' }' \ ' a = a + b;' \ '}' \ 'ret a;' self.assertEqual(4, interpret(s).to_py())
def test_print(self): import io from contextlib import redirect_stdout with io.StringIO() as buf, redirect_stdout(buf): s = 'a = [1, 2, 3, 4];' \ 'print(a);' interpret(s) self.assertEqual('[[1.0, 2.0, 3.0, 4.0]]\n', buf.getvalue()) with io.StringIO() as buf, redirect_stdout(buf): s = 'print("Hello world!");' interpret(s) self.assertEqual('Hello world!\n', buf.getvalue()) with io.StringIO() as buf, redirect_stdout(buf): s = 'a = "Hello world!";' \ 'print(a, a, a, a, a);' interpret(s) self.assertEqual('Hello world! ' * 4 + 'Hello world!\n', buf.getvalue())