def test_compare_images_two_plotter_different(sphere, airplane, tmpdir): tmppath = tmpdir.mkdir("tmpdir") filename = str(tmppath.join('tmp.png')) filename2 = str(tmppath.join('tmp2.png')) pl1 = pv.Plotter() pl1.add_mesh(sphere) arr1 = pl1.screenshot(filename) im1 = pv.read(filename) pl2 = pv.Plotter() pl2.add_mesh(airplane) arr2 = pl2.screenshot(filename2) im2 = pv.read(filename2) assert pv.compare_images(arr1, pl2) > 10000 assert pv.compare_images(arr1, arr2) > 10000 assert pv.compare_images(pl1, pl2) > 10000 assert pv.compare_images(im1, pl2) > 10000 assert pv.compare_images(im1, im2) > 10000 assert pv.compare_images(filename, pl2) > 10000 assert pv.compare_images(filename, filename2) > 10000 assert pv.compare_images(arr1, pl2, use_vtk=True) > 10000 with pytest.raises(TypeError): pv.compare_images(im1, pl1.ren_win)
def verify_cache_image(plotter): """Either store or validate an image. This is function should only be called within a pytest environment. Pass it to either the ``Plotter.show()`` or the ``pyvista.plot()`` functions as the before_close_callback keyword arg. Assign this only once for each test you'd like to validate the previous image of. This will not work with parameterized tests. Example Usage: plotter = pyvista.Plotter() plotter.add_mesh(sphere) plotter.show(before_close_callback=verify_cache_image) """ global glb_reset_image_cache, glb_ignore_image_cache # Image cache is only valid for VTK9 on Linux if not VTK9 or platform.system() != 'Linux': return # since each test must contain a unique name, we can simply # use the function test to name the image stack = inspect.stack() test_name = None for item in stack: if item.function == 'check_gc': return if item.function[:5] == 'test_': test_name = item.function break if test_name is None: raise RuntimeError( 'Unable to identify calling test function. This function ' 'should only be used within a pytest environment.') # cached image name image_filename = os.path.join(IMAGE_CACHE_DIR, test_name[5:] + '.png') # simply save the last screenshot if it doesn't exist or the cache # is being reset. if glb_reset_image_cache or not os.path.isfile(image_filename): return plotter.screenshot(image_filename) if glb_ignore_image_cache: return # otherwise, compare with the existing cached image error = pyvista.compare_images(image_filename, plotter) if error > IMAGE_REGRESSION_ERROR: raise RuntimeError('Exceeded image regression error of ' f'{IMAGE_REGRESSION_ERROR} with an image error of ' f'{error}') if error > IMAGE_REGRESSION_WARNING: warnings.warn('Exceeded image regression warning of ' f'{IMAGE_REGRESSION_WARNING} with an image error of ' f'{error}')
def test_compare_images_two_plotters_same(sphere, tmpdir): filename = str(tmpdir.mkdir("tmpdir").join('tmp.png')) pl1 = pv.Plotter() pl1.add_mesh(sphere) arr1 = pl1.screenshot(filename) im1 = pv.read(filename) pl2 = pv.Plotter() pl2.add_mesh(sphere) assert not pv.compare_images(pl1, pl2) assert not pv.compare_images(arr1, pl2) assert not pv.compare_images(im1, pl2) assert not pv.compare_images(filename, pl2) assert not pv.compare_images(arr1, pl2, use_vtk=True) with pytest.raises(TypeError): pv.compare_images(im1, pl1.ren_win)