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
def test_multiple_statements5(): lexer = Lexer.CreateLexer() parser = Parser.CreateParser() try: program = parse_string("\tnop : bra :") except Parser.ParseError: pass
def test_multiple_statements4(): lexer = Lexer.CreateLexer() parser = Parser.CreateParser() try: program = parse_string("\tnop : jmp $03: 1234 : bra : bcc") except Parser.ParseError: pass
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'
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'
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'
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'
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]
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
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)
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
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)
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
def test_multiple_statements3(): lexer = Lexer.CreateLexer() parser = Parser.CreateParser() program = parse_string("\tnop : jmp $03:1234 : bra : bcc")
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
def test_lexer_hex2(): try: program = parse_string("\tinc $::::") except ValueError: pass
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