77import matplotlib .tests
88import matplotlib .units
99from matplotlib import pyplot as plt
10+ from matplotlib import ft2font
1011import numpy as np
1112from matplotlib .testing .compare import comparable_formats , compare_images
1213import warnings
@@ -64,7 +65,7 @@ def teardown_class(cls):
6465 matplotlib .units .registry .clear ()
6566 matplotlib .units .registry .update (cls .original_units_registry )
6667 warnings .resetwarnings () #reset any warning filters set in tests
67-
68+
6869 def test (self ):
6970 self ._func ()
7071
@@ -78,6 +79,18 @@ def cleanup(func):
7879 {'_func' : func })
7980 return new_class
8081
82+ def check_freetype_version (ver ):
83+ if ver is None :
84+ return True
85+
86+ from distutils import version
87+ if isinstance (ver , str ):
88+ ver = (ver , ver )
89+ ver = [version .StrictVersion (x ) for x in ver ]
90+ found = version .StrictVersion (ft2font .__freetype_version__ )
91+
92+ return found >= ver [0 ] and found <= ver [1 ]
93+
8194class ImageComparisonTest (CleanupTest ):
8295 @classmethod
8396 def setup_class (cls ):
@@ -117,18 +130,25 @@ def do_test():
117130
118131 err = compare_images (expected_fname , actual_fname , self ._tol , in_decorator = True )
119132
120- if not os .path .exists (expected_fname ):
121- raise ImageComparisonFailure (
122- 'image does not exist: %s' % expected_fname )
123-
124- if err :
125- raise ImageComparisonFailure (
126- 'images not close: %(actual)s vs. %(expected)s '
127- '(RMS %(rms).3f)' % err )
133+ try :
134+ if not os .path .exists (expected_fname ):
135+ raise ImageComparisonFailure (
136+ 'image does not exist: %s' % expected_fname )
137+
138+ if err :
139+ raise ImageComparisonFailure (
140+ 'images not close: %(actual)s vs. %(expected)s '
141+ '(RMS %(rms).3f)' % err )
142+ except ImageComparisonFailure :
143+ if not check_freetype_version (self ._freetype_version ):
144+ raise KnownFailureTest (
145+ "Mismatched version of freetype. Test requires '%s', you have '%s'" %
146+ (self ._freetype_version , ft2font .__freetype_version__ ))
147+ raise
128148
129149 yield (do_test ,)
130150
131- def image_comparison (baseline_images = None , extensions = None , tol = 1e-3 ):
151+ def image_comparison (baseline_images = None , extensions = None , tol = 1e-3 , freetype_version = None ):
132152 """
133153 call signature::
134154
@@ -149,6 +169,13 @@ def image_comparison(baseline_images=None, extensions=None, tol=1e-3):
149169 If *None*, default to all supported extensions.
150170
151171 Otherwise, a list of extensions to test. For example ['png','pdf'].
172+
173+ *tol*: (default 1e-3)
174+ The RMS threshold above which the test is considered failed.
175+
176+ *freetype_version*: str or tuple
177+ The expected freetype version or range of versions for this
178+ test to pass.
152179 """
153180
154181 if baseline_images is None :
@@ -179,7 +206,9 @@ def compare_images_decorator(func):
179206 {'_func' : func ,
180207 '_baseline_images' : baseline_images ,
181208 '_extensions' : extensions ,
182- '_tol' : tol })
209+ '_tol' : tol ,
210+ '_freetype_version' : freetype_version })
211+
183212 return new_class
184213 return compare_images_decorator
185214
0 commit comments