import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:holo_shiny/holo_shiny.dart'; const ValueKey _cardTransformKey = ValueKey('holo_shiny.card.transform'); void main() { test('default profile is crackedIce', () { const Shiny shiny = Shiny(child: SizedBox.shrink()); const ShinyCard shinyCard = ShinyCard(); expect(shiny.profile, ShinyProfile.crackedIce); expect(shinyCard.profile, ShinyProfile.crackedIce); }); test('default opacity is 1.0', () { const Shiny shiny = Shiny(child: SizedBox.shrink()); const ShinyCard shinyCard = ShinyCard(); expect(shiny.opacity, 1.0); expect(shinyCard.opacity, 1.0); }); test('custom profile can be set on both widgets', () { const Shiny shiny = Shiny( profile: ShinyProfile.superGoldVinyl, child: SizedBox.shrink(), ); const ShinyCard shinyCard = ShinyCard( profile: ShinyProfile.silverMosaic, ); expect(shiny.profile, ShinyProfile.superGoldVinyl); expect(shinyCard.profile, ShinyProfile.silverMosaic); }); testWidgets('Shiny wraps any child without card transform', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: Scaffold( body: Shiny( enableShader: false, child: ColoredBox( color: Colors.blue, child: SizedBox(width: 80, height: 40), ), ), ), ), ); expect(find.byType(ColoredBox), findsWidgets); expect(find.byKey(_cardTransformKey), findsNothing); }); testWidgets('ShinyCard renders clipping and foreground', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: Scaffold( body: ShinyCard( enableShader: false, background: ColoredBox(color: Colors.black), foreground: Text('FOREGROUND'), ), ), ), ); expect(find.text('FOREGROUND'), findsOneWidget); expect(find.byType(ClipPath), findsOneWidget); expect(find.byKey(_cardTransformKey), findsOneWidget); }); testWidgets('ShinyCard responds to external tilt stream', (WidgetTester tester) async { final StreamController stream = StreamController.broadcast(); final ShinyController controller = ShinyController(tiltStream: stream.stream); await tester.pumpWidget( MaterialApp( home: Scaffold( body: Center( child: ShinyCard( enableShader: false, controller: controller, background: const ColoredBox(color: Colors.black), ), ), ), ), ); final Matrix4 before = tester.widget(find.byKey(_cardTransformKey)).transform; stream.add(const Offset(0.7, 0.2)); await tester.pump(); final Matrix4 after = tester.widget(find.byKey(_cardTransformKey)).transform; expect(after.storage[8], isNot(before.storage[8])); await controller.dispose(); await stream.close(); }); testWidgets('Dragging ShinyCard updates transform', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: Scaffold( body: Center( child: ShinyCard( enableShader: false, background: ColoredBox(color: Colors.black), ), ), ), ), ); final Finder shinyCard = find.byType(ShinyCard); final Matrix4 before = tester.widget(find.byKey(_cardTransformKey)).transform; await tester.drag(shinyCard, const Offset(50, 20)); await tester.pump(); final Matrix4 after = tester.widget(find.byKey(_cardTransformKey)).transform; expect(after.storage[8], isNot(before.storage[8])); }); }