1 | // Copyright 2014 The Flutter Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | import 'dart:async'; |
6 | import 'dart:ui' as ui; |
7 | |
8 | import 'package:flutter/material.dart'; |
9 | import 'package:flutter_test/flutter_test.dart'; |
10 | import 'package:integration_test/integration_test.dart'; |
11 | |
12 | // This class allows loadImage, a protected method, to be called with a custom |
13 | // ImageDecoderCallback function. |
14 | class LoadTestImageProvider extends ImageProvider<Object> { |
15 | LoadTestImageProvider(this.provider); |
16 | |
17 | final ImageProvider provider; |
18 | |
19 | ImageStreamCompleter testLoad(Object key, ImageDecoderCallback decode) { |
20 | return provider.loadImage(key, decode); |
21 | } |
22 | |
23 | @override |
24 | Future<Object> obtainKey(ImageConfiguration configuration) { |
25 | throw UnimplementedError(); |
26 | } |
27 | |
28 | @override |
29 | ImageStreamCompleter loadImage(Object key, ImageDecoderCallback decode) { |
30 | throw UnimplementedError(); |
31 | } |
32 | } |
33 | |
34 | void main() { |
35 | IntegrationTestWidgetsFlutterBinding.ensureInitialized(); |
36 | |
37 | testWidgets('Image.network uses cacheWidth and cacheHeight' , (WidgetTester tester) async { |
38 | const int expectedCacheHeight = 9; |
39 | const int expectedCacheWidth = 11; |
40 | await tester.pumpAndSettle(); |
41 | |
42 | final Image image = Image.network( |
43 | 'assets/packages/flutter_gallery_assets/assets/icons/material/material.png' , |
44 | cacheHeight: 9, |
45 | cacheWidth: 11, |
46 | ); |
47 | |
48 | bool called = false; |
49 | |
50 | Future<ui.Codec> decode( |
51 | ui.ImmutableBuffer buffer, { |
52 | ui.TargetImageSizeCallback? getTargetSize, |
53 | }) { |
54 | return PaintingBinding.instance.instantiateImageCodecWithSize( |
55 | buffer, |
56 | getTargetSize: (int intrinsicWidth, int intrinsicHeight) { |
57 | expect(getTargetSize, isNotNull); |
58 | final ui.TargetImageSize targetSize = getTargetSize!(intrinsicWidth, intrinsicHeight); |
59 | expect(targetSize.width, expectedCacheWidth); |
60 | expect(targetSize.height, expectedCacheHeight); |
61 | called = true; |
62 | return targetSize; |
63 | }, |
64 | ); |
65 | } |
66 | |
67 | final ImageProvider resizeImage = image.image; |
68 | expect(image.image, isA<ResizeImage>()); |
69 | |
70 | final LoadTestImageProvider testProvider = LoadTestImageProvider(image.image); |
71 | final ImageStreamCompleter streamCompleter = testProvider.testLoad( |
72 | await resizeImage.obtainKey(ImageConfiguration.empty), |
73 | decode, |
74 | ); |
75 | |
76 | final Completer<void> completer = Completer<void>(); |
77 | int? imageInfoCachedWidth; |
78 | int? imageInfoCachedHeight; |
79 | streamCompleter.addListener( |
80 | ImageStreamListener((ImageInfo imageInfo, bool syncCall) { |
81 | imageInfoCachedWidth = imageInfo.image.width; |
82 | imageInfoCachedHeight = imageInfo.image.height; |
83 | completer.complete(); |
84 | }), |
85 | ); |
86 | await completer.future; |
87 | |
88 | expect(imageInfoCachedHeight, isNotNull); |
89 | expect(imageInfoCachedHeight, expectedCacheHeight); |
90 | expect(imageInfoCachedWidth, isNotNull); |
91 | expect(imageInfoCachedWidth, expectedCacheWidth); |
92 | expect(called, true); |
93 | }); |
94 | } |
95 | |