| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/rendering.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| import 'mock_canvas.dart'; |
| import 'rendering_tester.dart'; |
| |
| RenderBox sizedBox(double width, double height) { |
| return new RenderConstrainedBox( |
| additionalConstraints: new BoxConstraints.tight(new Size(width, height)) |
| ); |
| } |
| |
| void main() { |
| test('Table control test; tight', () { |
| RenderTable table; |
| layout(table = new RenderTable(textDirection: TextDirection.ltr)); |
| |
| expect(table.size.width, equals(800.0)); |
| expect(table.size.height, equals(600.0)); |
| |
| expect(table, hasAGoodToStringDeep); |
| expect( |
| table.toStringDeep(minLevel: DiagnosticLevel.info), |
| equalsIgnoringHashCodes( |
| 'RenderTable#00000 NEEDS-PAINT\n' |
| ' │ parentData: <none>\n' |
| ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' |
| ' │ size: Size(800.0, 600.0)\n' |
| ' │ default column width: FlexColumnWidth(1.0)\n' |
| ' │ table size: 0×0\n' |
| ' │ column offsets: unknown\n' |
| ' │ row offsets: []\n' |
| ' │\n' |
| ' └─table is empty\n', |
| ), |
| ); |
| }); |
| |
| test('Table control test; loose', () { |
| RenderTable table; |
| layout(new RenderPositionedBox(child: table = new RenderTable(textDirection: TextDirection.ltr))); |
| |
| expect(table.size, equals(const Size(0.0, 0.0))); |
| }); |
| |
| test('Table test: combinations', () { |
| RenderTable table; |
| layout(new RenderPositionedBox(child: table = new RenderTable( |
| columns: 5, |
| rows: 5, |
| defaultColumnWidth: const IntrinsicColumnWidth(), |
| textDirection: TextDirection.ltr, |
| defaultVerticalAlignment: TableCellVerticalAlignment.baseline, |
| textBaseline: TextBaseline.alphabetic, |
| ))); |
| |
| expect(table.size, equals(const Size(0.0, 0.0))); |
| |
| table.setChild(2, 4, sizedBox(100.0, 200.0)); |
| |
| pumpFrame(); |
| |
| expect(table.size, equals(const Size(100.0, 200.0))); |
| |
| table.setChild(0, 0, sizedBox(10.0, 30.0)); |
| table.setChild(1, 0, sizedBox(20.0, 20.0)); |
| table.setChild(2, 0, sizedBox(30.0, 10.0)); |
| |
| pumpFrame(); |
| |
| expect(table.size, equals(const Size(130.0, 230.0))); |
| |
| expect(table, hasAGoodToStringDeep); |
| expect( |
| table.toStringDeep(minLevel: DiagnosticLevel.info), |
| equalsIgnoringHashCodes( |
| 'RenderTable#00000 relayoutBoundary=up1 NEEDS-PAINT\n' |
| ' │ parentData: offset=Offset(335.0, 185.0) (can use size)\n' |
| ' │ constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=600.0)\n' |
| ' │ size: Size(130.0, 230.0)\n' |
| ' │ default column width: IntrinsicColumnWidth(flex: null)\n' |
| ' │ table size: 5×5\n' |
| ' │ column offsets: 0.0, 10.0, 30.0, 130.0, 130.0\n' |
| ' │ row offsets: 0.0, 30.0, 30.0, 30.0, 30.0, 230.0\n' |
| ' │\n' |
| ' ├─child (0, 0): RenderConstrainedBox#00000 relayoutBoundary=up2 NEEDS-PAINT\n' |
| ' │ parentData: offset=Offset(0.0, 0.0); default vertical alignment\n' |
| ' │ (can use size)\n' |
| ' │ constraints: BoxConstraints(w=10.0, 0.0<=h<=Infinity)\n' |
| ' │ size: Size(10.0, 30.0)\n' |
| ' │ additionalConstraints: BoxConstraints(w=10.0, h=30.0)\n' |
| ' │\n' |
| ' ├─child (1, 0): RenderConstrainedBox#00000 relayoutBoundary=up2 NEEDS-PAINT\n' |
| ' │ parentData: offset=Offset(10.0, 0.0); default vertical alignment\n' |
| ' │ (can use size)\n' |
| ' │ constraints: BoxConstraints(w=20.0, 0.0<=h<=Infinity)\n' |
| ' │ size: Size(20.0, 20.0)\n' |
| ' │ additionalConstraints: BoxConstraints(w=20.0, h=20.0)\n' |
| ' │\n' |
| ' ├─child (2, 0): RenderConstrainedBox#00000 relayoutBoundary=up2 NEEDS-PAINT\n' |
| ' │ parentData: offset=Offset(30.0, 0.0); default vertical alignment\n' |
| ' │ (can use size)\n' |
| ' │ constraints: BoxConstraints(w=100.0, 0.0<=h<=Infinity)\n' |
| ' │ size: Size(100.0, 10.0)\n' |
| ' │ additionalConstraints: BoxConstraints(w=30.0, h=10.0)\n' |
| ' │\n' |
| ' ├─child (3, 0) is null\n' |
| ' ├─child (4, 0) is null\n' |
| ' ├─child (0, 1) is null\n' |
| ' ├─child (1, 1) is null\n' |
| ' ├─child (2, 1) is null\n' |
| ' ├─child (3, 1) is null\n' |
| ' ├─child (4, 1) is null\n' |
| ' ├─child (0, 2) is null\n' |
| ' ├─child (1, 2) is null\n' |
| ' ├─child (2, 2) is null\n' |
| ' ├─child (3, 2) is null\n' |
| ' ├─child (4, 2) is null\n' |
| ' ├─child (0, 3) is null\n' |
| ' ├─child (1, 3) is null\n' |
| ' ├─child (2, 3) is null\n' |
| ' ├─child (3, 3) is null\n' |
| ' ├─child (4, 3) is null\n' |
| ' ├─child (0, 4) is null\n' |
| ' ├─child (1, 4) is null\n' |
| ' ├─child (2, 4): RenderConstrainedBox#00000 relayoutBoundary=up2 NEEDS-PAINT\n' |
| ' │ parentData: offset=Offset(30.0, 30.0); default vertical alignment\n' |
| ' │ (can use size)\n' |
| ' │ constraints: BoxConstraints(w=100.0, 0.0<=h<=Infinity)\n' |
| ' │ size: Size(100.0, 200.0)\n' |
| ' │ additionalConstraints: BoxConstraints(w=100.0, h=200.0)\n' |
| ' │\n' |
| ' ├─child (3, 4) is null\n' |
| ' └─child (4, 4) is null\n', |
| ), |
| ); |
| }); |
| |
| test('Table test: removing cells', () { |
| RenderTable table; |
| RenderBox child; |
| table = new RenderTable( |
| columns: 5, |
| rows: 5, |
| textDirection: TextDirection.ltr, |
| ); |
| table.setChild(4, 4, child = sizedBox(10.0, 10.0)); |
| |
| layout(table); |
| |
| expect(child.attached, isTrue); |
| table.rows = 4; |
| expect(child.attached, isFalse); |
| }); |
| |
| test('Table test: replacing cells', () { |
| RenderTable table; |
| final RenderBox child1 = new RenderPositionedBox(); |
| final RenderBox child2 = new RenderPositionedBox(); |
| final RenderBox child3 = new RenderPositionedBox(); |
| table = new RenderTable(textDirection: TextDirection.ltr); |
| table.setFlatChildren(3, <RenderBox>[child1, new RenderPositionedBox(), child2, |
| new RenderPositionedBox(), child3, new RenderPositionedBox()]); |
| expect(table.rows, equals(2)); |
| layout(table); |
| table.setFlatChildren(3, <RenderBox>[new RenderPositionedBox(), child1, new RenderPositionedBox(), |
| child2, new RenderPositionedBox(), child3]); |
| pumpFrame(); |
| table.setFlatChildren(3, <RenderBox>[new RenderPositionedBox(), child1, new RenderPositionedBox(), |
| child2, new RenderPositionedBox(), child3]); |
| pumpFrame(); |
| expect(table.columns, equals(3)); |
| expect(table.rows, equals(2)); |
| }); |
| |
| test('Table border painting', () { |
| final RenderTable table = new RenderTable( |
| textDirection: TextDirection.rtl, |
| border: new TableBorder.all(), |
| ); |
| layout(table); |
| table.setFlatChildren(1, <RenderBox>[ ]); |
| pumpFrame(); |
| expect(table, paints..path()..path()..path()..path()); |
| table.setFlatChildren(1, <RenderBox>[ new RenderPositionedBox() ]); |
| pumpFrame(); |
| expect(table, paints..path()..path()..path()..path()); |
| table.setFlatChildren(1, <RenderBox>[ new RenderPositionedBox(), new RenderPositionedBox() ]); |
| pumpFrame(); |
| expect(table, paints..path()..path()..path()..path()..path()); |
| table.setFlatChildren(2, <RenderBox>[ new RenderPositionedBox(), new RenderPositionedBox() ]); |
| pumpFrame(); |
| expect(table, paints..path()..path()..path()..path()..path()); |
| table.setFlatChildren(2, <RenderBox>[ new RenderPositionedBox(), new RenderPositionedBox(), |
| new RenderPositionedBox(), new RenderPositionedBox() ]); |
| pumpFrame(); |
| expect(table, paints..path()..path()..path()..path()..path()..path()); |
| table.setFlatChildren(3, <RenderBox>[ new RenderPositionedBox(), new RenderPositionedBox(), new RenderPositionedBox(), |
| new RenderPositionedBox(), new RenderPositionedBox(), new RenderPositionedBox() ]); |
| pumpFrame(); |
| expect(table, paints..path()..path()..path()..path()..path()..path()); |
| }); |
| } |