1// Copyright 2016 The Chromium 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 5import 'dart:async'; 6import 'dart:typed_data'; 7import 'dart:ui' as ui show Image; 8import 'dart:ui'; 9 10import 'package:flutter/foundation.dart'; 11import 'package:flutter/painting.dart'; 12 13class TestImageInfo implements ImageInfo { 14 const TestImageInfo(this.value, { this.image, this.scale = 1.0 }); 15 16 @override 17 final ui.Image image; 18 19 @override 20 final double scale; 21 22 final int value; 23 24 @override 25 String toString() => '$runtimeType($value)'; 26} 27 28class TestImageProvider extends ImageProvider<int> { 29 const TestImageProvider(this.key, this.imageValue, { this.image }); 30 final int key; 31 final int imageValue; 32 final ui.Image image; 33 34 @override 35 Future<int> obtainKey(ImageConfiguration configuration) { 36 return Future<int>.value(key); 37 } 38 39 @override 40 ImageStreamCompleter load(int key) { 41 return OneFrameImageStreamCompleter( 42 SynchronousFuture<ImageInfo>(TestImageInfo(imageValue, image: image)) 43 ); 44 } 45 46 @override 47 String toString() => '$runtimeType($key, $imageValue)'; 48} 49 50class FailingTestImageProvider extends TestImageProvider { 51 const FailingTestImageProvider(int key, int imageValue, { ui.Image image }) : super(key, imageValue, image: image); 52 53 @override 54 ImageStreamCompleter load(int key) { 55 return OneFrameImageStreamCompleter(Future<ImageInfo>.sync(() => Future<ImageInfo>.error('loading failed!'))); 56 } 57} 58 59Future<ImageInfo> extractOneFrame(ImageStream stream) { 60 final Completer<ImageInfo> completer = Completer<ImageInfo>(); 61 ImageStreamListener listener; 62 listener = ImageStreamListener((ImageInfo image, bool synchronousCall) { 63 completer.complete(image); 64 stream.removeListener(listener); 65 }); 66 stream.addListener(listener); 67 return completer.future; 68} 69 70class TestImage implements ui.Image { 71 const TestImage({this.height = 0, this.width = 0}); 72 @override 73 final int height; 74 @override 75 final int width; 76 77 @override 78 void dispose() { } 79 80 @override 81 Future<ByteData> toByteData({ ImageByteFormat format = ImageByteFormat.rawRgba }) { 82 throw UnimplementedError(); 83 } 84} 85 86class ErrorImageProvider extends ImageProvider<ErrorImageProvider> { 87 @override 88 ImageStreamCompleter load(ErrorImageProvider key) { 89 throw Error(); 90 } 91 92 @override 93 Future<ErrorImageProvider> obtainKey(ImageConfiguration configuration) { 94 return SynchronousFuture<ErrorImageProvider>(this); 95 } 96} 97 98class ObtainKeyErrorImageProvider extends ImageProvider<ObtainKeyErrorImageProvider> { 99 @override 100 ImageStreamCompleter load(ObtainKeyErrorImageProvider key) { 101 throw Error(); 102 } 103 104 @override 105 Future<ObtainKeyErrorImageProvider> obtainKey(ImageConfiguration configuration) { 106 throw Error(); 107 } 108} 109 110class LoadErrorImageProvider extends ImageProvider<LoadErrorImageProvider> { 111 @override 112 ImageStreamCompleter load(LoadErrorImageProvider key) { 113 throw Error(); 114 } 115 116 @override 117 Future<LoadErrorImageProvider> obtainKey(ImageConfiguration configuration) { 118 return SynchronousFuture<LoadErrorImageProvider>(this); 119 } 120} 121 122class LoadErrorCompleterImageProvider extends ImageProvider<LoadErrorCompleterImageProvider> { 123 @override 124 ImageStreamCompleter load(LoadErrorCompleterImageProvider key) { 125 final Completer<void> completer = Completer<void>.sync(); 126 completer.completeError(Error()); 127 return OneFrameImageStreamCompleter(completer.future); 128 } 129 130 @override 131 Future<LoadErrorCompleterImageProvider> obtainKey(ImageConfiguration configuration) { 132 return SynchronousFuture<LoadErrorCompleterImageProvider>(this); 133 } 134} 135 136class TestImageStreamCompleter extends ImageStreamCompleter {} 137