Skip to content

Commit f9a4252

Browse files
committed
tests: reparent abstract base classes as a member of an _Abstract class
To prevent abstract base classes from being found by test discovery, we've been avoiding making them subclasses of TestCase, and then using multiple inheritance in the concrete subclasses. However, this confuses type checking when the ABC calls TestCase methods. Instead, make the ABC a TestCase subclass, but make it a member of another class so test discovery won't find it. Suggested-by: https://stackoverflow.com/a/50176291/981954 Signed-off-by: Benjamin Gilbert <[email protected]>
1 parent 5f49c01 commit f9a4252

File tree

3 files changed

+106
-97
lines changed

3 files changed

+106
-97
lines changed

tests/test_deepzoom.py

Lines changed: 86 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -27,90 +27,95 @@
2727
from openslide.deepzoom import DeepZoomGenerator
2828

2929

30-
class _BoxesDeepZoomTest:
31-
def setUp(self):
32-
self.osr = self.CLASS(file_path(self.FILENAME))
33-
self.dz = DeepZoomGenerator(self.osr, 254, 1)
34-
35-
def tearDown(self):
36-
self.osr.close()
37-
38-
def test_repr(self):
39-
self.assertEqual(
40-
repr(self.dz),
41-
('DeepZoomGenerator(%r, tile_size=254, overlap=1, ' + 'limit_bounds=False)')
42-
% self.osr,
43-
)
44-
45-
def test_metadata(self):
46-
self.assertEqual(self.dz.level_count, 10)
47-
self.assertEqual(self.dz.tile_count, 11)
48-
self.assertEqual(
49-
self.dz.level_tiles,
50-
(
51-
(1, 1),
52-
(1, 1),
53-
(1, 1),
54-
(1, 1),
55-
(1, 1),
56-
(1, 1),
57-
(1, 1),
58-
(1, 1),
59-
(1, 1),
60-
(2, 1),
61-
),
62-
)
63-
self.assertEqual(
64-
self.dz.level_dimensions,
65-
(
66-
(1, 1),
67-
(2, 1),
68-
(3, 2),
69-
(5, 4),
70-
(10, 8),
71-
(19, 16),
72-
(38, 32),
73-
(75, 63),
74-
(150, 125),
75-
(300, 250),
76-
),
77-
)
78-
79-
def test_get_tile(self):
80-
self.assertEqual(self.dz.get_tile(9, (1, 0)).size, (47, 250))
81-
82-
def test_tile_color_profile(self):
83-
if self.CLASS is OpenSlide and not lowlevel.read_icc_profile.available:
84-
self.skipTest("requires OpenSlide 4.0.0")
85-
self.assertEqual(len(self.dz.get_tile(9, (1, 0)).info['icc_profile']), 588)
86-
87-
def test_get_tile_bad_level(self):
88-
self.assertRaises(ValueError, lambda: self.dz.get_tile(-1, (0, 0)))
89-
self.assertRaises(ValueError, lambda: self.dz.get_tile(10, (0, 0)))
90-
91-
def test_get_tile_bad_address(self):
92-
self.assertRaises(ValueError, lambda: self.dz.get_tile(0, (-1, 0)))
93-
self.assertRaises(ValueError, lambda: self.dz.get_tile(0, (1, 0)))
94-
95-
def test_get_tile_coordinates(self):
96-
self.assertEqual(
97-
self.dz.get_tile_coordinates(9, (1, 0)), ((253, 0), 0, (47, 250))
98-
)
99-
100-
def test_get_tile_dimensions(self):
101-
self.assertEqual(self.dz.get_tile_dimensions(9, (1, 0)), (47, 250))
102-
103-
def test_get_dzi(self):
104-
self.assertTrue(
105-
'http://schemas.microsoft.com/deepzoom/2008' in self.dz.get_dzi('jpeg')
106-
)
107-
108-
109-
class TestSlideDeepZoom(_BoxesDeepZoomTest, unittest.TestCase):
30+
class _Abstract:
31+
# nested class to prevent the test runner from finding it
32+
class BoxesDeepZoomTest(unittest.TestCase):
33+
def setUp(self):
34+
self.osr = self.CLASS(file_path(self.FILENAME))
35+
self.dz = DeepZoomGenerator(self.osr, 254, 1)
36+
37+
def tearDown(self):
38+
self.osr.close()
39+
40+
def test_repr(self):
41+
self.assertEqual(
42+
repr(self.dz),
43+
(
44+
'DeepZoomGenerator(%r, tile_size=254, overlap=1, '
45+
+ 'limit_bounds=False)'
46+
)
47+
% self.osr,
48+
)
49+
50+
def test_metadata(self):
51+
self.assertEqual(self.dz.level_count, 10)
52+
self.assertEqual(self.dz.tile_count, 11)
53+
self.assertEqual(
54+
self.dz.level_tiles,
55+
(
56+
(1, 1),
57+
(1, 1),
58+
(1, 1),
59+
(1, 1),
60+
(1, 1),
61+
(1, 1),
62+
(1, 1),
63+
(1, 1),
64+
(1, 1),
65+
(2, 1),
66+
),
67+
)
68+
self.assertEqual(
69+
self.dz.level_dimensions,
70+
(
71+
(1, 1),
72+
(2, 1),
73+
(3, 2),
74+
(5, 4),
75+
(10, 8),
76+
(19, 16),
77+
(38, 32),
78+
(75, 63),
79+
(150, 125),
80+
(300, 250),
81+
),
82+
)
83+
84+
def test_get_tile(self):
85+
self.assertEqual(self.dz.get_tile(9, (1, 0)).size, (47, 250))
86+
87+
def test_tile_color_profile(self):
88+
if self.CLASS is OpenSlide and not lowlevel.read_icc_profile.available:
89+
self.skipTest("requires OpenSlide 4.0.0")
90+
self.assertEqual(len(self.dz.get_tile(9, (1, 0)).info['icc_profile']), 588)
91+
92+
def test_get_tile_bad_level(self):
93+
self.assertRaises(ValueError, lambda: self.dz.get_tile(-1, (0, 0)))
94+
self.assertRaises(ValueError, lambda: self.dz.get_tile(10, (0, 0)))
95+
96+
def test_get_tile_bad_address(self):
97+
self.assertRaises(ValueError, lambda: self.dz.get_tile(0, (-1, 0)))
98+
self.assertRaises(ValueError, lambda: self.dz.get_tile(0, (1, 0)))
99+
100+
def test_get_tile_coordinates(self):
101+
self.assertEqual(
102+
self.dz.get_tile_coordinates(9, (1, 0)), ((253, 0), 0, (47, 250))
103+
)
104+
105+
def test_get_tile_dimensions(self):
106+
self.assertEqual(self.dz.get_tile_dimensions(9, (1, 0)), (47, 250))
107+
108+
def test_get_dzi(self):
109+
self.assertTrue(
110+
'http://schemas.microsoft.com/deepzoom/2008' in self.dz.get_dzi('jpeg')
111+
)
112+
113+
114+
class TestSlideDeepZoom(_Abstract.BoxesDeepZoomTest):
110115
CLASS = OpenSlide
111116
FILENAME = 'boxes.tiff'
112117

113118

114-
class TestImageDeepZoom(_BoxesDeepZoomTest, unittest.TestCase):
119+
class TestImageDeepZoom(_Abstract.BoxesDeepZoomTest):
115120
CLASS = ImageSlide
116121
FILENAME = 'boxes.png'

tests/test_imageslide.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,17 @@ def test_context_manager(self):
8080
self.assertRaises(ValueError, lambda: osr.level_dimensions)
8181

8282

83-
class _SlideTest:
84-
def setUp(self):
85-
self.osr = ImageSlide(file_path(self.FILENAME))
83+
class _Abstract:
84+
# nested class to prevent the test runner from finding it
85+
class SlideTest(unittest.TestCase):
86+
def setUp(self):
87+
self.osr = ImageSlide(file_path(self.FILENAME))
8688

87-
def tearDown(self):
88-
self.osr.close()
89+
def tearDown(self):
90+
self.osr.close()
8991

9092

91-
class TestImage(_SlideTest, unittest.TestCase):
93+
class TestImage(_Abstract.SlideTest):
9294
FILENAME = 'boxes.png'
9395

9496
def test_repr(self):
@@ -142,7 +144,7 @@ def test_set_cache(self):
142144
self.assertEqual(self.osr.read_region((0, 0), 0, (400, 400)).size, (400, 400))
143145

144146

145-
class TestNoIccImage(_SlideTest, unittest.TestCase):
147+
class TestNoIccImage(_Abstract.SlideTest):
146148
FILENAME = 'boxes-no-icc.png'
147149

148150
def test_color_profile(self):

tests/test_openslide.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,17 @@ def test_context_manager(self):
9898
self.assertRaises(ArgumentError, lambda: osr.level_count)
9999

100100

101-
class _SlideTest:
102-
def setUp(self):
103-
self.osr = OpenSlide(file_path(self.FILENAME))
101+
class _Abstract:
102+
# nested class to prevent the test runner from finding it
103+
class SlideTest(unittest.TestCase):
104+
def setUp(self):
105+
self.osr = OpenSlide(file_path(self.FILENAME))
104106

105-
def tearDown(self):
106-
self.osr.close()
107+
def tearDown(self):
108+
self.osr.close()
107109

108110

109-
class TestSlide(_SlideTest, unittest.TestCase):
111+
class TestSlide(_Abstract.SlideTest):
110112
FILENAME = 'boxes.tiff'
111113

112114
def test_repr(self):
@@ -186,7 +188,7 @@ def test_set_cache(self):
186188
self.assertRaises(TypeError, lambda: self.osr.set_cache(3))
187189

188190

189-
class TestAperioSlide(_SlideTest, unittest.TestCase):
191+
class TestAperioSlide(_Abstract.SlideTest):
190192
FILENAME = 'small.svs'
191193

192194
def test_associated_images(self):
@@ -220,7 +222,7 @@ def test_color_profile(self):
220222
@unittest.skipUnless(
221223
lowlevel.read_associated_image_icc_profile.available, "requires OpenSlide 4.0.0"
222224
)
223-
class TestDicomSlide(_SlideTest, unittest.TestCase):
225+
class TestDicomSlide(_Abstract.SlideTest):
224226
FILENAME = 'boxes_0.dcm'
225227

226228
def test_color_profile(self):
@@ -232,7 +234,7 @@ def test_color_profile(self):
232234
self.assertIs(main_profile, associated_profile)
233235

234236

235-
class TestUnreadableSlide(_SlideTest, unittest.TestCase):
237+
class TestUnreadableSlide(_Abstract.SlideTest):
236238
FILENAME = 'unreadable.svs'
237239

238240
def test_read_bad_region(self):

0 commit comments

Comments
 (0)