277 lines
7.9 KiB
Dart
277 lines
7.9 KiB
Dart
// Copyright 2016 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/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:matcher/matcher.dart';
|
|
|
|
import '../widgets/semantics_tester.dart';
|
|
|
|
void main() {
|
|
testWidgets('Dialog is scrollable', (WidgetTester tester) async {
|
|
bool didPressOk = false;
|
|
|
|
await tester.pumpWidget(
|
|
new MaterialApp(
|
|
home: new Material(
|
|
child: new Builder(
|
|
builder: (BuildContext context) {
|
|
return new Center(
|
|
child: new RaisedButton(
|
|
child: const Text('X'),
|
|
onPressed: () {
|
|
showDialog<Null>(
|
|
context: context,
|
|
child: new AlertDialog(
|
|
content: new Container(
|
|
height: 5000.0,
|
|
width: 300.0,
|
|
color: Colors.green[500],
|
|
),
|
|
actions: <Widget>[
|
|
new FlatButton(
|
|
onPressed: () {
|
|
didPressOk = true;
|
|
},
|
|
child: const Text('OK')
|
|
)
|
|
]
|
|
)
|
|
);
|
|
}
|
|
)
|
|
);
|
|
}
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
await tester.tap(find.text('X'));
|
|
await tester.pump(); // start animation
|
|
await tester.pump(const Duration(seconds: 1));
|
|
|
|
expect(didPressOk, false);
|
|
await tester.tap(find.text('OK'));
|
|
expect(didPressOk, true);
|
|
});
|
|
|
|
testWidgets('Dialog background color', (WidgetTester tester) async {
|
|
|
|
await tester.pumpWidget(
|
|
new MaterialApp(
|
|
theme: new ThemeData(brightness: Brightness.dark),
|
|
home: new Material(
|
|
child: new Builder(
|
|
builder: (BuildContext context) {
|
|
return new Center(
|
|
child: new RaisedButton(
|
|
child: const Text('X'),
|
|
onPressed: () {
|
|
showDialog<Null>(
|
|
context: context,
|
|
child: const AlertDialog(
|
|
title: const Text('Title'),
|
|
content: const Text('Y'),
|
|
actions: const <Widget>[ ],
|
|
),
|
|
);
|
|
},
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
await tester.tap(find.text('X'));
|
|
await tester.pump(); // start animation
|
|
await tester.pump(const Duration(seconds: 1));
|
|
|
|
final StatefulElement widget = tester.element(find.byType(Material).last);
|
|
final Material materialWidget = widget.state.widget;
|
|
//first and second expect check that the material is the dialog's one
|
|
expect(materialWidget.type, MaterialType.card);
|
|
expect(materialWidget.elevation, 24);
|
|
expect(materialWidget.color, Colors.grey[800]);
|
|
});
|
|
|
|
testWidgets('Simple dialog control test', (WidgetTester tester) async {
|
|
await tester.pumpWidget(
|
|
new MaterialApp(
|
|
home: const Material(
|
|
child: const Center(
|
|
child: const RaisedButton(
|
|
onPressed: null,
|
|
child: const Text('Go'),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
final BuildContext context = tester.element(find.text('Go'));
|
|
|
|
final Future<int> result = showDialog(
|
|
context: context,
|
|
child: new SimpleDialog(
|
|
title: const Text('Title'),
|
|
children: <Widget>[
|
|
new SimpleDialogOption(
|
|
onPressed: () {
|
|
Navigator.pop(context, 42);
|
|
},
|
|
child: const Text('First option'),
|
|
),
|
|
const SimpleDialogOption(
|
|
child: const Text('Second option'),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
|
expect(find.text('Title'), findsOneWidget);
|
|
await tester.tap(find.text('First option'));
|
|
|
|
expect(await result, equals(42));
|
|
});
|
|
|
|
testWidgets('Barrier dismissible', (WidgetTester tester) async {
|
|
await tester.pumpWidget(
|
|
new MaterialApp(
|
|
home: const Material(
|
|
child: const Center(
|
|
child: const RaisedButton(
|
|
onPressed: null,
|
|
child: const Text('Go'),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
final BuildContext context = tester.element(find.text('Go'));
|
|
|
|
showDialog<Null>(
|
|
context: context,
|
|
child: new Container(
|
|
width: 100.0,
|
|
height: 100.0,
|
|
alignment: Alignment.center,
|
|
child: const Text('Dialog1'),
|
|
),
|
|
);
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
|
expect(find.text('Dialog1'), findsOneWidget);
|
|
|
|
// Tap on the barrier.
|
|
await tester.tapAt(const Offset(10.0, 10.0));
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
|
expect(find.text('Dialog1'), findsNothing);
|
|
|
|
showDialog<Null>(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
child: new Container(
|
|
width: 100.0,
|
|
height: 100.0,
|
|
alignment: Alignment.center,
|
|
child: const Text('Dialog2'),
|
|
),
|
|
);
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
|
expect(find.text('Dialog2'), findsOneWidget);
|
|
|
|
// Tap on the barrier, which shouldn't do anything this time.
|
|
await tester.tapAt(const Offset(10.0, 10.0));
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
|
expect(find.text('Dialog2'), findsOneWidget);
|
|
|
|
});
|
|
|
|
testWidgets('Dialog hides underlying semantics tree', (WidgetTester tester) async {
|
|
final SemanticsTester semantics = new SemanticsTester(tester);
|
|
const String buttonText = 'A button covered by dialog overlay';
|
|
await tester.pumpWidget(
|
|
new MaterialApp(
|
|
home: const Material(
|
|
child: const Center(
|
|
child: const RaisedButton(
|
|
onPressed: null,
|
|
child: const Text(buttonText),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(semantics, includesNodeWith(label: buttonText));
|
|
|
|
final BuildContext context = tester.element(find.text(buttonText));
|
|
|
|
const String alertText = 'A button in an overlay alert';
|
|
showDialog<Null>(
|
|
context: context,
|
|
child: const AlertDialog(title: const Text(alertText)),
|
|
);
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
|
|
|
expect(semantics, includesNodeWith(label: alertText));
|
|
expect(semantics, isNot(includesNodeWith(label: buttonText)));
|
|
|
|
semantics.dispose();
|
|
});
|
|
|
|
testWidgets('Dialogs removes MediaQuery padding', (WidgetTester tester) async {
|
|
BuildContext outerContext;
|
|
BuildContext dialogContext;
|
|
|
|
await tester.pumpWidget(new Localizations(
|
|
locale: const Locale('en', 'US'),
|
|
delegates: <LocalizationsDelegate<dynamic>>[
|
|
DefaultWidgetsLocalizations.delegate,
|
|
DefaultMaterialLocalizations.delegate,
|
|
],
|
|
child: new MediaQuery(
|
|
data: const MediaQueryData(
|
|
padding: const EdgeInsets.all(50.0),
|
|
),
|
|
child: new Navigator(
|
|
onGenerateRoute: (_) {
|
|
return new PageRouteBuilder<Null>(
|
|
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
|
|
outerContext = context;
|
|
return new Container();
|
|
},
|
|
);
|
|
},
|
|
),
|
|
),
|
|
));
|
|
|
|
showDialog<Null>(
|
|
context: outerContext,
|
|
barrierDismissible: false,
|
|
child: new Builder(
|
|
builder: (BuildContext context) {
|
|
dialogContext = context;
|
|
return new Container();
|
|
},
|
|
),
|
|
);
|
|
|
|
await tester.pump();
|
|
|
|
expect(MediaQuery.of(outerContext).padding, const EdgeInsets.all(50.0));
|
|
expect(MediaQuery.of(dialogContext).padding, EdgeInsets.zero);
|
|
});
|
|
}
|