-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #160 from enthought/template-test-case-for-graphic…
…-contexts Template test case for graphic contexts
- Loading branch information
Showing
17 changed files
with
451 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,179 @@ | ||
import contextlib | ||
import os | ||
import shutil | ||
import tempfile | ||
|
||
import numpy | ||
from PIL import Image | ||
|
||
from kiva.fonttools import Font | ||
from kiva.constants import MODERN | ||
|
||
|
||
class DrawingTester(object): | ||
""" Basic drawing tests for graphics contexts. | ||
""" | ||
|
||
def setUp(self): | ||
self.directory = tempfile.mkdtemp() | ||
self.filename = os.path.join(self.directory, 'rendered') | ||
self.gc = self.create_graphics_context(300, 300) | ||
self.gc.clear() | ||
self.gc.set_stroke_color((1.0, 0.0, 0.0)) | ||
self.gc.set_fill_color((1.0, 0.0, 0.0)) | ||
self.gc.set_line_width(5) | ||
|
||
def tearDown(self): | ||
del self.gc | ||
shutil.rmtree(self.directory) | ||
|
||
def test_line(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.move_to(107, 204) | ||
self.gc.line_to(107, 104) | ||
self.gc.stroke_path() | ||
|
||
def test_rectangle(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.move_to(107, 104) | ||
self.gc.line_to(107, 184) | ||
self.gc.line_to(187, 184) | ||
self.gc.line_to(187, 104) | ||
self.gc.line_to(107, 104) | ||
self.gc.stroke_path() | ||
|
||
def test_rect(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.rect(0, 0, 200, 200) | ||
self.gc.stroke_path() | ||
|
||
def test_circle(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.arc(150, 150, 100, 0.0, 2 * numpy.pi) | ||
self.gc.stroke_path() | ||
|
||
def test_quarter_circle(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.arc(150, 150, 100, 0.0, numpy.pi / 2) | ||
self.gc.stroke_path() | ||
|
||
def test_text(self): | ||
with self.draw_and_check(): | ||
font = Font(family=MODERN) | ||
font.size = 24 | ||
self.gc.set_font(font) | ||
self.gc.set_text_position(23, 67) | ||
self.gc.show_text("hello kiva") | ||
|
||
def test_circle_fill(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.arc(150, 150, 100, 0.0, 2 * numpy.pi) | ||
self.gc.fill_path() | ||
|
||
def test_star_fill(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.move_to(100, 100) | ||
self.gc.line_to(150, 200) | ||
self.gc.line_to(200, 100) | ||
self.gc.line_to(100, 150) | ||
self.gc.line_to(200, 150) | ||
self.gc.line_to(100, 100) | ||
self.gc.fill_path() | ||
|
||
def test_star_eof_fill(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.move_to(100, 100) | ||
self.gc.line_to(150, 200) | ||
self.gc.line_to(200, 100) | ||
self.gc.line_to(100, 150) | ||
self.gc.line_to(200, 150) | ||
self.gc.line_to(100, 100) | ||
self.gc.eof_fill_path() | ||
|
||
def test_circle_clip(self): | ||
with self.draw_and_check(): | ||
self.gc.clip_to_rect(150, 150, 100, 100) | ||
self.gc.begin_path() | ||
self.gc.arc(150, 150, 100, 0.0, 2 * numpy.pi) | ||
self.gc.fill_path() | ||
|
||
def test_text_clip(self): | ||
with self.draw_and_check(): | ||
self.gc.clip_to_rect(23, 77, 100, 23) | ||
font = Font(family=MODERN) | ||
font.size = 24 | ||
self.gc.set_font(font) | ||
self.gc.set_text_position(23, 67) | ||
self.gc.show_text("hello kiva") | ||
|
||
def test_star_clip(self): | ||
with self.draw_and_check(): | ||
self.gc.begin_path() | ||
self.gc.move_to(100, 100) | ||
self.gc.line_to(150, 200) | ||
self.gc.line_to(200, 100) | ||
self.gc.line_to(100, 150) | ||
self.gc.line_to(200, 150) | ||
self.gc.line_to(100, 100) | ||
self.gc.close_path() | ||
self.gc.clip() | ||
|
||
self.gc.begin_path() | ||
self.gc.arc(150, 150, 100, 0.0, 2 * numpy.pi) | ||
self.gc.fill_path() | ||
|
||
#### Required methods #################################################### | ||
|
||
@contextlib.contextmanager | ||
def draw_and_check(self): | ||
""" A context manager to check the result. | ||
""" | ||
raise NotImplementedError() | ||
|
||
def create_graphics_context(self, width, length): | ||
""" Create the desired graphics context | ||
""" | ||
raise NotImplementedError() | ||
|
||
|
||
class DrawingImageTester(DrawingTester): | ||
""" Basic drawing tests for graphics contexts of gui toolkits. | ||
""" | ||
|
||
@contextlib.contextmanager | ||
def draw_and_check(self): | ||
yield | ||
filename = "{0}.png".format(self.filename) | ||
self.gc.save(filename) | ||
self.assertImageSavedWithContent(filename) | ||
|
||
def assertImageSavedWithContent(self, filename): | ||
""" Load the image and check that there is some content in it. | ||
""" | ||
image = numpy.array(Image.open(filename)) | ||
# default is expected to be a totally white image | ||
|
||
self.assertEqual(image.shape[:2], (300, 300)) | ||
if image.shape[2] == 3: | ||
check = numpy.sum(image == [255, 0, 0], axis=2) == 3 | ||
elif image.shape[2] == 4: | ||
check = numpy.sum(image == [255, 0, 0, 255], axis=2) == 4 | ||
else: | ||
self.fail( | ||
'Pixel size is not 3 or 4, but {0}'.format(image.shape[2])) | ||
if check.any(): | ||
return | ||
self.fail('The image looks empty, no red pixels where drawn') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from kiva.tests.drawing_tester import DrawingImageTester | ||
from kiva.image import GraphicsContext | ||
from traits.testing.unittest_tools import unittest | ||
|
||
|
||
class TestAggDrawing(DrawingImageTester, unittest.TestCase): | ||
|
||
def create_graphics_context(self, width, height): | ||
return GraphicsContext((width, height)) | ||
|
||
|
||
if __name__ == "__main__": | ||
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
from kiva.tests.drawing_tester import DrawingImageTester | ||
from traits.testing.unittest_tools import unittest | ||
|
||
try: | ||
import cairo # noqa | ||
except ImportError: | ||
CAIRO_NOT_AVAILABLE = True | ||
else: | ||
CAIRO_NOT_AVAILABLE = False | ||
|
||
|
||
@unittest.skipIf(CAIRO_NOT_AVAILABLE, "Cannot import cairo") | ||
class TestCairoDrawing(DrawingImageTester, unittest.TestCase): | ||
|
||
def create_graphics_context(self, width, height): | ||
from kiva.cairo import GraphicsContext | ||
return GraphicsContext((width, height)) | ||
|
||
|
||
if __name__ == "__main__": | ||
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
import contextlib | ||
|
||
try: | ||
import pyglet | ||
except ImportError: | ||
PYGLET_NOT_AVAILABLE = True | ||
else: | ||
PYGLET_NOT_AVAILABLE = False | ||
|
||
|
||
from kiva.tests.drawing_tester import DrawingImageTester | ||
from traits.testing.unittest_tools import unittest | ||
|
||
|
||
@unittest.skipIf(PYGLET_NOT_AVAILABLE, "Cannot import pyglet") | ||
class TestGLDrawing(DrawingImageTester, unittest.TestCase): | ||
|
||
def tearDown(self): | ||
if hasattr(self, 'window') and self.window is not None: | ||
self.window.close() | ||
del self.window | ||
DrawingImageTester.tearDown(self) | ||
|
||
def create_graphics_context(self, width, height): | ||
from kiva.gl import GraphicsContext | ||
self.window = pyglet.window.Window(width=width, height=height) | ||
gc = GraphicsContext((width, height)) | ||
gc.gl_init() | ||
return gc | ||
|
||
@unittest.skip("gl graphics context does not support star_clip (#164)") | ||
def test_star_clip(self): | ||
# FIXME: overriding test since it segfaults | ||
DrawingImageTester.test_star_clip(self) | ||
|
||
@unittest.expectedFailure | ||
def test_text_clip(self): | ||
# gl graphics context does not clip text properly (#165). | ||
DrawingImageTester.test_text_clip(self) | ||
|
||
@contextlib.contextmanager | ||
def draw_and_check(self): | ||
from pyglet.image.codecs.png import PNGImageEncoder | ||
|
||
self.window.clear() | ||
self.window.switch_to() | ||
self.window.dispatch_events() | ||
yield | ||
self.window.dispatch_events() | ||
filename = "{0}.png".format(self.filename) | ||
buffer = pyglet.image.get_buffer_manager() | ||
buffer.get_color_buffer().save(filename, encoder=PNGImageEncoder()) | ||
self.assertImageSavedWithContent(filename) | ||
|
||
|
||
if __name__ == "__main__": | ||
unittest.main() |
Oops, something went wrong.