From 1de384d46a7b07658d2598517d1cb955f8d9ccd5 Mon Sep 17 00:00:00 2001 From: Cary Phillips Date: Sat, 16 May 2026 11:34:39 -0700 Subject: [PATCH] Add test to validate python module reading of unfinished parts PR #2148 extends the python module to skip over parts with invalid/unfinished pixel data, so it reads what it can. Reading "header_only" reads all headers. This adds a test to validate that behavior, using a test file with corrupted chunk tables in two of the parts. Made-with: Cursor Signed-off-by: Cary Phillips --- src/wrappers/python/tests/test_unittest.py | 28 ++++++++++++++++++ .../python/tests/unfinished_multipart.exr | Bin 0 -> 1457 bytes 2 files changed, 28 insertions(+) create mode 100644 src/wrappers/python/tests/unfinished_multipart.exr diff --git a/src/wrappers/python/tests/test_unittest.py b/src/wrappers/python/tests/test_unittest.py index d14947c21..b1b9c369e 100644 --- a/src/wrappers/python/tests/test_unittest.py +++ b/src/wrappers/python/tests/test_unittest.py @@ -637,6 +637,34 @@ def test_write_float(self): os.remove(outfilename) + def test_unfinished_multipart_load(self): + + # + # Multipart files may list more part headers than have valid + # pixel data (interrupted write). Loading should return only + # parts whose pixels read successfully, not fail the entire + # file open. + # + # The test file unfinished_multipart.exr has 4 parts, 2 valid + # and 2 invalid. The default read should return 2 parts; the + # header_only read should return all 4 parts. + # + + path = f"{test_dir}/unfinished_multipart.exr" + num_parts = 4 + num_good = 2 + + with OpenEXR.File(path, separate_channels=True) as f: + self.assertEqual(len(f.parts), num_good) + for i in range(num_good): + self.assertIn('Z', f.parts[i].channels) + self.assertEqual(f.parts[i].channels['Z'].pixels.shape, (8, 8)) + self.assertEqual(f.parts[0].name(), 'Part0') + self.assertEqual(f.parts[1].name(), 'Part1') + + with OpenEXR.File(path, separate_channels=True, header_only=True) as f: + self.assertEqual(len(f.parts), num_parts) + def test_write_2part(self): # diff --git a/src/wrappers/python/tests/unfinished_multipart.exr b/src/wrappers/python/tests/unfinished_multipart.exr new file mode 100644 index 0000000000000000000000000000000000000000..9361ee43335174dbc79caac89e9a1000201e4a53 GIT binary patch literal 1457 zcmeHHO-e&C5dK;fT_^}{yoI(NK%@sy+!S00F)!^K%$q!tw7#yi$M6`vgBy?FZJhW* zTe@*o1nIzJzRW)#A=8Uqr+W(MQZXAF1Xv0YX8<11l`}~vt3)UKJa7|^AkqEo*RHC) z34t7A9jCgzLPa$sF5C;AT+=7WxTPElN?K5;t(yIsXNk?NFO0_ur72)l8HDJG$2gGt zo$~RrrpDNtP#YcZRV0Uzb*fz(c)JeT8^i6)f#E1!r~MI*Qok(gDMKn^xzQrd>gCuI zsR>$f+KehSHvf~=-j3BRyw(1W)h)1k_1COoo<1Xy_iPv0erDT7fnx#9qb|?CfRDxN L{O3~>-=_Z?