image_cache_test.dart 5.33 KB
Newer Older
1 2 3 4
// 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.

5
import 'package:flutter/painting.dart';
6 7
import 'package:test/test.dart';

8
import '../rendering/rendering_tester.dart';
9 10 11
import 'mocks_for_image_cache.dart';

void main() {
12
  new TestRenderingFlutterBinding(); // initializes the imageCache
13 14 15 16 17 18
  group(ImageCache, () {
    tearDown(() {
      imageCache.clear();
      imageCache.maximumSize = 1000;
      imageCache.maximumSizeBytes = 10485760;
    });
19

20 21
    test('maintains cache size', () async {
      imageCache.maximumSize = 3;
22

23 24 25 26 27 28 29 30 31 32 33 34
      final TestImageInfo a = await extractOneFrame(const TestImageProvider(1, 1).resolve(ImageConfiguration.empty));
      expect(a.value, equals(1));
      final TestImageInfo b = await extractOneFrame(const TestImageProvider(1, 2).resolve(ImageConfiguration.empty));
      expect(b.value, equals(1));
      final TestImageInfo c = await extractOneFrame(const TestImageProvider(1, 3).resolve(ImageConfiguration.empty));
      expect(c.value, equals(1));
      final TestImageInfo d = await extractOneFrame(const TestImageProvider(1, 4).resolve(ImageConfiguration.empty));
      expect(d.value, equals(1));
      final TestImageInfo e = await extractOneFrame(const TestImageProvider(1, 5).resolve(ImageConfiguration.empty));
      expect(e.value, equals(1));
      final TestImageInfo f = await extractOneFrame(const TestImageProvider(1, 6).resolve(ImageConfiguration.empty));
      expect(f.value, equals(1));
35

36
      expect(f, equals(a));
37

38
      // cache still only has one entry in it: 1(1)
39

40 41
      final TestImageInfo g = await extractOneFrame(const TestImageProvider(2, 7).resolve(ImageConfiguration.empty));
      expect(g.value, equals(7));
42

43
      // cache has two entries in it: 1(1), 2(7)
44

45 46
      final TestImageInfo h = await extractOneFrame(const TestImageProvider(1, 8).resolve(ImageConfiguration.empty));
      expect(h.value, equals(1));
47

48
      // cache still has two entries in it: 2(7), 1(1)
49

50 51
      final TestImageInfo i = await extractOneFrame(const TestImageProvider(3, 9).resolve(ImageConfiguration.empty));
      expect(i.value, equals(9));
52

53
      // cache has three entries in it: 2(7), 1(1), 3(9)
54

55 56
      final TestImageInfo j = await extractOneFrame(const TestImageProvider(1, 10).resolve(ImageConfiguration.empty));
      expect(j.value, equals(1));
57

58
      // cache still has three entries in it: 2(7), 3(9), 1(1)
59

60 61
      final TestImageInfo k = await extractOneFrame(const TestImageProvider(4, 11).resolve(ImageConfiguration.empty));
      expect(k.value, equals(11));
62

63
      // cache has three entries: 3(9), 1(1), 4(11)
64

65 66
      final TestImageInfo l = await extractOneFrame(const TestImageProvider(1, 12).resolve(ImageConfiguration.empty));
      expect(l.value, equals(1));
67

68
      // cache has three entries: 3(9), 4(11), 1(1)
69

70 71
      final TestImageInfo m = await extractOneFrame(const TestImageProvider(2, 13).resolve(ImageConfiguration.empty));
      expect(m.value, equals(13));
72

73
      // cache has three entries: 4(11), 1(1), 2(13)
74

75 76
      final TestImageInfo n = await extractOneFrame(const TestImageProvider(3, 14).resolve(ImageConfiguration.empty));
      expect(n.value, equals(14));
77

78
      // cache has three entries: 1(1), 2(13), 3(14)
79

80 81
      final TestImageInfo o = await extractOneFrame(const TestImageProvider(4, 15).resolve(ImageConfiguration.empty));
      expect(o.value, equals(15));
82

83
      // cache has three entries: 2(13), 3(14), 4(15)
84

85 86
      final TestImageInfo p = await extractOneFrame(const TestImageProvider(1, 16).resolve(ImageConfiguration.empty));
      expect(p.value, equals(16));
87

88
      // cache has three entries: 3(14), 4(15), 1(16)
89

90
    });
91

92
    test('clear removes all images and resets cache size', () async {
93
      const TestImage testImage = TestImage(width: 8, height: 8);
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

      expect(imageCache.currentSize, 0);
      expect(imageCache.currentSizeBytes, 0);

      await extractOneFrame(const TestImageProvider(1, 1, image: testImage).resolve(ImageConfiguration.empty));
      await extractOneFrame(const TestImageProvider(2, 2, image: testImage).resolve(ImageConfiguration.empty));

      expect(imageCache.currentSize, 2);
      expect(imageCache.currentSizeBytes, 256 * 2);

      imageCache.clear();

      expect(imageCache.currentSize, 0);
      expect(imageCache.currentSizeBytes, 0);
    });

    test('evicts individual images', () async {
111
      const TestImage testImage = TestImage(width: 8, height: 8);
112 113 114 115 116 117 118 119 120
      await extractOneFrame(const TestImageProvider(1, 1, image: testImage).resolve(ImageConfiguration.empty));
      await extractOneFrame(const TestImageProvider(2, 2, image: testImage).resolve(ImageConfiguration.empty));

      expect(imageCache.currentSize, 2);
      expect(imageCache.currentSizeBytes, 256 * 2);
      expect(imageCache.evict(1), true);
      expect(imageCache.currentSize, 1);
      expect(imageCache.currentSizeBytes, 256);
    });
121 122

    test('Increases cache size if an image is loaded that is larger then the maximum size', () async {
123
      const TestImage testImage = TestImage(width: 8, height: 8);
124 125 126 127 128 129 130

      imageCache.maximumSizeBytes = 1;
      await extractOneFrame(const TestImageProvider(1, 1, image: testImage).resolve(ImageConfiguration.empty));
      expect(imageCache.currentSize, 1);
      expect(imageCache.currentSizeBytes, 256);
      expect(imageCache.maximumSizeBytes, 256 + 1000);
    });
131 132
  });
}