Esempio n. 1
0
def test_vm_jmpb():
    code = [*create_instr("jmpb", 0), *create_instr("nop")]

    vm = Arkhe(code)
    vm.registers[0] = 3
    vm.exc_instr()  # counter at 3
    assert vm.counter == 0
Esempio n. 2
0
def test_vm_comp_ne():
    code = [*create_instr("ne", 0, 1), *create_instr("ne", 1, 2)]
    vm = Arkhe(code)
    vm.registers[0] = 5
    vm.registers[1] = 5
    vm.exc_instr()
    assert not vm._eqflag
    vm.registers[2] = 10
    vm.exc_instr()
    assert vm._eqflag
Esempio n. 3
0
def test_vm_mem_dealloc():
    code = create_instr("dealloc", 0, 0)
    vm = Arkhe(code)
    vm.registers[0] = 16
    vm.memory.alloc(36)
    vm.exc_instr()
    assert len(vm.memory) == 20
Esempio n. 4
0
def test_vm_jfn():
    code = [*create_instr("jfn", 0)]
    vm = Arkhe(code)
    vm.registers[0] = 20
    vm._eqflag = False
    vm.exc_instr()
    assert vm.counter == 23
Esempio n. 5
0
def test_vm_sym_read():
    code = create_instr("symread", 0, 1)
    vm = Arkhe(code)
    vm.symtable["age"] = 15
    vm.registers[0] = "age"
    vm.exc_instr()
    assert vm.registers[1] == 15
Esempio n. 6
0
def test_vm_comp_lt():
    code = [
        *create_instr("lt", 0, 1),
        *create_instr("lt", 1, 2),
        *create_instr("lt", 1, 3),
    ]
    vm = Arkhe(code)
    vm.registers[0] = 5
    vm.registers[1] = 5
    vm.exc_instr()
    assert not vm._eqflag
    vm.registers[2] = 10
    vm.exc_instr()
    assert vm._eqflag
    vm.registers[3] = 4
    vm.exc_instr()
    assert not vm._eqflag
Esempio n. 7
0
def test_utils_create_instr():
    assert create_instr("load", 0, 1, 244) == [
        Operation.LOAD.value,
        0,
        1,
        244,
        INSTR_TERM,
    ]
Esempio n. 8
0
def test_vm_mem_alloc():
    code = create_instr("alloc", 0)
    vm = Arkhe(code)
    vm.registers[0] = 16
    vm.exc_instr()
    assert len(vm.memory) == 16
    vm.counter = 0
    vm.exc_instr()
    assert len(vm.memory) == 32
Esempio n. 9
0
def test_type_string():
    code = create_instr("load", 0, 104, 101, 108, 108, 111, TypeTable.STR)
    vm = Arkhe(code)
    vm.exc_instr()
    assert vm.registers[0] == "hello"
    vm.code.extend(
        create_instr("load", 1, 32, 119, 111, 114, 108, 100, 33, 32,
                     TypeTable.STR))
    vm.exc_instr()
    assert vm.registers[1] == " world! "
    vm.code.extend(create_instr("add", 0, 1, 2))
    vm.exc_instr()
    assert vm.registers[2] == "hello world! "
    vm.registers[5] = 5
    vm.code.extend(create_instr("mul", 2, 5, 3))
    vm.exc_instr()
    assert vm.registers[
        3] == "hello world! hello world! hello world! hello world! hello world! "
Esempio n. 10
0
def test_vm_jne():
    code = [*create_instr("jne", 0)]
    vm = Arkhe(code)
    vm.registers[0] = 0
    vm._eqflag = False
    vm.exc_instr()
    assert vm.counter == 0
    vm._eqflag = True
    vm.exc_instr()
    assert vm.counter == 3
Esempio n. 11
0
def test_vm_mem_read():
    code = create_instr("read", 0, 1)
    vm = Arkhe(code)
    vm.registers[0] = 16
    with pytest.raises(MemoryFault):
        vm.exc_instr()
    vm.memory.alloc(100)
    vm.memory[16] = "hello"
    vm.counter = 0
    vm.exc_instr()
    assert vm.registers[1] == "hello"
Esempio n. 12
0
def test_vm_math():
    code = [
        *create_instr("load", 0, 3, 232),
        *create_instr("load", 1, 1, 244),
        *create_instr("add", 0, 1, 2),
        *create_instr("sub", 2, 1, 3),
        *create_instr("mul", 1, 2, 4),
        *create_instr("truediv", 2, 3, 5),
    ]

    vm = Arkhe(code)
    vm.eval()
    assert (vm.registers[0] == 1000 and vm.registers[1] == 500
            and vm.registers[2] == 1500 and vm.registers[3] == 1000
            and vm.registers[4] == 750_000 and vm.registers[5] == 1.5)
Esempio n. 13
0
    def instr(self, tokens):
        op = tokens.pop(0)
        operands = list(map(b16, tokens))

        return create_instr(op, *operands)
Esempio n. 14
0
def test_vm_jmp():
    code = create_instr("jmp", 0)
    vm = Arkhe(code)
    vm.registers[0] = 0
    vm.exc_instr()
    assert vm.counter == 0
Esempio n. 15
0
def test_vm_load_multiple():
    code = [*create_instr("load", 0, 3, 232), *create_instr("load", 1, 1, 244)]

    vm = Arkhe(code)
    vm.eval()
    assert vm.registers[0] == 1000 and vm.registers[1] == 500
Esempio n. 16
0
def test_vm_load():
    code = create_instr("load", 0, 0, 100)
    vm = Arkhe(code)
    vm.eval()
    assert vm.registers[0] == 100
Esempio n. 17
0
def test_ext_libc():
    code = create_instr("ccall", 0, 1)
    vm = Arkhe(code)
    vm.registers[0] = "getpid"
    vm.exc_instr()
    assert vm.registers[1] == os.getpid()
Esempio n. 18
0
def test_type_bytes():
    code = create_instr("load", 0, 104, 101, 108, 108, 111, TypeTable.BYT)
    vm = Arkhe(code)
    vm.exc_instr()
    assert vm.registers[0] == b"hello"