mocks_for_image_cache.dart 3.8 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
6
import 'dart:typed_data';
7
import 'dart:ui' as ui show Image;
8
import 'dart:ui';
9

10
import 'package:flutter/foundation.dart';
11
import 'package:flutter/painting.dart';
12 13

class 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 23 24 25 26 27

  final int value;

  @override
  String toString() => '$runtimeType($value)';
}

28
class 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, DecoderCallback decode) {
41 42
    return OneFrameImageStreamCompleter(
      SynchronousFuture<ImageInfo>(TestImageInfo(imageValue, image: image))
43
    );
44 45 46
  }

  @override
47
  String toString() => '$runtimeType($key, $imageValue)';
48
}
49

50 51 52 53
class FailingTestImageProvider extends TestImageProvider {
  const FailingTestImageProvider(int key, int imageValue, { ui.Image image }) : super(key, imageValue, image: image);

  @override
54
  ImageStreamCompleter load(int key, DecoderCallback decode) {
55 56 57 58
    return OneFrameImageStreamCompleter(Future<ImageInfo>.sync(() => Future<ImageInfo>.error('loading failed!')));
  }
}

59
Future<ImageInfo> extractOneFrame(ImageStream stream) {
60
  final Completer<ImageInfo> completer = Completer<ImageInfo>();
61 62
  ImageStreamListener listener;
  listener = ImageStreamListener((ImageInfo image, bool synchronousCall) {
63 64
    completer.complete(image);
    stream.removeListener(listener);
65
  });
66 67
  stream.addListener(listener);
  return completer.future;
68
}
69 70 71 72 73 74 75 76 77

class TestImage implements ui.Image {
  const TestImage({this.height = 0, this.width = 0});
  @override
  final int height;
  @override
  final int width;

  @override
78
  void dispose() { }
79 80

  @override
81
  Future<ByteData> toByteData({ ImageByteFormat format = ImageByteFormat.rawRgba }) {
82
    throw UnimplementedError();
83 84
  }
}
85 86 87

class ErrorImageProvider extends ImageProvider<ErrorImageProvider> {
  @override
88
  ImageStreamCompleter load(ErrorImageProvider key, DecoderCallback decode) {
89 90 91 92 93 94 95 96
    throw Error();
  }

  @override
  Future<ErrorImageProvider> obtainKey(ImageConfiguration configuration) {
    return SynchronousFuture<ErrorImageProvider>(this);
  }
}
97

98 99
class ObtainKeyErrorImageProvider extends ImageProvider<ObtainKeyErrorImageProvider> {
  @override
100
  ImageStreamCompleter load(ObtainKeyErrorImageProvider key, DecoderCallback decode) {
101 102 103 104 105 106 107 108 109
    throw Error();
  }

  @override
  Future<ObtainKeyErrorImageProvider> obtainKey(ImageConfiguration configuration) {
    throw Error();
  }
}

110 111
class LoadErrorImageProvider extends ImageProvider<LoadErrorImageProvider> {
  @override
112
  ImageStreamCompleter load(LoadErrorImageProvider key, DecoderCallback decode) {
113 114 115
    throw Error();
  }

116
  @override
117 118 119 120 121
  Future<LoadErrorImageProvider> obtainKey(ImageConfiguration configuration) {
    return SynchronousFuture<LoadErrorImageProvider>(this);
  }
}

122
class LoadErrorCompleterImageProvider extends ImageProvider<LoadErrorCompleterImageProvider> {
123
  @override
124
  ImageStreamCompleter load(LoadErrorCompleterImageProvider key, DecoderCallback decode) {
125
    final Completer<ImageInfo> completer = Completer<ImageInfo>.sync();
126 127
    completer.completeError(Error());
    return OneFrameImageStreamCompleter(completer.future);
128 129
  }

130
  @override
131 132 133 134 135
  Future<LoadErrorCompleterImageProvider> obtainKey(ImageConfiguration configuration) {
    return SynchronousFuture<LoadErrorCompleterImageProvider>(this);
  }
}

136
class TestImageStreamCompleter extends ImageStreamCompleter {}