def test_reg_report(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) vm, size = self.create(stack=b'\x00\x00') vm.step(Report(L2Value=42)) self.assertEqual(vm.SP, 44) self.assertEqual(vm.offset, size)
def test_reg_report(self): self.add_opcode() self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX)) vm, size = self.create() vm.step(Report(IMUX=42.5)) self.assertEqual(vm.TH, 42) self.assertEqual(vm.offset, size)
def test_report_int_report_float(self): self.add_opcode() self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX)) vm, size = self.create() report = Report(IMUX=42.5) vm.step(report) self.assertEqual(report.L2Value, 42) self.assertEqual(vm.offset, size)
def test_report_report(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_R2VALUE)) vm, size = self.create() report = Report(L2Value=9, R2Value=42) vm.step(report) self.assertEqual(report.L2Value, 9 + 42) self.assertEqual(vm.offset, size)
def test_reg_reg(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) vm, size = self.create(stack=b'\x00\x00') vm.TH = 42 vm.step(Report()) self.assertEqual(vm.SP, 2 + 42) self.assertEqual(vm.offset, size)
def test_push_report_int(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) vm, size = self.create(stack=struct.pack('<i', 1)) vm.step(Report(L2Value=13)) self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 13)) self.assertEqual(vm.offset, size)
def test_push_report_float(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY)) vm, size = self.create(stack=struct.pack('<i', 1)) vm.step(Report(IMUY=13.5)) self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 13.5)) self.assertEqual(vm.offset, size)
def test_not_reg_true(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) vm, size = self.create() vm.TH = 42 vm.step(Report()) self.assertEqual(vm.TH, 0) self.assertEqual(vm.offset, size)
def test_push_reg(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) vm, size = self.create(stack=struct.pack('<i', 1)) vm.TH = 42 vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 42)) self.assertEqual(vm.offset, size)
def test_reg_C(self): self.add_opcode(Opcodes.OPCODE_VARIANT_C) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP)) self.add(struct.pack('<i', 42)) vm, size = self.create(stack=b'\x00\x00') vm.step(Report()) self.assertEqual(vm.SP, 44) self.assertEqual(vm.offset, size)
def test_report_C(self): self.add_opcode(Opcodes.OPCODE_VARIANT_C) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) self.add(struct.pack('<i', 42)) vm, size = self.create() report = Report(L2Value=9) vm.step(report) self.assertEqual(report.L2Value, 9 + 42) self.assertEqual(vm.offset, size)
def test_jz_report_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ, variant=Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) self.add(struct.pack('<H', 42)) vm, size = self.create() ret = vm.step(Report(L2Value=1)) self.assertEqual(vm.offset, size) self.assertFalse(ret)
def test_regoff_report_float(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY)) vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3)) vm.step(Report(IMUY=42.5)) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 2.5 + 42.5, 3)) self.assertEqual(vm.offset, size)
def test_reg_regoff(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3)) vm.step(Report()) self.assertEqual(vm.SP, 12 + 42) self.assertEqual(vm.offset, size)
def test_jz_reg_true(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ, variant=Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) self.add(struct.pack('<H', 42)) vm, size = self.create() vm.TH = 0 ret = vm.step(Report()) self.assertEqual(vm.offset, 42) self.assertFalse(ret)
def test_reg_int_regoff_float(self): self.add_opcode() self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<if', 1, 42.5)) vm.step(Report()) self.assertEqual(vm.TH, 42) self.assertEqual(vm.offset, size)
def test_regoff_report_int(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) vm, size = self.create(stack=struct.pack('<iii', 1, 2, 3)) vm.step(Report(L2Value=42)) self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 2 + 42, 3)) self.assertEqual(vm.offset, size)
def test_report_constaddr(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 9, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iibii', 1, 2, 3, 42, 13)) report = Report(L2Value=9) vm.step(report) self.assertEqual(report.L2Value, 9 + 42) self.assertEqual(vm.offset, size)
def test_constaddr_reg(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_INT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) vm, size = self.create(stack=struct.pack('<ii', 1, 2)) vm.TH = 42 vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 2 + 42)) self.assertEqual(vm.offset, size)
def test_constaddr_report_float(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX)) vm, size = self.create(stack=struct.pack('<if', 1, 2.0)) report = Report(IMUX=42.5) vm.step(report) self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 2.0 + 42.5)) self.assertEqual(vm.offset, size)
def test_reg_addr_str(self): value = Opcodes.make_addr_reg(Opcodes.REGINDEX_TH) self.assertEqual(Opcodes.make_addr_str(value).str, '%TH')
def test_reg_addr(self): value, = struct.unpack('>B', Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) self.assertEqual(value, (Opcodes.ADDR_TYPE_REG << 6) | Opcodes.REGINDEX_TH)