Пример #1
0
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]
Пример #2
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>"
Пример #3
0
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')
Пример #4
0
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
Пример #5
0
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'
Пример #6
0
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'
Пример #7
0
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
Пример #8
0
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]
Пример #9
0
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)
Пример #10
0
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
Пример #11
0
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)]
Пример #12
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)
Пример #13
0
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
Пример #14
0
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
Пример #15
0
def test_copy():
    canvas = pytc.Canvas(4, 4)
Пример #16
0
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    '
Пример #17
0
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
Пример #18
0
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)
Пример #19
0
def test_contains():
    canvas = pytc.Canvas(loads='hello\n world')
    assert 'hello' in canvas
    assert 'world' in canvas
Пример #20
0
        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.
Пример #21
0
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()
Пример #22
0
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
Пример #23
0
# 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' %