Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #4
0
 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())
Exemple #5
0
    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())
Exemple #6
0
    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())
Exemple #7
0
    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())
Exemple #8
0
    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())
Exemple #9
0
    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())
Exemple #10
0
    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())
Exemple #11
0
 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())
Exemple #12
0
 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())
Exemple #13
0
 def test_false_condition(self):
     s = 'a = 10;' \
         'do {' \
         '   a = a - 1;' \
         '} while (a < 0);' \
         'ret a;'
     self.assertEqual(9, interpret(s).to_py())
Exemple #14
0
    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)
Exemple #15
0
 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)
Exemple #16
0
 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)
Exemple #17
0
    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)
Exemple #18
0
 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)
Exemple #19
0
 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())
Exemple #20
0
 def test_else_statement(self):
     s = 'a = 0;' \
         'if (1<0)' \
         '   ;' \
         'else' \
         '   a = a - 1;' \
         'ret a;'
     self.assertEqual(-1, interpret(s).to_py())
Exemple #21
0
 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())
Exemple #22
0
 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())
Exemple #23
0
    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)
Exemple #24
0
    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)
Exemple #25
0
    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)
Exemple #26
0
    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())
Exemple #27
0
    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')
Exemple #28
0
    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())
Exemple #29
0
 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())
Exemple #30
0
    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())