image_test.dart 5.53 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// Copyright 2016 The Chromium 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:async';
import 'dart:ui' as ui show Image;

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/services.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';

void main() {
14 15 16
  testWidgets('Verify Image resets its RenderImage when changing providers', (WidgetTester tester) async {
    final GlobalKey key = new GlobalKey();
    TestImageProvider imageProvider1 = new TestImageProvider();
17
    await tester.pumpWidget(
18 19 20 21 22 23 24 25
      new Container(
        key: key,
        child: new Image(
          image: imageProvider1
        )
      ),
      null,
      EnginePhase.layout
26
    );
27 28
    RenderImage renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNull);
29

30 31 32
    imageProvider1.complete();
    await tester.idle(); // resolve the future from the image provider
    await tester.pump(null, EnginePhase.layout);
33

34 35
    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNotNull);
36

37
    TestImageProvider imageProvider2 = new TestImageProvider();
38
    await tester.pumpWidget(
39 40 41 42 43 44 45 46
      new Container(
        key: key,
        child: new Image(
          image: imageProvider2
        )
      ),
      null,
      EnginePhase.layout
47 48
    );

49 50
    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNull);
51 52
  });

53 54 55
  testWidgets('Verify Image doesn\'t reset its RenderImage when changing providers if it has gaplessPlayback set', (WidgetTester tester) async {
    final GlobalKey key = new GlobalKey();
    TestImageProvider imageProvider1 = new TestImageProvider();
56
    await tester.pumpWidget(
57 58 59 60 61 62 63 64 65
      new Container(
        key: key,
        child: new Image(
          gaplessPlayback: true,
          image: imageProvider1
        )
      ),
      null,
      EnginePhase.layout
66
    );
67 68
    RenderImage renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNull);
69

70 71 72
    imageProvider1.complete();
    await tester.idle(); // resolve the future from the image provider
    await tester.pump(null, EnginePhase.layout);
73

74 75 76 77
    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNotNull);

    TestImageProvider imageProvider2 = new TestImageProvider();
78
    await tester.pumpWidget(
79 80 81 82 83 84 85 86 87
      new Container(
        key: key,
        child: new Image(
          gaplessPlayback: true,
          image: imageProvider2
        )
      ),
      null,
      EnginePhase.layout
88 89
    );

90 91
    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNotNull);
92 93
  });

94
  testWidgets('Verify Image resets its RenderImage when changing providers if it has a key', (WidgetTester tester) async {
95 96
    final GlobalKey key = new GlobalKey();
    TestImageProvider imageProvider1 = new TestImageProvider();
97
    await tester.pumpWidget(
98
      new Image(
99
        key: key,
100
        image: imageProvider1
101 102 103 104 105 106 107 108
      ),
      null,
      EnginePhase.layout
    );
    RenderImage renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNull);

    imageProvider1.complete();
109 110
    await tester.idle(); // resolve the future from the image provider
    await tester.pump(null, EnginePhase.layout);
111 112 113 114 115

    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNotNull);

    TestImageProvider imageProvider2 = new TestImageProvider();
116
    await tester.pumpWidget(
117
      new Image(
118
        key: key,
119
        image: imageProvider2
120 121 122 123
      ),
      null,
      EnginePhase.layout
    );
124

125 126
    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNull);
127 128
  });

129
  testWidgets('Verify Image doesn\'t reset its RenderImage when changing providers if it has gaplessPlayback set', (WidgetTester tester) async {
130 131
    final GlobalKey key = new GlobalKey();
    TestImageProvider imageProvider1 = new TestImageProvider();
132
    await tester.pumpWidget(
133 134 135 136
      new Image(
        key: key,
        gaplessPlayback: true,
        image: imageProvider1
137 138 139 140 141 142 143 144
      ),
      null,
      EnginePhase.layout
    );
    RenderImage renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNull);

    imageProvider1.complete();
145 146
    await tester.idle(); // resolve the future from the image provider
    await tester.pump(null, EnginePhase.layout);
147 148 149 150 151

    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNotNull);

    TestImageProvider imageProvider2 = new TestImageProvider();
152
    await tester.pumpWidget(
153
      new Image(
154
        key: key,
155 156
        gaplessPlayback: true,
        image: imageProvider2
157 158 159 160 161 162 163
      ),
      null,
      EnginePhase.layout
    );

    renderImage = key.currentContext.findRenderObject();
    expect(renderImage.image, isNotNull);
164 165 166 167
  });

}

168
class TestImageProvider extends ImageProvider<TestImageProvider> {
169 170 171
  final Completer<ImageInfo> _completer = new Completer<ImageInfo>();

  @override
172 173
  Future<TestImageProvider> obtainKey(ImageConfiguration configuration) {
    return new SynchronousFuture<TestImageProvider>(this);
174 175 176
  }

  @override
177
  ImageStreamCompleter load(TestImageProvider key) => new OneFrameImageStreamCompleter(_completer.future);
178

179 180 181
  void complete() {
    _completer.complete(new ImageInfo(image: new TestImage()));
  }
182 183

  @override
184
  String toString() => '$runtimeType($hashCode)';
185 186 187 188 189 190 191 192 193 194
}

class TestImage extends ui.Image {
  @override
  int get width => 100;

  @override
  int get height => 100;

  @override
195
  void dispose() { }
196
}