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_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_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_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_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_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_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_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_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_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_regoff_float_regoff_int(self): self.add_opcode() self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 13)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 13.0, 13)) self.assertEqual(vm.offset, size)
def test_regoff_constaddr_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_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<iffi', 1, 2.5, 3.5, 4)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iffi', 1, 2.5, 6.0, 4)) self.assertEqual(vm.offset, size)
def test_positive_int(self): value, = struct.unpack( '>H', Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, 42, Opcodes.ADDR_VALTYPE_INT)) self.assertEqual(value, (Opcodes.ADDR_TYPE_REGOFF << 14) | (Opcodes.REGINDEX_TH << 12) | (Opcodes.ADDR_VALTYPE_INT << 11) | 42)
def test_negative_float(self): value, = struct.unpack( '>H', Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, -42, Opcodes.ADDR_VALTYPE_FLOAT)) self.assertEqual(value, (Opcodes.ADDR_TYPE_REGOFF << 14) | (Opcodes.REGINDEX_TH << 12) | (Opcodes.ADDR_VALTYPE_FLOAT << 11) | (1 << 10) | 42)
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_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_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_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_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_not_constaddr_float_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 0.0, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 1.0, 3)) self.assertEqual(vm.offset, size)
def test_push_report_constaddr_int(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iiii', 1, 42, 3, 42)) self.assertEqual(vm.offset, size)
def test_not_regoff_int_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 0, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 1, 3)) self.assertEqual(vm.offset, size)
def test_neg_regoff_float(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NEG) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, -2.5, 3)) 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_push_report_regoff_float(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifif', 1, 42.5, 3, 42.5)) self.assertEqual(vm.offset, size)
def test_jz_regoff_float_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ, variant=Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(struct.pack('<H', 42)) vm, size = self.create(stack=struct.pack('<ifi', 1, 1.0, 1)) ret = vm.step(Report()) self.assertEqual(vm.offset, size) self.assertFalse(ret)