Esempio n. 1
0
def test_hit_breakpoint(vm, dummy_linearray):
    code = '''
    Load X
    Add Y
    Add Z
    Halt
    X, DEC 1
    Y, DEC 2
    Z, DEC 3
    '''
    program = parser.parse(code)
    bp1 = Breakpoint(current_lineno=1, original_lineno=1, instr='Load X')
    bp2 = Breakpoint(current_lineno=4, original_lineno=5, instr='Add Z')
    breakpoints = [bp1, bp2]

    vm.setup_debug(program, breakpoints, [1, 2, 3, 4, 5, 6, 7])

    hit1 = vm.hit_breakpoint()
    vm.step()
    hit2 = vm.hit_breakpoint()
    vm.step()
    hit3 = vm.hit_breakpoint()
    vm.step()

    assert hit1.breakpoint == bp1
    assert hit1.snapshot.AC == 0

    assert hit2.breakpoint == bp2
    assert hit2.snapshot.AC == 6

    assert hit3 is None
Esempio n. 2
0
def test_load_label_hex(vm, dummy_linearray):
    code = '''\
Load X
Halt
X, HEX 0xFFFFF
'''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == -1
Esempio n. 3
0
def test_load_label_dec(vm, dummy_linearray):
    code = '''\
Load X
Halt
X, DEC 20    
'''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 20
Esempio n. 4
0
def test_storey(vm, dummy_linearray):
    code = '''
    Load X
    StoreY
    Halt
    X, DEC 10
    '''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.Y == 10
Esempio n. 5
0
def test_output(vm, output, buf, dummy_linearray):
    code = f'''
    Load X
    Output
    Halt
    X, HEX {output}
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.output_stream.buf == buf
Esempio n. 6
0
def test_overflow(vm, dummy_linearray):
    code = '''\
    Load X
    Add Y
    Halt
    X, DEC 524287
    Y, DEC 524286
    '''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == -3
Esempio n. 7
0
def test_add_label_hex(vm, dummy_linearray):
    code = '''\
Load X
Add Y
Halt
X, HEX 0xFFFFF
Y, HEX 0x00003    
'''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 2
Esempio n. 8
0
def test_clear(vm, dummy_linearray):
    code = '''\
    Load X
    Clear
    Halt
    X, HEX 0x20
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 0
Esempio n. 9
0
def test_step(vm, dummy_linearray):
    code = '''
    Load X
    
    X, DEC 3
    '''
    program = parser.parse(code)

    vm.setup_debug(program, [], dummy_linearray)
    ss = vm.debugstep().snapshot

    assert vm.AC == 3
    assert ss.AC == 3
Esempio n. 10
0
def test_loadi(vm, dummy_linearray):
    code = '''
    LoadI X
    Halt
    X, DEC 3
    Z, DEC 99
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 99
Esempio n. 11
0
def test_subti_label_hex(vm, dummy_linearray):
    code = '''\
Load X
SubtI 4
Halt
X, HEX 0x7
Y, HEX 0x5
Z, HEX 0x5
'''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 0x2
Esempio n. 12
0
def test_addi_label_hex(vm, dummy_linearray):
    code = '''\
Load X
AddI 4
Halt
X, HEX 0x1
Y, HEX 0x5
Z, HEX 0x20
'''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 0x21
Esempio n. 13
0
def test_decr(vm, dummy_linearray):
    code = '''
    Load X
    Decr
    Halt

    X, DEC 10
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 9
Esempio n. 14
0
def test_shiftl(vm, dummy_linearray):
    code = '''
    Load X
    ShiftL Y
    Halt
    
    X, DEC 2
    Y, DEC 3
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 16
Esempio n. 15
0
def test_storei(vm, dummy_linearray):
    code = '''
    Load Y
    StoreI X
    Load X
    Halt
    
    X, DEC 5
    Y, DEC 4
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 4
Esempio n. 16
0
def test_skipcond_000(vm, dummy_linearray):
    code = '''\
Load X
Skipcond 000
Add Y
Add Z
Halt
X, HEX 0xFFFFF
Y, HEX 0x00003
Z, HEX 0x00004
'''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 3
Esempio n. 17
0
def test_jump(vm, dummy_linearray):
    code = '''\
            Load X
            Jump here
            Add Y
    here,   Add Z
            Halt
    X,      DEC 0
    Y,      DEC 5
    Z,      DEC 10
    '''
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 10
Esempio n. 18
0
def test_shiftr(vm, dummy_linearray):
    code = '''
    Load X
    ShiftR Y
    Halt
    
    
    X, DEC 8
    Y, DEC 1
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 4
Esempio n. 19
0
def test_loady(vm, dummy_linearray):
    code = '''
    Load X
    StoreY
    Load Y
    LoadY
    Halt

    X, DEC 10
    Y, DEC 20
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 10
Esempio n. 20
0
def test_input(input_, acc, dummy_linearray):
    code = '''\
    Input
    Halt
    '''
    vm = MarieVm(
        memory=[0] * 1024,
        input_stream=BufferedInputStream(input_),
        output_stream=OutputStream(),
        stack=[],
        max_num_of_executed_instrs=1000,
    )
    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == acc
Esempio n. 21
0
def run(code: str,
        debug: bool,
        input_=None,
        breakpoints=None) -> List[Snapshot]:
    vm = MarieVm.get_default()
    parsed_breakpoints = []
    if breakpoints:
        parsed_breakpoints = breakpoints_module.parse_breakpoints(
            breakpoints, code)
    if input_:
        istream = BufferedInputStream(input_)
        vm.input_stream = istream
    program = parser.parse(code)
    line_array = [*range(100)]
    if debug:
        return vm.setup_debug(program, parsed_breakpoints, line_array)
    vm.execute(program, line_array)
    return [snapshot_maker.make_snapshot(vm)]
Esempio n. 22
0
def test_jumpi(vm, dummy_linearray):
    code = '''
    Load X
    JumpI Z
    Add Y
    Add Y
    Add Y 
    Halt
    
    X, DEC 5
    Y, DEC 6
    Z, DEC 5
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.AC == 5
Esempio n. 23
0
def test_vm_raises_when_max_allowed_num_of_executed_instrs_is_exceeded(
        vm, dummy_linearray):
    vm.max_num_of_executed_instrs = 1000
    vm.num_of_executed_instrs = 998

    code = '''
    Load X
    StoreY
    Load Y
    LoadY
    Halt

    X, DEC 10
    Y, DEC 20
    '''

    program = parser.parse(code)

    with pytest.raises(TimeoutError):
        vm.execute(program, dummy_linearray)
Esempio n. 24
0
def test_make_snapshot(vm, dummy_linearray):
    code = """
    Load X
    Push
    Add Y
    Halt
    X, HEX 0xFFFFF
    Y, HEX 0x00003    
    """

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    snapshot = snapshot_maker.make_snapshot(vm)

    assert snapshot.AC == 2
    assert -1 in snapshot.memory
    assert 3 in snapshot.memory
    assert snapshot.stack == [-1]
Esempio n. 25
0
def test_jns(vm, dummy_linearray):
    code = '''
JnS PrintX
JnS PrintX
Halt

PrintX, HEX 0x00000
        Load X
        StoreX
        Output

        JumpI PrintX

        X, DEC 42
'''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.output_stream.buf == ['0x2A', '0x2A']
    assert vm.X == 42
Esempio n. 26
0
def test_push_and_pop(vm, dummy_linearray):
    code = '''
    Load X
    Push
    
    Load Y
    Push
    
    Load Z
    Push
    Pop
    Halt
    
    X, HEX 0xFFFFF
    Y, HEX 0xFFFFE
    Z, HEX 0xFFFFD
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.stack == [-2, -1]
Esempio n. 27
0
def test_profiling_stats(vm, dummy_linearray):
    code = '''
    Load X
    StoreY
    Load Y
    LoadY
    Halt

    X, DEC 10
    Y, DEC 20
    '''

    program = parser.parse(code)

    vm.execute(program, dummy_linearray)

    assert vm.cost_of_executed_instrs == 9
    assert vm.instr_to_call_count == {
        'Load': 2,
        'Halt': 1,
        'StoreY': 1,
        'LoadY': 1,
    }
Esempio n. 28
0
def parse_code(code: str) -> Program:
    return parser.parse(code)