// 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('CarouselViewThemeData copyWith, ==, hashCode basics', () { expect(const CarouselViewThemeData(), const CarouselViewThemeData().copyWith()); expect( const CarouselViewThemeData().hashCode, const CarouselViewThemeData().copyWith().hashCode, ); }); test('CarouselViewThemeData null fields by default', () { const carouselViewTheme = CarouselViewThemeData(); expect(carouselViewTheme.backgroundColor, null); expect(carouselViewTheme.elevation, null); expect(carouselViewTheme.overlayColor, null); expect(carouselViewTheme.padding, null); expect(carouselViewTheme.shape, null); expect(carouselViewTheme.itemClipBehavior, null); }); testWidgets('Default CarouselViewThemeData debugFillProperties', (WidgetTester tester) async { final builder = DiagnosticPropertiesBuilder(); const CarouselViewThemeData().debugFillProperties(builder); final List description = builder.properties .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode node) => node.toString()) .toList(); expect(description, []); }); testWidgets('CarouselViewThemeData implements debugFillProperties', (WidgetTester tester) async { final builder = DiagnosticPropertiesBuilder(); const CarouselViewThemeData( backgroundColor: Color(0xFFFFFFFF), elevation: 5.0, padding: EdgeInsets.zero, shape: RoundedRectangleBorder(), overlayColor: MaterialStatePropertyAll(Colors.red), itemClipBehavior: Clip.hardEdge, ).debugFillProperties(builder); final List description = builder.properties .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode node) => node.toString()) .toList(); expect(description, [ 'backgroundColor: ${const Color(0xffffffff)}', 'elevation: 5.0', 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', 'overlayColor: WidgetStatePropertyAll(${Colors.red})', 'padding: EdgeInsets.zero', 'itemClipBehavior: hardEdge', ]); }); testWidgets('Uses value from CarouselViewThemeData', (WidgetTester tester) async { final CarouselViewThemeData carouselViewTheme = _carouselViewThemeData(); await tester.pumpWidget( MaterialApp( theme: ThemeData(carouselViewTheme: carouselViewTheme), home: const Scaffold( body: Center( child: CarouselView( itemExtent: 100, children: [SizedBox(width: 100, height: 100)], ), ), ), ), ); expect(find.byType(CarouselView), findsOneWidget); final Finder padding = find.descendant( of: find.byType(CarouselView), matching: find.byWidgetPredicate( (Widget widget) => widget is Padding && widget.child is Material, ), ); expect(padding, findsOneWidget); final Padding paddingWidget = tester.widget(padding); final material = paddingWidget.child! as Material; final InkWell inkWell = tester.widget( find.descendant(of: find.byType(CarouselView), matching: find.byType(InkWell)), ); expect(paddingWidget.padding, carouselViewTheme.padding); expect(material.color, carouselViewTheme.backgroundColor); expect(material.elevation, carouselViewTheme.elevation); expect(material.shape, carouselViewTheme.shape); expect(material.borderRadius, null); expect(inkWell.overlayColor, carouselViewTheme.overlayColor); expect(material.clipBehavior, carouselViewTheme.itemClipBehavior); }); testWidgets('Widgets properties override theme', (WidgetTester tester) async { final CarouselViewThemeData carouselViewTheme = _carouselViewThemeData(); const backgroundColor = Color(0xFFFF0000); const elevation = 10.0; const padding = EdgeInsets.all(15.0); const OutlinedBorder shape = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10)), ); const WidgetStateProperty overlayColor = MaterialStatePropertyAll(Colors.green); const Clip itemClipBehavior = Clip.hardEdge; await tester.pumpWidget( MaterialApp( theme: ThemeData(carouselViewTheme: carouselViewTheme), home: const Scaffold( body: Center( child: CarouselView( backgroundColor: backgroundColor, elevation: elevation, padding: padding, shape: shape, overlayColor: overlayColor, itemExtent: 100, itemClipBehavior: itemClipBehavior, children: [SizedBox(width: 100, height: 100)], ), ), ), ), ); expect(find.byType(CarouselView), findsOneWidget); final Finder paddingFinder = find.descendant( of: find.byType(CarouselView), matching: find.byWidgetPredicate( (Widget widget) => widget is Padding && widget.child is Material, ), ); expect(paddingFinder, findsOneWidget); final Padding paddingWidget = tester.widget(paddingFinder); final material = paddingWidget.child! as Material; final InkWell inkWell = tester.widget( find.descendant(of: find.byType(CarouselView), matching: find.byType(InkWell)), ); expect(paddingWidget.padding, padding); expect(material.color, backgroundColor); expect(material.elevation, elevation); expect(material.shape, shape); expect(inkWell.overlayColor, overlayColor); expect(material.clipBehavior, Clip.hardEdge); }); testWidgets('CarouselViewTheme can override Theme.carouselViewTheme', ( WidgetTester tester, ) async { const globalBackgroundColor = Color(0xfffffff1); const globalOverlayColor = Color(0xff000000); const globalElevation = 5.0; const globalPadding = EdgeInsets.all(10.0); const OutlinedBorder globalShape = RoundedRectangleBorder(); const Clip globalItemClipBehavior = Clip.hardEdge; const localBackgroundColor = Color(0xffff0000); const localOverlayColor = Color(0xffffffff); const localElevation = 10.0; const localPadding = EdgeInsets.all(15.0); const OutlinedBorder localShape = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10)), ); const Clip localItemClipBehavior = Clip.antiAlias; await tester.pumpWidget( MaterialApp( theme: ThemeData( carouselViewTheme: const CarouselViewThemeData( backgroundColor: globalBackgroundColor, overlayColor: MaterialStatePropertyAll(globalOverlayColor), elevation: globalElevation, padding: globalPadding, shape: globalShape, itemClipBehavior: globalItemClipBehavior, ), ), home: const Scaffold( body: Center( child: CarouselViewTheme( data: CarouselViewThemeData( backgroundColor: localBackgroundColor, overlayColor: MaterialStatePropertyAll(localOverlayColor), elevation: localElevation, padding: localPadding, shape: localShape, itemClipBehavior: localItemClipBehavior, ), child: CarouselView( itemExtent: 100, children: [SizedBox(width: 100, height: 100)], ), ), ), ), ), ); final Finder padding = find.descendant( of: find.byType(CarouselView), matching: find.byWidgetPredicate( (Widget widget) => widget is Padding && widget.child is Material, ), ); expect(padding, findsOneWidget); final Padding paddingWidget = tester.widget(padding); final material = paddingWidget.child! as Material; final InkWell inkWell = tester.widget( find.descendant(of: find.byType(CarouselView), matching: find.byType(InkWell)), ); expect(paddingWidget.padding, localPadding); expect(material.color, localBackgroundColor); expect(material.elevation, localElevation); expect(material.shape, localShape); expect(inkWell.overlayColor?.resolve({}), localOverlayColor); expect(material.clipBehavior, localItemClipBehavior); }); } CarouselViewThemeData _carouselViewThemeData() { const backgroundColor = Color(0xFF0000FF); const elevation = 5.0; const padding = EdgeInsets.all(10.0); const OutlinedBorder shape = RoundedRectangleBorder(); const WidgetStateProperty overlayColor = MaterialStatePropertyAll(Colors.red); const Clip itemClipBehavior = Clip.hardEdge; return const CarouselViewThemeData( backgroundColor: backgroundColor, elevation: elevation, padding: padding, shape: shape, overlayColor: overlayColor, itemClipBehavior: itemClipBehavior, ); }