summaryrefslogtreecommitdiff
path: root/tests/arch/operands/immediate.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/arch/operands/immediate.py')
-rw-r--r--tests/arch/operands/immediate.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/tests/arch/operands/immediate.py b/tests/arch/operands/immediate.py
new file mode 100644
index 0000000..c3fcb84
--- /dev/null
+++ b/tests/arch/operands/immediate.py
@@ -0,0 +1,86 @@
+
+import pychrysalide
+
+from chrysacase import ChrysalideTestCase
+from pychrysalide import MemoryDataSize
+from pychrysalide.arch.operands import ImmediateOperand
+from pychrysalide.glibext import StringBuilder
+
+
+class TestImmediate(ChrysalideTestCase):
+ """TestCase for arch.ImmediateOperand."""
+
+
+ def testBasicImmediate(self):
+ """Check basic properties of immediate values."""
+
+ imm = ImmediateOperand(MemoryDataSize._32_BITS_UNSIGNED, 0x123)
+
+ self.assertEqual(imm.size, MemoryDataSize._32_BITS_UNSIGNED)
+ self.assertEqual(imm.value, 0x123)
+ self.assertFalse(imm.is_negative)
+
+
+ def testStringBuilderForImmediatesOverriding(self):
+ """Override the StringBuilder interface for immediate values."""
+
+ class MyImmOperand(ImmediateOperand, StringBuilder):
+
+ def __init__(self):
+ super().__init__(MemoryDataSize._32_BITS_UNSIGNED, 0x123)
+
+ def _to_string(self, flags=0):
+ return 'NaN'
+
+ op = MyImmOperand()
+
+ self.assertEqual(op.to_string(), 'NaN')
+ self.assertEqual(str(op), 'NaN')
+ self.assertEqual(f'{op}', 'NaN')
+
+
+ def validateValue(self, value, size, padding, strings):
+ """Check all kinds of things with a given immediate operand."""
+
+ for d in strings.keys():
+
+ op = ImmediateOperand(size, value)
+
+ self.assertTrue(op.size == size)
+ self.assertTrue(op.value == value)
+
+ if padding:
+ op.set_flag(ImmediateOperand.ImmOperandFlag.ZERO_PADDING)
+ else:
+ op.unset_flag(ImmediateOperand.ImmOperandFlag.ZERO_PADDING_BY_DEFAULT)
+
+ op.display = d
+
+ string = op.to_string()
+ self.assertEqual(string, strings[d])
+
+
+ def testByteOne(self):
+ """Run sanity checks on immediate operand with value 1."""
+
+ strings = {
+ ImmediateOperand.ImmOperandDisplay.BIN: 'b1',
+ ImmediateOperand.ImmOperandDisplay.OCT: '01',
+ ImmediateOperand.ImmOperandDisplay.DEC: '1',
+ ImmediateOperand.ImmOperandDisplay.HEX: '0x1'
+ }
+
+ self.validateValue(1, pychrysalide.MemoryDataSize._8_BITS_UNSIGNED, False, strings)
+
+
+ def testByteOnePadded(self):
+ """Run sanity checks on immediate operand with padded value 1."""
+
+ strings = {
+ ImmediateOperand.ImmOperandDisplay.BIN: 'b00000001',
+ ImmediateOperand.ImmOperandDisplay.OCT: '01',
+ ImmediateOperand.ImmOperandDisplay.DEC: '1',
+ ImmediateOperand.ImmOperandDisplay.HEX: '0x01'
+ }
+
+ self.validateValue(1, pychrysalide.MemoryDataSize._8_BITS_UNSIGNED, True, strings)