From 349551d8521aa08eefb19461f8cb0e2f55fa2ae2 Mon Sep 17 00:00:00 2001 From: alestiago Date: Sun, 1 May 2022 23:33:12 +0100 Subject: [PATCH] test: tested z_canvas_component --- packages/pinball_flame/lib/pinball_flame.dart | 2 +- .../lib/src/rendering/rendering.dart | 3 - .../lib/src/rendering/z_canvas_component.dart | 22 - .../lib/src/rendering/z_index.dart | 20 - .../z_canvas.dart => z_canvas_component.dart} | 34 +- .../rendering/golden/rendering/blue_red.png | Bin 0 -> 22364 bytes .../rendering/golden/rendering/red_blue.png | Bin 0 -> 22395 bytes .../rendering/z_canvas_component_test.dart | 392 ++++++++++++++++++ 8 files changed, 425 insertions(+), 48 deletions(-) delete mode 100644 packages/pinball_flame/lib/src/rendering/rendering.dart delete mode 100644 packages/pinball_flame/lib/src/rendering/z_canvas_component.dart delete mode 100644 packages/pinball_flame/lib/src/rendering/z_index.dart rename packages/pinball_flame/lib/src/{rendering/z_canvas.dart => z_canvas_component.dart} (87%) create mode 100644 packages/pinball_flame/test/src/rendering/golden/rendering/blue_red.png create mode 100644 packages/pinball_flame/test/src/rendering/golden/rendering/red_blue.png create mode 100644 packages/pinball_flame/test/src/rendering/z_canvas_component_test.dart diff --git a/packages/pinball_flame/lib/pinball_flame.dart b/packages/pinball_flame/lib/pinball_flame.dart index bd28d18d..66d34b14 100644 --- a/packages/pinball_flame/lib/pinball_flame.dart +++ b/packages/pinball_flame/lib/pinball_flame.dart @@ -4,5 +4,5 @@ export 'src/component_controller.dart'; export 'src/contact_behavior.dart'; export 'src/keyboard_input_controller.dart'; export 'src/parent_is_a.dart'; -export 'src/rendering/rendering.dart'; export 'src/sprite_animation.dart'; +export 'src/z_canvas_component.dart'; diff --git a/packages/pinball_flame/lib/src/rendering/rendering.dart b/packages/pinball_flame/lib/src/rendering/rendering.dart deleted file mode 100644 index 030cb200..00000000 --- a/packages/pinball_flame/lib/src/rendering/rendering.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'z_canvas.dart'; -export 'z_canvas_component.dart'; -export 'z_index.dart'; diff --git a/packages/pinball_flame/lib/src/rendering/z_canvas_component.dart b/packages/pinball_flame/lib/src/rendering/z_canvas_component.dart deleted file mode 100644 index e6c5da87..00000000 --- a/packages/pinball_flame/lib/src/rendering/z_canvas_component.dart +++ /dev/null @@ -1,22 +0,0 @@ -// ignore_for_file: public_member_api_docs - -import 'dart:ui' show Canvas; - -import 'package:flame/components.dart'; -import 'package:pinball_flame/src/rendering/rendering.dart'; - -class ZCanvasComponent extends Component { - ZCanvasComponent({ - Iterable? children, - }) : _pinballCanvas = ZCanvas(), - super(children: children); - - final ZCanvas _pinballCanvas; - - @override - void renderTree(Canvas canvas) { - _pinballCanvas.canvas = canvas; - super.renderTree(_pinballCanvas); - _pinballCanvas.render(); - } -} diff --git a/packages/pinball_flame/lib/src/rendering/z_index.dart b/packages/pinball_flame/lib/src/rendering/z_index.dart deleted file mode 100644 index 0d138f48..00000000 --- a/packages/pinball_flame/lib/src/rendering/z_index.dart +++ /dev/null @@ -1,20 +0,0 @@ -// ignore_for_file: public_member_api_docs -import 'dart:ui'; - -import 'package:flame/components.dart'; -import 'package:pinball_flame/src/rendering/rendering.dart'; - -mixin ZIndex on Component { - int zIndex = 0; - - @override - void renderTree( - Canvas canvas, - ) { - if (canvas is ZCanvas) { - canvas.buffer(this); - } else { - super.renderTree(canvas); - } - } -} diff --git a/packages/pinball_flame/lib/src/rendering/z_canvas.dart b/packages/pinball_flame/lib/src/z_canvas_component.dart similarity index 87% rename from packages/pinball_flame/lib/src/rendering/z_canvas.dart rename to packages/pinball_flame/lib/src/z_canvas_component.dart index 0c6b293c..a5368eff 100644 --- a/packages/pinball_flame/lib/src/rendering/z_canvas.dart +++ b/packages/pinball_flame/lib/src/z_canvas_component.dart @@ -4,7 +4,37 @@ import 'dart:typed_data'; import 'dart:ui'; import 'package:flame/components.dart'; -import 'package:pinball_flame/src/rendering/rendering.dart'; + +class ZCanvasComponent extends Component { + ZCanvasComponent({ + Iterable? children, + }) : _pinballCanvas = ZCanvas(), + super(children: children); + + final ZCanvas _pinballCanvas; + + @override + void renderTree(Canvas canvas) { + _pinballCanvas.canvas = canvas; + super.renderTree(_pinballCanvas); + _pinballCanvas.render(); + } +} + +mixin ZIndex on Component { + int zIndex = 0; + + @override + void renderTree( + Canvas canvas, + ) { + if (canvas is ZCanvas) { + canvas.buffer(this); + } else { + super.renderTree(canvas); + } + } +} class ZCanvas implements Canvas { late Canvas canvas; @@ -176,7 +206,7 @@ class ZCanvas implements Canvas { void saveLayer(Rect? bounds, Paint paint) => canvas.saveLayer(bounds, paint); @override - void scale(double sx, [double? sy]) => canvas.scale(sx); + void scale(double sx, [double? sy]) => canvas.scale(sx, sy); @override void skew(double sx, double sy) => canvas.skew(sx, sy); diff --git a/packages/pinball_flame/test/src/rendering/golden/rendering/blue_red.png b/packages/pinball_flame/test/src/rendering/golden/rendering/blue_red.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca86375e8dffc98cb915c5a9eca4ecf94a8677c GIT binary patch literal 22364 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 X+Ve~i*X!6e;Kp4a`Fip_7@z(Vr{)6r literal 0 HcmV?d00001 diff --git a/packages/pinball_flame/test/src/rendering/z_canvas_component_test.dart b/packages/pinball_flame/test/src/rendering/z_canvas_component_test.dart new file mode 100644 index 00000000..6ec67e53 --- /dev/null +++ b/packages/pinball_flame/test/src/rendering/z_canvas_component_test.dart @@ -0,0 +1,392 @@ +// ignore_for_file: cascade_invocations + +import 'dart:math'; +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:flame/components.dart'; +import 'package:flame/game.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter/material.dart' hide Image; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class _TestCircleComponent extends CircleComponent with ZIndex { + _TestCircleComponent(Color color) + : super( + paint: Paint()..color = color, + radius: 10, + ); +} + +class _MockCanvas extends Mock implements Canvas {} + +class _MockImage extends Mock implements Image {} + +class _MockPicture extends Mock implements Picture {} + +class _MockParagraph extends Mock implements Paragraph {} + +class _MockVertices extends Mock implements Vertices {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(FlameGame.new); + const goldenPrefix = 'golden/rendering/'; + + group('ZCanvasComponent', () { + flameTester.test('loads correctly', (game) async { + final component = ZCanvasComponent(); + await game.ensureAdd(component); + expect(game.contains(component), isTrue); + }); + + flameTester.testGameWidget( + 'red circle rendes behind blue circle', + setUp: (game, tester) async { + final redSquare = _TestCircleComponent(Colors.red)..zIndex = 0; + final blueSquare = _TestCircleComponent(Colors.blue)..zIndex = 1; + + final canvas = ZCanvasComponent( + children: [ + blueSquare, + redSquare, + ], + ); + await game.ensureAdd(canvas); + + game.camera.followVector2(Vector2.zero()); + }, + verify: (game, tester) async { + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenPrefix}red_blue.png'), + ); + }, + ); + + flameTester.testGameWidget( + 'blue circle rendes behind red circle', + setUp: (game, tester) async { + final redSquare = _TestCircleComponent(Colors.red)..zIndex = 1; + final blueSquare = _TestCircleComponent(Colors.blue)..zIndex = 0; + + final canvas = ZCanvasComponent( + children: [ + blueSquare, + redSquare, + ], + ); + await game.ensureAdd(canvas); + + game.camera.followVector2(Vector2.zero()); + }, + verify: (game, tester) async { + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenPrefix}blue_red.png'), + ); + }, + ); + }); + + group('ZCanvas', () { + late Canvas canvas; + late Path path; + late RRect rRect; + late Rect rect; + late Paint paint; + late Image atlas; + late BlendMode blendMode; + late Color color; + late Offset offset; + late Float64List float64list; + late Float32List float32list; + late Int32List int32list; + late Picture picture; + late Paragraph paragraph; + late Vertices vertices; + + setUp(() { + canvas = _MockCanvas(); + path = Path(); + rRect = RRect.zero; + rect = Rect.zero; + paint = Paint(); + atlas = _MockImage(); + blendMode = BlendMode.clear; + color = Colors.black; + offset = Offset.zero; + float64list = Float64List(1); + float32list = Float32List(1); + int32list = Int32List(1); + picture = _MockPicture(); + paragraph = _MockParagraph(); + vertices = _MockVertices(); + }); + + test("clipPath calls Canvas's clipPath", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.clipPath(path, doAntiAlias: false); + verify( + () => canvas.clipPath(path, doAntiAlias: false), + ).called(1); + }); + + test("clipRRect calls Canvas's clipRRect", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.clipRRect(rRect, doAntiAlias: false); + verify( + () => canvas.clipRRect(rRect, doAntiAlias: false), + ).called(1); + }); + + test("clipRect calls Canvas's clipRect", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.clipRect(rect, doAntiAlias: false); + verify( + () => canvas.clipRect(rect, doAntiAlias: false), + ).called(1); + }); + + test("drawArc calls Canvas's drawArc", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawArc(rect, 0, 1, false, paint); + verify( + () => canvas.drawArc(rect, 0, 1, false, paint), + ).called(1); + }); + + test("drawAtlas calls Canvas's drawAtlas", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawAtlas(atlas, [], [], [], blendMode, rect, paint); + verify( + () => canvas.drawAtlas(atlas, [], [], [], blendMode, rect, paint), + ).called(1); + }); + + test("drawCircle calls Canvas's drawCircle", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawCircle(offset, 0, paint); + verify( + () => canvas.drawCircle(offset, 0, paint), + ).called(1); + }); + + test("drawColor calls Canvas's drawColor", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawColor(color, blendMode); + verify( + () => canvas.drawColor(color, blendMode), + ).called(1); + }); + + test("drawDRRect calls Canvas's drawDRRect", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawDRRect(rRect, rRect, paint); + verify( + () => canvas.drawDRRect(rRect, rRect, paint), + ).called(1); + }); + + test("drawImage calls Canvas's drawImage", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawImage(atlas, offset, paint); + verify( + () => canvas.drawImage(atlas, offset, paint), + ).called(1); + }); + + test("drawImageNine calls Canvas's drawImageNine", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawImageNine(atlas, rect, rect, paint); + verify( + () => canvas.drawImageNine(atlas, rect, rect, paint), + ).called(1); + }); + + test("drawImageRect calls Canvas's drawImageRect", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawImageRect(atlas, rect, rect, paint); + verify( + () => canvas.drawImageRect(atlas, rect, rect, paint), + ).called(1); + }); + + test("drawLine calls Canvas's drawLine", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawLine(offset, offset, paint); + verify( + () => canvas.drawLine(offset, offset, paint), + ).called(1); + }); + + test("drawOval calls Canvas's drawOval", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawOval(rect, paint); + verify( + () => canvas.drawOval(rect, paint), + ).called(1); + }); + + test("drawPaint calls Canvas's drawPaint", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawPaint(paint); + verify( + () => canvas.drawPaint(paint), + ).called(1); + }); + + test("drawParagraph calls Canvas's drawParagraph", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawParagraph(paragraph, offset); + verify( + () => canvas.drawParagraph(paragraph, offset), + ).called(1); + }); + + test("drawPath calls Canvas's drawPath", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawPath(path, paint); + verify( + () => canvas.drawPath(path, paint), + ).called(1); + }); + + test("drawPicture calls Canvas's drawPicture", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawPicture(picture); + verify( + () => canvas.drawPicture(picture), + ).called(1); + }); + + test("drawPoints calls Canvas's drawPoints", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawPoints(PointMode.points, [offset], paint); + verify( + () => canvas.drawPoints(PointMode.points, [offset], paint), + ).called(1); + }); + + test("drawRRect calls Canvas's drawRRect", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawRRect(rRect, paint); + verify( + () => canvas.drawRRect(rRect, paint), + ).called(1); + }); + + test("drawRawAtlas calls Canvas's drawRawAtlas", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawRawAtlas( + atlas, + float32list, + float32list, + int32list, + BlendMode.clear, + rect, + paint, + ); + verify( + () => canvas.drawRawAtlas( + atlas, + float32list, + float32list, + int32list, + BlendMode.clear, + rect, + paint, + ), + ).called(1); + }); + + test("drawRawPoints calls Canvas's drawRawPoints", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawRawPoints(PointMode.points, float32list, paint); + verify( + () => canvas.drawRawPoints(PointMode.points, float32list, paint), + ).called(1); + }); + + test("drawRect calls Canvas's drawRect", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawRect(rect, paint); + verify( + () => canvas.drawRect(rect, paint), + ).called(1); + }); + + test("drawShadow calls Canvas's drawShadow", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawShadow(path, color, 0, false); + verify( + () => canvas.drawShadow(path, color, 0, false), + ).called(1); + }); + + test("drawVertices calls Canvas's drawVertices", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.drawVertices(vertices, blendMode, paint); + verify( + () => canvas.drawVertices(vertices, blendMode, paint), + ).called(1); + }); + + test("getSaveCount calls Canvas's getSaveCount", () { + final zcanvas = ZCanvas()..canvas = canvas; + when(() => canvas.getSaveCount()).thenReturn(1); + zcanvas.getSaveCount(); + verify(() => canvas.getSaveCount()).called(1); + }); + + test("restore calls Canvas's restore", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.restore(); + verify(() => canvas.restore()).called(1); + }); + + test("rotate calls Canvas's rotate", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.rotate(0); + verify(() => canvas.rotate(0)).called(1); + }); + + test("save calls Canvas's save", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.save(); + verify(() => canvas.save()).called(1); + }); + + test("saveLayer calls Canvas's saveLayer", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.saveLayer(rect, paint); + verify(() => canvas.saveLayer(rect, paint)).called(1); + }); + + test("scale calls Canvas's scale", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.scale(0, 0); + verify(() => canvas.scale(0, 0)).called(1); + }); + + test("skew calls Canvas's skew", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.skew(0, 0); + verify(() => canvas.skew(0, 0)).called(1); + }); + + test("transform calls Canvas's transform", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.transform(float64list); + verify(() => canvas.transform(float64list)).called(1); + }); + + test("translate calls Canvas's translate", () { + final zcanvas = ZCanvas()..canvas = canvas; + zcanvas.translate(0, 0); + verify(() => canvas.translate(0, 0)).called(1); + }); + }); +}