grassrenderer_test.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # NAME: grassrenderer_test.py
  5. #
  6. # AUTHOR: Caitlin Haedrich (caitlin dot haedrich gmail com)
  7. #
  8. # PURPOSE: This is a test script for grass.jupyter's GrassRenderer
  9. #
  10. # COPYRIGHT: (C) 2021 by Caitlin Haedrich and the GRASS Development Team
  11. #
  12. # This program is free software under the GNU General Public
  13. # License (>=v2). Read the file COPYING that comes with GRASS
  14. # for details.
  15. #
  16. #############################################################################
  17. import os
  18. import unittest
  19. import sys
  20. from pathlib import Path
  21. import grass.jupyter as gj
  22. from grass.gunittest.case import TestCase
  23. from grass.gunittest.main import test
  24. def can_import_ipython():
  25. """Test folium import to see if test can be run."""
  26. try:
  27. import IPython
  28. return True
  29. except ImportError:
  30. return False
  31. class TestDisplay(TestCase):
  32. # Setup variables
  33. files = []
  34. @classmethod
  35. def setUpClass(cls):
  36. """Ensures expected computational region"""
  37. # to not override mapset's region (which might be used by other tests)
  38. cls.use_temp_region()
  39. # cls.runModule or self.runModule is used for general module calls
  40. # we'll use the elevation raster as a test display
  41. cls.runModule("g.region", raster="elevation")
  42. @classmethod
  43. def tearDownClass(cls):
  44. """Remove temporary region"""
  45. cls.del_temp_region()
  46. def tearDown(self):
  47. """
  48. Remove the PNG file created after testing with "filename =" option.
  49. This is executed after each test run.
  50. """
  51. for f in self.files:
  52. f = Path(f)
  53. if sys.version_info < (3, 8):
  54. try:
  55. os.remove(f)
  56. except FileNotFoundError:
  57. pass
  58. else:
  59. f.unlink(missing_ok=True)
  60. def test_defaults(self):
  61. """Test that GrassRenderer can create a map with default settings."""
  62. # Create a map with default inputs
  63. grass_renderer = gj.GrassRenderer()
  64. # Adding vectors and rasters to the map
  65. grass_renderer.run("d.rast", map="elevation")
  66. grass_renderer.run("d.vect", map="roadsmajor")
  67. # Make sure image was created
  68. self.assertFileExists(grass_renderer._filename)
  69. def test_filename(self):
  70. """Test that GrassRenderer creates maps with unique filenames."""
  71. # Create map with unique filename
  72. custom_filename = "test_filename.png"
  73. grass_renderer = gj.GrassRenderer(filename=custom_filename)
  74. # Add files to self for cleanup later
  75. self.files.append(custom_filename)
  76. self.files.append(f"{custom_filename}.grass_vector_legend")
  77. # Add a vector and a raster to the map
  78. grass_renderer.run("d.rast", map="elevation")
  79. grass_renderer.run("d.vect", map="roadsmajor")
  80. # Make sure image was created
  81. self.assertFileExists(custom_filename)
  82. def test_hw(self):
  83. """Test that GrassRenderer creates maps with custom height and widths."""
  84. # Create map with height and width parameters
  85. grass_renderer = gj.GrassRenderer(width=400, height=400)
  86. # Add just a vector (for variety here)
  87. grass_renderer.run("d.vect", map="roadsmajor")
  88. def test_env(self):
  89. """Test that we can hand an environment to GrassRenderer."""
  90. # Create map with environment parameter
  91. grass_renderer = gj.GrassRenderer(env=os.environ.copy())
  92. # Add just a raster (again for variety)
  93. grass_renderer.run("d.rast", map="elevation")
  94. def test_text(self):
  95. """Test that we can set a unique text_size in GrassRenderer."""
  96. # Create map with unique text_size parameter
  97. grass_renderer = gj.GrassRenderer(text_size=10)
  98. grass_renderer.run("d.vect", map="roadsmajor")
  99. grass_renderer.run("d.rast", map="elevation")
  100. def test_shortcut(self):
  101. """Test that we can use display shortcuts with __getattr__."""
  102. # Create map
  103. grass_renderer = gj.GrassRenderer()
  104. # Use shortcut
  105. grass_renderer.d_rast(map="elevation")
  106. grass_renderer.d_vect(map="roadsmajor")
  107. def test_shortcut_error(self):
  108. """Test that passing an incorrect attribute raises
  109. appropriate error"""
  110. # Create map
  111. grass_renderer = gj.GrassRenderer()
  112. # Pass bad shortcuts
  113. with self.assertRaisesRegex(AttributeError, "Module must begin with 'd_'"):
  114. grass_renderer.r_watersheds()
  115. with self.assertRaisesRegex(AttributeError, "d.module.does.not.exist"):
  116. grass_renderer.d_module_does_not_exist()
  117. @unittest.skipIf(not can_import_ipython(), "Cannot import IPython")
  118. def test_image_creation(self):
  119. """Test that show() returns an image object."""
  120. # Create map
  121. grass_renderer = gj.GrassRenderer()
  122. grass_renderer.d_rast(map="elevation")
  123. self.assertTrue(grass_renderer.show(), "Failed to open PNG image")
  124. if __name__ == "__main__":
  125. test()