def test_get_legend(self): """Getting a legend for a generic layer works.""" LOGGER.debug('test_get_legend called') layer, _ = load_layer('test_shakeimpact.shp') map_legend = MapLegend(layer) self.assertTrue(map_legend.layer is not None) legend = map_legend.get_legend() path = unique_filename( prefix='getLegend', suffix='.png', dir=temp_dir('test')) legend.save(path, 'PNG') LOGGER.debug(path) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. tolerance = 0 # to allow for version number changes in disclaimer flag, message = check_images('getLegend', path, tolerance) message += ( '\nWe want these images to match, if they do already ' 'copy the test image generated to create a new control ' 'image.') self.assertTrue(flag, message) LOGGER.debug('test_getLegend done')
def test_get_vector_legend(self): """Getting a legend for a vector layer works. .. note:: This test is not related do thousand separator since we insert our own legend notes and our own layer. """ layer, _ = load_layer('test_shakeimpact.shp') map_legend = MapLegend( layer, legend_notes='Thousand separator represented by \',\'', legend_units='(people per cell)') image = map_legend.vector_legend() path = unique_filename( prefix='getVectorLegend', suffix='.png', dir=temp_dir('test')) image.save(path, 'PNG') LOGGER.debug(path) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. tolerance = 0 # to allow for version number changes in disclaimer flag, message = check_images( 'getVectorLegend', path, tolerance) message += ( '\nWe want these images to match, if they do already ' 'copy the test image generated to create a new control image.') self.assertTrue(flag, message)
def test_add_symbol_to_legend(self): """Test we can add a symbol to the legend.""" layer, _ = load_layer('test_floodimpact.tif') map_legend = MapLegend(layer) symbol = QgsFillSymbolV2() symbol.setColor(QtGui.QColor(12, 34, 56)) map_legend.add_symbol( symbol, minimum=0, # expect 2.0303 in legend maximum=2.02030, label='Foo') path = unique_filename( prefix='addSymbolToLegend', suffix='.png', dir=temp_dir('test')) map_legend.get_legend().save(path, 'PNG') LOGGER.debug(path) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. tolerance = 0 # to allow for version number changes in disclaimer flag, message = check_images( 'addSymbolToLegend', path, tolerance) message += ( '\nWe want these images to match, if they do already, copy the ' 'test image generated to create a new control image.') self.assertTrue(flag, message)
def test_add_class_to_legend(self): """Test we can add a class to the map legend.""" layer, _ = load_layer('test_shakeimpact.shp') map_legend = MapLegend(layer) colour = QtGui.QColor(12, 34, 126) map_legend.add_class( colour, label='bar') map_legend.add_class( colour, label='foo') path = unique_filename( prefix='addClassToLegend', suffix='.png', dir=temp_dir('test')) map_legend.get_legend().save(path, 'PNG') LOGGER.debug(path) # As we have discovered, different versions of Qt and # OS platforms cause different output, so place any other possible # variants in the safe_qgis/test_data/test_images/ dir e.g. # addClassToLegend-variantUbuntu13.04.png tolerance = 0 # to allow for version number changes in disclaimer flag, message = check_images( 'addClassToLegend', path, tolerance) message += ( '\nWe want these images to match, if they do already copy the test' ' image generated to create a new control image.') self.assertTrue(flag, message)
def test_renderComposition(self): """Test making an image of the map only.""" LOGGER.info("Testing renderComposition") myLayer, _ = load_layer("test_shakeimpact.shp") myCanvasLayer = QgsMapCanvasLayer(myLayer) CANVAS.setLayerSet([myCanvasLayer]) myRect = QgsRectangle(106.7894, -6.2308, 106.8004, -6.2264) CANVAS.setExtent(myRect) CANVAS.refresh() myMap = Map(IFACE) myMap.set_impact_layer(myLayer) myMap.compose_map() myImagePath, myControlImage, myTargetArea = myMap.render() LOGGER.debug(myImagePath) assert myControlImage is not None myDimensions = [myTargetArea.left(), myTargetArea.top(), myTargetArea.bottom(), myTargetArea.right()] myExpectedDimensions = [0.0, 0.0, 3507.0, 2480.0] myMessage = "Expected target area to be %s, got %s" % (str(myExpectedDimensions), str(myDimensions)) assert myExpectedDimensions == myDimensions, myMessage myMessage = "Rendered output does not exist" assert os.path.exists(myImagePath), myMessage # Beta version and version changes can introduce a few extra chars # into the metadata section so we set a reasonable tolerance to cope # with this. myTolerance = 8000 myFlag, myMessage = check_images("renderComposition", myImagePath, myTolerance) assert myFlag, myMessage
def test_getVectorLegend(self): """Getting a legend for a vector layer works. @note This test is not related do thousand separator since we insert our own legend notes and our own layer. """ myLayer, _ = load_layer('test_shakeimpact.shp') myMapLegend = MapLegend( myLayer, theLegendNotes='Thousand separator represented by \',\'', theLegendUnits='(people per cell)') myImage = myMapLegend.getVectorLegend() myPath = unique_filename( prefix='getVectorLegend', suffix='.png', dir=temp_dir('test')) myImage.save(myPath, 'PNG') LOGGER.debug(myPath) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. myTolerance = 0 # to allow for version number changes in disclaimer myFlag, myMessage = check_images( 'getVectorLegend', myPath, myTolerance) myMessage += ('\nWe want these images to match, if they do already ' 'copy the test image generated to create a new control ' 'image.') assert myFlag, myMessage
def test_addSymbolToLegend(self): """Test we can add a symbol to the legend.""" myLayer, _ = load_layer('test_floodimpact.tif') myMapLegend = MapLegend(myLayer) mySymbol = QgsSymbol() mySymbol.setColor(QtGui.QColor(12, 34, 56)) myMapLegend.addSymbolToLegend( mySymbol, theMin=0, # expect 2.0303 in legend theMax=2.02030, theLabel='Foo') myPath = unique_filename( prefix='addSymbolToLegend', suffix='.png', dir=temp_dir('test')) myMapLegend.getLegend().save(myPath, 'PNG') LOGGER.debug(myPath) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. myTolerance = 0 # to allow for version number changes in disclaimer myFlag, myMessage = check_images('addSymbolToLegend', myPath, myTolerance) myMessage += ('\nWe want these images to match, if they do already ' 'copy the test image generated to create a new control ' 'image.') assert myFlag, myMessage
def test_windowsDrawingArtifacts(self): """Test that windows rendering does not make artifacts""" # sometimes spurious lines are drawn on the layout LOGGER.info('Testing windowsDrawingArtifacts') myPath = unique_filename( prefix='artifacts', suffix='.pdf', dir=temp_dir('test')) myMap = Map(IFACE) setup_printer(myPath) myMap.setup_composition() myImage = QtGui.QImage(10, 10, QtGui.QImage.Format_RGB32) myImage.setDotsPerMeterX(dpi_to_meters(300)) myImage.setDotsPerMeterY(dpi_to_meters(300)) #myImage.fill(QtGui.QColor(250, 250, 250)) # Look at the output, you will see antialiasing issues around some # of the boxes drawn... # myImage.fill(QtGui.QColor(200, 200, 200)) myImage.fill(200 + 200 * 256 + 200 * 256 * 256) myFilename = os.path.join(temp_dir(), 'greyBox') myImage.save(myFilename, 'PNG') for i in range(10, 190, 10): myPicture = QgsComposerPicture(myMap.composition) myPicture.setPictureFile(myFilename) if qgis_version() >= 10800: # 1.8 or newer myPicture.setFrameEnabled(False) else: myPicture.setFrame(False) myPicture.setItemPosition(i, # x i, # y 10, # width 10) # height myMap.composition.addItem(myPicture) # Same drawing drawn directly as a pixmap # noinspection PyCallByClass,PyTypeChecker,PyArgumentList myPixmapItem = myMap.composition.addPixmap( QtGui.QPixmap.fromImage(myImage)) myPixmapItem.setOffset(i, i + 20) # Same drawing using our drawImage Helper myWidthMM = 1 myMap.draw_image(myImage, myWidthMM, i, i + 40) myImagePath, _, _ = myMap.render() # when this test no longer matches our broken render hash # we know the issue is fixed myTolerance = 0 myFlag, myMessage = check_images( 'windowsArtifacts', myImagePath, myTolerance) myMessage += ('\nWe want these images to match, if they do not ' 'there may be rendering artifacts in windows.\n') assert myFlag, myMessage
def test_getRasterLegend(self): """Getting a legend for a raster layer works.""" myLayer, _ = load_layer('test_floodimpact.tif') myMapLegend = MapLegend(myLayer) myImage = myMapLegend.raster_legend() myPath = unique_filename(prefix='getRasterLegend', suffix='.png', dir=temp_dir('test')) myImage.save(myPath, 'PNG') LOGGER.debug(myPath) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. myTolerance = 0 # to allow for version number changes in disclaimer myFlag, myMessage = check_images('getRasterLegend', myPath, myTolerance) myMessage += ( '\nWe want these images to match, if they do already copy the test' ' image generated to create a new control image.') assert myFlag, myMessage
def test_getRasterLegend(self): """Getting a legend for a raster layer works.""" myLayer, _ = load_layer('test_floodimpact.tif') myMapLegend = MapLegend(myLayer) myImage = myMapLegend.raster_legend() myPath = unique_filename( prefix='getRasterLegend', suffix='.png', dir=temp_dir('test')) myImage.save(myPath, 'PNG') LOGGER.debug(myPath) # As we have discovered, different versions of Qt and # OS platforms cause different output, so myControlImages is a list # of 'known good' renders. myTolerance = 0 # to allow for version number changes in disclaimer myFlag, myMessage = check_images( 'getRasterLegend', myPath, myTolerance) myMessage += ( '\nWe want these images to match, if they do already copy the test' ' image generated to create a new control image.') assert myFlag, myMessage
def test_render_html_to_image(self): """Test that we can render html to a pixmap.""" LOGGER.debug('InaSAFE HtmlRenderer testing renderHtmlToImage') html = self.sample_html(20) LOGGER.debug(html) page_dpi = 100 renderer = HtmlRenderer(page_dpi) path = unique_filename(prefix='testHtmlToImage', suffix='.png', dir=temp_dir('test')) LOGGER.debug(path) width = 150 pixmap = renderer.html_to_image(html, width) self.assertFalse(pixmap.isNull()) LOGGER.debug(pixmap.__class__) pixmap.save(path) message = 'Rendered output does not exist: %s' % path self.assertTrue(os.path.exists(path), message) tolerance = 1000 # to allow for version number changes in disclaimer flag, message = check_images('renderHtmlToImage', path, tolerance) self.assertTrue(flag, message + '\n' + path)
def test_renderComposition(self): """Test making an image of the map only.""" LOGGER.info('Testing renderComposition') myLayer, _ = load_layer('test_shakeimpact.shp') myCanvasLayer = QgsMapCanvasLayer(myLayer) CANVAS.setLayerSet([myCanvasLayer]) myRect = QgsRectangle(106.7894, -6.2308, 106.8004, -6.2264) CANVAS.setExtent(myRect) CANVAS.refresh() myMap = Map(IFACE) myMap.set_impact_layer(myLayer) myMap.compose_map() myImagePath, myControlImage, myTargetArea = myMap.render() LOGGER.debug(myImagePath) assert myControlImage is not None myDimensions = [ myTargetArea.left(), myTargetArea.top(), myTargetArea.bottom(), myTargetArea.right() ] myExpectedDimensions = [0.0, 0.0, 3507.0, 2480.0] myMessage = 'Expected target area to be %s, got %s' % ( str(myExpectedDimensions), str(myDimensions)) assert myExpectedDimensions == myDimensions, myMessage myMessage = 'Rendered output does not exist' assert os.path.exists(myImagePath), myMessage # Beta version and version changes can introduce a few extra chars # into the metadata section so we set a reasonable tolerance to cope # with this. myTolerance = 8000 myFlag, myMessage = check_images('renderComposition', myImagePath, myTolerance) assert myFlag, myMessage
def test_renderHtmlToImage(self): """Test that we can render html to a pixmap.""" LOGGER.debug('InaSAFE HtmlRenderer testing renderHtmlToImage') myHtml = self.sampleHtml(20) LOGGER.debug(myHtml) myPageDpi = 300 myRenderer = HtmlRenderer(myPageDpi) myPath = unique_filename(prefix='testHtmlToImage', suffix='.png', dir=temp_dir('test')) LOGGER.debug(myPath) myWidth = 250 myPixmap = myRenderer.renderHtmlToImage(myHtml, myWidth) assert not myPixmap.isNull() LOGGER.debug(myPixmap.__class__) myPixmap.save(myPath) myMessage = 'Rendered output does not exist: %s' % myPath assert os.path.exists(myPath), myMessage myTolerance = 1000 # to allow for version number changes in disclaimer myFlag, myMessage = check_images('renderHtmlToImage', myPath, myTolerance) assert myFlag, myMessage + '\n' + myPath
def test_renderHtmlToImage(self): """Test that we can render html to a pixmap.""" LOGGER.debug('InaSAFE HtmlRenderer testing renderHtmlToImage') myHtml = self.sampleHtml(20) LOGGER.debug(myHtml) myPageDpi = 300 myRenderer = HtmlRenderer(myPageDpi) myPath = unique_filename( prefix='testHtmlToImage', suffix='.png', dir=temp_dir('test')) LOGGER.debug(myPath) myWidth = 250 myPixmap = myRenderer.html_to_image(myHtml, myWidth) assert not myPixmap.isNull() LOGGER.debug(myPixmap.__class__) myPixmap.save(myPath) myMessage = 'Rendered output does not exist: %s' % myPath assert os.path.exists(myPath), myMessage myTolerance = 1000 # to allow for version number changes in disclaimer myFlag, myMessage = check_images( 'renderHtmlToImage', myPath, myTolerance) assert myFlag, myMessage + '\n' + myPath
def test_render_html_to_image(self): """Test that we can render html to a pixmap.""" LOGGER.debug('InaSAFE HtmlRenderer testing renderHtmlToImage') html = self.sample_html(20) LOGGER.debug(html) page_dpu = 300 renderer = HtmlRenderer(page_dpu) path = unique_filename( prefix='testHtmlToImage', suffix='.png', dir=temp_dir('test')) LOGGER.debug(path) width = 250 pixmap = renderer.html_to_image(html, width) self.assertFalse(pixmap.isNull()) LOGGER.debug(pixmap.__class__) pixmap.save(path) message = 'Rendered output does not exist: %s' % path self.assertTrue(os.path.exists(path), message) tolerance = 1000 # to allow for version number changes in disclaimer flag, message = check_images( 'renderHtmlToImage', path, tolerance) self.assertTrue(flag, message + '\n' + path)