test_render3d.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # NAME: Test 3D renderer
  5. #
  6. # AUTHOR(S): Vaclav Petras <wenzeslaus gmail com>
  7. #
  8. # PURPOSE: Test script for grass.jupyter's Grass3dRenderer
  9. #
  10. # COPYRIGHT: (C) 2021 by Vaclav Petras 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. """Test of 3D renderer"""
  18. import os
  19. import sys
  20. import unittest
  21. from pathlib import Path
  22. import grass.jupyter as gj
  23. from grass.gunittest.case import TestCase
  24. from grass.gunittest.main import test
  25. def can_import_ipython():
  26. """Return True if IPython can be imported, False otherwise"""
  27. try:
  28. # pylint: disable=import-outside-toplevel,unused-import
  29. import IPython # noqa: F401
  30. return True
  31. except ImportError:
  32. return False
  33. def can_import_pyvirtualdisplay():
  34. """Return True if pyvirtualdisplay can be imported, False otherwise"""
  35. try:
  36. # pylint: disable=import-outside-toplevel,unused-import
  37. import pyvirtualdisplay # noqa: F401
  38. return True
  39. except ImportError:
  40. return False
  41. class TestDisplay(TestCase):
  42. """Test Grass3dRenderer"""
  43. files = []
  44. @classmethod
  45. def setUpClass(cls):
  46. """Ensures expected computational region"""
  47. # to not override mapset's region (which might be used by other tests)
  48. cls.use_temp_region()
  49. # cls.runModule or self.runModule is used for general module calls
  50. # we'll use the elevation raster as a test display
  51. cls.runModule("g.region", raster="elevation")
  52. @classmethod
  53. def tearDownClass(cls):
  54. """Remove temporary region"""
  55. cls.del_temp_region()
  56. def tearDown(self):
  57. """After each run, remove the created files if exist"""
  58. for file in self.files:
  59. file = Path(file)
  60. if sys.version_info < (3, 8):
  61. try:
  62. os.remove(file)
  63. except FileNotFoundError:
  64. pass
  65. else:
  66. file.unlink(missing_ok=True)
  67. def test_defaults(self):
  68. """Check that default settings work"""
  69. renderer = gj.Grass3dRenderer()
  70. renderer.render(elevation_map="elevation", color_map="elevation")
  71. self.assertFileExists(renderer.filename)
  72. def test_filename(self):
  73. """Check that custom filename works"""
  74. custom_filename = "test_filename.png"
  75. renderer = gj.Grass3dRenderer(filename=custom_filename)
  76. # Add files to self for cleanup later
  77. self.files.append(custom_filename)
  78. renderer.render(elevation_map="elevation", color_map="elevation")
  79. self.assertFileExists(custom_filename)
  80. def test_hw(self):
  81. """Check that custom width and height works"""
  82. renderer = gj.Grass3dRenderer(width=200, height=400)
  83. renderer.render(elevation_map="elevation", color_map="elevation")
  84. self.assertFileExists(renderer.filename)
  85. def test_overlay(self):
  86. """Check that overlay works"""
  87. renderer = gj.Grass3dRenderer()
  88. renderer.render(elevation_map="elevation", color_map="elevation")
  89. renderer.overlay.d_legend(raster="elevation", at=(60, 97, 87, 92))
  90. self.assertFileExists(renderer.filename)
  91. @unittest.skipIf(
  92. not can_import_pyvirtualdisplay(), "Cannot import PyVirtualDisplay"
  93. )
  94. def test_pyvirtualdisplay_backend(self):
  95. """Check that pyvirtualdisplay backend works"""
  96. renderer = gj.Grass3dRenderer(screen_backend="pyvirtualdisplay")
  97. renderer.render(elevation_map="elevation", color_map="elevation")
  98. self.assertFileExists(renderer.filename)
  99. def test_shortcut_error(self):
  100. """Check that wrong screen backend fails"""
  101. with self.assertRaisesRegex(ValueError, "does_not_exist"):
  102. gj.Grass3dRenderer(screen_backend="does_not_exist")
  103. @unittest.skipIf(not can_import_ipython(), "Cannot import IPython")
  104. def test_image_creation(self):
  105. """Check that show() works"""
  106. renderer = gj.Grass3dRenderer()
  107. renderer.render(elevation_map="elevation", color_map="elevation")
  108. self.assertTrue(renderer.show(), "Failed to create IPython Image object")
  109. if __name__ == "__main__":
  110. test()