blob: 9ad94a8e8f3f327980173247a35e0c1c9ee10b9f [file] [log] [blame]
// Copyright 2014 The Flutter 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/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
test('NavigationDrawerThemeData copyWith, ==, hashCode, basics', () {
expect(const NavigationDrawerThemeData(), const NavigationDrawerThemeData().copyWith());
expect(
const NavigationDrawerThemeData().hashCode,
const NavigationDrawerThemeData().copyWith().hashCode,
);
});
test('NavigationDrawerThemeData lerp special cases', () {
expect(NavigationDrawerThemeData.lerp(null, null, 0), null);
const NavigationDrawerThemeData data = NavigationDrawerThemeData();
expect(identical(NavigationDrawerThemeData.lerp(data, data, 0.5), data), true);
});
testWidgets('Default debugFillProperties', (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
const NavigationDrawerThemeData().debugFillProperties(builder);
final List<String> description =
builder.properties
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
.map((DiagnosticsNode node) => node.toString())
.toList();
expect(description, <String>[]);
});
testWidgets('NavigationDrawerThemeData implements debugFillProperties', (
WidgetTester tester,
) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
const NavigationDrawerThemeData(
tileHeight: 50,
backgroundColor: Color(0x00000099),
elevation: 5.0,
shadowColor: Color(0x00000098),
surfaceTintColor: Color(0x00000097),
indicatorColor: Color(0x00000096),
indicatorShape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(2.0))),
indicatorSize: Size(10, 10),
labelTextStyle: MaterialStatePropertyAll<TextStyle>(TextStyle(fontSize: 7.0)),
iconTheme: MaterialStatePropertyAll<IconThemeData>(IconThemeData(color: Color(0x00000095))),
).debugFillProperties(builder);
final List<String> description =
builder.properties
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
.map((DiagnosticsNode node) => node.toString())
.toList();
expect(
description,
equalsIgnoringHashCodes(<String>[
'tileHeight: 50.0',
'backgroundColor: ${const Color(0x00000099)}',
'elevation: 5.0',
'shadowColor: ${const Color(0x00000098)}',
'surfaceTintColor: ${const Color(0x00000097)}',
'indicatorColor: ${const Color(0x00000096)}',
'indicatorShape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(2.0))',
'indicatorSize: Size(10.0, 10.0)',
'labelTextStyle: WidgetStatePropertyAll(TextStyle(inherit: true, size: 7.0))',
'iconTheme: WidgetStatePropertyAll(IconThemeData#00000(color: ${const Color(0x00000095)}))',
]),
);
});
testWidgets(
'NavigationDrawerThemeData values are used when no NavigationDrawer properties are specified',
(WidgetTester tester) async {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
const NavigationDrawerThemeData navigationDrawerTheme = NavigationDrawerThemeData(
backgroundColor: Color(0x00000001),
elevation: 7.0,
shadowColor: Color(0x00000002),
surfaceTintColor: Color(0x00000003),
indicatorColor: Color(0x00000004),
indicatorShape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(topRight: Radius.circular(16.0)),
),
labelTextStyle: MaterialStatePropertyAll<TextStyle>(TextStyle(fontSize: 7.0)),
iconTheme: MaterialStatePropertyAll<IconThemeData>(IconThemeData(color: Color(0x00000005))),
);
await tester.pumpWidget(
_buildWidget(
scaffoldKey,
NavigationDrawer(
children: const <Widget>[
Text('Headline'),
NavigationDrawerDestination(icon: Icon(Icons.ac_unit), label: Text('AC')),
NavigationDrawerDestination(icon: Icon(Icons.access_alarm), label: Text('Alarm')),
],
onDestinationSelected: (int i) {},
),
theme: ThemeData(navigationDrawerTheme: navigationDrawerTheme),
),
);
scaffoldKey.currentState!.openDrawer();
await tester.pump(const Duration(seconds: 1));
// Test drawer Material.
expect(_getMaterial(tester).color, navigationDrawerTheme.backgroundColor);
expect(_getMaterial(tester).surfaceTintColor, navigationDrawerTheme.surfaceTintColor);
expect(_getMaterial(tester).shadowColor, navigationDrawerTheme.shadowColor);
expect(_getMaterial(tester).elevation, 7);
// Test indicator decoration.
expect(_getIndicatorDecoration(tester)?.color, navigationDrawerTheme.indicatorColor);
expect(_getIndicatorDecoration(tester)?.shape, navigationDrawerTheme.indicatorShape);
// Test icon.
expect(
_iconStyle(tester, Icons.ac_unit)?.color,
navigationDrawerTheme.iconTheme?.resolve(<MaterialState>{})?.color,
);
expect(
_iconStyle(tester, Icons.access_alarm)?.color,
navigationDrawerTheme.iconTheme?.resolve(<MaterialState>{})?.color,
);
// Test label.
expect(
_labelStyle(tester, 'AC'),
navigationDrawerTheme.labelTextStyle?.resolve(<MaterialState>{}),
);
expect(
_labelStyle(tester, 'Alarm'),
navigationDrawerTheme.labelTextStyle?.resolve(<MaterialState>{}),
);
},
);
testWidgets(
'NavigationDrawer values take priority over NavigationDrawerThemeData values when both properties are specified',
(WidgetTester tester) async {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
const NavigationDrawerThemeData navigationDrawerTheme = NavigationDrawerThemeData(
backgroundColor: Color(0x00000001),
elevation: 7.0,
shadowColor: Color(0x00000002),
surfaceTintColor: Color(0x00000003),
indicatorColor: Color(0x00000004),
indicatorShape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(topRight: Radius.circular(16.0)),
),
labelTextStyle: MaterialStatePropertyAll<TextStyle>(TextStyle(fontSize: 7.0)),
iconTheme: MaterialStatePropertyAll<IconThemeData>(IconThemeData(color: Color(0x00000005))),
);
const Color backgroundColor = Color(0x00000009);
const double elevation = 14.0;
const Color shadowColor = Color(0x00000008);
const Color surfaceTintColor = Color(0x00000007);
const RoundedRectangleBorder indicatorShape = RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(32.0)),
);
const Color indicatorColor = Color(0x00000006);
await tester.pumpWidget(
_buildWidget(
scaffoldKey,
NavigationDrawer(
backgroundColor: backgroundColor,
elevation: elevation,
shadowColor: shadowColor,
surfaceTintColor: surfaceTintColor,
indicatorShape: indicatorShape,
indicatorColor: indicatorColor,
children: const <Widget>[
Text('Headline'),
NavigationDrawerDestination(icon: Icon(Icons.ac_unit), label: Text('AC')),
NavigationDrawerDestination(icon: Icon(Icons.access_alarm), label: Text('Alarm')),
],
onDestinationSelected: (int i) {},
),
theme: ThemeData(navigationDrawerTheme: navigationDrawerTheme),
),
);
scaffoldKey.currentState!.openDrawer();
await tester.pump(const Duration(seconds: 1));
// Test drawer Material.
expect(_getMaterial(tester).color, backgroundColor);
expect(_getMaterial(tester).surfaceTintColor, surfaceTintColor);
expect(_getMaterial(tester).shadowColor, shadowColor);
expect(_getMaterial(tester).elevation, elevation);
// Test indicator decoration.
expect(_getIndicatorDecoration(tester)?.color, indicatorColor);
expect(_getIndicatorDecoration(tester)?.shape, indicatorShape);
},
);
testWidgets('Local NavigationDrawerTheme takes priority over ThemeData.navigationDrawerTheme', (
WidgetTester tester,
) async {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
const Color backgroundColor = Color(0x00000009);
const double elevation = 7.0;
const Color shadowColor = Color(0x00000008);
const Color surfaceTintColor = Color(0x00000007);
const Color iconColor = Color(0x00000006);
const TextStyle labelStyle = TextStyle(fontSize: 7.0);
const ShapeBorder indicatorShape = CircleBorder();
const Color indicatorColor = Color(0x00000005);
await tester.pumpWidget(
_buildWidget(
scaffoldKey,
NavigationDrawerTheme(
data: const NavigationDrawerThemeData(
backgroundColor: backgroundColor,
elevation: elevation,
shadowColor: shadowColor,
surfaceTintColor: surfaceTintColor,
indicatorShape: indicatorShape,
indicatorColor: indicatorColor,
labelTextStyle: MaterialStatePropertyAll<TextStyle>(TextStyle(fontSize: 7.0)),
iconTheme: MaterialStatePropertyAll<IconThemeData>(IconThemeData(color: iconColor)),
),
child: NavigationDrawer(
children: const <Widget>[
Text('Headline'),
NavigationDrawerDestination(icon: Icon(Icons.ac_unit), label: Text('AC')),
NavigationDrawerDestination(icon: Icon(Icons.access_alarm), label: Text('Alarm')),
],
onDestinationSelected: (int i) {},
),
),
theme: ThemeData(
navigationDrawerTheme: const NavigationDrawerThemeData(
backgroundColor: Color(0x00000001),
elevation: 7.0,
shadowColor: Color(0x00000002),
surfaceTintColor: Color(0x00000003),
indicatorColor: Color(0x00000004),
indicatorShape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(topRight: Radius.circular(16.0)),
),
labelTextStyle: MaterialStatePropertyAll<TextStyle>(TextStyle(fontSize: 7.0)),
iconTheme: MaterialStatePropertyAll<IconThemeData>(
IconThemeData(color: Color(0x00000005)),
),
),
),
),
);
scaffoldKey.currentState!.openDrawer();
await tester.pump(const Duration(seconds: 1));
// Test drawer Material.
expect(_getMaterial(tester).color, backgroundColor);
expect(_getMaterial(tester).surfaceTintColor, surfaceTintColor);
expect(_getMaterial(tester).shadowColor, shadowColor);
expect(_getMaterial(tester).elevation, elevation);
// Test indicator decoration.
expect(_getIndicatorDecoration(tester)?.color, indicatorColor);
expect(_getIndicatorDecoration(tester)?.shape, indicatorShape);
// Test icon.
expect(_iconStyle(tester, Icons.ac_unit)?.color, iconColor);
expect(_iconStyle(tester, Icons.access_alarm)?.color, iconColor);
// Test label.
expect(_labelStyle(tester, 'AC'), labelStyle);
expect(_labelStyle(tester, 'Alarm'), labelStyle);
});
}
Widget _buildWidget(GlobalKey<ScaffoldState> scaffoldKey, Widget child, {ThemeData? theme}) {
return MaterialApp(
theme: theme,
home: Scaffold(key: scaffoldKey, drawer: child, body: Container()),
);
}
Material _getMaterial(WidgetTester tester) {
return tester.firstWidget<Material>(
find.descendant(of: find.byType(NavigationDrawer), matching: find.byType(Material)),
);
}
ShapeDecoration? _getIndicatorDecoration(WidgetTester tester) {
return tester
.firstWidget<Container>(
find.descendant(of: find.byType(FadeTransition), matching: find.byType(Container)),
)
.decoration
as ShapeDecoration?;
}
TextStyle? _iconStyle(WidgetTester tester, IconData icon) {
return tester
.widget<RichText>(find.descendant(of: find.byIcon(icon), matching: find.byType(RichText)))
.text
.style;
}
TextStyle? _labelStyle(WidgetTester tester, String label) {
return tester
.widget<RichText>(find.descendant(of: find.text(label), matching: find.byType(RichText)))
.text
.style;
}