Example #1
0
def test_comment2():
    program = parse_string("\tplaceholder (42) ; This is the answer")

    stmt = program[0].statement_list.value[0]
    operands = stmt.operands
    assert isinstance(operands, ParserAST.ExpressionList)
    assert operands.value[0].eval() == 42
Example #2
0
def test_multiple_statements5():
    lexer = Lexer.CreateLexer()
    parser = Parser.CreateParser()

    try:
        program = parse_string("\tnop : bra :")
    except Parser.ParseError:
        pass
Example #3
0
def test_multiple_statements4():
    lexer = Lexer.CreateLexer()
    parser = Parser.CreateParser()

    try:
        program = parse_string("\tnop : jmp $03: 1234 : bra : bcc")
    except Parser.ParseError:
        pass
Example #4
0
def test_parser_negative_oct1():
    for i in range(0, 1000):
        program = parse_string("\tplaceholder -0o{:o}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert expression.eval() == -i
        assert expression.collapse().eval() == -i
        assert expression.value.base == 'oct'
Example #5
0
def test_parser_oct2():
    for i in range(0, 1000):
        program = parse_string("\tplaceholder &{:o}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.Number)
        assert expression.eval() == i
        assert expression.base == 'oct'
Example #6
0
def test_parser_negative_dec1():
    for i in range(0, 1000):
        program = parse_string("\tplaceholder -{}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.UnaryOp_Negate) and isinstance(expression.value, ParserAST.Number)
        assert expression.eval() == -i
        assert expression.collapse().eval() == -i
        assert expression.value.base == 'dec'
Example #7
0
def test_parser_negative_hex1():
    for i in range(0, 1000):
        program = parse_string("\tplaceholder -${:x}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.UnaryOp_Negate) and isinstance(expression.value, ParserAST.Number)
        assert expression.eval() == -i
        assert expression.collapse().eval() == -i
        assert expression.value.base == 'hex'
        #if i < 256:
        #    assert expression.stated_byte_size == 1, str(i)
        #else:
        #    assert expression.stated_byte_size == 2, str(i)
        program = parse_string("\tplaceholder -0x{:X}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.UnaryOp_Negate) and isinstance(expression.value, ParserAST.Number)
        assert expression.eval() == -i
        assert expression.collapse().eval() == -i
        assert expression.value.base == 'hex'
        #if i < 256:
        #    assert expression.stated_byte_size == 1, str(i)
        #else:
        #    assert expression.stated_byte_size == 2, str(i)
    program = parse_string("\tplaceholder -0x00F")
    statement = program[0].statement_list.value[0]
    assert isinstance(statement, ParserAST.Statement)
    operands = statement.operands
    assert isinstance(operands, ParserAST.ExpressionList)
    expression = operands.value[0]
    assert isinstance(expression, ParserAST.UnaryOp_Negate) and isinstance(expression.value, ParserAST.Number)
    assert expression.eval() == -0xF
    assert expression.value.base == 'hex'
Example #8
0
def test_expression_list():
    program = parse_string("\tplaceholder (5, 10 * 2), 15")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList) and len(program_ast.value) == 2 \
           and isinstance(program_ast.value[0], ParserAST.ExpressionList) \
           and isinstance(program_ast.value[1], ParserAST.Number) \
           and isinstance(program_ast.value[0].value[0], ParserAST.Number) \
           and isinstance(program_ast.value[0].value[1], ParserAST.BinaryOp_Mul)
    assert program_ast.eval() == [[5, 20], 15]
Example #9
0
def test_parens2():
    program = parse_string("\tplaceholder (42 - -8)")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.ExpressionList) and isinstance(
        program_ast.value[0], ParserAST.BinaryOp_Sub)
    assert program_ast.eval() == 50
Example #10
0
def test_parser_hex1():
    for i in range(0, 1000):
        program = parse_string("\tplaceholder ${:x}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.Number)
        assert expression.eval() == i
        assert expression.base == 'hex'
        if i < 256:
            assert expression.stated_byte_size == 1, str(i)
        else:
            assert expression.stated_byte_size == 2, str(i)
        program = parse_string("\tplaceholder 0x{:X}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.Number)
        assert expression.eval() == i
        assert expression.base == 'hex'
        if i < 256:
            assert expression.stated_byte_size == 1, str(i)
        else:
            assert expression.stated_byte_size == 2, str(i)
    program = parse_string("\tplaceholder 0x00F")
    statement = program[0].statement_list.value[0]
    assert isinstance(statement, ParserAST.Statement)
    operands = statement.operands
    assert isinstance(operands, ParserAST.ExpressionList)
    expression = operands.value[0]
    assert isinstance(expression, ParserAST.Number)
    assert expression.eval() == 0xF
    assert expression.base == 'hex'
    assert expression.stated_byte_size == 2, str(i)
Example #11
0
def test_parens1():
    program = parse_string("\tplaceholder (42)")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    # twice, because parenthesis only hold expression lists
    assert isinstance(program_ast, ParserAST.ExpressionList) and isinstance(
        program_ast.value[0], ParserAST.Number)
    assert program_ast.eval() == 42
Example #12
0
def test_parser_hex2():
    import random
    for i in range(0, 256):
        b = random.randrange(0, 0xFFFF)
        program = parse_string("\tplaceholder ${:02x}:{:04x}".format(i, b))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert isinstance(expression, ParserAST.Number)
        assert expression.eval() == ((i << 16) | b)
        assert expression.base == 'hex'
        assert expression.stated_byte_size == 3, str(i)
Example #13
0
def test_parser_bin2():
    for i in range(0, 512):
        program = parse_string("\tplaceholder %{:b}".format(i))
        statement = program[0].statement_list.value[0]
        assert isinstance(statement, ParserAST.Statement)
        operands = statement.operands
        assert isinstance(operands, ParserAST.ExpressionList)
        expression = operands.value[0]
        assert expression.eval() == i
        assert expression.base == 'bin'
        if i < 256:
            assert expression.stated_byte_size == 1, str(i)
        else:
            assert expression.stated_byte_size == 2, str(i)
Example #14
0
def test_parens4():
    program = parse_string("\tplaceholder -((5 * 5) * (3 + 1))")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.UnaryOp_Negate) and isinstance(program_ast.value, ParserAST.ExpressionList) \
           and isinstance(program_ast.value.value[0], ParserAST.BinaryOp_Mul) \
           and isinstance(program_ast.value.value[0].left, ParserAST.ExpressionList) \
           and isinstance(program_ast.value.value[0].right, ParserAST.ExpressionList)
    assert program_ast.eval() == -100
Example #15
0
def test_parens3():
    program = parse_string("\tplaceholder -(5 * 5) * 3")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Mul) and isinstance(
        program_ast.left, ParserAST.UnaryOp_Negate) and isinstance(
            program_ast.left.value, ParserAST.ExpressionList)
    assert program_ast.left.value.eval() == 25
    assert program_ast.eval() == -75
Example #16
0
def test_or():
    program = parse_string("\tplaceholder 0b1111_0001 | 0xAF")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Or) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 0xFF
    assert program_ast.left.eval() == 0xF1
    assert program_ast.right.eval() == 0xAF
Example #17
0
def test_not():
    program = parse_string("\tplaceholder ~0b1111_0001 | ~0xAF")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Or) and isinstance(
        program_ast.left, ParserAST.UnaryOp_Not) and isinstance(
            program_ast.right, ParserAST.UnaryOp_Not)
    assert program_ast.eval() == 0x5E
    assert program_ast.left.eval() == 0x0E
    assert program_ast.right.eval() == 0x50
Example #18
0
def test_power():
    program = parse_string("\tplaceholder 3 ** 4")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Pow) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 81
    assert program_ast.left.eval() == 3
    assert program_ast.right.eval() == 4
Example #19
0
def test_modulus():
    program = parse_string("\tplaceholder 117 % 6")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Mod) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 3
    assert program_ast.left.eval() == 117
    assert program_ast.right.eval() == 6
Example #20
0
def test_addition():
    program = parse_string("\tplaceholder 5 + 42")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Add) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 47
    assert program_ast.left.eval() == 5
    assert program_ast.right.eval() == 42
Example #21
0
def test_division():
    program = parse_string("\tplaceholder 169 / 3")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Div) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 56
    assert program_ast.left.eval() == 169
    assert program_ast.right.eval() == 3
Example #22
0
def test_subtraction():
    program = parse_string("\tplaceholder 114-32")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Sub) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 82
    assert program_ast.left.eval() == 114
    assert program_ast.right.eval() == 32
Example #23
0
def test_multiplication():
    program = parse_string("\tplaceholder 71 *9")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Mul) and isinstance(
        program_ast.left, ParserAST.Number) and isinstance(
            program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 639
    assert program_ast.left.eval() == 71
    assert program_ast.right.eval() == 9
Example #24
0
def test_unary_addition():
    program = parse_string("\tplaceholder -5 + +42")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(program_ast, ParserAST.BinaryOp_Add) and isinstance(
        program_ast.left, ParserAST.UnaryOp_Negate) and isinstance(
            program_ast.right, ParserAST.UnaryOp_Posigate)
    assert program_ast.eval() == 37
    assert program_ast.left.eval() == -5
    assert program_ast.right.eval() == 42
Example #25
0
def test_right_shift():
    program = parse_string("\tplaceholder ~0b0111_0001 >> 3")

    program_ast = program[0].statement_list.value[0]
    assert isinstance(program_ast, ParserAST.Statement)
    program_ast = program_ast.operands

    assert isinstance(program_ast, ParserAST.ExpressionList)
    program_ast = program_ast.value[0]

    assert isinstance(
        program_ast, ParserAST.BinaryOp_RightShift) and isinstance(
            program_ast.left, ParserAST.UnaryOp_Not) and isinstance(
                program_ast.right, ParserAST.Number)
    assert program_ast.eval() == 0x11
    assert program_ast.left.eval() == 0x8E
    assert program_ast.right.eval() == 3
Example #26
0
def test_multiple_statements1():
    program = parse_string("\tnop : jmp\n")
    assert isinstance(program[0], ParserAST.Line) and len(
        program[0].statement_list.value) == 2
    for statement in program[0].statement_list.value:
        assert len(statement.operands.value) == 0
Example #27
0
def test_multiple_statements3():
    lexer = Lexer.CreateLexer()
    parser = Parser.CreateParser()

    program = parse_string("\tnop : jmp $03:1234 : bra : bcc")
Example #28
0
def test_label_declaration2():
    program = parse_string(" label: placeholder")
    assert isinstance(program[0], ParserAST.Line)
    assert program[0].label_declaration is None
    assert len(program[0].statement_list.value) == 2
Example #29
0
def test_lexer_hex2():
    try:
        program = parse_string("\tinc $::::")
    except ValueError:
        pass
Example #30
0
def test_comment3():
    program = parse_string("    ; This is a comment")
    assert len(program) == 1 and program[0].label_declaration is None and len(
        program[0].statement_list.value) == 0