def __init__(self, xpos, ypos, angle, renderer): self.x = xpos self.y = ypos self.angle = float(angle) self.turn_angle = 30.0 self.random_angle = 5.0 self.renderer = renderer self.shapes = BasicShapes(renderer.buffer_x, renderer.buffer_y) self.stack = []
class TestBasicShapes(unittest.TestCase): def setUp(self): self.shapes = BasicShapes(100, 100) def test_interface(self): for func in ('setCanvasSize', 'drawLine'): self.assertTrue(hasattr(self.shapes, func) and callable(getattr(self.shapes, func)), "Interface requires function: " + func) def test_setCanvasSize(self): self.assertEqual(self.shapes.setCanvasSize(300, 400), (300, 400)) self.assertEqual(self.shapes.setCanvasSize(500), (500, 400)) self.assertEqual(self.shapes.setCanvasSize(), (500, 400)) self.assertEqual(self.shapes.setCanvasSize(600, 700), (600, 700)) def test_drawLine(self): self.shapes.setCanvasSize(1000, 1000) pixels = self.shapes.drawLine(0, 0, 1000, 1000, (255, 255, 255)) self.assertTrue(len(pixels) >= 1000) self.assertTrue(len(pixels[0]) == 3) self.assertTrue(pixels[0][0] == 0 and pixels[0][1] == 0 and pixels[1000][0] == 1000 and pixels[1000][1] == 1000)
def setUp(self): self.shapes = BasicShapes(100, 100)
class SimpleTurtle: """Implements the drawing functions and stack for a basic turtle. Must be driven externally (eg: by LSystem) :Functions: - 'turnRight': Turns the turtle CW by angle - 'turnLeft': Turns the turtle CCW by angle - 'turnRightRandom': Turns the turtle CW by a random number in [0, random_angle) - 'turnLeftRandom': Turns the turtle CCW by a random number in [0, random_angle) - 'draw': Draws a line in the current direction - 'push': Pushes the current position and angle onto the stack - 'pop': Restores the previous position and angle from the stack - 'render': Renders the current session - 'reset': Resets the current session - 'setAngle': Sets the value of angle for turnLeft and turnRight - 'setRandomAngle': Sets the value of random_angle for turnLeftRandom and turnRightRandom :Examples: >>> from pygraph.generate.SimpleTurtle import SimpleTurtle >>> turtle = SimpleTurtle(128,0, 90) # x, y, up >>> turtle.draw() >>> turtle.push() >>> turtle.turnLeft(30) >>> turtle.draw() >>> turtle.pop() >>> turtle.turnRight(30) >>> turtle.draw() >>> turtle.render('./test.png') """ def __init__(self, xpos, ypos, angle, renderer): self.x = xpos self.y = ypos self.angle = float(angle) self.turn_angle = 30.0 self.random_angle = 5.0 self.renderer = renderer self.shapes = BasicShapes(renderer.buffer_x, renderer.buffer_y) self.stack = [] def turnRight(self): self.angle -= self.turn_angle self.angle %= 360 return self.angle def turnLeft(self): self.angle += self.turn_angle self.angle %= 360 return self.angle def turnRightRandom(self): self.angle -= random.random()*self.random_angle self.angle %= 360 return self.angle def turnLeftRandom(self): self.angle += random.random()*self.random_angle self.angle %= 360 return self.angle def push(self): self.stack.append([self.x, self.y, self.angle]) def pop(self): self.x, self.y, self.angle = self.stack.pop() def reset(self, xpos, ypos, angle): self.x = xpos self.y = ypos self.angle = float(angle) def draw(self, distance=5): newx = int(round(float(self.x) + math.cos(math.radians(self.angle)) * float(distance))) newy = int(round(float(self.y) - math.sin(math.radians(self.angle)) * float(distance))) self.renderer.drawOver(self.shapes.drawLine(self.x, self.y, newx, newy, [0,0,0])) self.x = newx self.y = newy def setAngle(self, angle): self.turn_angle = float(angle % 360) return self.turn_angle def setRandomAngle(self, angle): self.random_angle = float(angle % 360) return self.random_angle
def setUpClass(self): self.shapes = BasicShapes(10, 10) self.line1 = self.shapes.drawLine(0, 5, 9, 5, (255, 0, 0)) self.line2 = self.shapes.drawLine(0, 5, 9, 5, (0, 255, 0)) self.line3 = self.shapes.drawLine(5, 0, 5, 9, (0, 0, 255))
class TestRenderer(unittest.TestCase): @classmethod def setUpClass(self): self.shapes = BasicShapes(10, 10) self.line1 = self.shapes.drawLine(0, 5, 9, 5, (255, 0, 0)) self.line2 = self.shapes.drawLine(0, 5, 9, 5, (0, 255, 0)) self.line3 = self.shapes.drawLine(5, 0, 5, 9, (0, 0, 255)) def setUp(self): self.renderer = Renderer(10, 10) def test_interface(self): for func in ('render', 'clearBuffer', 'setBackgroundColor', 'drawOver', 'drawUnder'): self.assertTrue(hasattr(self.renderer, func) and callable(getattr(self.renderer, func)), "Interface requires function: " + func) def test_render(self): self.renderer.setBackgroundColor(200, 200, 200) self.renderer.clearBuffer() self.renderer.drawOver(self.line1) self.renderer.drawUnder(self.line2, 3, 3) render = self.renderer.render() self.assertIs(type(render), list) self.assertEqual(render[5], [255, 0, 0]*10, "The red line was not rendered properly") self.assertEqual(render[8], [200, 200, 200]*3 + [0, 255, 0]*7, "The green line was not rendered properly") for row in [0, 1, 2, 3, 4, 6, 7, 9]: self.assertEqual(render[row], [200, 200, 200]*10, "Row " + str(row) + " did not render background properly") self.renderer.render('./test.png') self.assertTrue(os.path.exists('./test.png'), "The file wasn't created upon rendering") try: os.remove('./test.png') except OSError: fail("Could not clean up the created test file") def test_clearBuffer(self): self.renderer.setBackgroundColor(10, 20, 30) self.renderer.clearBuffer() for i, row in enumerate(self.renderer.pixels): self.assertEqual(row[0:30], [10, 20, 30]*10, "Row " + str(i) + " was not cleared") def test_setBackgroundColor(self): self.assertEqual(self.renderer.setBackgroundColor(200, 200, 200), [200, 200, 200]) self.assertEqual(self.renderer.setBackgroundColor(256, 255, 255), [200, 200, 200]) self.assertEqual(self.renderer.setBackgroundColor(), [200, 200, 200]) self.assertEqual(self.renderer.setBackgroundColor(200, 100), [200, 200, 200]) self.assertEqual(self.renderer.setBackgroundColor(200, 100, 50), [200, 100, 50]) def test_drawOver(self): self.renderer.drawOver(self.line1) self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*10) self.renderer.drawOver(self.line1, 3, 2) self.assertEqual(self.renderer.pixels[7][9:30], [255, 0, 0]*7) self.renderer.drawOver(self.line2, 2, 0) self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*2 + [0, 255, 0]*8) def test_drawUnder(self): self.renderer.drawUnder(self.line1) self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*10) self.renderer.drawUnder(self.line1, 3, 2) self.assertEqual(self.renderer.pixels[7][9:30], [255, 0, 0]*7) self.renderer.drawUnder(self.line2, 2, 0) self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*10) def test_integration_drawOrder(self): self.renderer.drawOver(self.line1, 0, -2) self.renderer.setBackgroundColor(100, 100, 100) self.renderer.clearBuffer() self.renderer.drawOver(self.line1) self.renderer.drawUnder(self.line2, 1, 3) self.renderer.drawOver(self.line3) self.renderer.drawUnder(self.line3, 2) render = self.renderer.render() self.renderer.render('./integration_drawOrder.png') self.assertTrue(os.path.exists('./integration_drawOrder.png'), "The file wasn't created upon rendering") self.assertIs(type(render), list) for row in [0, 1, 2, 3, 4, 6, 7, 9]: self.assertEqual(render[row], [100, 100, 100]*5 + [0, 0, 255] + [100, 100, 100] + [0, 0, 255] + [100, 100, 100]*2, "Background did not render properly on row: " + str(row)) self.assertEqual(render[5], [255, 0, 0]*5 + [0, 0, 255] + [255, 0, 0]*4, "Redline did not render properly") self.assertEqual(render[8], [100, 100, 100] + [0, 255, 0]*4 + [0, 0, 255] + [0, 255, 0]*4, "GreenLine did not render properly")