|
1 | 1 | import unittest
|
2 | 2 |
|
3 |
| -from ..memory import _RangeMap, MemoryMap |
| 3 | +from ..memory import _RangeMap, ResourceInfo, MemoryMap |
4 | 4 |
|
5 | 5 |
|
6 | 6 | class RangeMapTestCase(unittest.TestCase):
|
@@ -40,6 +40,54 @@ def test_get(self):
|
40 | 40 | self.assertEqual(range_map.get(15), None)
|
41 | 41 |
|
42 | 42 |
|
| 43 | +class ResourceInfoTestCase(unittest.TestCase): |
| 44 | + def test_simple(self): |
| 45 | + info = ResourceInfo("a", name=("foo", "bar"), start=0, end=1, width=8) |
| 46 | + self.assertEqual(info.name, ("foo", "bar")) |
| 47 | + self.assertEqual(info.start, 0) |
| 48 | + self.assertEqual(info.end, 1) |
| 49 | + self.assertEqual(info.width, 8) |
| 50 | + |
| 51 | + def test_name_cast(self): |
| 52 | + info = ResourceInfo("a", name="foo", start=0, end=1, width=8) |
| 53 | + self.assertEqual(info.name, ("foo",)) |
| 54 | + |
| 55 | + def test_wrong_name(self): |
| 56 | + with self.assertRaisesRegex(TypeError, |
| 57 | + r"Name must be a non-empty sequence of non-empty strings, not \(1,\)"): |
| 58 | + ResourceInfo("a", name=(1,), start=0, end=1, width=8) |
| 59 | + with self.assertRaisesRegex(TypeError, |
| 60 | + r"Name must be a non-empty sequence of non-empty strings, not \(\)"): |
| 61 | + ResourceInfo("a", name=(), start=0, end=1, width=8) |
| 62 | + with self.assertRaisesRegex(TypeError, |
| 63 | + r"Name must be a non-empty sequence of non-empty strings, not \('foo', ''\)"): |
| 64 | + ResourceInfo("a", name=("foo", ""), start=0, end=1, width=8) |
| 65 | + |
| 66 | + def test_wrong_start_addr(self): |
| 67 | + with self.assertRaisesRegex(TypeError, |
| 68 | + r"Start address must be a non-negative integer, not 'foo'"): |
| 69 | + ResourceInfo("a", name="b", start="foo", end=1, width=8) |
| 70 | + with self.assertRaisesRegex(TypeError, |
| 71 | + r"Start address must be a non-negative integer, not -1"): |
| 72 | + ResourceInfo("a", name="b", start=-1, end=1, width=8) |
| 73 | + |
| 74 | + def test_wrong_end_addr(self): |
| 75 | + with self.assertRaisesRegex(TypeError, |
| 76 | + r"End address must be an integer greater than the start address, not 'foo'"): |
| 77 | + ResourceInfo("a", name="b", start=0, end="foo", width=8) |
| 78 | + with self.assertRaisesRegex(TypeError, |
| 79 | + r"End address must be an integer greater than the start address, not 0"): |
| 80 | + ResourceInfo("a", name="b", start=0, end=0, width=8) |
| 81 | + |
| 82 | + def test_wrong_width(self): |
| 83 | + with self.assertRaisesRegex(TypeError, |
| 84 | + r"Width must be a non-negative integer, not 'foo'"): |
| 85 | + ResourceInfo("a", name="b", start=0, end=1, width="foo") |
| 86 | + with self.assertRaisesRegex(TypeError, |
| 87 | + r"Width must be a non-negative integer, not -1"): |
| 88 | + ResourceInfo("a", name="b", start=0, end=1, width=-1) |
| 89 | + |
| 90 | + |
43 | 91 | class MemoryMapTestCase(unittest.TestCase):
|
44 | 92 | def test_name(self):
|
45 | 93 | memory_map_0 = MemoryMap(addr_width=1, data_width=8)
|
@@ -375,28 +423,62 @@ def setUp(self):
|
375 | 423 | self.root.add_window(self.win3, sparse=False)
|
376 | 424 |
|
377 | 425 | def test_iter_all_resources(self):
|
378 |
| - self.assertEqual(list(self.root.all_resources()), [ |
379 |
| - (self.res1, (0x00000000, 0x00000010, 32)), |
380 |
| - (self.res2, (0x00010000, 0x00010020, 32)), |
381 |
| - (self.res3, (0x00010020, 0x00010040, 32)), |
382 |
| - (self.res4, (0x00020000, 0x00020001, 32)), |
383 |
| - (self.res5, (0x00030000, 0x00030010, 8)), |
384 |
| - (self.res6, (0x00040000, 0x00040004, 32)), |
385 |
| - ]) |
| 426 | + res_info = list(self.root.all_resources()) |
| 427 | + |
| 428 | + self.assertIs(res_info[0].resource, self.res1) |
| 429 | + self.assertEqual(res_info[0].name, ("name1",)) |
| 430 | + self.assertEqual(res_info[0].start, 0x00000000) |
| 431 | + self.assertEqual(res_info[0].end, 0x00000010) |
| 432 | + self.assertEqual(res_info[0].width, 32) |
| 433 | + |
| 434 | + self.assertIs(res_info[1].resource, self.res2) |
| 435 | + self.assertEqual(res_info[1].name, ("name2",)) |
| 436 | + self.assertEqual(res_info[1].start, 0x00010000) |
| 437 | + self.assertEqual(res_info[1].end, 0x00010020) |
| 438 | + self.assertEqual(res_info[1].width, 32) |
| 439 | + |
| 440 | + self.assertIs(res_info[2].resource, self.res3) |
| 441 | + self.assertEqual(res_info[2].name, ("name3",)) |
| 442 | + self.assertEqual(res_info[2].start, 0x00010020) |
| 443 | + self.assertEqual(res_info[2].end, 0x00010040) |
| 444 | + self.assertEqual(res_info[2].width, 32) |
| 445 | + |
| 446 | + self.assertIs(res_info[3].resource, self.res4) |
| 447 | + self.assertEqual(res_info[3].name, ("name4",)) |
| 448 | + self.assertEqual(res_info[3].start, 0x00020000) |
| 449 | + self.assertEqual(res_info[3].end, 0x00020001) |
| 450 | + self.assertEqual(res_info[3].width, 32) |
| 451 | + |
| 452 | + self.assertIs(res_info[4].resource, self.res5) |
| 453 | + self.assertEqual(res_info[4].name, ("name5",)) |
| 454 | + self.assertEqual(res_info[4].start, 0x00030000) |
| 455 | + self.assertEqual(res_info[4].end, 0x00030010) |
| 456 | + self.assertEqual(res_info[4].width, 8) |
| 457 | + |
| 458 | + self.assertIs(res_info[5].resource, self.res6) |
| 459 | + self.assertEqual(res_info[5].name, ("win3", "name6")) |
| 460 | + self.assertEqual(res_info[5].start, 0x00040000) |
| 461 | + self.assertEqual(res_info[5].end, 0x00040004) |
| 462 | + self.assertEqual(res_info[5].width, 32) |
386 | 463 |
|
387 | 464 | def test_find_resource(self):
|
388 |
| - for res, loc in self.root.all_resources(): |
389 |
| - self.assertEqual(self.root.find_resource(res), loc) |
| 465 | + for res_info in self.root.all_resources(): |
| 466 | + other = self.root.find_resource(res_info.resource) |
| 467 | + self.assertIs(other.resource, res_info.resource) |
| 468 | + self.assertEqual(other.name, res_info.name) |
| 469 | + self.assertEqual(other.start, res_info.start) |
| 470 | + self.assertEqual(other.end, res_info.end) |
| 471 | + self.assertEqual(other.width, res_info.width) |
390 | 472 |
|
391 | 473 | def test_find_resource_wrong(self):
|
392 | 474 | with self.assertRaises(KeyError) as error:
|
393 | 475 | self.root.find_resource("resNA")
|
394 | 476 | self.assertEqual(error.exception.args, ("resNA",))
|
395 | 477 |
|
396 | 478 | def test_decode_address(self):
|
397 |
| - for res, (start, end, width) in self.root.all_resources(): |
398 |
| - self.assertEqual(self.root.decode_address(start), res) |
399 |
| - self.assertEqual(self.root.decode_address(end - 1), res) |
| 479 | + for res_info in self.root.all_resources(): |
| 480 | + self.assertEqual(self.root.decode_address(res_info.start), res_info.resource) |
| 481 | + self.assertEqual(self.root.decode_address(res_info.end - 1), res_info.resource) |
400 | 482 |
|
401 | 483 | def test_decode_address_missing(self):
|
402 | 484 | self.assertIsNone(self.root.decode_address(address=0x00000100))
|
0 commit comments