blob: f88ec954f0a80f1099e6e795f82f7f9ea158a623 [file] [edit]
// 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 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
// 1x1 transparent PNG bytes.
final Uint8List kTransparentImage = Uint8List.fromList(<int>[
0x89,
0x50,
0x4E,
0x47,
0x0D,
0x0A,
0x1A,
0x0A,
0x00,
0x00,
0x00,
0x0D,
0x49,
0x48,
0x44,
0x52,
0x00,
0x00,
0x00,
0x01,
0x00,
0x00,
0x00,
0x01,
0x08,
0x06,
0x00,
0x00,
0x00,
0x1F,
0x15,
0xC4,
0x89,
0x00,
0x00,
0x00,
0x0A,
0x49,
0x44,
0x41,
0x54,
0x78,
0x9C,
0x63,
0x00,
0x01,
0x00,
0x00,
0x05,
0x00,
0x01,
0x0D,
0x0A,
0x2D,
0xB4,
0x00,
0x00,
0x00,
0x00,
0x49,
0x45,
0x4E,
0x44,
0xAE,
0x42,
0x60,
0x82,
]);
void main() {
test('createTestImage creates and caches an image', () async {
final ui.Image image1 = await createTestImage(width: 10, height: 10);
expect(image1.width, 10);
expect(image1.height, 10);
image1.dispose();
final ui.Image image2 = await createTestImage(width: 10, height: 10);
expect(image2.width, 10);
expect(image2.height, 10);
image2.dispose();
});
test('precacheTestImage can be used in a standalone test', () async {
final provider = MemoryImage(kTransparentImage);
await precacheTestImage(provider);
expect(imageCache.containsKey(provider), isTrue);
imageCache.clear();
imageCache.clearLiveImages();
});
testWidgets('precacheTestImage synchronously loads image into ImageCache for first frame', (
WidgetTester tester,
) async {
addTearDown(imageCache.clear);
addTearDown(imageCache.clearLiveImages);
final provider = MemoryImage(kTransparentImage);
await precacheTestImage(provider);
bool? wasSynchronouslyLoaded;
await tester.pumpWidget(
Image(
image: provider,
frameBuilder: (BuildContext context, Widget child, int? frame, bool synchronouslyLoaded) {
wasSynchronouslyLoaded = synchronouslyLoaded;
return child;
},
),
);
expect(wasSynchronouslyLoaded, isTrue);
});
testWidgets('precacheTestImage reports errors to onError handler', (WidgetTester tester) async {
final errorProvider = _FailingImageProvider();
Object? caughtError;
StackTrace? caughtStackTrace;
await precacheTestImage(
errorProvider,
onError: (Object error, StackTrace? stackTrace) {
caughtError = error;
caughtStackTrace = stackTrace;
},
);
expect(caughtError, isA<StateError>());
expect(caughtStackTrace, isNotNull);
imageCache.clear();
imageCache.clearLiveImages();
await tester.pump();
});
testWidgets('precacheTestImage throws if onError is not provided and load fails', (
WidgetTester tester,
) async {
final errorProvider = _FailingImageProvider();
await expectLater(() => precacheTestImage(errorProvider), throwsA(isA<StateError>()));
imageCache.clear();
imageCache.clearLiveImages();
await tester.pump();
});
}
class _FailingImageProvider extends ImageProvider<Object> {
@override
Future<Object> obtainKey(ImageConfiguration configuration) {
return Future<Object>.value(this);
}
@override
ImageStreamCompleter loadImage(Object key, ImageDecoderCallback decode) {
return OneFrameImageStreamCompleter(
Future<ImageInfo>.error(StateError('Failed to load test image')),
);
}
}