From ccd00bc5c2578acafb0cccc71fea74e60c2f1e3e Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Fri, 21 Aug 2015 09:56:14 -0700 Subject: [PATCH] Migrate sky/tests/layout to sky/unit/test Also, I've organized the tests by the render object they're testing. --- packages/unit/test/rendering/image_test.dart | 161 ++++++++++++++++++ .../unit/test/rendering/layout_utils.dart | 30 ++++ packages/unit/test/rendering/stack_test.dart | 40 +++++ .../unit/test/rendering/viewport_test.dart | 30 ++++ 4 files changed, 261 insertions(+) create mode 100644 packages/unit/test/rendering/image_test.dart create mode 100644 packages/unit/test/rendering/layout_utils.dart create mode 100644 packages/unit/test/rendering/stack_test.dart create mode 100644 packages/unit/test/rendering/viewport_test.dart diff --git a/packages/unit/test/rendering/image_test.dart b/packages/unit/test/rendering/image_test.dart new file mode 100644 index 00000000000..d87bc6e0d8e --- /dev/null +++ b/packages/unit/test/rendering/image_test.dart @@ -0,0 +1,161 @@ +import 'dart:sky' as sky; + +import 'package:sky/rendering.dart'; +import 'package:test/test.dart'; + +import 'layout_utils.dart'; + +class SquareImage implements sky.Image { + int get width => 10; + int get height => 10; +} + +class WideImage implements sky.Image { + int get width => 20; + int get height => 10; +} + +class TallImage implements sky.Image { + int get width => 10; + int get height => 20; +} + +void main() { + test('Image sizing', () { + RenderImage image; + + image = new RenderImage(image: new SquareImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 25.0, + minHeight: 25.0, + maxWidth: 100.0, + maxHeight: 100.0)); + expect(image.size.width, equals(25.0)); + expect(image.size.height, equals(25.0)); + + image = new RenderImage(image: new WideImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 5.0, + minHeight: 30.0, + maxWidth: 100.0, + maxHeight: 100.0)); + expect(image.size.width, equals(60.0)); + expect(image.size.height, equals(30.0)); + + image = new RenderImage(image: new TallImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 50.0, + minHeight: 5.0, + maxWidth: 75.0, + maxHeight: 75.0)); + expect(image.size.width, equals(50.0)); + expect(image.size.height, equals(75.0)); + + image = new RenderImage(image: new WideImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 5.0, + minHeight: 5.0, + maxWidth: 100.0, + maxHeight: 100.0)); + expect(image.size.width, equals(20.0)); + expect(image.size.height, equals(10.0)); + + image = new RenderImage(image: new WideImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 5.0, + minHeight: 5.0, + maxWidth: 16.0, + maxHeight: 16.0)); + expect(image.size.width, equals(16.0)); + expect(image.size.height, equals(8.0)); + + image = new RenderImage(image: new TallImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 5.0, + minHeight: 5.0, + maxWidth: 16.0, + maxHeight: 16.0)); + expect(image.size.width, equals(8.0)); + expect(image.size.height, equals(16.0)); + + image = new RenderImage(image: new SquareImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 4.0, + minHeight: 4.0, + maxWidth: 8.0, + maxHeight: 8.0)); + expect(image.size.width, equals(8.0)); + expect(image.size.height, equals(8.0)); + + image = new RenderImage(image: new WideImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 20.0, + minHeight: 20.0, + maxWidth: 30.0, + maxHeight: 30.0)); + expect(image.size.width, equals(30.0)); + expect(image.size.height, equals(20.0)); + + image = new RenderImage(image: new TallImage()); + layout(image, + constraints: new BoxConstraints( + minWidth: 20.0, + minHeight: 20.0, + maxWidth: 30.0, + maxHeight: 30.0)); + expect(image.size.width, equals(20.0)); + expect(image.size.height, equals(30.0)); + }); + + test('Null image sizing', () { + RenderImage image; + + image = new RenderImage(); + layout(image, + constraints: new BoxConstraints( + minWidth: 25.0, + minHeight: 25.0, + maxWidth: 100.0, + maxHeight: 100.0)); + expect(image.size.width, equals(25.0)); + expect(image.size.height, equals(25.0)); + + image = new RenderImage(width: 50.0); + layout(image, + constraints: new BoxConstraints( + minWidth: 25.0, + minHeight: 25.0, + maxWidth: 100.0, + maxHeight: 100.0)); + expect(image.size.width, equals(50.0)); + expect(image.size.height, equals(25.0)); + + image = new RenderImage(height: 50.0); + layout(image, + constraints: new BoxConstraints( + minWidth: 25.0, + minHeight: 25.0, + maxWidth: 100.0, + maxHeight: 100.0)); + expect(image.size.width, equals(25.0)); + expect(image.size.height, equals(50.0)); + + image = new RenderImage(width: 100.0, height: 100.0); + layout(image, + constraints: new BoxConstraints( + minWidth: 25.0, + minHeight: 25.0, + maxWidth: 75.0, + maxHeight: 75.0)); + expect(image.size.width, equals(75.0)); + expect(image.size.height, equals(75.0)); + }); +} diff --git a/packages/unit/test/rendering/layout_utils.dart b/packages/unit/test/rendering/layout_utils.dart new file mode 100644 index 00000000000..a95b60f764d --- /dev/null +++ b/packages/unit/test/rendering/layout_utils.dart @@ -0,0 +1,30 @@ +import 'package:sky/rendering.dart'; + +const Size _kTestViewSize = const Size(800.0, 600.0); + +class TestRenderView extends RenderView { + TestRenderView({ RenderBox child }) : super(child: child) { + attach(); + rootConstraints = new ViewConstraints(size: _kTestViewSize); + scheduleInitialLayout(); + } + + void beginFrame(double timeStamp) { + RenderObject.flushLayout(); + } +} + +RenderView layout(RenderBox box, { BoxConstraints constraints }) { + if (constraints != null) { + box = new RenderPositionedBox( + child: new RenderConstrainedBox( + additionalConstraints: constraints, + child: box + ) + ); + } + + TestRenderView renderView = new TestRenderView(child: box); + renderView.beginFrame(0.0); + return renderView; +} diff --git a/packages/unit/test/rendering/stack_test.dart b/packages/unit/test/rendering/stack_test.dart new file mode 100644 index 00000000000..1a4ac488583 --- /dev/null +++ b/packages/unit/test/rendering/stack_test.dart @@ -0,0 +1,40 @@ +import 'package:sky/rendering.dart'; +import 'package:test/test.dart'; + +import 'layout_utils.dart'; + +void main() { + test('Stack can layout with top, right, bottom, left 0.0', () { + RenderBox size = new RenderConstrainedBox( + additionalConstraints: new BoxConstraints.tight(const Size(100.0, 100.0))); + + RenderBox red = new RenderDecoratedBox( + decoration: new BoxDecoration( + backgroundColor: const Color(0xFFFF0000) + ), + child: size); + + RenderBox green = new RenderDecoratedBox( + decoration: new BoxDecoration( + backgroundColor: const Color(0xFFFF0000) + )); + + RenderBox stack = new RenderStack(children: [red, green]); + (green.parentData as StackParentData) + ..top = 0.0 + ..right = 0.0 + ..bottom = 0.0 + ..left = 0.0; + + layout(stack, constraints: const BoxConstraints()); + + expect(stack.size.width, equals(100.0)); + expect(stack.size.height, equals(100.0)); + + expect(red.size.width, equals(100.0)); + expect(red.size.height, equals(100.0)); + + expect(green.size.width, equals(100.0)); + expect(green.size.height, equals(100.0)); + }); +} diff --git a/packages/unit/test/rendering/viewport_test.dart b/packages/unit/test/rendering/viewport_test.dart new file mode 100644 index 00000000000..85562aff987 --- /dev/null +++ b/packages/unit/test/rendering/viewport_test.dart @@ -0,0 +1,30 @@ +import 'package:sky/rendering.dart'; +import 'package:test/test.dart'; + +import 'layout_utils.dart'; + +void main() { + test('Should be able to hit with negative scroll offset', () { + RenderBox size = new RenderConstrainedBox( + additionalConstraints: new BoxConstraints.tight(const Size(100.0, 100.0))); + + RenderBox red = new RenderDecoratedBox( + decoration: new BoxDecoration( + backgroundColor: const Color(0xFFFF0000) + ), + child: size); + + RenderViewport viewport = new RenderViewport(child: red, scrollOffset: new Offset(0.0, -10.0)); + RenderView renderView = layout(viewport); + + HitTestResult result; + + result = new HitTestResult(); + renderView.hitTest(result, position: new Point(15.0, 0.0)); + expect(result.path.first.target, equals(viewport)); + + result = new HitTestResult(); + renderView.hitTest(result, position: new Point(15.0, 15.0)); + expect(result.path.first.target, equals(size)); + }); +}