blob: b5fcdc14e536f3c78a0814cd7dcdb2993f5ad8ba [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/service/service_manager.dart';
import 'package:devtools_app/src/shared/config_specific/ide_theme/ide_theme.dart';
import 'package:devtools_app/src/shared/globals.dart';
import 'package:devtools_app/src/shared/primitives/utils.dart';
import 'package:devtools_app/src/shared/split.dart';
import 'package:devtools_test/devtools_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
setUp(() {
setGlobal(ServiceConnectionManager, FakeServiceManager());
setGlobal(IdeTheme, IdeTheme());
});
// 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(197.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(591.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(12, 600),
);
});
testWidgets('with 50% space to first child', (WidgetTester tester) async {
final split = buildSplit(
Axis.horizontal,
initialFractions: [0.5, 0.5],
);
await tester.pumpWidget(wrap(split));
expectEqualSizes(
tester.element(find.byKey(_k1)).size!,
const Size(394, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(394, 600),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(12, 600),
);
});
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(591.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(197.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(12, 600),
);
});
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(788, 600),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(12, 600),
);
});
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(788, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 600),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(12, 600),
);
},
);
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(155.2, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(310.4, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(310.4, 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(258.666416, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(258.666416, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(258.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, 147),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 441),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(800, 12),
);
});
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, 294),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 294),
);
});
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, 441.0),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 147.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, 588),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(800, 12),
);
});
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, 588),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 0),
);
expectEqualSizes(
tester.element(find.byKey(split.dividerKey(0))).size!,
const Size(800, 12),
);
},
);
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, 115.2),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 230.4),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(800, 230.4),
);
});
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, 191.99981599999998),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 191.99981599999998),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(800, 191.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(394.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(394.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(591.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(197.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(197.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(591.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(788, 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(788, 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(788, 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(788, 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, 294.0),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 294.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, 441.0),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 147.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, 147.0),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(800, 441.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, 588),
);
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, 588),
);
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, 588),
);
// 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, 588),
);
});
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(155.2, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(310.4, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(310.4, 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(77.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(388.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(310.4, 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(465.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(310.4, 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(465.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(310.4, 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(465.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(310.4, 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(368.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(407.4, 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(368.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(407.4, 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(368.6, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(407.4, 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(394.0, 600),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(394.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(688.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(688.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(688.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(688.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(288, 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(188, 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(75.2, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(150.4, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(150.4, 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(35.2, 200),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(70.4, 200),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(70.4, 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(176.0, 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(100.0, 200),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(6.0, 200),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(100.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),
),
),
);
// TODO(dantup): These now fail, as the results are 100/176/100. It's not
// clear why these expectations are different to the above when it's
// in the same size box?
expectEqualSizes(
tester.element(find.byKey(_k1)).size!,
const Size(182.5242718446602, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(10.951456310679607, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(182.5242718446602, 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(125.33333333333333, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(250.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(58.666666666666664, 200),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 200),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(117.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(125.33333333333333, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(250.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(258.66666666666666, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(0, 400),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(517.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, 288.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, 188),
);
});
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, 75.2),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(400, 150.4),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(400, 150.4),
);
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, 35.2),
);
expectEqualSizes(
tester.element(find.byKey(_k2)).size!,
const Size(200, 70.4),
);
expectEqualSizes(
tester.element(find.byKey(_k3)).size!,
const Size(200, 70.4),
);
},
);
});
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 = PreferredSize(
preferredSize: Size(20, 20),
child: SizedBox(height: 20, width: 20),
);
const _largeSplitter = PreferredSize(
preferredSize: Size(40, 40),
child: SizedBox(height: 40, width: 40),
);
Split buildSplit(
Axis axis, {
required List<double> initialFractions,
List<Widget>? children,
List<double>? minSizes,
List<PreferredSizeWidget>? splitters,
}) {
children ??= const [_w1, _w2];
return Split(
axis: axis,
initialFractions: initialFractions,
minSizes: minSizes,
splitters: splitters,
children: children,
);
}
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}',
);
}