// 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_api_samples/material/theme/theme_extension.1.dart' as example; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('ThemeExtension can be obtained', (WidgetTester tester) async { await tester.pumpWidget( const example.ThemeExtensionExampleApp(), ); final ThemeData theme = Theme.of( tester.element(find.byType(example.Home)), ); final example.MyColors colors = theme.extension()!; expect(colors.brandColor, equals(const Color(0xFF1E88E5))); expect(colors.danger, equals(const Color(0xFFE53935))); }); testWidgets('ThemeExtension can be changed', (WidgetTester tester) async { await tester.pumpWidget( const example.ThemeExtensionExampleApp(), ); ThemeData theme = Theme.of( tester.element(find.byType(example.Home)), ); example.MyColors colors = theme.extension()!; expect(colors.brandColor, equals(const Color(0xFF1E88E5))); expect(colors.danger, equals(const Color(0xFFE53935))); // Tap the IconButton to switch theme mode from light to dark. await tester.tap(find.byType(IconButton)); await tester.pumpAndSettle(); theme = Theme.of( tester.element(find.byType(example.Home)), ); colors = theme.extension()!; expect(colors.brandColor, equals(const Color(0xFF90CAF9))); expect(colors.danger, equals(const Color(0xFFEF9A9A))); }); testWidgets('Home uses MyColors extension correctly', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( theme: ThemeData.light().copyWith( extensions: >[ const example.MyColors( brandColor: Color(0xFF0000FF), danger: Color(0xFFFF0000), ), ], ), home: example.Home( isLightTheme: true, toggleTheme: () {}, ), ), ); expect( find.byType(example.Home), paints ..rect(color: const Color(0xFF0000FF)) ..rect(color: const Color(0xFFFF0000)), ); }); testWidgets('Home updates IconButton correctly', (WidgetTester tester) async { await tester.pumpWidget( const example.ThemeExtensionExampleApp(), ); example.Home home = tester.widget(find.byType(example.Home)); IconButton iconButton = tester.widget(find.byType(IconButton)); ThemeData theme = Theme.of( tester.element(find.byType(example.Home)), ); expect(theme.brightness, equals(Brightness.light)); expect(home.isLightTheme, isTrue); expect( iconButton.icon, isA().having((Icon i) => i.icon, 'icon', equals(Icons.nightlight)), ); // Tap the IconButton to switch theme mode from light to dark. await tester.tap(find.byType(IconButton)); await tester.pumpAndSettle(); home = tester.widget(find.byType(example.Home)); iconButton = tester.widget(find.byType(IconButton)); theme = Theme.of( tester.element(find.byType(example.Home)), ); expect(theme.brightness, equals(Brightness.dark)); expect(home.isLightTheme, isFalse); expect( iconButton.icon, isA().having((Icon i) => i.icon, 'icon', equals(Icons.wb_sunny)), ); }); }