blob: 61a9bbd197c5e3d26a7e03830c9dd7889df29fc3 [file] [log] [blame]
// Copyright 2019 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:devtools_app/src/split.dart';
import 'package:devtools_app/src/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'support/wrappers.dart';
void main() {
// Note: tester by default has a window size of 800x600.
group('Split', () {
group('builds horizontal layout', () {
testWidgets('with 25% space to first child', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
initialFractions: [0.25, 0.75],
);
await tester.pumpWidget(wrap(split));
expect(find.byKey(_k1), findsOneWidget);
expect(find.byKey(_k2), findsOneWidget);
expect(find.byKey(split.dividerKey(0)), findsOneWidget);
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(194.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(582.0, 600));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with 50% space to first child', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
initialFractions: [0.50, 0.50],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(388, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(388, 600));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with 75% space to first child', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
initialFractions: [0.75, 0.25],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(582.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(194.0, 600));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with 0% space to first child', (WidgetTester tester) async {
final split = buildSplit(Axis.horizontal, initialFractions: [0.0, 1.0]);
await tester.pumpWidget(wrap(split));
expect(find.byKey(_k1), findsOneWidget);
expect(find.byKey(_k2), findsOneWidget);
expect(find.byKey(split.dividerKey(0)), findsOneWidget);
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(776, 600));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with 100% space to first child',
(WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
initialFractions: [1.0, 0.0],
);
await tester.pumpWidget(wrap(split));
expect(find.byKey(_k1), findsOneWidget);
expect(find.byKey(_k2), findsOneWidget);
expect(find.byKey(split.dividerKey(0)), findsOneWidget);
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(776, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 600));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with n children', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(150.4, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(300.8, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(300.8, 600));
});
testWidgets('with custom splitters', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
splitters: [_mediumSplitter, _largeSplitter],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(148, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(296, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(296, 600));
});
testWidgets('with initialFraction rounding errors',
(WidgetTester tester) async {
const oneThird = 0.333333;
final split = buildSplit(
Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [oneThird, oneThird, oneThird],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(250.666416, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(250.666416, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(250.666416, 600));
});
});
group('builds vertical layout', () {
testWidgets('with 25% space to first child', (WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [0.25, 0.75]);
await tester.pumpWidget(wrap(split));
expect(find.byKey(_k1), findsOneWidget);
expect(find.byKey(_k2), findsOneWidget);
expect(find.byKey(split.dividerKey(0)), findsOneWidget);
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 144.0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 432.0));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with 50% space to first child', (WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [0.5, 0.5]);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 288));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 288));
});
testWidgets('with 75% space to first child', (WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [0.75, 0.25]);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 432.0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 144.0));
});
testWidgets('with 0% space to first child', (WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [0.0, 1.0]);
await tester.pumpWidget(wrap(split));
expect(find.byKey(_k1), findsOneWidget);
expect(find.byKey(_k2), findsOneWidget);
expect(find.byKey(split.dividerKey(0)), findsOneWidget);
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 576));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with 100% space to first child',
(WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [1.0, 0.0]);
await tester.pumpWidget(wrap(split));
expect(find.byKey(_k1), findsOneWidget);
expect(find.byKey(_k2), findsOneWidget);
expect(find.byKey(split.dividerKey(0)), findsOneWidget);
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 576));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 0));
expectEqualSizes(tester.element(find.byKey(split.dividerKey(0))).size,
const Size(24, 24));
});
testWidgets('with n children', (WidgetTester tester) async {
final split = buildSplit(
Axis.vertical,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 110.4));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 220.8));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(800, 220.8));
});
testWidgets('with custom splitters', (WidgetTester tester) async {
final split = buildSplit(
Axis.vertical,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
splitters: [_mediumSplitter, _largeSplitter],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 108));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 216));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(800, 216));
});
testWidgets('with initialFraction rounding errors',
(WidgetTester tester) async {
const oneThird = 0.333333;
final split = buildSplit(
Axis.vertical,
children: [_w1, _w2, _w3],
initialFractions: [oneThird, oneThird, oneThird],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(800, 183.99981599999998));
expectEqualSizes(tester.element(find.byKey(_k2)).size,
const Size(800, 183.99981599999998));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(800, 183.99981599999998));
});
});
group('drags properly', () {
testWidgets('with horizontal layout', (WidgetTester tester) async {
final split = buildSplit(Axis.horizontal, initialFractions: [0.5, 0.5]);
await tester.pumpWidget(wrap(split));
// We start at 0.5 size.
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(388.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(388.0, 600));
// Drag to 0.75 first child size.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(582.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(194.0, 600));
// Drag to 0.25 first child size.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-400, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(194.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(582.0, 600));
// Drag past the right end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(600, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(776, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 600));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(776, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 600));
// Drag back past the left end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-800, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(776, 600));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(776, 600));
});
testWidgets('with vertical layout', (WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [0.5, 0.5]);
await tester.pumpWidget(wrap(split));
// We start at 0.5 size.
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 288.0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 288.0));
// Drag to 0.75 first child size.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(0, 150));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 432.0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 144.0));
// Drag to 0.25 first child size.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(0, -300));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 144.0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 432.0));
// Drag past the right end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(0, 450));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 576));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 0));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(0, 200));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 576));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 0));
// Drag back past the left end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(0, -600));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 576));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(0, -200));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(800, 0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(800, 576));
});
testWidgets('with n children', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
);
await tester.pumpWidget(wrap(split));
// We start at initial size.
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(150.4, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(300.8, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(300.8, 600));
// Drag first splitter to 0.1 first child size.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-80, 0));
await tester.pumpAndSettle();
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(75.20000000000002, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(376.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(300.8, 600));
// Drag first splitter to the left end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-80, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(451.2, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(300.8, 600));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(451.2, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(300.8, 600));
// Drag first splitter to second splitter.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(480, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(451.2, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(300.8, 600));
// Drag second splitter past first splitter.
await tester.drag(
find.byKey(split.dividerKey(1)), const Offset(-100, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(357.2, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(394.8, 600));
// Drag second splitter to the right end of the widget.
await tester.drag(
find.byKey(split.dividerKey(1)), const Offset(420, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(357.2, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(394.8, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(0, 600));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(1)), const Offset(200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(357.2, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(394.8, 600));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(0, 600));
});
testWidgets('with minSizes', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
initialFractions: [0.5, 0.5],
minSizes: [100.0, 100.0],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(388.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(388.0, 600));
// Drag splitter to the left end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-300, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(100, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(676.0, 600));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(-200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(100, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(676.0, 600));
// Drag splitter to the right end of the widget.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(597.5, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(676.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(100, 600));
// Make sure we can't overdrag.
await tester.drag(
find.byKey(split.dividerKey(0)), const Offset(200, 0));
await tester.pumpAndSettle();
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(676.0, 600));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(100, 600));
});
});
group('resizes contents', () {
testWidgets('in a horizontal layout', (WidgetTester tester) async {
final split = buildSplit(Axis.horizontal, initialFractions: [0.0, 1.0]);
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 300.0, height: 300.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 300));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(276, 300));
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 200.0, height: 200.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(0, 200));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(176, 200));
});
testWidgets('in a horizontal layout with n children',
(WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
);
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 400.0, height: 400.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(70.4, 400));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(140.8, 400));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(140.8, 400));
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 200.0, height: 200.0, child: split),
),
));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(30.400000000000002, 200));
expectEqualSizes(tester.element(find.byKey(_k2)).size,
const Size(60.800000000000004, 200));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(60.800000000000004, 200));
});
testWidgets('with violated minsize constraints',
(WidgetTester tester) async {
final split = buildSplit(Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [0.1, 0.7, 0.2],
minSizes: [100.0, 0, 100.0]);
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 400.0, height: 400.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(100, 400));
expectEqualSizes(tester.element(find.byKey(_k2)).size,
const Size(151.99999999999997, 400));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(100, 400));
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 230.0, height: 200.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(91.0, 200));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0.0, 200));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(91.0, 200));
// It would be nice if we restored the size of w2 in this case but the
// logic is simpler if we don't as this way the layout calculation can
// avoid tracking state about what the previous fractions were before
// clipping which would add more complexity and shouldn't really matter.
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 400.0, height: 400.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(176.0, 400));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0.0, 400));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(176.0, 400));
});
testWidgets('with impossible minsize constraints',
(WidgetTester tester) async {
final split = buildSplit(Axis.horizontal,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
minSizes: [200.0, 0, 400.0]);
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 400.0, height: 400.0, child: split),
),
));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(117.33333333333333, 400));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 400));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(234.66666666666666, 400));
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 200.0, height: 200.0, child: split),
),
));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(50.666666666666664, 200));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 200));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(101.33333333333333, 200));
// Min size constraints still violated but not violated by as much.
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 400.0, height: 400.0, child: split),
),
));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(117.33333333333333, 400));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 400));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(234.66666666666666, 400));
// Min size constraints are now satisfied.
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 800.0, height: 400.0, child: split),
),
));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(250.66666666666666, 400));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(0, 400));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(501.3333333333333, 400));
});
testWidgets('in a vertical layout', (WidgetTester tester) async {
final split = buildSplit(Axis.vertical, initialFractions: [0.0, 1.0]);
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 300.0, height: 300.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(300, 0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(300, 276.0));
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 200.0, height: 200.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(200, 0));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(200, 176));
});
testWidgets('in a vertical layout with n children',
(WidgetTester tester) async {
final split = buildSplit(
Axis.vertical,
children: [_w1, _w2, _w3],
initialFractions: [0.2, 0.4, 0.4],
);
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 400.0, height: 400.0, child: split),
),
));
expectEqualSizes(
tester.element(find.byKey(_k1)).size, const Size(400, 70.4));
expectEqualSizes(
tester.element(find.byKey(_k2)).size, const Size(400, 140.8));
expectEqualSizes(
tester.element(find.byKey(_k3)).size, const Size(400, 140.8));
await tester.pumpWidget(wrap(
Center(
child: SizedBox(width: 200.0, height: 200.0, child: split),
),
));
expectEqualSizes(tester.element(find.byKey(_k1)).size,
const Size(200, 30.400000000000002));
expectEqualSizes(tester.element(find.byKey(_k2)).size,
const Size(200, 60.800000000000004));
expectEqualSizes(tester.element(find.byKey(_k3)).size,
const Size(200, 60.800000000000004));
});
});
group('axisFor', () {
testWidgetsWithWindowSize('return Axis.horizontal', const Size(800, 800),
(WidgetTester tester) async {
await tester.pumpWidget(wrap(Builder(
builder: (context) {
expectLater(Split.axisFor(context, 1.0), Axis.horizontal);
return Container();
},
)));
});
testWidgetsWithWindowSize('return Axis.vertical', const Size(500, 800),
(WidgetTester tester) async {
await tester.pumpWidget(wrap(Builder(
builder: (context) {
expectLater(Split.axisFor(context, 1.0), Axis.vertical);
return Container();
},
)));
});
});
});
}
const _k1 = Key('child 1');
const _k2 = Key('child 2');
const _k3 = Key('child 3');
const _w1 = Text('content1', key: _k1);
const _w2 = Text('content2', key: _k2);
const _w3 = Text('content3', key: _k3);
const _mediumSplitter = SizedBox(height: 20, width: 20);
const _largeSplitter = SizedBox(height: 40, width: 40);
Split buildSplit(
Axis axis, {
@required List<double> initialFractions,
List<Widget> children,
List<double> minSizes,
List<SizedBox> splitters,
}) {
children ??= const [_w1, _w2];
return Split(
axis: axis,
children: children,
initialFractions: initialFractions,
minSizes: minSizes,
splitters: splitters,
);
}
void expectEqualSizes(Size a, Size b) {
expect(
(a.width - b.width).abs() < defaultEpsilon,
isTrue,
reason: 'Widths unequal:\nExpected ${b.width}\nActual: ${a.width}',
);
expect(
(a.height - b.height).abs() < defaultEpsilon,
isTrue,
reason: 'Heights unequal:\nExpected ${b.height}\nActual: ${a.height}',
);
}