def reset(self): """ Reset the widget to a blank screen. """ self._canvas = Canvas(self._frame.canvas, self._h, self._w, x=self._x, y=self._y) self._cursor_x, self._cursor_y = 0, 0 self._current_colours = (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK)
def test_shadow(self): """ Check Frames support shadows. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8) scene = MagicMock(spec=Scene) canvas = Canvas(screen, 10, 40, 0, 0) for y in range(10): canvas.print_at("X" * 40, 0, y) form = PopUpDialog( canvas, "Message", ["Yes", "No"], test_on_click, has_shadow=True) form.register_scene(scene) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXX+------------------+XXXXXXXXXX\n" + "XXXXXXXXXX|Message | XXXXXXXXX\n" + "XXXXXXXXXX| | XXXXXXXXX\n" + "XXXXXXXXXX| < Yes > < No > | XXXXXXXXX\n" + "XXXXXXXXXX+------------------+ XXXXXXXXX\n" + "XXXXXXXXXXX XXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n")
def demo(screen=None): canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c")
def test_mirage(self): """ Check that Mirage works. """ # Check that Mirage randomly updates the Screen every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Mirage(canvas, FigletText("hello"), 3, 1) effect.reset() effect.update(0) self.assert_blank(canvas) effect.update(1) changed = False for x in range(canvas.width): for y in range(canvas.height): if canvas.get_from(x, y) != (32, 7, 0, 0): changed = True self.assertTrue(changed) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_wipe(self): """ Check that Wipe works. """ # Check that Wipe clears lines going down the screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Wipe(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for x in range(canvas.width): for y in range(canvas.height): canvas.print_at(chr(randint(1, 128)), x, y) my_buffer[y][x] = canvas.get_from(x, y) for i in range(10): effect.update(i) self.assertEqual( self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_wipe(self): """ Check that Wipe works. """ # Check that Wipe clears lines going down the screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Wipe(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for x in range(canvas.width): for y in range(canvas.height): canvas.print_at(chr(randint(1, 128)), x, y) my_buffer[y][x] = canvas.get_from(x, y) for i in range(10): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def set_layout(self, x, y, offset, w, h): """ Resize the widget (and underlying TTY) to the required size. """ super(Terminal, self).set_layout(x, y, offset, w, h) self._canvas = Canvas(self._frame.canvas, h, w, x=x, y=y) winsize = struct.pack("HHHH", h, w, 0, 0) fcntl.ioctl(self._slave, termios.TIOCSWINSZ, winsize)
def test_class_method_decorator(self, screen=None): """ Check ManagedScreen method decorator works. """ canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c")
def test_context_manager(self): """ Check ManagedScreen context manager works. """ with ManagedScreen() as screen: canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c")
def __init__(self): self.instance = TestIrohaTUI() self.screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) self.canvas = Canvas(self.screen, 25, 80, 0, 0) self.canvas.clear = lambda: self.canvas.reset() self.instance.screen_manager = ScreenManager.from_frame( SelectorView, ModeSelectorModel, screen=self.canvas, application=self.instance )
def test_shoot_screen(self): """ Test that ShootScreen works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) canvas.centre("Hello World!", 5) effect = ShootScreen(canvas, canvas.width // 2, canvas.height // 2, 100) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), 'HeloWrd! '), is_blank=False, iterations=4)
def test_drop_screen(self): """ Test that DropScreen works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) canvas.centre("Hello World!", 0) effect = DropScreen(canvas, 100) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), 'HeloWrd! '), is_blank=False, warm_up=3, iterations=10)
def test_shoot_screen(self): """ Test that ShootScreen works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) canvas.centre("Hello World!", 5) effect = ShootScreen(canvas, canvas.width // 2, canvas.height // 2, 100) self.check_effect( canvas, effect, lambda value: self.assertIn(chr(value[0]), 'HeloWrd! '), is_blank=False, iterations=4)
def test_drop_screen(self): """ Test that DropScreen works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) canvas.centre("Hello World!", 0) effect = DropScreen(canvas, 100) self.check_effect( canvas, effect, lambda value: self.assertIn(chr(value[0]), 'HeloWrd! '), is_blank=False, warm_up=3, iterations=10)
def test_radiobutton_input(self): """ Check RadioButton input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) form.reset() # Check basic selection keys self.process_keys( form, [Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB]) form.save() self.assertEqual(form.data["Things"], 1) self.process_keys(form, [Screen.KEY_DOWN]) form.save() self.assertEqual(form.data["Things"], 2) self.process_keys(form, [Screen.KEY_UP]) form.save() self.assertEqual(form.data["Things"], 1) # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event))
def test_checkbox_input(self): """ Check Checkbox input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) form.reset() # Check basic selection keys self.process_keys(form, [ Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, " " ]) form.save() self.assertEqual(form.data["CA"], True) self.process_keys(form, ["\n"]) form.save() self.assertEqual(form.data["CA"], False) self.process_keys(form, ["\r"]) form.save() self.assertEqual(form.data["CA"], True) # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event))
def test_text_input(self): """ Check Text input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) form.reset() # Check basic movement keys self.process_keys(form, [Screen.KEY_TAB, "ABC"]) form.save() self.assertEqual(form.data["TB"], "ABC") self.process_keys(form, [Screen.KEY_HOME, "D"]) form.save() self.assertEqual(form.data["TB"], "DABC") self.process_keys(form, [Screen.KEY_END, "E"]) form.save() self.assertEqual(form.data["TB"], "DABCE") self.process_keys(form, [Screen.KEY_LEFT, "F"]) form.save() self.assertEqual(form.data["TB"], "DABCFE") self.process_keys(form, [Screen.KEY_RIGHT, "G"]) form.save() self.assertEqual(form.data["TB"], "DABCFEG") # Backspace self.process_keys(form, [Screen.KEY_BACK]) form.save() self.assertEqual(form.data["TB"], "DABCFE") # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event))
def test_form_input(self): """ Check Frame input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) form.reset() self.process_keys(form, ["ABC\nDEF", "GHI", "jkl", "MN", " ", " ", "", " "], Screen.KEY_TAB) form.save() self.assertEqual( form.data, { 'CA': True, 'CB': False, 'CC': True, 'TA': ['ABC', 'DEF'], 'TB': 'GHI', 'TC': 'jkl', 'TD': 'MN', 'Things': 1 }) # Check that forms ignore unrecognised events. event = object() self.assertEqual(event, form.process_event(event))
def test_matrix(self): """ Check that the Matrix works. """ # Check that Matrix randomly updates the Screen every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Matrix(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(10): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertTrue(value[0] == 32 or value[1] == 2)), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_cjk_popup(self): """ Check PopUpDialog widgets work with CJK double-width characters. """ # Apologies to anyone who actually speaks this language! I just need some double-width # glyphs so have re-used the ones from the original bug report. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = MagicMock(spec=Scene) canvas = Canvas(screen, 10, 40, 0, 0) form = PopUpDialog(canvas, u"你確定嗎? 你確定嗎? 你確定嗎?", [u"是", u"否"]) form.register_scene(scene) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, " \n" + " \n" + " +------------------------+ \n" + " |你你確確定定嗎嗎?? 你你確確定定嗎嗎?? | \n" + " |你你確確定定嗎嗎?? O \n" + " | | \n" + " | < 是是 > < 否否 > | \n" + " +------------------------+ \n" + " \n" + " \n")
def test_disabled_text(self): """ Check disabled TextBox can be used for pre-formatted output. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = MagicMock(spec=Scene) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) text_box = TextBox(1, as_string=True) text_box.disabled = True layout.add_widget(text_box) form.fix() form.register_scene(scene) form.reset() # Check that input has no effect on the programmed value. text_box.value = "A test" self.process_keys(form, ["A"]) form.save() self.assertEqual(text_box.value, "A test") # Check that we can provide a custom colour. Since the default palette has no "custom" # key, this will throw an exception. self.assertEqual(text_box._pick_colours("blah"), form.palette["disabled"]) with self.assertRaises(KeyError) as cm: text_box.custom_colour = "custom" text_box._pick_colours("blah") self.assertIn("custom", str(cm.exception))
def test_validation(self): """ Check free-form text validation works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) form.reset() # Check that save still works with no validation. self.process_keys(form, [Screen.KEY_TAB, Screen.KEY_TAB, "ABC"]) form.save() self.assertEqual(form.data["TC"], "ABC") # Check that enforced validation throws exceptions as needed. with self.assertRaises(InvalidFields) as cm: form.save(validate=True) self.assertEqual(cm.exception.fields, ["TC"]) # Check valid data doesn't throw anything. self.process_keys(form, [Screen.KEY_BACK, Screen.KEY_BACK, Screen.KEY_BACK]) form.save(validate=True) # Check functions work as well as regexp strings. self.process_keys(form, [Screen.KEY_TAB, "ABC"]) with self.assertRaises(InvalidFields) as cm: form.save(validate=True) self.assertEqual(cm.exception.fields, ["TD"])
def test_cog(self): """ Check that Cog works. """ # Check that Cog updates the Screen every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Cog(canvas, 10, 5, 5) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(20): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn( chr(value[0]), " ''^.|/7.\\|Ywbd#")), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_julia(self): """ Check that Julia works. """ # Check that Julia updates every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Julia(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(20): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), '@&9#GHh32As;:. ')), True) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_sprite(self): """ Check that Sprites work. """ # Check that we can move a Sprite around the screen. screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) path = Path() path.jump_to(10, 5) path.move_straight_to(20, 10, 5) path.move_straight_to(30, 5, 5) path.move_straight_to(20, 0, 5) path.move_straight_to(10, 5, 5) effect = Sam(canvas, path) effect.reset() self.assert_blank(canvas) buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(30): effect.update(i) self.assertEqual( self.check_canvas( canvas, buffer, lambda value: self.assertLess(value[0], 129)), i % 2 == 0, "Bad update on frame %d" % i) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0)
def test_cjk_forms(self): """ Check form widgets work with CJK characters. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = MagicMock(spec=Scene) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False) layout = Layout([100], fill_frame=True) mc_list = MultiColumnListBox(4, [3, 5, 0], [ (["1", "2", "3"], 1), ([u"你", u"確", u"定"], 2), ], titles=[u"你確定嗎?", u"你確定嗎?", u"你確定嗎?"]) text = Text() text_box = TextBox(3) form.add_layout(layout) layout.add_widget(mc_list) layout.add_widget(text) layout.add_widget(text_box) form.fix() form.register_scene(scene) form.reset() # Set some interesting values... text.value = u"你確定嗎? 你確定嗎? 你確定嗎?" text_box.value = [u"你確定嗎", u"?"] # Check that the CJK characters render correctly - no really this is correctly aligned! self.maxDiff = None form.update(0) self.assert_canvas_equals( canvas, u"你你 你你確確 你你確確定定嗎嗎?? \n" + u"1 2 3 \n" + u"你你 確確 定定 \n" + u" \n" + u"你你確確定定嗎嗎?? 你你確確定定嗎嗎?? 你你確確定定嗎嗎?? \n" + u"你你確確定定嗎嗎 \n" + u"?? \n" + u" \n" + u" \n" + u" \n") # Check that mouse input takes into account the glyph width self.process_mouse(form, [(5, 4, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["b"]) self.process_mouse(form, [(2, 4, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["p"]) form.save() self.assertEqual(text.value, u"你p確b定嗎? 你確定嗎? 你確定嗎?") self.process_mouse(form, [(2, 5, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["p"]) self.process_mouse(form, [(1, 6, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["b"]) form.save() self.assertEqual(text_box.value, [u"你p確定嗎", u"b?"])
def test_sprite_overlap(self): """ Check that Sprites detect overlap. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) path = Path() path.jump_to(10, 5) effect1 = Sam(canvas, path) effect2 = Sam(canvas, path) # These 2 sprites should overlap! effect1.reset() effect1.update(0) effect2.reset() effect2.update(0) self.assertTrue(effect1.overlaps(effect2)) # Now create a sprite that shouldn't quite overlap width = effect1.last_position()[2] path = Path() path.jump_to(10 + width, 5) effect2 = Sam(canvas, path) effect2.reset() effect2.update(0) self.assertFalse(effect1.overlaps(effect2))
def test_noise(self): """ Check that RandomNoise works. """ # Check that RandomNoise updates every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = RandomNoise(canvas) effect.reset() self.assert_blank(canvas) buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(20): effect.update(i) self.assertEqual(self.check_canvas( canvas, buffer, lambda value: self.assertLess(value[0], 129)), True) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_clone(self): """ Check Frame cloning works. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8) scene = MagicMock(spec=Scene) scene2 = Scene([], 10) canvas = Canvas(screen, 10, 40, 0, 0) # Check that pop-up dialogs get copied to the new Scene form = PopUpDialog( canvas, "Message", ["Yes", "No"], test_on_click, has_shadow=True) form.register_scene(scene) form.clone(canvas, scene2) self.assertEqual(len(scene2.effects), 1) self.assertEqual(scene2.effects[0]._text, "Message") self.assertEqual(scene2.effects[0]._buttons, ["Yes", "No"]) # Check that normal Frame data gets copied to the new Scene. frame = TestFrame(canvas) frame2 = TestFrame(canvas) scene2 = Scene([frame2], 10) frame.register_scene(scene) frame2.register_scene(scene) frame.data = {"TA": "something"} frame2.data = {} self.assertEqual(frame2.data, {}) self.assertNotEqual(frame2.data, frame.data) frame.clone(canvas, scene2) self.assertEqual(frame2.data, frame.data)
def test_sprite(self): """ Check that Sprites work. """ # Check that we can move a Sprite around the screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) path = Path() path.jump_to(10, 5) path.move_straight_to(20, 10, 5) path.move_straight_to(30, 5, 5) path.move_straight_to(20, 0, 5) path.move_straight_to(10, 5, 5) effect = Sam(canvas, path) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(30): effect.update(i) self.assertEqual( self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), i % 2 == 0, "Bad update on frame %d" % i) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # Static paths should pay no attention to events. event = object() self.assertEqual(event, effect.process_event(event))
def test_snow(self): """ Check that Snow works. """ # Check that Snow randomly updates the Screen every 3rd frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Snow(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(10): effect.update(i) self.assertEqual( self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), ".+* ,;#@")), i % 3 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_pop_up_widget(self): """ Check widget tab stops work as expected. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8) scene = MagicMock(spec=Scene) canvas = Canvas(screen, 10, 40, 0, 0) form = PopUpDialog(canvas, "Message", ["Yes", "No"], test_on_click) form.register_scene(scene) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, " \n" + " \n" + " +------------------+ \n" + " |Message | \n" + " | | \n" + " | < Yes > < No > | \n" + " +------------------+ \n" + " \n" + " \n" + " \n") # Check that mouse input triggers the close function. with self.assertRaises(NextScene): self.process_mouse(form, [(14, 5, MouseEvent.LEFT_CLICK)])
def test_text_input(self): """ Check Text input works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) form.reset() # Check basic movement keys self.process_keys(form, [Screen.KEY_TAB, "ABC"]) form.save() self.assertEqual(form.data["TB"], "ABC") self.process_keys(form, [Screen.KEY_HOME, "D"]) form.save() self.assertEqual(form.data["TB"], "DABC") self.process_keys(form, [Screen.KEY_END, "E"]) form.save() self.assertEqual(form.data["TB"], "DABCE") self.process_keys(form, [Screen.KEY_LEFT, "F"]) form.save() self.assertEqual(form.data["TB"], "DABCFE") self.process_keys(form, [Screen.KEY_RIGHT, "G"]) form.save() self.assertEqual(form.data["TB"], "DABCFEG") # Backspace self.process_keys(form, [Screen.KEY_BACK]) form.save() self.assertEqual(form.data["TB"], "DABCFE")
def test_form_data(self): """ Check Frame.data works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas) # Should be empty on construction self.assertEqual(form.data, {}) # Should be blank values after saving. form.reset() form.save() self.assertEqual( form.data, { 'CA': False, 'CB': False, 'CC': False, 'TA': [''], 'TB': '', 'TC': '', 'TD': '', 'Things': 1 })
def test_stop_frame(self): """ Check Frames always request no end to the Scene. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = TestFrame(canvas, reduce_cpu=True) self.assertEqual(form.stop_frame, -1)
def test_banner(self): """ Check that BannerText works. """ # Check that banner redraws every frame. screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 100, 0, 0) effect = BannerText(canvas, StaticRenderer(images=["hello"]), 2, 3) effect.reset() effect.update(0) self.assertEqual(canvas.get_from(canvas.width - 1, 2), (ord("h"), 3, 0, 0)) effect.update(1) self.assertEqual(canvas.get_from(canvas.width - 1, 2), (ord("e"), 3, 0, 0)) # Check there is some stop frame - will vary according to screen width self.assertGreater(effect.stop_frame, 0)
def check_screen_and_canvas(screen, fn): """ Helper function to check that a Screen and Canvas work identically. :param screen: The screen object to use for the test. :param fn: The function to call for the test. """ for test_object in (screen, Canvas(screen, screen.height, screen.width)): fn(test_object)
def test_banner(self): """ Check that BannerText works. """ # Check that banner redraws every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 100, 0, 0) effect = BannerText(canvas, StaticRenderer(images=["hello"]), 2, 3) effect.reset() effect.update(0) self.assertEqual(canvas.get_from(canvas.width - 1, 2), (ord("h"), 3, 0, 0)) effect.update(1) self.assertEqual(canvas.get_from(canvas.width - 1, 2), (ord("e"), 3, 0, 0)) # Check there is some stop frame - will vary according to screen width self.assertGreater(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event))
def test_cjk_glyphs(self): """ Check that CJK languages track double-width glyphs as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected for CJK languages. # These languages actually use two characters for some glyphs, so when you query the # contents, you will see the value for both characters. Also, most terminals don't like # displaying half glyphs, so asciimatics doesn't even allow it. canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c") canvas.reset() canvas.print_at("你確", -1, 0) canvas.print_at("你確", canvas.width - 1, 0) self.assert_line_equals(canvas, u" 確確 ")