|
| 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 loadBuffer, a protected method, to be called with a custom |
| 13 | +// DecoderBufferCallback function. |
| 14 | +class LoadTestImageProvider extends ImageProvider<Object> { |
| 15 | + LoadTestImageProvider(this.provider); |
| 16 | + |
| 17 | + final ImageProvider provider; |
| 18 | + |
| 19 | + ImageStreamCompleter testLoad(Object key, DecoderBufferCallback decode) { |
| 20 | + return provider.loadBuffer(key, decode); |
| 21 | + } |
| 22 | + |
| 23 | + @override |
| 24 | + Future<Object> obtainKey(ImageConfiguration configuration) { |
| 25 | + throw UnimplementedError(); |
| 26 | + } |
| 27 | + |
| 28 | + @override |
| 29 | + ImageStreamCompleter loadBuffer(Object key, DecoderBufferCallback 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(ui.ImmutableBuffer buffer, {int? cacheWidth, int? cacheHeight, bool allowUpscaling = false}) { |
| 51 | + expect(cacheHeight, expectedCacheHeight); |
| 52 | + expect(cacheWidth, expectedCacheWidth); |
| 53 | + expect(allowUpscaling, false); |
| 54 | + called = true; |
| 55 | + return PaintingBinding.instance.instantiateImageCodecFromBuffer(buffer, cacheWidth: cacheWidth, cacheHeight: cacheHeight, allowUpscaling: allowUpscaling); |
| 56 | + } |
| 57 | + |
| 58 | + final ImageProvider resizeImage = image.image; |
| 59 | + expect(image.image, isA<ResizeImage>()); |
| 60 | + |
| 61 | + final LoadTestImageProvider testProvider = LoadTestImageProvider(image.image); |
| 62 | + final ImageStreamCompleter streamCompleter = testProvider.testLoad(await resizeImage.obtainKey(ImageConfiguration.empty), decode); |
| 63 | + |
| 64 | + final Completer<void> completer = Completer<void>(); |
| 65 | + int? imageInfoCachedWidth; |
| 66 | + int? imageInfoCachedHeight; |
| 67 | + streamCompleter.addListener(ImageStreamListener((ImageInfo imageInfo, bool syncCall) { |
| 68 | + imageInfoCachedWidth = imageInfo.image.width; |
| 69 | + imageInfoCachedHeight = imageInfo.image.height; |
| 70 | + completer.complete(); |
| 71 | + })); |
| 72 | + await completer.future; |
| 73 | + |
| 74 | + expect(imageInfoCachedHeight, isNotNull); |
| 75 | + expect(imageInfoCachedHeight, expectedCacheHeight); |
| 76 | + expect(imageInfoCachedWidth, isNotNull); |
| 77 | + expect(imageInfoCachedWidth, expectedCacheWidth); |
| 78 | + expect(called, true); |
| 79 | + }); |
| 80 | +} |
0 commit comments