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