diff --git a/testing/vcs/CMakeLists.txt b/testing/vcs/CMakeLists.txt index 04cd85d8e0..248a30655c 100644 --- a/testing/vcs/CMakeLists.txt +++ b/testing/vcs/CMakeLists.txt @@ -1,5 +1,6 @@ set(BASELINE_DIR "${UVCDAT_GIT_TESTDATA_DIR}/baselines/vcs") + cdat_add_test(vcs_verify_import "${PYTHON_EXECUTABLE}" ${cdat_SOURCE_DIR}/testing/vcs/test_vcs_import.py @@ -509,3 +510,5 @@ cdat_add_test(vcs_test_taylor_2_quads ${BASELINE_DIR}/test_vcs_issue_960_labels_2.png ) endif() + +add_subdirectory(vtk_ui) diff --git a/testing/vcs/vtk_ui/CMakeLists.txt b/testing/vcs/vtk_ui/CMakeLists.txt new file mode 100644 index 0000000000..88370e3542 --- /dev/null +++ b/testing/vcs/vtk_ui/CMakeLists.txt @@ -0,0 +1,67 @@ +set(BASELINE_DIR "${UVCDAT_GIT_TESTDATA_DIR}/baselines/vcs/vtk_ui") +set(TEST_DIR "${cdat_SOURCE_DIR}/testing/vcs/vtk_ui") + +# Button tests +add_test(test_vtk_ui_button_draw + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_draw.py + ${BASELINE_DIR}/test_vtk_ui_button_draw.png +) + +add_test(test_vtk_ui_button_action + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_action.py +) + +add_test(test_vtk_ui_button_corner_radius + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_corner_radius.py + ${BASELINE_DIR}/test_vtk_ui_button_corner_radius.png +) + +add_test(test_vtk_ui_button_dimensions + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_dimensions.py + ${BASELINE_DIR}/test_vtk_ui_button_dimensions.png +) + +add_test(test_vtk_ui_button_states + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_states.py + ${BASELINE_DIR}/test_vtk_ui_button_states.png +) + +add_test(test_vtk_ui_button_click + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_click.py +) + +add_test(test_vtk_ui_button_font + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_font.py + ${BASELINE_DIR}/test_vtk_ui_button_font.png +) + +add_test(test_vtk_ui_button_alignment + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_alignment.py + ${BASELINE_DIR}/test_vtk_ui_button_alignment.png +) + +add_test(test_vtk_ui_button_image + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_image.py + ${BASELINE_DIR}/test_vtk_ui_button_image.png +) + +add_test(test_vtk_ui_button_tooltip_show + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_tooltip_show.py + ${BASELINE_DIR}/test_vtk_ui_button_tooltip_show.png +) + +add_test(test_vtk_ui_button_tooltip_hide + "${PYTHON_EXECUTABLE}" + ${TEST_DIR}/test_vtk_ui_button_tooltip_hide.py + ${BASELINE_DIR}/test_vtk_ui_button_tooltip_hide.png +) \ No newline at end of file diff --git a/testing/vcs/vtk_ui/Pepper.png b/testing/vcs/vtk_ui/Pepper.png new file mode 100644 index 0000000000..06cc04d469 Binary files /dev/null and b/testing/vcs/vtk_ui/Pepper.png differ diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_action.py b/testing/vcs/vtk_ui/test_vtk_ui_button_action.py new file mode 100644 index 0000000000..ca96777b39 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_action.py @@ -0,0 +1,20 @@ +""" +Test button placement +""" +import vcs.vtk_ui + + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_action(vtk_ui_test): + def action(self, state): + self.passed = 0 + + def do_test(self): + self.win.SetSize(100, 100) + button = vcs.vtk_ui.Button(self.inter, action=self.action, corner_radius=5, font="Arial", left=10, top=10, label="Test", bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.place() + button.show() + button.clicked(None, None) + +test_vtk_ui_button_action().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_alignment.py b/testing/vcs/vtk_ui/test_vtk_ui_button_alignment.py new file mode 100644 index 0000000000..19d5bef32b --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_alignment.py @@ -0,0 +1,19 @@ +""" +Test button alignment +""" +from vcs.vtk_ui import button + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_alignment(vtk_ui_test): + def do_test(self): + self.win.SetSize(300, 50) + left_button = button.Button(self.inter, label="Left", halign=button.LEFT_ALIGN, valign=button.TOP_ALIGN, width=125) + left_button.show() + center_button = button.Button(self.inter, label="Center", halign=button.CENTER_ALIGN, valign=button.BOTTOM_ALIGN, top=25, width=125) + center_button.show() + right_button = button.Button(self.inter, label="Right", halign=button.RIGHT_ALIGN, valign=button.CENTER_ALIGN, width=125) + right_button.show() + self.test_file = "test_vtk_ui_button_alignment.png" + +test_vtk_ui_button_alignment().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_click.py b/testing/vcs/vtk_ui/test_vtk_ui_button_click.py new file mode 100644 index 0000000000..d5687a9a1b --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_click.py @@ -0,0 +1,25 @@ +""" +Test button click +""" +import vcs.vtk_ui + + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_click(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 100) + states = [vcs.vtk_ui.ButtonState(label="State %d" % i, fgcolor=(.1 * i + .5, .1 * i + .5, .1 * i + .5), bgcolor=(.5 - .1 * i,.5 - .1 * i,.5 - .1 * i)) for i in range(5)] + + b = vcs.vtk_ui.Button(self.inter, states=states, action=self.pass_me, left=0, top=0) + b.show() + + self.click_event(5, 95) + + def pass_me(self, state): + if state == 1: + print "Button action executed" + self.passed = 0 + +if __name__ == "__main__": + test_vtk_ui_button_click().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_corner_radius.py b/testing/vcs/vtk_ui/test_vtk_ui_button_corner_radius.py new file mode 100644 index 0000000000..f92f916c34 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_corner_radius.py @@ -0,0 +1,18 @@ +""" +Test button placement +""" +import vcs.vtk_ui + + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_corner_radius(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 300) + for i in range(10): + button = vcs.vtk_ui.Button(self.inter, corner_radius=i, font="Arial", left=10, top=30 * i, label="Test", bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.place() + button.show() + self.test_file = "test_vtk_ui_button_corner_radius.png" + +test_vtk_ui_button_corner_radius().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_dimensions.py b/testing/vcs/vtk_ui/test_vtk_ui_button_dimensions.py new file mode 100644 index 0000000000..414c79e212 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_dimensions.py @@ -0,0 +1,27 @@ +""" +Test button placement +""" +import vcs.vtk_ui + + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_dimensions(vtk_ui_test): + def do_test(self): + self.win.SetSize(290, 300) + + button = vcs.vtk_ui.Button(self.inter, corner_radius=5, font="Arial", height=15, width=100, left=10, top=10, label="100 x 15", bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.place() + button.show() + + button = vcs.vtk_ui.Button(self.inter, corner_radius=5, font="Arial", height=90, width=90, left=10, top=30, label="90 x 90", bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.place() + button.show() + + button = vcs.vtk_ui.Button(self.inter, corner_radius=5, font="Arial", height=100, width=30, left=10, top=200, label="30\n x \n100", bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.place() + button.show() + + self.test_file = "test_vtk_ui_button_dimensions.png" + +test_vtk_ui_button_dimensions().test() diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_draw.py b/testing/vcs/vtk_ui/test_vtk_ui_button_draw.py new file mode 100644 index 0000000000..5ab80a2fe4 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_draw.py @@ -0,0 +1,19 @@ +""" +Test button placement +""" +import vcs.vtk_ui + + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_draw(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 250) + + for i in range(5): + button = vcs.vtk_ui.Button(self.inter, corner_radius=5, font="Arial", left=10 * i, top=30 * i, label="Test %d" % i, bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.place() + button.show() + self.test_file = "test_vtk_ui_button_draw.png" + +test_vtk_ui_button_draw().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_font.py b/testing/vcs/vtk_ui/test_vtk_ui_button_font.py new file mode 100644 index 0000000000..2dad0c455f --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_font.py @@ -0,0 +1,17 @@ +""" +Test button font/size +""" + +import vcs, os +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_font(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 80) + fonts = ["Arial", "Courier", os.path.join(os.environ["HOME"], vcs.getdotdirectory()[0], "HelvMono.ttf")] + sizes = [8, 12, 16] + for ind, font in enumerate(fonts): + b = vcs.vtk_ui.Button(self.inter, label="Font Test", font=font, top=ind * 25, size=sizes[ind]) + b.show() + self.test_file = "test_vtk_ui_button_font.png" +test_vtk_ui_button_font().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_image.py b/testing/vcs/vtk_ui/test_vtk_ui_button_image.py new file mode 100644 index 0000000000..6b8b73af04 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_image.py @@ -0,0 +1,18 @@ +""" +Test button image +""" +import vcs.vtk_ui + +from vtk_ui_test import vtk_ui_test +import os + +class test_vtk_ui_button_image(vtk_ui_test): + def do_test(self): + self.win.SetSize(80, 80) + directory = os.path.dirname(__file__) + image = os.path.join(directory, "Pepper.png") + b = vcs.vtk_ui.Button(self.inter, image=image, left=5, top=5) + b.show() + self.test_file = "test_vtk_ui_button_image.png" + +test_vtk_ui_button_image().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_states.py b/testing/vcs/vtk_ui/test_vtk_ui_button_states.py new file mode 100644 index 0000000000..5027430c70 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_states.py @@ -0,0 +1,21 @@ +""" +Test button states +""" +import vcs.vtk_ui + + +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_states(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 250) + states = [vcs.vtk_ui.ButtonState(label="State %d" % i, fgcolor=(.1 * i + .5, .1 * i + .5, .1 * i + .5), bgcolor=(.5 - .1 * i,.5 - .1 * i,.5 - .1 * i)) for i in range(5)] + + for i in range(5): + button = vcs.vtk_ui.Button(self.inter, corner_radius=5, font="Arial", left=10 * i, top=30 * i, states=states, bgcolor=(.1, .1, .1), fgcolor=(1, 1, 1), size=14, halign=vcs.vtk_ui.button.LEFT_ALIGN, valign=vcs.vtk_ui.button.CENTER_ALIGN) + button.set_state(i) + button.place() + button.show() + self.test_file = "test_vtk_ui_button_states.png" + +test_vtk_ui_button_states().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_tooltip_hide.py b/testing/vcs/vtk_ui/test_vtk_ui_button_tooltip_hide.py new file mode 100644 index 0000000000..7b5f0ad9f8 --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_tooltip_hide.py @@ -0,0 +1,28 @@ +""" +Test button tooltip hides when hovered over +""" +import vcs.vtk_ui + +import vtk +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_tooltip_hide(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 100) + + prop = vtk.vtkTextProperty() + prop.SetColor(.5, .5, .5) + prop.SetBackgroundColor(1, 0, 0) + prop.SetBackgroundOpacity(1) + prop.SetVerticalJustificationToCentered() + b = vcs.vtk_ui.Button(self.inter, label="Hover", tooltip="Hidden", tooltip_property=prop) + b.show() + + # Timers only work while interacting, have to fake this ID + b.hover_timer = 1 + + self.hover(5, 95, .3) + self.test_file = "test_vtk_ui_button_tooltip_hide.png" + self.hover(5, 50, .1) + +test_vtk_ui_button_tooltip_hide().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/test_vtk_ui_button_tooltip_show.py b/testing/vcs/vtk_ui/test_vtk_ui_button_tooltip_show.py new file mode 100644 index 0000000000..3d5b1a4ada --- /dev/null +++ b/testing/vcs/vtk_ui/test_vtk_ui_button_tooltip_show.py @@ -0,0 +1,27 @@ +""" +Test button tooltip shows when hovered over +""" +import vcs.vtk_ui + +import vtk +from vtk_ui_test import vtk_ui_test + +class test_vtk_ui_button_tooltip_show(vtk_ui_test): + def do_test(self): + self.win.SetSize(100, 100) + + prop = vtk.vtkTextProperty() + prop.SetColor(.5, .5, .5) + prop.SetBackgroundColor(1, 0, 0) + prop.SetBackgroundOpacity(1) + prop.SetVerticalJustificationToCentered() + b = vcs.vtk_ui.Button(self.inter, label="Hover", tooltip="Hidden", tooltip_property=prop) + b.show() + + # Timers only work while interacting, have to fake this ID + b.hover_timer = 1 + + self.hover(5, 95, .3) + self.test_file = "test_vtk_ui_button_tooltip_show.png" + +test_vtk_ui_button_tooltip_show().test() \ No newline at end of file diff --git a/testing/vcs/vtk_ui/vtk_ui_test.py b/testing/vcs/vtk_ui/vtk_ui_test.py new file mode 100644 index 0000000000..c8b23d980b --- /dev/null +++ b/testing/vcs/vtk_ui/vtk_ui_test.py @@ -0,0 +1,67 @@ +import vtk, vcs.vtk_ui + +import os, sys, time + +def init(): + win = vtk.vtkRenderWindow() + win.SetSize(100, 250) + inter = vtk.vtkRenderWindowInteractor() + inter.SetRenderWindow(win) + manager = vcs.vtk_ui.manager.get_manager(inter) + win.SetOffScreenRendering(1) + win.AddRenderer(manager.renderer) + + return win + +def generate_png(win, fnm): + win.Render() + out_filter = vtk.vtkWindowToImageFilter() + out_filter.SetInput(win) + out_filter.Update() + + png_writer = vtk.vtkPNGWriter() + png_writer.SetFileName(fnm) + png_writer.SetInputConnection(out_filter.GetOutputPort()) + png_writer.Write() + +class vtk_ui_test(object): + def __init__(self): + self.win = init() + self.inter = self.win.GetInteractor() + self.test_file = None + self.passed = 1 + + def hover(self, x, y, duration): + self.win.Render() + self.inter.SetEventInformation(x, y) + self.inter.MouseMoveEvent() + time.sleep(duration) + self.inter.InvokeEvent("TimerEvent") + self.win.Render() + + def click_event(self, x, y): + self.win.Render() + self.inter.SetEventInformation(x, y) + self.inter.MouseMoveEvent() + self.inter.LeftButtonPressEvent() + self.inter.LeftButtonReleaseEvent() + + def do_test(self): + raise NotImplementedError("Implement do_test to execute a test.") + + def test(self): + self.do_test() + + if self.test_file is not None: + generate_png(self.win, self.test_file) + if len(sys.argv) >= 2: + src=sys.argv[1] + pth = os.path.join(os.path.dirname(__file__),"../..") + sys.path.append(pth) + import checkimage + print "fnm:", self.test_file + print "src:", src + self.passed = checkimage.check_result_image(self.test_file, src, checkimage.defaultThreshold) + + print sys.argv[0], "passed" if self.passed == 0 else "failed" + sys.exit(self.passed)