Skip to content

Commit cbbfafb

Browse files
committed
feat/fix/test: improve test coverage
1 parent 51f49b6 commit cbbfafb

5 files changed

Lines changed: 52 additions & 29 deletions

File tree

libdestruct/c/c_str.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
class c_str(array):
1313
"""A C string."""
1414

15-
def size(self: c_str) -> int:
15+
def count(self: c_str) -> int:
1616
"""Return the size of the string."""
1717
size = 0
1818

@@ -26,21 +26,21 @@ def size(self: c_str) -> int:
2626

2727
def get(self: c_str, index: int = -1) -> bytes:
2828
"""Return the character at the given index."""
29-
if index != -1 and index < 0 or index >= self.size():
29+
if index != -1 and index < 0 or index >= self.count():
3030
raise IndexError("String index out of range.")
3131

3232
if index == -1:
33-
return self.resolver.resolve(self.size(), 0)
33+
return self.resolver.resolve(self.count(), 0)
3434

3535
return bytes([self.resolver.resolve(index)[-1]])
3636

3737
def to_bytes(self: c_str) -> bytes:
3838
"""Return the serialized representation of the object."""
39-
return self.resolver.resolve(self.size(), 0)
39+
return self.resolver.resolve(self.count(), 0)
4040

4141
def _set(self: c_str, value: bytes, index: int = -1) -> None:
4242
"""Set the character at the given index to the given value."""
43-
if index != -1 and index < 0 or index >= self.size():
43+
if index != -1 and index < 0 or index >= self.count():
4444
raise IndexError("String index out of range.")
4545

4646
if index == -1:
@@ -52,5 +52,5 @@ def _set(self: c_str, value: bytes, index: int = -1) -> None:
5252

5353
def __iter__(self: c_str) -> iter:
5454
"""Return an iterator over the string."""
55-
for i in range(self.size()):
55+
for i in range(self.count()):
5656
yield self.get(i)

libdestruct/common/array/array.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ class array(obj):
1515
"""An array of objects."""
1616

1717
@abstractmethod
18-
def size(self: array) -> int:
18+
def count(self: array) -> int:
1919
"""Return the size of the array."""
2020

2121
def __len__(self: array) -> int:
2222
"""Return the size of the array."""
23-
return self.size()
23+
return self.count()
2424

2525
@abstractmethod
2626
def get(self: array, index: int) -> object:

libdestruct/common/array/array_impl.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ def __init__(
3434
super().__init__(resolver)
3535

3636
self.backing_type = backing_type
37-
self.count = count
38-
self.size = self.backing_type.size * self.count
37+
self._count = count
38+
self.size = self.backing_type.size * self._count
3939

40-
def size(self: array_impl) -> int:
40+
def count(self: array_impl) -> int:
4141
"""Get the size of the array."""
42-
return self.size
42+
return self._count
4343

44-
def get(self: array_impl) -> str:
45-
"""Get the array as a string."""
46-
return f"[{', '.join(str(i) for i in self)}]"
44+
def get(self: array, index: int) -> object:
45+
"""Return the element at the given index."""
46+
return self.backing_type(self.resolver.relative_from_own(index * self.backing_type.size, 0))
4747

4848
def _set(self: array_impl, _: list[obj]) -> None:
4949
"""Set the array from a list."""
@@ -55,17 +55,13 @@ def set(self: array_impl, _: list[obj]) -> None:
5555

5656
def to_bytes(self: array_impl) -> bytes:
5757
"""Return the serialized representation of the array."""
58-
return b"".join(x for x in self)
59-
60-
def __getitem__(self: array_impl, index: int) -> obj:
61-
"""Get an item from the array."""
62-
return self.backing_type(self.resolver.relative_from_own(index * self.backing_type.size, 0))
58+
return b"".join(bytes(x) for x in self)
6359

6460
def __setitem__(self: array_impl, index: int, value: obj) -> None:
6561
"""Set an item in the array."""
6662
raise NotImplementedError("Cannot set items in an array.")
6763

6864
def __iter__(self: array_impl) -> Generator[obj, None, None]:
6965
"""Iterate over the array."""
70-
for i in range(self.count):
66+
for i in range(self._count):
7167
yield self[i]

test/scripts/array_test.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,18 @@ def test_linear_arrays_1(self):
2121

2222
libdestruct = inflater(d.memory)
2323

24-
assert bp.hit_on(d)
24+
self.assertTrue(bp.hit_on(d))
2525

2626
test1 = libdestruct.inflate(array_of(c_int, 10), d.regs.rdi)
2727

28+
self.assertEqual(len(test1), 10)
29+
2830
for i in range(10):
29-
assert test1[i].value == i ** 2
31+
self.assertEqual(test1[i].value, i ** 2)
32+
33+
self.assertEqual(bytes(test1), b"".join((i ** 2).to_bytes(4, "little") for i in range(10)))
34+
35+
self.assertIn(test1[0], test1)
3036

3137
d.cont()
3238

@@ -36,7 +42,7 @@ class test2_t(struct):
3642
test2 = libdestruct.inflate(array_of(test2_t, 10), d.regs.rdi)
3743

3844
for i in range(10):
39-
assert test2[i].a.value == i ** 3
45+
self.assertEqual(test2[i].a.value, i ** 3)
4046

4147
d.cont()
4248

@@ -47,8 +53,8 @@ class test3_t(struct):
4753
test3 = libdestruct.inflate(array_of(test3_t, 10), d.regs.rdi)
4854

4955
for i in range(10):
50-
assert test3[i].a.value == i * 100
51-
assert test3[i].b.value == i * 1000
56+
self.assertEqual(test3[i].a.value, i * 100)
57+
self.assertEqual(test3[i].b.value, i * 1000)
5258

5359
d.cont()
5460

@@ -59,9 +65,18 @@ class test4_t(struct):
5965
test4 = libdestruct.inflate(array_of(test4_t, 10), d.regs.rdi)
6066

6167
for i in range(10):
62-
assert test4[i].a.value == i ** 4
68+
self.assertEqual(test4[i].a.value, i ** 4)
6369
for j in range(10):
64-
assert test4[i].b[j].value == (i + 1) * j
70+
self.assertEqual(test4[i].b[j].value, (i + 1) * j)
71+
72+
with self.assertRaises(NotImplementedError):
73+
test4[i] = 4
74+
75+
with self.assertRaises(NotImplementedError):
76+
test4._set([1, 2, 3])
77+
78+
with self.assertRaises(NotImplementedError):
79+
test4.set([1, 2, 3])
6580

6681
d.kill()
67-
d.terminate()
82+
d.terminate()

test/scripts/basic_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,18 @@ def twos_complement(value, bits):
4242
self.assertEqual(provola3.get(), twos_complement(0xdeadbeefdeadbeef, 64))
4343
self.assertEqual(provola4.get(), (0xdeadbeefdeadbeef * 2) & ((1 << 64) - 1))
4444

45+
self.assertEqual(int(provola1), provola1.value)
46+
4547
provola1._set(0x1)
4648
provola2._set(0x2)
4749
provola3.value = 0x3
4850
provola4._set(0x4)
4951

52+
self.assertEqual(bytes(provola1), b"\x01\x00\x00\x00")
53+
self.assertEqual(bytes(provola2), b"\x02\x00\x00\x00")
54+
self.assertEqual(bytes(provola3), b"\x03\x00\x00\x00\x00\x00\x00\x00")
55+
self.assertEqual(bytes(provola4), b"\x04\x00\x00\x00\x00\x00\x00\x00")
56+
5057
d.cont()
5158

5259
assert bp2.hit_on(d)
@@ -94,6 +101,11 @@ def test_integer_type_freeze(self):
94101
self.assertEqual(provola3.value, 3)
95102
self.assertEqual(provola4.value, 4)
96103

104+
self.assertEqual(bytes(provola1), b"\x01\x00\x00\x00")
105+
self.assertEqual(bytes(provola2), b"\x02\x00\x00\x00")
106+
self.assertEqual(bytes(provola3), b"\x03\x00\x00\x00\x00\x00\x00\x00")
107+
self.assertEqual(bytes(provola4), b"\x04\x00\x00\x00\x00\x00\x00\x00")
108+
97109
self.assertRaises(ValueError, provola1.set, 0x1)
98110

99111
d.kill()

0 commit comments

Comments
 (0)