def test_convert_CALL(): # Simulates CALL(R12, l) where l = 1000 ops = helper("CALL(R12, 1000)") assert ops == [ SETLO(Token.R(13), Token.Int(232)), SETHI(Token.R(13), Token.Int(3)), CALL(Token.R(12), Token.R(13)), ]
def test_convert_register_branch_with_integer(): # Simulates BR(l) where l = 1000 ops = helper("BR(1000)") assert ops == [ SETLO(Token.R(11), Token.Int(232)), SETHI(Token.R(11), Token.Int(3)), BR(Token.R(11)), ]
def test_convert_ops_with_constant(): oplist, messages = convert_ops([SET(Token.R(1), Token.Sym("n"))], {"n": 100}) assert len(messages.errors) == 0 assert oplist == [ SETLO(Token.R(1), Token.Int(100)), SETHI(Token.R(1), Token.Int(0)), ]
def test_typecheck_single_error(): # Second argument to SETHI is out of range. program = [ SETLO(Token.R(1), Token.Int(10)), SETHI(Token.R(1), Token.Int(1000)) ] symbol_table, messages = typecheck(program) assert len(messages.errors) == 1 assert "integer must be in range [-128, 256)" in messages.errors[0][0]
def test_typecheck_multiple_errors(): program = [ ADD(Token.R(1), Token.Int(10)), INC(Token.R(3), Token.Int(1), Token.Int(2)), ] symbol_table, messages = typecheck(program) assert len(messages.errors) == 3 assert "ADD" in messages.errors[0][0] assert "too few" in messages.errors[0][0] assert "expected register" in messages.errors[1][0] assert "INC" in messages.errors[2][0] assert "too many" in messages.errors[2][0]
def test_operation_length_of_SETRF(): assert operation_length(SETRF(Token.R(1), Token.Int(10))) == 4
def test_convert_HALT(): ops = helper("HALT()") assert ops == [BRR(Token.Int(0))]
def test_convert_NOP(): ops = helper("NOP()") assert ops == [BRR(Token.Int(1))]
def test_convert_FLAGS(): ops = helper("FLAGS(R14)") assert ops == [FOFF(Token.Int(8)), ADD(Token.R(0), Token.R(14), Token.R(0))]
def test_convert_ops_does_not_report_error_for_valid_relative_branch(): data = [INTEGER(Token.Int(1))] * 200 oplist, messages = convert_ops(data + [BRR(Token.Sym("l"))], {"l": 1}) assert len(messages.errors) == 0 assert oplist == data + [BRR(Token.Int(1))]
def test_convert_CBON(): ops = helper("CBON()") assert ops == [FON(Token.Int(0x10))]
def test_convert_COFF(): ops = helper("COFF()") assert ops == [FOFF(Token.Int(8))]
def test_convert_CMP(): ops = helper("CMP(R5, R6)") assert ops == [FON(Token.Int(8)), SUB(Token.R(0), Token.R(5), Token.R(6))]
def test_convert_SET(): ops = helper("SET(R1, 0b100010101010)") assert ops == [ SETLO(Token.R(1), Token.Int(0b10101010)), SETHI(Token.R(1), Token.Int(0b1000)), ]
def test_substitute_label_with_SETHI(): program = SETHI(Token.R(1), Token.Sym("N")) labels = {"N": 10} assert substitute_label(program, labels) == SETHI(Token.R(1), Token.Int(10))
def test_substitute_label_with_other_op(): program = INC(Token.R(1), Token.Sym("N")) labels = {"N": 10} assert substitute_label(program, labels) == INC(Token.R(1), Token.Int(10))
def test_convert_CCBOFF(): ops = helper("CCBOFF()") assert ops == [FOFF(Token.Int(0x18))]