示例#1
0
 def test_stores_the_right_value_for_strings(self):
     ev = OpalEvaluator()
     ev.evaluate('gamma = "bon appetit"', run=False)
     str(ev.llvm_mod).should.contain('%gamma = alloca [12 x i8]*')
     str(ev.llvm_mod).should.contain(
         'store [12 x i8]* @str_2f274d89cb7f072099747f894e80986616b2e81cc8e02711ef7c78db956d1fca, [12 x i8]** %gamma'
     )
示例#2
0
    def setup_class(cls):
        expr = f"""
        class Object
        end
        """

        evaluator = OpalEvaluator()
        evaluator.evaluate(expr, run=False)
        cls.code = str(evaluator.codegen)
示例#3
0
    def test_works_for_booleans(self):
        expr = f"print(true)"

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('true')
示例#4
0
    def test_works_for_arithmetics_with_parenthesis(self):
        expr = f"print(1000 / (10 - 80) + 22)"

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('8')
示例#5
0
    def test_simple_division(self):
        """
        Wrong configuration on Lark lead to parser ambiguity errors
        """
        expr = """
        10 / 2
        """

        ev = OpalEvaluator()

        ev.evaluate(expr)
示例#6
0
    def test_works_for_floats(self):
        expr = f"print(432.108)"

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('432.108')
示例#7
0
    def test_works_for_integers(self):
        expr = f"print(432234)"

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('432234')
示例#8
0
    def test_works_for_strings(self):
        opal_string = 'something something complete..'

        expr = f"""'{opal_string}'
        """
        ev = OpalEvaluator()
        ev.evaluate(expr)

        global_str_constant = r'@"str_[0-9a-fA-F]+" = private unnamed_addr constant \[31 x i8\] c"%s\\00"' % opal_string

        str(ev.codegen).should.match(global_str_constant)
示例#9
0
 def setup_class(cls):
     expr = f"""
     class {cls.parent_class_name}
     end
     
     class {cls.class_name} < {cls.parent_class_name}
     end
     """
     evaluator = OpalEvaluator()
     evaluator.evaluate(expr, run=False)
     cls.code = str(evaluator.codegen)
示例#10
0
    def test_works_for_strings(self):
        something_complete = f"""printing string"""
        expr = f"""print('%s')
        """ % something_complete

        ev = OpalEvaluator()
        ev.evaluate(expr, run=False)

        global_str_constant = \
            fr'@"str_[0-9a-fA-F]+" = private unnamed_addr constant \[16 x i8\] c"{something_complete}\\00"'

        str(ev.codegen).should.match(global_str_constant)
        str(ev.codegen).should.contain('%".3" = call i32 @"puts"(i8* %".2")')
示例#11
0
    def test_should_work_for_less_than(self):
        expr = f"""
        print(2 < 1)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('false')
示例#12
0
    def test_works_for_integers(self):
        expr = """
        alpha = 123
        print(alpha)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('123')
示例#13
0
    def test_works_for_strings(self):
        expr = """
        gamma = "so be it"
        print(gamma)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('so be it')
示例#14
0
    def test_works_for_floats(self):
        expr = """
        beta = 12.3
        print(beta)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('12.3')
示例#15
0
    def test_should_work_for_equality(self):
        expr = f"""
        print(3 == 3)
        print(3 == 8)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('true')
        out.should.contain('false')
示例#16
0
    def test_should_work_for_float_inequality(self):
        expr = f"""
        print(3.0 != 3.0)
        print(0.3 != 0.8)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('false')
        out.should.contain('true')
示例#17
0
    def test_should_work_for_both_floats_greater_and_less_than(self):
        expr = f"""
        print(3.0 < 10.1)
        print(20.4 < 5.4)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('false')
        out.should.contain('true')
示例#18
0
    def test_should_work_for_both_integers_greater_and_less_than_equal(self):
        expr = f"""
        print(3 <= 10)
        print(20 <= 5)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('false')
        out.should.contain('true')
示例#19
0
    def test_works_for_multiple_strings(self):
        str1 = 'something special'
        str2 = 'something different'

        expr = f"""print('%s')
        print('%s')
        """ % (str1, str2)
        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain(str1)
        out.should.contain(str2)
示例#20
0
    def test_works_for_booleans(self):
        expr = """
        delta = true
        print(delta)
        zeta = false
        print(zeta)
        """

        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('true')
        out.should.contain('false')
示例#21
0
    def test_twice_just_creates_one_constant(self):
        str1 = f"same thing printed twice"

        expr = f"""
        print('{str1}')
        print('{str1}')
        """
        ev = OpalEvaluator()

        with pipes() as (out, _):
            ev.evaluate(expr)

        out = out.read()

        out.should.contain('same thing printed twice')

        const_string_declaration_regex = r'(@"str_[0-9a-fA-F]+" =)'
        re.findall(const_string_declaration_regex,
                   str(ev.codegen),
                   flags=re.MULTILINE).should.have.length_of(1)
示例#22
0
 def test_works_when_adding_integers(self):
     for expr in ['3 - 4', '3 + 4', '3 * 4', '3 / 4']:
         ev = OpalEvaluator()
         ev.evaluate(expr)
示例#23
0
 def test_stores_the_right_value_for_floats(self):
     ev = OpalEvaluator()
     ev.evaluate('beta = 2.3', run=False)
     str(ev.llvm_mod).should.contain('%beta = alloca double')
     str(ev.llvm_mod).should.contain(
         'store double 2.300000e+00, double* %beta')
示例#24
0
 def test_stores_the_right_value_for_ints(self):
     ev = OpalEvaluator()
     ev.evaluate('alpha = 1', run=False)
     str(ev.llvm_mod).should.contain('%alpha = alloca i32')
     str(ev.llvm_mod).should.contain('store i32 1, i32* %alpha')
示例#25
0
 def test_includes_int_to_c_function(self):
     ev = OpalEvaluator()
     ev.evaluate('1 / 1', run=False)
     # noinspection PyStatementEffect
     ev.llvm_mod.get_function('int_to_string').should.be.truthy
示例#26
0
 def test_works_when_adding_float(self):
     for expr in ['3.1 - 4.3', '3.3 + 4.4', '23.1 * 4.2', '3.22 / 2.4']:
         ev = OpalEvaluator()
         ev.evaluate(expr)
示例#27
0
 def test_works_for_multi_line(self):
     expr = """
     3 + 4 * 6 + (4 / 2)
     """
     ev = OpalEvaluator()
     ev.evaluate(expr)