|
@@ -0,0 +1,145 @@
|
|
|
+#!/usr/bin/env python
|
|
|
+
|
|
|
+############################################################################
|
|
|
+#
|
|
|
+# NAME: grassrenderer_test.py
|
|
|
+#
|
|
|
+# AUTHOR: Caitlin Haedrich (caitlin dot haedrich gmail com)
|
|
|
+#
|
|
|
+# PURPOSE: This is a test script for grass.jupyter's GrassRenderer
|
|
|
+#
|
|
|
+# COPYRIGHT: (C) 2021 by Caitlin Haedrich and the GRASS Development Team
|
|
|
+#
|
|
|
+# This program is free software under the GNU General Public
|
|
|
+# License (>=v2). Read the file COPYING that comes with GRASS
|
|
|
+# for details.
|
|
|
+#
|
|
|
+#############################################################################
|
|
|
+
|
|
|
+import os
|
|
|
+import unittest
|
|
|
+import sys
|
|
|
+from pathlib import Path
|
|
|
+import grass.jupyter as gj
|
|
|
+from grass.gunittest.case import TestCase
|
|
|
+from grass.gunittest.main import test
|
|
|
+
|
|
|
+
|
|
|
+def can_import_ipython():
|
|
|
+ """Test folium import to see if test can be run."""
|
|
|
+ try:
|
|
|
+ import IPython
|
|
|
+
|
|
|
+ return True
|
|
|
+ except ImportError:
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
+class TestDisplay(TestCase):
|
|
|
+ # Setup variables
|
|
|
+ files = []
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def setUpClass(cls):
|
|
|
+ """Ensures expected computational region"""
|
|
|
+ # to not override mapset's region (which might be used by other tests)
|
|
|
+ cls.use_temp_region()
|
|
|
+ # cls.runModule or self.runModule is used for general module calls
|
|
|
+ # we'll use the elevation raster as a test display
|
|
|
+ cls.runModule("g.region", raster="elevation")
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def tearDownClass(cls):
|
|
|
+ """Remove temporary region"""
|
|
|
+ cls.del_temp_region()
|
|
|
+
|
|
|
+ def tearDown(self):
|
|
|
+ """
|
|
|
+ Remove the PNG file created after testing with "filename =" option.
|
|
|
+ This is executed after each test run.
|
|
|
+ """
|
|
|
+ for f in self.files:
|
|
|
+ f = Path(f)
|
|
|
+ if sys.version_info < (3, 8):
|
|
|
+ try:
|
|
|
+ os.remove(f)
|
|
|
+ except FileNotFoundError:
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ f.unlink(missing_ok=True)
|
|
|
+
|
|
|
+ def test_defaults(self):
|
|
|
+ """Test that GrassRenderer can create a map with default settings."""
|
|
|
+ # Create a map with default inputs
|
|
|
+ grass_renderer = gj.GrassRenderer()
|
|
|
+ # Adding vectors and rasters to the map
|
|
|
+ grass_renderer.run("d.rast", map="elevation")
|
|
|
+ grass_renderer.run("d.vect", map="roadsmajor")
|
|
|
+ # Make sure image was created
|
|
|
+ self.assertFileExists(grass_renderer._filename)
|
|
|
+
|
|
|
+ def test_filename(self):
|
|
|
+ """Test that GrassRenderer creates maps with unique filenames."""
|
|
|
+ # Create map with unique filename
|
|
|
+ custom_filename = "test_filename.png"
|
|
|
+ grass_renderer = gj.GrassRenderer(filename=custom_filename)
|
|
|
+ # Add files to self for cleanup later
|
|
|
+ self.files.append(custom_filename)
|
|
|
+ self.files.append(f"{custom_filename}.grass_vector_legend")
|
|
|
+ # Add a vector and a raster to the map
|
|
|
+ grass_renderer.run("d.rast", map="elevation")
|
|
|
+ grass_renderer.run("d.vect", map="roadsmajor")
|
|
|
+ # Make sure image was created
|
|
|
+ self.assertFileExists(custom_filename)
|
|
|
+
|
|
|
+ def test_hw(self):
|
|
|
+ """Test that GrassRenderer creates maps with custom height and widths."""
|
|
|
+ # Create map with height and width parameters
|
|
|
+ grass_renderer = gj.GrassRenderer(width=400, height=400)
|
|
|
+ # Add just a vector (for variety here)
|
|
|
+ grass_renderer.run("d.vect", map="roadsmajor")
|
|
|
+
|
|
|
+ def test_env(self):
|
|
|
+ """Test that we can hand an environment to GrassRenderer."""
|
|
|
+ # Create map with environment parameter
|
|
|
+ grass_renderer = gj.GrassRenderer(env=os.environ.copy())
|
|
|
+ # Add just a raster (again for variety)
|
|
|
+ grass_renderer.run("d.rast", map="elevation")
|
|
|
+
|
|
|
+ def test_text(self):
|
|
|
+ """Test that we can set a unique text_size in GrassRenderer."""
|
|
|
+ # Create map with unique text_size parameter
|
|
|
+ grass_renderer = gj.GrassRenderer(text_size=10)
|
|
|
+ grass_renderer.run("d.vect", map="roadsmajor")
|
|
|
+ grass_renderer.run("d.rast", map="elevation")
|
|
|
+
|
|
|
+ def test_shortcut(self):
|
|
|
+ """Test that we can use display shortcuts with __getattr__."""
|
|
|
+ # Create map
|
|
|
+ grass_renderer = gj.GrassRenderer()
|
|
|
+ # Use shortcut
|
|
|
+ grass_renderer.d_rast(map="elevation")
|
|
|
+ grass_renderer.d_vect(map="roadsmajor")
|
|
|
+
|
|
|
+ def test_shortcut_error(self):
|
|
|
+ """Test that passing an incorrect attribute raises
|
|
|
+ appropriate error"""
|
|
|
+ # Create map
|
|
|
+ grass_renderer = gj.GrassRenderer()
|
|
|
+ # Pass bad shortcuts
|
|
|
+ with self.assertRaisesRegex(AttributeError, "Module must begin with 'd_'"):
|
|
|
+ grass_renderer.r_watersheds()
|
|
|
+ with self.assertRaisesRegex(AttributeError, "d.module.does.not.exist"):
|
|
|
+ grass_renderer.d_module_does_not_exist()
|
|
|
+
|
|
|
+ @unittest.skipIf(not can_import_ipython(), "Cannot import IPython")
|
|
|
+ def test_image_creation(self):
|
|
|
+ """Test that show() returns an image object."""
|
|
|
+ # Create map
|
|
|
+ grass_renderer = gj.GrassRenderer()
|
|
|
+ grass_renderer.d_rast(map="elevation")
|
|
|
+ self.assertTrue(grass_renderer.show(), "Failed to open PNG image")
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ test()
|