| // Copyright 2013 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. |
| |
| // This file is hand-formatted. |
| |
| import 'dart:typed_data'; |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:rfw/formats.dart' show parseLibraryFile; |
| import 'package:rfw/rfw.dart'; |
| |
| void main() { |
| testWidgets('Core widgets', (WidgetTester tester) async { |
| final Runtime runtime = Runtime() |
| ..update(const LibraryName(<String>['core']), createCoreWidgets()); |
| final DynamicContent data = DynamicContent(); |
| final List<String> eventLog = <String>[]; |
| await tester.pumpWidget( |
| RemoteWidget( |
| runtime: runtime, |
| data: data, |
| widget: const FullyQualifiedWidgetName(LibraryName(<String>['test']), 'root'), |
| onEvent: (String eventName, DynamicMap eventArguments) { |
| eventLog.add('$eventName $eventArguments'); |
| }, |
| ), |
| ); |
| expect(tester.takeException().toString(), contains('Could not find remote widget named')); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = GestureDetector( |
| onTapDown: event 'tapdown' { }, |
| onTapUp: event 'tapup' { }, |
| onTap: event 'tap' { }, |
| child: ColoredBox(), |
| ); |
| ''')); |
| await tester.pump(); |
| await tester.tap(find.byType(ColoredBox)); |
| expect(eventLog, <String>['tapdown {}', 'tapup {}', 'tap {}']); |
| eventLog.clear(); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = IntrinsicHeight(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(IntrinsicHeight), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = IntrinsicWidth(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(IntrinsicWidth), findsOneWidget); |
| |
| ArgumentDecoders.imageProviderDecoders['beepboop'] = (DataSource source, List<Object> key) { |
| return MemoryImage(Uint8List.fromList(<int>[ |
| 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0xff, 0x00, 0xc0, 0xc0, 0xc0, |
| 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, |
| 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3b, |
| ])); |
| }; |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Image(source: 'beepboop'); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(Image), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = SingleChildScrollView(child: ListBody()); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(SingleChildScrollView), findsOneWidget); |
| expect(find.byType(ListBody), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "rtl", |
| child: ListView( |
| children: [ |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), |
| Container(height: 67.0), // number 10 is not visible |
| ], |
| ), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(ListView), findsOneWidget); |
| expect(find.byType(Container), findsNWidgets(9)); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Opacity(onEnd: event 'end' {}); |
| ''')); |
| await tester.pump(); |
| expect(tester.widget<AnimatedOpacity>(find.byType(AnimatedOpacity)).onEnd, isNot(isNull)); |
| expect(eventLog, isEmpty); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality(textDirection: "ltr", child: Padding(padding: [12.0])); |
| ''')); |
| await tester.pump(); |
| expect(tester.widget<Padding>(find.byType(Padding)).padding.resolve(TextDirection.ltr), const EdgeInsets.all(12.0)); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality(textDirection: "ltr", child: Padding(padding: [24.0])); |
| ''')); |
| await tester.pump(); |
| expect(tester.widget<Padding>(find.byType(Padding)).padding.resolve(TextDirection.ltr), const EdgeInsets.all(12.0)); |
| await tester.pump(const Duration(seconds: 4)); |
| expect(tester.widget<Padding>(find.byType(Padding)).padding.resolve(TextDirection.ltr), const EdgeInsets.all(24.0)); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Placeholder(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(Placeholder), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "ltr", |
| child: Stack( |
| children: [ |
| Positioned( |
| start: 0.0, |
| top: 0.0, |
| width: 10.0, |
| height: 10.0, |
| child: ColoredBox(), |
| ), |
| ], |
| ), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(Stack), findsOneWidget); |
| expect(find.byType(Positioned), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "rtl", |
| child: Rotation(turns: 0.0), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(AnimatedRotation), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "rtl", |
| child: Rotation(turns: 1.0, onEnd: event 'end' { from: "rotation" }), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(AnimatedRotation), findsOneWidget); |
| expect(eventLog, isEmpty); |
| await tester.pump(const Duration(seconds: 1)); |
| expect(eventLog, <String>['end {from: rotation}']); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "rtl", |
| child: Row( |
| crossAxisAlignment: "start", |
| children: [SizedBox(width: 10.0)] |
| ), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(tester.getTopLeft(find.byType(SizedBox)), const Offset(790.0, 0.0)); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "rtl", |
| child: Row( |
| crossAxisAlignment: "start", |
| children: [Spacer()] |
| ), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(tester.getTopLeft(find.byType(SizedBox)), Offset.zero); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = SizedBoxExpand(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(SizedBox), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = SizedBoxShrink(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(SizedBox), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Directionality( |
| textDirection: "ltr", |
| child: FractionallySizedBox( |
| widthFactor: 0.5, |
| heightFactor: 0.8, |
| child: Text(text: "test"), |
| ), |
| ); |
| ''')); |
| await tester.pump(); |
| final Size fractionallySizedBoxSize = tester.getSize(find.byType(FractionallySizedBox)); |
| final Size childSize = tester.getSize(find.text('test')); |
| expect(childSize.width, fractionallySizedBoxSize.width * 0.5); |
| expect(childSize.height, fractionallySizedBoxSize.height * 0.8); |
| expect(tester.widget<FractionallySizedBox>(find.byType(FractionallySizedBox)).alignment, Alignment.center); |
| }); |
| |
| testWidgets('More core widgets', (WidgetTester tester) async { |
| final Runtime runtime = Runtime() |
| ..update(const LibraryName(<String>['core']), createCoreWidgets()); |
| final DynamicContent data = DynamicContent(); |
| final List<String> eventLog = <String>[]; |
| await tester.pumpWidget( |
| MaterialApp( |
| home: RemoteWidget( |
| runtime: runtime, |
| data: data, |
| widget: const FullyQualifiedWidgetName(LibraryName(<String>['test']), 'root'), |
| onEvent: (String eventName, DynamicMap eventArguments) { |
| eventLog.add('$eventName $eventArguments'); |
| }, |
| ), |
| ), |
| ); |
| expect(tester.takeException().toString(), contains('Could not find remote widget named')); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = SafeArea( |
| child: SizedBoxShrink(), |
| ); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(SafeArea), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Scale(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(AnimatedScale), findsOneWidget); |
| |
| runtime.update(const LibraryName(<String>['test']), parseLibraryFile(''' |
| import core; |
| widget root = Wrap(); |
| ''')); |
| await tester.pump(); |
| expect(find.byType(Wrap), findsOneWidget); |
| }); |
| } |