Python源码示例:asciimatics.screen.Screen.wrapper()
示例1
def test_wrapper(self):
"""
Check that you can create a blank Screen.
"""
def internal_checks(screen):
# Check screen basically exists
self.assertIsNotNone(screen)
self.assertGreater(screen.width, 0)
self.assertGreater(screen.height, 0)
self.assertGreater(screen.colours, 0)
# Check that the Screen is cleared ready for use.
for x in range(screen.width):
for y in range(screen.height):
char, fg, attr, bg = screen.get_from(x, y)
self.assertEqual(char, ord(" "))
self.assertEqual(fg, Screen.COLOUR_WHITE)
self.assertEqual(attr, 0)
self.assertEqual(bg, Screen.COLOUR_BLACK)
Screen.wrapper(internal_checks)
示例2
def test_print_and_get(self):
"""
Check that basic print_at and get_from work as expected.
"""
def internal_checks(screen):
for x in range(screen.width):
for y in range(15):
char = randint(0, 255)
fg = randint(0, Screen.COLOUR_WHITE)
bg = randint(0, Screen.COLOUR_WHITE)
attr = randint(0, Screen.A_UNDERLINE)
screen.print_at(chr(char), x, y, fg, attr, bg)
char2, fg2, attr2, bg2 = screen.get_from(x, y)
self.assertEqual(char, char2)
self.assertEqual(fg, fg2)
self.assertEqual(attr, attr2)
self.assertEqual(bg, bg2)
Screen.wrapper(
check_screen_and_canvas, height=15, arguments=[internal_checks])
示例3
def test_visible(self):
"""
Check that is_visible works as expected.
"""
def internal_checks(screen):
# Check some points that must always be visible
self.assertTrue(screen.is_visible(0, 0))
self.assertTrue(screen.is_visible(
screen.width - 1, screen.height - 1))
# Check some points that cannot be visible
self.assertFalse(screen.is_visible(-1, -1))
self.assertFalse(screen.is_visible(
screen.width, screen.height))
Screen.wrapper(
check_screen_and_canvas, height=15, arguments=[internal_checks])
示例4
def test_scroll(self):
"""
Check that scrolling works as expected.
"""
def internal_checks(screen):
# New screen is not scrolled.
self.assertEqual(screen.start_line, 0)
# Scroll and check it has moved
screen.scroll()
self.assertEqual(screen.start_line, 1)
# Scroll to specific location and check it has moved
screen.scroll_to(0)
self.assertEqual(screen.start_line, 0)
Screen.wrapper(internal_checks, height=15)
示例5
def test_putch_and_getch(self):
"""
Check deprecated features still work.
"""
def internal_checks(screen):
for x in range(screen.width):
for y in range(15):
char = randint(0, 255)
fg = randint(0, Screen.COLOUR_WHITE)
bg = randint(0, Screen.COLOUR_WHITE)
attr = randint(0, Screen.A_UNDERLINE)
screen.putch(chr(char), x, y, fg, attr, bg)
char2, fg2, attr2, bg2 = screen.getch(x, y)
self.assertEqual(char, char2)
self.assertEqual(fg, fg2)
self.assertEqual(attr, attr2)
self.assertEqual(bg, bg2)
Screen.wrapper(internal_checks, height=15)
示例6
def test_refresh(self):
"""
Check that refresh works.
"""
def internal_checks(screen):
# Not much we can do here as refresh will draw to a screen we can't
# query. Check that we don't hit an Exception on refresh().
screen.print_at("Hello world!",
0, 0,
colour=Screen.COLOUR_CYAN,
attr=Screen.A_BOLD,
bg=Screen.COLOUR_BLUE)
screen.refresh()
Screen.wrapper(
check_screen_and_canvas, height=15, arguments=[internal_checks])
示例7
def test_forced_update(self):
"""
Check that forcing an update works as expected.
"""
def internal_checks(screen):
# First check that Effects are always drawn at Scene start
test_effect = MockEffect(count=101, stop_frame=101, frame_rate=100)
screen.set_scenes([Scene([test_effect], 0)])
screen.draw_next_frame()
self.assertTrue(test_effect.update_called)
# Now check that the Screen honours the long frame rate...
test_effect.update_called = False
for _ in range(90):
screen.draw_next_frame()
self.assertFalse(test_effect.update_called)
# Now check that the forced update works as expected.
screen.force_update()
screen.draw_next_frame()
self.assertTrue(test_effect.update_called)
Screen.wrapper(internal_checks, height=15)
示例8
def test_scroll_redraw(self):
"""
Check that scrolling works with screen locations.
"""
def internal_checks(screen):
# New screen is not scrolled.
self.assertEqual(screen.start_line, 0)
# Scroll and check it has not moved
screen.print_at("Hello", 0, 1)
for i, c in enumerate("Hello"):
self.assertEqual(screen.get_from(i, 1)[0], ord(c))
screen.scroll()
for i, c in enumerate("Hello"):
self.assertEqual(screen.get_from(i, 1)[0], ord(c))
screen.refresh()
for i, c in enumerate("Hello"):
self.assertEqual(screen.get_from(i, 1)[0], ord(c))
Screen.wrapper(internal_checks)
示例9
def test_unhandled_events(self):
"""
Check that default handling of events works as documented.
"""
def internal_checks(screen):
# Check for exit
for char in ("X", "x", "Q", "q"):
with self.assertRaises(StopApplication):
event = KeyboardEvent(ord(char))
screen._unhandled_event_default(event)
for char in (" ", "\n"):
with self.assertRaises(NextScene):
event = KeyboardEvent(ord(char))
screen._unhandled_event_default(event)
Screen.wrapper(internal_checks, height=15)
示例10
def test_signal(self):
"""
Check that signals are restored after using _CursesScreen
"""
if sys.platform == "win32":
self.skipTest("Windows does not have signals.")
def dummy_signal_handler():
"""Dummy previous signal handler."""
pass
outer_state = _SignalState()
self.assertNotEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler)
outer_state.set(signal.SIGWINCH, dummy_signal_handler)
self.assertEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler)
Screen.wrapper(self.signal_check)
self.assertEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler)
outer_state.restore()
self.assertNotEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler)
示例11
def load(self):
current_dapp = None
while True:
try:
#raise RunDapp
screen = Screen.wrapper(self.tui)
break
except ResizeScreenError as e:
#debug(); import pdb; pdb.set_trace()
# TODO make ResizeScreenError just raise NextScene
pass
except RunDapp:
print("switching to dapp...")
# load dapp from wherever it is
from dapp import Dapp
current_dapp = Dapp(screen, self.node)
except ExitDapp:
del(sys.modules['dapp'])
except ExitTuiError:
print("Shutting it all down...")
break
示例12
def wrapper(cls, func, watch=False):
if watch:
Screen.wrapper(func)
else:
func(display)
示例13
def test_wrapper_return(self):
"""
Check that you get the result back from the wrapped function.
"""
def internal_checks(_):
return True
self.assertTrue(Screen.wrapper(internal_checks))
示例14
def test_limits(self):
"""
Check that get_from and print_at limit checking works.
"""
def internal_checks(screen):
# Check we have some canvas dimensions
self.assertEqual(screen.dimensions[1], screen.width)
self.assertEqual(screen.dimensions[0], screen.height)
# Basic limit checking
self.assertIsNone(screen.get_from(-1, -1))
self.assertIsNone(screen.get_from(screen.width, screen.height))
# Printing off-screen should not fail, but do nothing.
screen.print_at("hello", 0, -1)
screen.print_at("hello", 0, screen.height)
# Printing across screen edge should crop.
screen.print_at("12345", -1, 0)
char, fg, _, bg = screen.get_from(0, 0)
self.assertEqual(char, ord("2"))
self.assertEqual(fg, Screen.COLOUR_WHITE)
self.assertEqual(bg, Screen.COLOUR_BLACK)
Screen.wrapper(
check_screen_and_canvas, height=15, arguments=[internal_checks])
示例15
def test_centre(self):
"""
Check that centre works as expected.
"""
def internal_checks(screen):
screen.centre("1234", 0)
char, fg, _, bg = screen.get_from((screen.width - 4) // 2, 0)
self.assertEqual(char, ord("1"))
self.assertEqual(fg, Screen.COLOUR_WHITE)
self.assertEqual(bg, Screen.COLOUR_BLACK)
Screen.wrapper(internal_checks, height=15)
示例16
def test_polygons(self):
"""
Check that filled polygons work as expected.
"""
def internal_checks(screen):
screen.fill_polygon([[(0, 0), (10, 0), (0, 10), (10, 10)]])
screen.fill_polygon([[(20, 0), (30, 0), (30, 10), (25, 5), (20, 10)]])
screen.fill_polygon([[(40, 0), (45, 5), (50, 0), (50, 10), (40, 10)]])
screen.fill_polygon([[(60, 0), (70, 0), (70, 10), (60, 10)],
[(63, 2), (67, 2), (67, 8), (63, 8)]])
self.maxDiff = None
self.assert_canvas_equals(
screen,
"Y########7 ########## . . ########## \n" +
" Y######7 ########## #. .# ########## \n" +
" Y####7 ########## ##. .## ### ### \n" +
" Y##7 ########## ###. .### ### ### \n" +
" Y7 ########## ####..#### ### ### \n" +
" .. ####7Y#### ########## ### ### \n" +
" .##. ###7 Y### ########## ### ### \n" +
" .####. ##7 Y## ########## ### ### \n" +
" .######. #7 Y# ########## ########## \n" +
".########. 7 Y ########## ########## \n")
Screen.wrapper(
check_screen_and_canvas,
height=10,
unicode_aware=False,
arguments=[internal_checks])
示例17
def test_palette(self):
"""
Check that we have a valid colour palette.
"""
def internal_checks(screen):
# Check basic length
self.assertGreater(screen.colours, 0)
self.assertEqual(len(screen.palette), 256 * 3)
# Should always have fundamental console colours
for i, c in enumerate((0, 0, 0)):
self.assertEqual(screen.palette[i], c)
for i, c in enumerate((128, 0, 0)):
self.assertEqual(screen.palette[i+3], c)
for i, c in enumerate((0, 128, 0)):
self.assertEqual(screen.palette[i+6], c)
for i, c in enumerate((128, 128, 0)):
self.assertEqual(screen.palette[i+9], c)
for i, c in enumerate((0, 0, 128)):
self.assertEqual(screen.palette[i+12], c)
for i, c in enumerate((128, 0, 128)):
self.assertEqual(screen.palette[i+15], c)
for i, c in enumerate((0, 128, 128)):
self.assertEqual(screen.palette[i+18], c)
for i, c in enumerate((192, 192, 192)):
self.assertEqual(screen.palette[i+21], c)
Screen.wrapper(internal_checks, height=15)
示例18
def test_origin(self):
"""
Check that Canvas origin is correct.
"""
def internal_checks(screen):
canvas = Canvas(screen, 5, 5, 1, 2)
self.assertEqual(canvas.origin, (1, 2))
Screen.wrapper(internal_checks, height=15)
示例19
def test_play(self):
"""
Check that we can play a basic Effect in a Scene.
"""
def internal_checks(screen):
# Since the Screen draws things, there's not too much we can do
# to genuinely verify this without verifying all Scene and Effect
# function too. Just play a dummy Effect for now.
test_effect = MockEffect()
screen.play([Scene([test_effect], 0)])
self.assertTrue(test_effect.stop_called)
self.assertTrue(test_effect.reset_called)
# Now check that the desired duration is used.
test_effect = MockEffect(count=6)
screen.play([Scene([test_effect], 15)])
self.assertFalse(test_effect.stop_called)
self.assertTrue(test_effect.reset_called)
# Now check that delete_count works.
test_effect = MockEffect(count=6)
test_effect2 = MockEffect(delete_count=3)
scene = Scene([test_effect, test_effect2], 15)
self.assertEqual(len(scene.effects), 2)
screen.play([scene])
self.assertEqual(len(scene.effects), 1)
self.assertEqual(scene.effects[0], test_effect)
Screen.wrapper(internal_checks, height=15)
示例20
def test_catch_exceptions(self):
"""
Check that we can catch exceptions (e.g. for ctrl-c).
"""
def internal_checks(screen):
# Not much we can do here as refresh will draw to a screen we can't
# query. Check that we don't hit an Exception on refresh().
if sys.platform == "win32":
# Strictly speaking, this doesn't test catching ctrl-c as
# it isn't possible to trigger the control handler (even if
# we don't catch interrupts). Still a good basic check for
# input, though.
event = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
event.Char = u"\03"
event.KeyDown = 1
event.RepeatCount = 1
event.ControlKeyState = win32con.LEFT_CTRL_PRESSED
event.VirtualKeyCode = 67
event.VirtualScanCode = 46
screen._stdin.WriteConsoleInput([event])
event.KeyDown = 0
screen._stdin.WriteConsoleInput([event])
ch = screen.get_event()
self.assertEqual(ch.key_code, 3)
self.assertIsNone(screen.get_event())
else:
# Check Ctrl-c (and no other input)
os.kill(os.getpid(), signal.SIGINT)
ch = screen.get_event()
self.assertEqual(ch.key_code, 3)
self.assertIsNone(screen.get_event())
# Check Ctrl-z (and no other input)
os.kill(os.getpid(), signal.SIGTSTP)
ch = screen.get_event()
self.assertEqual(ch.key_code, 26)
self.assertIsNone(screen.get_event())
Screen.wrapper(internal_checks, height=15, catch_interrupt=True)
示例21
def test_key_input(self):
"""
Check that keyboard input works.
"""
def internal_checks(screen):
# Inject a letter and check it is picked up
self._inject_key(screen, ord("a"))
ch = screen.get_event()
self.assertEqual(ch.key_code, ord("a"))
self.assertIsNone(screen.get_event())
# Inject a letter and check it is picked up
self._inject_key(screen, Screen.KEY_BACK_TAB)
ch = screen.get_event()
self.assertEqual(ch.key_code, Screen.KEY_BACK_TAB)
self.assertIsNone(screen.get_event())
# Check that get_key also works.
self._inject_key(screen, ord("b"))
ch = screen.get_key()
self.assertEqual(ch, ord("b"))
self.assertIsNone(screen.get_key())
# Check that unicode input also works
self._inject_key(screen, ord(u"├"))
ch = screen.get_event()
self.assertEqual(ch.key_code, ord(u"├"))
self.assertIsNone(screen.get_event())
Screen.wrapper(internal_checks, height=15, unicode_aware=True)
示例22
def test_mouse_input(self):
"""
Check that mouse input works.
"""
def internal_checks(screen):
# Inject a mouse move and check it is picked up
self._inject_mouse(screen, 1, 2, 0)
ev = screen.get_event()
self.assertEqual(ev.x, 1)
self.assertEqual(ev.y, 2)
self.assertEqual(ev.buttons, 0)
self.assertIsNone(screen.get_event())
# Check left click
self._inject_mouse(screen, 2, 3, MouseEvent.LEFT_CLICK)
ev = screen.get_event()
self.assertEqual(ev.x, 2)
self.assertEqual(ev.y, 3)
self.assertEqual(ev.buttons, MouseEvent.LEFT_CLICK)
self.assertIsNone(screen.get_event())
# Check right click
self._inject_mouse(screen, 0, 0, MouseEvent.RIGHT_CLICK)
ev = screen.get_event()
self.assertEqual(ev.x, 0)
self.assertEqual(ev.y, 0)
self.assertEqual(ev.buttons, MouseEvent.RIGHT_CLICK)
self.assertIsNone(screen.get_event())
# Check double click
self._inject_mouse(screen, 0, 0, MouseEvent.DOUBLE_CLICK)
ev = screen.get_event()
self.assertEqual(ev.x, 0)
self.assertEqual(ev.y, 0)
self.assertEqual(ev.buttons, MouseEvent.DOUBLE_CLICK)
self.assertIsNone(screen.get_event())
Screen.wrapper(internal_checks, height=15)
示例23
def test_title(self):
"""
Check that we can change the screen title.
"""
def internal_checks(screen):
# It's not possible to read values back, so just check code doesn't
# crash.
screen.set_title("Asciimatics test")
Screen.wrapper(internal_checks, height=15)
示例24
def test_wait(self):
"""
Check that wait_for_input delays as requested when no input.
"""
def internal_checks(screen):
start = time.time()
screen.wait_for_input(0.1)
self.assertGreaterEqual(time.time() - start, 0.1)
Screen.wrapper(internal_checks, height=15)
示例25
def signal_check(self, screen):
"""Dummy callback for screen wrapper."""
self.assertEqual(signal.getsignal(signal.SIGWINCH), screen._resize_handler)
示例26
def test_rainbow(self):
"""
Check that the Rainbow renderer works.
"""
# Skip for non-Windows if the terminal definition is incomplete.
# This typically means we're running inside a non-standard terminal.
# For example, this happens when embedded in PyCharm.
if sys.platform != "win32":
if not (("FORCE_TTY" in os.environ and os.environ["FORCE_TTY"] == "Y") or sys.stdout.isatty()):
self.skipTest("Not a valid TTY")
curses.initscr()
if curses.tigetstr("ri") is None:
self.skipTest("No valid terminal definition")
def internal_checks(screen):
# Create a base renderer
plain_text = (".-------.\n" +
"| hello |\n" +
"`-------`")
renderer = SpeechBubble("hello")
self.assertEqual(str(renderer), plain_text)
# Pretend that we always have an 8 colour palette for the test.
screen.colours = 8
# Check that the Rainbow renderer doesn't change this.
rainbow = Rainbow(screen, renderer)
self.assertEqual(str(rainbow), plain_text)
# Check rainbow colour scheme.
self.assertEqual(
rainbow.rendered_text[1], [
[(1, 1, None), (1, 1, None), (3, 1, None), (3, 1, None), (2, 1, None),
(2, 1, None), (6, 1, None), (6, 1, None), (4, 1, None)],
[(1, 1, None), (3, 1, None), (3, 1, None), (2, 1, None), (2, 1, None),
(6, 1, None), (6, 1, None), (4, 1, None), (4, 1, None)],
[(3, 1, None), (3, 1, None), (2, 1, None), (2, 1, None), (6, 1, None),
(6, 1, None), (4, 1, None), (4, 1, None), (5, 1, None)]])
Screen.wrapper(internal_checks, height=15)
示例27
def test_highlight(self):
"""
Check that highlight works as expected.
"""
def internal_checks(screen):
for x in range(screen.width):
for y in range(15):
char = randint(0, 255)
fg = randint(Screen.COLOUR_RED, Screen.COLOUR_WHITE)
bg = randint(Screen.COLOUR_RED, Screen.COLOUR_WHITE)
attr = randint(0, Screen.A_UNDERLINE)
screen.print_at(chr(char), x, y, fg, attr, bg)
# Check BG highlight first.
screen.highlight(-1, -1, screen.width + 2, screen.height + 2, bg=0)
for x in range(screen.width):
for y in range(15):
_, fg2, _, bg2 = screen.get_from(x, y)
self.assertEqual(bg2, 0)
self.assertNotEqual(fg2, 0)
# Now check FG highlighting.
screen.highlight(-1, -1, screen.width + 2, screen.height + 2, fg=0)
for x in range(screen.width):
for y in range(15):
_, fg2, _, bg2 = screen.get_from(x, y)
self.assertEqual(bg2, 0)
self.assertEqual(fg2, 0)
# Now check blending.
screen.print_at("*" * screen.width,
0, 0,
Screen.COLOUR_CYAN,
Screen.A_NORMAL,
Screen.COLOUR_YELLOW)
screen.highlight(0, 0, screen.width, 1, fg=0, bg=0, blend=50)
for x in range(screen.width):
_, fg2, _, bg2 = screen.get_from(x, 0)
self.assertEqual(bg2, 0)
self.assertEqual(fg2, 0)
Screen.wrapper(
check_screen_and_canvas, height=15, arguments=[internal_checks])
示例28
def test_draw(self):
"""
Check that line drawing works as expected.
"""
def internal_checks(screen):
# Draw thick and thin lines
for line_type in (True, False):
# Draw in opposite directions
for start in range(0, 11, 10):
screen.print_at(str(start), 11, 2)
# Horizontal line
screen.move(start, 0)
screen.draw(10 - start, 0, thin=line_type)
res = screen.get_from(1, 0)
self.assertEqual(res[0], ord("^" if line_type else "#"))
# Check clearing works too
screen.draw(start, 0, char=" ", thin=line_type)
res = screen.get_from(1, 0)
self.assertEqual(res[0], ord(" "))
# Vertical line
screen.move(0, start)
screen.draw(0, 10 - start, thin=line_type)
res = screen.get_from(0, 1)
self.assertEqual(res[0], ord("|" if line_type else "#"))
# Check clearing works too
screen.draw(0, start, char=" ", thin=line_type)
res = screen.get_from(0, 1)
self.assertEqual(res[0], ord(" "))
# Diagonal line
screen.move(0, start)
screen.draw(10, 10 - start, thin=line_type)
res = screen.get_from(1, 9 if start else 1)
if line_type:
self.assertEqual(res[0], ord("'" if start else "\\"))
else:
self.assertEqual(res[0], ord("7" if start else "Y"))
# Check clearing works too
screen.move(0, start)
screen.draw(10, 10 - start, char=" ", thin=line_type)
res = screen.get_from(1, 9 if start else 1)
self.assertEqual(res[0], ord(" "))
Screen.wrapper(
check_screen_and_canvas,
height=15,
unicode_aware=False,
arguments=[internal_checks])
示例29
def test_uni_image_files(self):
"""
Check that the unicode ColourImageFile rendering works.
"""
# Skip for non-Windows if the terminal definition is incomplete.
# This typically means we're running inside a non-standard terminal.
# For example, this happens when embedded in PyCharm.
if sys.platform != "win32":
if not (("FORCE_TTY" in os.environ and os.environ["FORCE_TTY"] == "Y") or sys.stdout.isatty()):
self.skipTest("Not a valid TTY")
curses.initscr()
if curses.tigetstr("ri") is None:
self.skipTest("No valid terminal definition")
def internal_checks(screen):
# Check the original FG only rendering
renderer = ColourImageFile(
screen,
os.path.join(os.path.dirname(__file__), "globe.gif"),
height=10, uni=True, dither=True)
# Check renderer got all images from the file.
count = 0
for image in renderer.images:
count += 1
self.assertIsNotNone(image)
self.assertIsNotNone(len(image) <= renderer.max_height)
self.assertEqual(count, 11)
# Check an image looks plausible
image = next(renderer.images)
self.assertEqual(
image,
['.',
'....▄▄▄▄▄▄▄▄▄▄▄▄.....',
'..▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄...',
'.▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄..',
'▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄.',
'▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄.',
'▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄.',
'▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄..',
'.▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄..',
'..▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄....',
'.....▄▄▄▄▄▄▄▄▄▄......'])
Screen.wrapper(internal_checks, height=15)