Convert some widgets tests to NNBD (#67782)

Migrating some more widget tests to NNBD.
This commit is contained in:
Greg Spencer 2020-10-13 14:41:24 -07:00 committed by GitHub
parent 085f1daa43
commit ef119187d0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 263 additions and 295 deletions

File diff suppressed because it is too large Load diff

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:math' as math;
import 'package:flutter_test/flutter_test.dart';

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:typed_data';
import 'dart:ui' as ui;
@ -22,21 +20,21 @@ class FadeInImageParts {
assert(target != null);
final ComponentElement fadeInImageElement;
final FadeInImageElements placeholder;
final FadeInImageElements? placeholder;
final FadeInImageElements target;
State get state {
StatefulElement animatedFadeOutFadeInElement;
State? get state {
StatefulElement? animatedFadeOutFadeInElement;
fadeInImageElement.visitChildren((Element child) {
expect(animatedFadeOutFadeInElement, isNull);
animatedFadeOutFadeInElement = child as StatefulElement;
});
expect(animatedFadeOutFadeInElement, isNotNull);
return animatedFadeOutFadeInElement.state;
return animatedFadeOutFadeInElement!.state;
}
Element get semanticsElement {
Element result;
Element? get semanticsElement {
Element? result;
fadeInImageElement.visitChildren((Element child) {
if (child.widget is Semantics)
result = child;
@ -49,39 +47,39 @@ class FadeInImageElements {
const FadeInImageElements(this.rawImageElement, this.fadeTransitionElement);
final Element rawImageElement;
final Element fadeTransitionElement;
final Element? fadeTransitionElement;
RawImage get rawImage => rawImageElement.widget as RawImage;
FadeTransition get fadeTransition => fadeTransitionElement?.widget as FadeTransition;
double get opacity => fadeTransition == null ? 1 : fadeTransition.opacity.value;
FadeTransition? get fadeTransition => fadeTransitionElement?.widget as FadeTransition?;
double get opacity => fadeTransition == null ? 1 : fadeTransition!.opacity.value;
}
class LoadTestImageProvider extends ImageProvider<dynamic> {
class LoadTestImageProvider extends ImageProvider<Object> {
LoadTestImageProvider(this.provider);
final ImageProvider provider;
ImageStreamCompleter testLoad(dynamic key, DecoderCallback decode) {
ImageStreamCompleter testLoad(Object key, DecoderCallback decode) {
return provider.load(key, decode);
}
@override
Future<dynamic> obtainKey(ImageConfiguration configuration) {
return null;
Future<Object> obtainKey(ImageConfiguration configuration) {
throw UnimplementedError();
}
@override
ImageStreamCompleter load(dynamic key, DecoderCallback decode) {
return null;
ImageStreamCompleter load(Object key, DecoderCallback decode) {
throw UnimplementedError();
}
}
FadeInImageParts findFadeInImage(WidgetTester tester) {
final List<FadeInImageElements> elements = <FadeInImageElements>[];
final Iterable<Element> rawImageElements = tester.elementList(find.byType(RawImage));
ComponentElement fadeInImageElement;
ComponentElement? fadeInImageElement;
for (final Element rawImageElement in rawImageElements) {
Element fadeTransitionElement;
Element? fadeTransitionElement;
rawImageElement.visitAncestorElements((Element ancestor) {
if (ancestor.widget is FadeTransition) {
fadeTransitionElement = ancestor;
@ -99,10 +97,10 @@ FadeInImageParts findFadeInImage(WidgetTester tester) {
elements.add(FadeInImageElements(rawImageElement, fadeTransitionElement));
}
if (elements.length == 2) {
return FadeInImageParts(fadeInImageElement, elements.last, elements.first);
return FadeInImageParts(fadeInImageElement!, elements.last, elements.first);
} else {
expect(elements, hasLength(1));
return FadeInImageParts(fadeInImageElement, null, elements.first);
return FadeInImageParts(fadeInImageElement!, null, elements.first);
}
}
@ -127,30 +125,30 @@ Future<void> main() async {
excludeFromSemantics: true,
));
expect(findFadeInImage(tester).placeholder.rawImage.image, null);
expect(findFadeInImage(tester).placeholder!.rawImage.image, null);
expect(findFadeInImage(tester).target.rawImage.image, null);
placeholderProvider.complete();
await tester.pump();
expect(findFadeInImage(tester).placeholder.rawImage.image.isCloneOf(placeholderImage), true);
expect(findFadeInImage(tester).placeholder!.rawImage.image!.isCloneOf(placeholderImage), true);
expect(findFadeInImage(tester).target.rawImage.image, null);
imageProvider.complete();
await tester.pump();
for (int i = 0; i < 5; i += 1) {
final FadeInImageParts parts = findFadeInImage(tester);
expect(parts.placeholder.rawImage.image.isCloneOf(placeholderImage), true);
expect(parts.target.rawImage.image.isCloneOf(targetImage), true);
expect(parts.placeholder.opacity, moreOrLessEquals(1 - i / 5));
expect(parts.placeholder!.rawImage.image!.isCloneOf(placeholderImage), true);
expect(parts.target.rawImage.image!.isCloneOf(targetImage), true);
expect(parts.placeholder!.opacity, moreOrLessEquals(1 - i / 5));
expect(parts.target.opacity, 0);
await tester.pump(const Duration(milliseconds: 10));
}
for (int i = 0; i < 5; i += 1) {
final FadeInImageParts parts = findFadeInImage(tester);
expect(parts.placeholder.rawImage.image.isCloneOf(placeholderImage), true);
expect(parts.target.rawImage.image.isCloneOf(targetImage), true);
expect(parts.placeholder.opacity, 0);
expect(parts.placeholder!.rawImage.image!.isCloneOf(placeholderImage), true);
expect(parts.target.rawImage.image!.isCloneOf(targetImage), true);
expect(parts.placeholder!.opacity, 0);
expect(parts.target.opacity, moreOrLessEquals(i / 5));
await tester.pump(const Duration(milliseconds: 10));
}
@ -159,7 +157,7 @@ Future<void> main() async {
placeholder: placeholderProvider,
image: imageProvider,
));
expect(findFadeInImage(tester).target.rawImage.image.isCloneOf(targetImage), true);
expect(findFadeInImage(tester).target.rawImage.image!.isCloneOf(targetImage), true);
expect(findFadeInImage(tester).target.opacity, 1);
});
@ -174,7 +172,7 @@ Future<void> main() async {
image: imageProvider,
));
expect(findFadeInImage(tester).target.rawImage.image.isCloneOf(targetImage), true);
expect(findFadeInImage(tester).target.rawImage.image!.isCloneOf(targetImage), true);
expect(findFadeInImage(tester).placeholder, isNull);
expect(findFadeInImage(tester).target.opacity, 1);
});
@ -192,10 +190,10 @@ Future<void> main() async {
excludeFromSemantics: true,
));
final State state = findFadeInImage(tester).state;
final State? state = findFadeInImage(tester).state;
placeholderProvider.complete();
await tester.pump();
expect(findFadeInImage(tester).placeholder.rawImage.image.isCloneOf(placeholderImage), true);
expect(findFadeInImage(tester).placeholder!.rawImage.image!.isCloneOf(placeholderImage), true);
await tester.pumpWidget(FadeInImage(
placeholder: secondPlaceholderProvider,
@ -207,7 +205,7 @@ Future<void> main() async {
secondPlaceholderProvider.complete();
await tester.pump();
expect(findFadeInImage(tester).placeholder.rawImage.image.isCloneOf(replacementImage), true);
expect(findFadeInImage(tester).placeholder!.rawImage.image!.isCloneOf(replacementImage), true);
expect(findFadeInImage(tester).state, same(state));
});
@ -246,7 +244,7 @@ Future<void> main() async {
excludeFromSemantics: true,
));
final State state = findFadeInImage(tester).state;
final State? state = findFadeInImage(tester).state;
placeholderProvider.complete();
imageProvider.complete();
await tester.pump();
@ -263,15 +261,15 @@ Future<void> main() async {
secondImageProvider.complete();
await tester.pump();
expect(findFadeInImage(tester).target.rawImage.image.isCloneOf(replacementImage), true);
expect(findFadeInImage(tester).target.rawImage.image!.isCloneOf(replacementImage), true);
expect(findFadeInImage(tester).state, same(state));
expect(findFadeInImage(tester).placeholder.opacity, moreOrLessEquals(1));
expect(findFadeInImage(tester).placeholder!.opacity, moreOrLessEquals(1));
expect(findFadeInImage(tester).target.opacity, moreOrLessEquals(0));
await tester.pump(animationDuration);
expect(findFadeInImage(tester).placeholder.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).placeholder!.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).target.opacity, moreOrLessEquals(0));
await tester.pump(animationDuration);
expect(findFadeInImage(tester).placeholder.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).placeholder!.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).target.opacity, moreOrLessEquals(1));
});
@ -287,7 +285,7 @@ Future<void> main() async {
excludeFromSemantics: true,
));
final State state = findFadeInImage(tester).state;
final State? state = findFadeInImage(tester).state;
placeholderProvider.complete();
imageProvider.complete();
await tester.pump();
@ -302,10 +300,10 @@ Future<void> main() async {
));
expect(findFadeInImage(tester).state, same(state));
expect(findFadeInImage(tester).placeholder.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).placeholder!.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).target.opacity, moreOrLessEquals(0));
await tester.pump(animationDuration);
expect(findFadeInImage(tester).placeholder.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).placeholder!.opacity, moreOrLessEquals(0));
expect(findFadeInImage(tester).target.opacity, moreOrLessEquals(1));
});
@ -323,12 +321,12 @@ Future<void> main() async {
);
bool called = false;
final DecoderCallback decode = (Uint8List bytes, {int cacheWidth, int cacheHeight, bool allowUpscaling}) {
final DecoderCallback decode = (Uint8List bytes, {int? cacheWidth, int? cacheHeight, bool allowUpscaling = false}) {
expect(cacheWidth, 20);
expect(cacheHeight, 30);
expect(allowUpscaling, false);
called = true;
return PaintingBinding.instance.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight, allowUpscaling: allowUpscaling);
return PaintingBinding.instance!.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight, allowUpscaling: allowUpscaling);
};
final ImageProvider resizeImage = image.placeholder;
expect(image.placeholder, isA<ResizeImage>());
@ -346,12 +344,12 @@ Future<void> main() async {
);
bool called = false;
final DecoderCallback decode = (Uint8List bytes, {int cacheWidth, int cacheHeight, bool allowUpscaling}) {
final DecoderCallback decode = (Uint8List bytes, {int? cacheWidth, int? cacheHeight, bool allowUpscaling = false}) {
expect(cacheWidth, null);
expect(cacheHeight, null);
expect(allowUpscaling, null);
expect(allowUpscaling, false);
called = true;
return PaintingBinding.instance.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight);
return PaintingBinding.instance!.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight);
};
// image.placeholder should be an instance of MemoryImage instead of ResizeImage
final ImageProvider memoryImage = image.placeholder;

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
@ -12,8 +10,8 @@ void main() {
testWidgets('FadeTransition', (WidgetTester tester) async {
final DebugPrintCallback oldPrint = debugPrint;
final List<String> log = <String>[];
debugPrint = (String message, { int wrapWidth }) {
log.add(message);
debugPrint = (String? message, { int? wrapWidth }) {
log.add(message!);
};
debugPrintBuildScope = true;
final AnimationController controller = AnimationController(

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
@ -595,12 +593,11 @@ void main() {
List<Type> getLayers() {
final List<Type> layers = <Type>[];
Layer layer = RendererBinding.instance.renderView.debugLayer;
while (layer is ContainerLayer) {
final ContainerLayer container = layer as ContainerLayer;
Layer? container = RendererBinding.instance!.renderView.debugLayer;
while (container is ContainerLayer) {
layers.add(container.runtimeType);
expect(container.firstChild, same(container.lastChild));
layer = container.firstChild;
container = container.firstChild;
}
return layers;
}

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
@ -63,18 +61,6 @@ void main() {
expect(box.size.width, 100.0);
});
testWidgets('Can pass null for flex', (WidgetTester tester) async {
await tester.pumpWidget(
Row(
textDirection: TextDirection.ltr,
children: const <Widget>[
Expanded(flex: null, child: Text('one', textDirection: TextDirection.ltr)),
Flexible(flex: null, child: Text('two', textDirection: TextDirection.ltr)),
],
),
);
});
testWidgets("Doesn't overflow because of floating point accumulated error", (WidgetTester tester) async {
// both of these cases have failed in the past due to floating point issues
await tester.pumpWidget(

View file

@ -2,14 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
class TestFlowDelegate extends FlowDelegate {
TestFlowDelegate({this.startOffset}) : super(repaint: startOffset);
TestFlowDelegate({required this.startOffset}) : super(repaint: startOffset);
final Animation<double> startOffset;
@ -23,7 +21,7 @@ class TestFlowDelegate extends FlowDelegate {
double dy = startOffset.value;
for (int i = 0; i < context.childCount; ++i) {
context.paintChild(i, transform: Matrix4.translationValues(0.0, dy, 0.0));
dy += 0.75 * context.getChildSize(i).height;
dy += 0.75 * context.getChildSize(i)!.height;
}
}
@ -149,13 +147,13 @@ void main() {
],
),
);
ContainerLayer layer = RendererBinding.instance.renderView.debugLayer;
ContainerLayer? layer = RendererBinding.instance!.renderView.debugLayer;
while (layer != null && layer is! OpacityLayer)
layer = layer.firstChild as ContainerLayer;
layer = layer.firstChild as ContainerLayer?;
expect(layer, isA<OpacityLayer>());
final OpacityLayer opacityLayer = layer as OpacityLayer;
expect(opacityLayer.alpha, equals(opacity * 255));
expect(layer.firstChild, isA<TransformLayer>());
final OpacityLayer? opacityLayer = layer as OpacityLayer?;
expect(opacityLayer!.alpha, equals(opacity * 255));
expect(layer!.firstChild, isA<TransformLayer>());
});
testWidgets('Flow can set and update clipBehavior', (WidgetTester tester) async {

View file

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:math' as math;
import 'package:flutter/foundation.dart';
@ -18,7 +16,7 @@ void main() {
final GlobalKey widgetKey = GlobalKey();
Future<BuildContext> setupWidget(WidgetTester tester) async {
await tester.pumpWidget(Container(key: widgetKey));
return widgetKey.currentContext;
return widgetKey.currentContext!;
}
group(FocusNode, () {
@ -931,7 +929,7 @@ void main() {
}, variant: TargetPlatformVariant.all());
testWidgets('Mouse events change initial focus highlight mode on mobile.', (WidgetTester tester) async {
expect(FocusManager.instance.highlightMode, equals(FocusHighlightMode.touch));
RendererBinding.instance.initMouseTracker(); // Clear out the mouse state.
RendererBinding.instance!.initMouseTracker(); // Clear out the mouse state.
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse, pointer: 0);
addTearDown(gesture.removePointer);
await gesture.moveTo(Offset.zero);
@ -939,7 +937,7 @@ void main() {
}, variant: TargetPlatformVariant.mobile());
testWidgets('Mouse events change initial focus highlight mode on desktop.', (WidgetTester tester) async {
expect(FocusManager.instance.highlightMode, equals(FocusHighlightMode.traditional));
RendererBinding.instance.initMouseTracker(); // Clear out the mouse state.
RendererBinding.instance!.initMouseTracker(); // Clear out the mouse state.
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse, pointer: 0);
addTearDown(gesture.removePointer);
await gesture.moveTo(Offset.zero);
@ -952,7 +950,7 @@ void main() {
testWidgets('Events change focus highlight mode.', (WidgetTester tester) async {
await setupWidget(tester);
int callCount = 0;
FocusHighlightMode lastMode;
FocusHighlightMode? lastMode;
void handleModeChange(FocusHighlightMode mode) {
lastMode = mode;
callCount++;