def test_getitem_setitem_slice(): # copy entire canvas canvas = pytc.Canvas() canvas[0, 0] = 'A' canvas[1, 1] = 'B' canvas[-1, -1] = 'Z' assert canvas == canvas[(0, 0):(pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT)] assert canvas == canvas[None:(pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT)] assert canvas == canvas[:(pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT)] assert canvas == canvas[(0, 0):None] assert canvas == canvas[(0, 0):] assert canvas == canvas[None:None] assert canvas == canvas[:] assert canvas == canvas[(pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT):(0, 0)] subcanvas = pytc.Canvas(10, 1) subcanvas[0, 0] = 'A' assert subcanvas == canvas[(0, 0):(10, 1)] assert subcanvas == canvas[(10, 1):(0, 0)] subcanvas = pytc.Canvas(10, 2) subcanvas[0, 0] = 'A' subcanvas[1, 1] = 'B' assert subcanvas == canvas[(0, 0):(10, 2)] assert subcanvas == canvas[(10, 2):(0, 0)] # test steps canvas = pytc.Canvas(width=24, height=24) subcanvas = canvas[0, 0]
def test_repr(): canvas = pytc.Canvas() assert repr(canvas) == "<'Canvas' object, width=%s, height=%s>" % ( pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT) canvas = pytc.Canvas(10, 20, 'Alice') assert repr(canvas) == "<'Canvas' object, width=10, height=20>"
def test_fill(): blankCanvas = pytc.Canvas(4, 4) canvas = pytc.Canvas(4, 4) assert canvas == blankCanvas canvas[1, 1] = 'x' canvas[2, 2] = 'x' canvas.clear() assert canvas == blankCanvas canvas.fill('x') assert str(canvas) == 'xxxx\nxxxx\nxxxx\nxxxx' canvas.fill(' ') assert str(canvas) == ' \n \n \n ' canvas.fill(None) assert str(canvas) == ' \n \n \n ' # Test argument being casted to a string canvas.fill(3) assert str(canvas) == '3333\n3333\n3333\n3333' # Test "char" keyword. canvas.fill(char='x') assert str(canvas) == 'xxxx\nxxxx\nxxxx\nxxxx' # Test exceptions with pytest.raises(pytc.PyTextCanvasException): canvas.fill('xx')
def test_clear(): blankCanvas = pytc.Canvas(4, 4) canvas = pytc.Canvas(4, 4) assert canvas == blankCanvas canvas[1, 1] = 'x' canvas[2, 2] = 'x' canvas.clear() assert canvas == blankCanvas
def test_shift(): canvas = pytc.Canvas(loads='1234\n5678\nabcd\nefgh') canvas.shift(1, 0) assert str(canvas) == ' 123\n 567\n abc\n efg' canvas = pytc.Canvas(loads='1234\n5678\nabcd\nefgh') canvas.shift(0, 1) assert str(canvas) == ' \n1234\n5678\nabcd' canvas = pytc.Canvas(loads='1234\n5678\nabcd\nefgh') canvas.shift(1, 1) assert str(canvas) == ' \n 123\n 567\n abc'
def test_setitem_getitem_int_tuple_key(): canvas = pytc.Canvas() # Basic write & read assert canvas[0, 0] == None # chars start as None canvas[0, 0] = 'A' assert canvas[0, 0] == 'A' canvas[1, 0] = 'B' assert canvas[1, 0] == 'B' # negative indexes canvas[-1, -1] = 'Z' canvas[-2, -1] = 'Y' assert canvas[-1, -1] == 'Z' assert canvas[-2, -1] == 'Y' assert canvas[79, 24] == 'Z' assert canvas[78, 24] == 'Y' with pytest.raises(pytc.PyTextCanvasException): canvas['invalid'] with pytest.raises(pytc.PyTextCanvasException): canvas['invalid'] = 'A' with pytest.raises( pytc.PyTextCanvasException ): # TODO - change this when we can store arbitrary values in canvas cells. canvas[0, 0] = 'too long string'
def test_colorifed_property(): canvas = pytc.Canvas(fg=pytc.WHITE) assert canvas.colorfied == True canvas.colorfied = False assert canvas.colorfied == False canvas.colorfied = True assert canvas.colorfied == True
def test_setitem_getitem_keyerror(): canvas = pytc.Canvas() for key in ((9999, 99999), (9999, 0), (0, 9999), (-9999, -9999), (-9999, 0), (0, -9999), (0.0, 0), (0, 0.0), (0.0, 0.0)): with pytest.raises(pytc.PyTextCanvasException): canvas[key] = 'X' with pytest.raises(pytc.PyTextCanvasException): canvas[key]
def test_isOnCanvas(): canvas = pytc.Canvas(10, 10) assert canvas.isOnCanvas(0, 0) assert canvas.isOnCanvas(9, 9) assert canvas.isOnCanvas(0, 9) assert canvas.isOnCanvas(9, 0) assert not canvas.isOnCanvas(10, 0) assert not canvas.isOnCanvas(0, 10) assert not canvas.isOnCanvas(10, 10) assert not canvas.isOnCanvas(-1, 0) assert not canvas.isOnCanvas(0, -1) assert not canvas.isOnCanvas(-1, -1)
def test_width_height(): # Make sure the ctor sets the width and height correctly. canvas = pytc.Canvas(width=4) assert canvas.width == 4 canvas = pytc.Canvas(height=4) assert canvas.height == 4 # Make sure the width, height, and area are immutable. with pytest.raises(AttributeError): canvas.width = 10 with pytest.raises(AttributeError): del canvas.width with pytest.raises(AttributeError): canvas.height = 10 with pytest.raises(AttributeError): del canvas.height with pytest.raises(AttributeError): canvas.area = 10 with pytest.raises(AttributeError): del canvas.area
def test_getitem_setitem_slice_errors(): canvas = pytc.Canvas() with pytest.raises(pytc.PyTextCanvasException): canvas[(0.0, 0):] with pytest.raises(pytc.PyTextCanvasException): canvas[(0, 0.0):] with pytest.raises(pytc.PyTextCanvasException): canvas[:(0.0, 0)] with pytest.raises(pytc.PyTextCanvasException): canvas[:(0, 0.0)]
def isOnCanvas(): canvas = pytc.Canvas() assert canvas.isOnCanvas(0, 0) assert canvas.isOnCanvas(pytc.DEFAULT_CANVAS_WIDTH - 1, 0) assert canvas.isOnCanvas(0, pytc.DEFAULT_CANVAS_HEIGHT - 1) assert canvas.isOnCanvas(pytc.DEFAULT_CANVAS_WIDTH - 1, pytc.DEFAULT_CANVAS_HEIGHT - 1) assert not canvas.isOnCanvas(-1, -1) assert not canvas.isOnCanvas(-1, 0) assert not canvas.isOnCanvas(0, -1) assert not canvas.isOnCanvas(0, pytc.DEFAULT_CANVAS_HEIGHT) assert not canvas.isOnCanvas(pytc.DEFAULT_CANVAS_WIDTH, 0) assert not canvas.isOnCanvas(pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT)
def test_del(): canvas = pytc.Canvas(10, 10) # Test that deleting an invalid key raises an exception with pytest.raises(pytc.PyTextCanvasException): del canvas['invalid'] # Test that deleting a nonexistent key doesn't raise an exception del canvas[0, 0] del canvas[(0, 0):(10, 10)] # Test del operator canvas[0, 0] = 'x' del canvas[0, 0] assert canvas[0, 0] is None canvas[1, 0] = 'x' del canvas[1, 0] assert canvas[1, 0] is None canvas[0, 1] = 'x' del canvas[0, 1] assert canvas[0, 1] is None # Test setting to None canvas[0, 0] = 'x' canvas[0, 0] = None assert canvas[0, 0] is None canvas[1, 0] = 'x' canvas[1, 0] = None assert canvas[1, 0] is None canvas[0, 1] = 'x' canvas[0, 1] = None assert canvas[0, 1] is None # Can't delete cell by setting it to a blank string. with pytest.raises(pytc.PyTextCanvasException): canvas[0, 0] = '' # Delete multiple cells with a slice: canvas[(0, 0):(10, 10)] = 'x' del canvas[(0, 0):(10, 10)] for x in range(10): for y in range(10): assert canvas[x, y] is None
def test_len(): # TODO - tests len of string rep, not just width*height canvas = pytc.Canvas(10, 10) assert len(canvas) == 109 canvas = pytc.Canvas(10, 1) assert len(canvas) == 10 canvas = pytc.Canvas(1, 10) assert len(canvas) == 19 canvas = pytc.Canvas(1, 1) assert len(canvas) == 1 canvas = pytc.Canvas(10, 2) assert len(canvas) == 21 canvas = pytc.Canvas(2, 10) assert len(canvas) == 29
def test_copy(): canvas = pytc.Canvas(4, 4)
def test_str(): canvas = pytc.Canvas(width=3, height=4) assert str(canvas) == ' \n \n \n ' canvas = pytc.Canvas(width=4, height=3) assert str(canvas) == ' \n \n '
def test_loads(): # Test basic usage patternedCanvas = pytc.Canvas(3, 3) patternedCanvas[0, 0] = '1' patternedCanvas[1, 0] = '2' patternedCanvas[2, 0] = '3' patternedCanvas[0, 1] = '4' patternedCanvas[1, 1] = '5' patternedCanvas[2, 1] = '6' patternedCanvas[0, 2] = '7' patternedCanvas[1, 2] = '8' patternedCanvas[2, 2] = '9' canvas = pytc.Canvas(3, 3, loads='123\n456\n789') assert canvas == patternedCanvas canvas = pytc.Canvas(loads='123\n456\n789') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3) canvas.loads('123\n456\n789') assert canvas == patternedCanvas canvas.loads('123\n456\n789') assert canvas == patternedCanvas # Test a too-large loads string canvas = pytc.Canvas(3, 3, loads='123xxx\n456xx\n789x') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3, loads='123xxx\n456xx\n789x\n') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3, loads='123\n456\n789\nxxx') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3, loads='123\n456\n789\nxxx\n') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3, loads='123xxx\n456xx\n789x\nxxx') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3, loads='123xxx\n456xx\n789x\nxxx\n') assert canvas == patternedCanvas # Test a too-small loads string biggerCanvas = pytc.Canvas(4, 4, loads='123\n456\n789') for x in range(3): for y in range(3): assert biggerCanvas[x, y] == str((y * 3) + x + 1) assert biggerCanvas[0, 3] is None assert biggerCanvas[3, 0] is None assert biggerCanvas[3, 3] is None # Test a sparse loads string patternedCanvas[0, 2] = None patternedCanvas[1, 2] = None patternedCanvas[2, 2] = None canvas = pytc.Canvas(3, 3, loads='123\n456') assert canvas == patternedCanvas canvas = pytc.Canvas(3, 3, loads='123\n456\n') assert canvas == patternedCanvas
def test_ctor(): # Test default width and height settings. canvas = pytc.Canvas() assert canvas.width, pytc.DEFAULT_CANVAS_WIDTH assert canvas.height, pytc.DEFAULT_CANVAS_HEIGHT assert repr(canvas), "<'Canvas' object, width=%s, height=%s>" % ( pytc.DEFAULT_CANVAS_WIDTH, pytc.DEFAULT_CANVAS_HEIGHT) assert canvas.cursor == (0, 0) # Test positional arguments. for canvas in (pytc.Canvas(width=20, height=10), pytc.Canvas(20, 10, 'Alice')): assert canvas.width == 20 assert canvas.height == 10 assert canvas.area == 200 assert canvas.size == (20, 10) assert canvas.colorfied == False assert repr(canvas) == "<'Canvas' object, width=20, height=10>" # Test invalid settings for ctor width and height. with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(width=3.0) with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(width='invalid') with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(width=0) with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(width=-1) with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(height=3.0) with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(height='invalid') with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(height=0) with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(height=-1) # Test invalid fg and bg settings. with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(fg='invalid') with pytest.raises(pytc.PyTextCanvasException): pytc.Canvas(bg='invalid') # Test fg and bg canvas = pytc.Canvas(fg=pytc.BLUE) assert canvas.colorfied == True pytc.Canvas(bg=pytc.BLUE) pytc.Canvas(fg=pytc.WHITE, bg=pytc.BLACK)
def test_contains(): canvas = pytc.Canvas(loads='hello\n world') assert 'hello' in canvas assert 'world' in canvas
rt[7], rt[13], rt[17], rt[11] = t[11], t[7], t[13], t[17] rt[12] = t[12] # Center position doesn't rotate positions. # Rotate the individual block characters: for i in range(25): rt[i] = ROTATE_MAP[rt[i]] t = ''.join(rt) assert len(t) == 25 return t # Create a canvas to draw the tiles on: canvas = pytc.Canvas(WIDTH, HEIGHT) for x in range(0, WIDTH, 5): for y in range(0, HEIGHT, 5): # Choose a random tile, rotate it a random number of times: tile = rotateTile(random.choice(TILES), random.randint(0, 3)) drawTile(tile, x, y, canvas) canvas.print() # Copy the canvas to the clipboard if pyperclip is installed: try: import pyperclip pyperclip.copy(str(canvas)) except: pass # Do nothing if pyperclip is not installed.
def test_equality(): # different sizes and data types affect equality assert pytc.Canvas() == pytc.Canvas() assert pytc.Canvas() != 'hello' assert pytc.Canvas() != pytc.Canvas(width=81) assert pytc.Canvas() != pytc.Canvas(height=26) # cursor setting doesn't affect equality canvas = pytc.Canvas() canvas.cursor = (1, 1) assert canvas == pytc.Canvas() canvas[0, 0] = 'A' assert canvas, pytc.Canvas() canvas[0, 0] = None assert canvas == pytc.Canvas()
def test_cursor(): canvas = pytc.Canvas(10, 10) # Test reading the cursor value. assert canvas.cursor == (0, 0) assert canvas.cursorx == 0 assert canvas.cursory == 0 # Test writing the cursor value. canvas.cursor = (3, 4) assert canvas.cursorx == 3 assert canvas.cursory == 4 canvas.cursorx = 5 assert canvas.cursorx == 5 canvas.cursory = 6 assert canvas.cursory == 6 # Test negative indexes for the cursor. canvas.cursor = (1, -1) assert canvas.cursor == (1, 9) canvas.cursor = (-2, 1) assert canvas.cursor == (8, 1) canvas.cursorx = -3 assert canvas.cursor == (7, 1) canvas.cursory = -4 assert canvas.cursor == (7, 6) # Test to make sure invalid values raise an exception. with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = 'invalid' with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (0, ) with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (0, 1, 2) with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = [] with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (1.1, 1) with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (1, 1.1) with pytest.raises(AttributeError): del canvas.cursor with pytest.raises(pytc.PyTextCanvasException): canvas.cursorx = 'invalid' with pytest.raises(pytc.PyTextCanvasException): canvas.cursorx = 1.1 with pytest.raises(AttributeError): del canvas.cursorx with pytest.raises(pytc.PyTextCanvasException): canvas.cursory = 'invalid' with pytest.raises(pytc.PyTextCanvasException): canvas.cursory = 1.1 with pytest.raises(AttributeError): del canvas.cursory # Test to make sure coordinates are within the canvas. with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (1, 9999) with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (9999, 1) with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (1, canvas.height) with pytest.raises(pytc.PyTextCanvasException): canvas.cursor = (canvas.width, 1) with pytest.raises(pytc.PyTextCanvasException): canvas.cursory = 9999 with pytest.raises(pytc.PyTextCanvasException): canvas.cursory = canvas.height with pytest.raises(pytc.PyTextCanvasException): canvas.cursorx = 9999 with pytest.raises(pytc.PyTextCanvasException): canvas.cursorx = canvas.width
# This test checks what FPS we can get using PyTextCanvas. Drawing to consoles is usually slow. # On my Windows 10 machine, I was getting about 10 fps (with really bad flickering). Obviously # drawing areas smaller than 80 x 25 will result in faster drawing. import sys import time import pytextcanvas as pytc FRAMES_TO_TEST = 100 canvas = pytc.Canvas(80, 25) pytc.clearScreen() startTime = time.time() for i in range(FRAMES_TO_TEST // 2): canvas.fg = pytc.RED canvas.bg = pytc.BLUE canvas.fill('*') canvas.print() pytc.clearScreen() canvas.fg = pytc.BLUE canvas.bg = pytc.RED canvas.fill('+') canvas.print() pytc.clearScreen() runtime = time.time() - startTime print(sys.platform, sys.version) print('%s frames in %s seconds, %s fps' %