// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.6
import 'package:ui/src/engine.dart';
import 'package:test/test.dart';

void main() {
  group('CrossFrameCache', () {
    test('Reuse returns no object when cache empty', () {
      final CrossFrameCache<TestItem> cache = CrossFrameCache();
      cache.commitFrame();
      TestItem requestedItem = cache.reuse('item1');
      expect(requestedItem, null);
    });

    test('Reuses object across frames', () {
      final CrossFrameCache<TestItem> cache = CrossFrameCache();
      final TestItem testItem1 = TestItem('item1');
      cache.cache(testItem1.label, testItem1);
      cache.commitFrame();
      TestItem requestedItem = cache.reuse('item1');
      expect(requestedItem, testItem1);
      requestedItem = cache.reuse('item1');
      expect(requestedItem, null);
    });

    test('Reuses objects that have same key across frames', () {
      final CrossFrameCache<TestItem> cache = CrossFrameCache();
      final TestItem testItem1 = TestItem('sameLabel');
      final TestItem testItem2 = TestItem('sameLabel');
      final TestItem testItemX = TestItem('X');
      cache.cache(testItem1.label, testItem1);
      cache.cache(testItemX.label, testItemX);
      cache.cache(testItem2.label, testItem2);
      cache.commitFrame();
      TestItem requestedItem = cache.reuse('sameLabel');
      expect(requestedItem, testItem1);
      requestedItem = cache.reuse('sameLabel');
      expect(requestedItem, testItem2);
      requestedItem = cache.reuse('sameLabel');
      expect(requestedItem, null);
    });

    test('Values don\'t survive beyond next frame', () {
      final CrossFrameCache<TestItem> cache = CrossFrameCache();
      final TestItem testItem1 = TestItem('item1');
      cache.cache(testItem1.label, testItem1);
      cache.commitFrame();
      cache.commitFrame();
      TestItem requestedItem = cache.reuse('item1');
      expect(requestedItem, null);
    });

    test('Values are evicted when not reused', () {
      final Set<TestItem> _evictedItems = {};
      final CrossFrameCache<TestItem> cache = CrossFrameCache();
      final TestItem testItem1 = TestItem('item1');
      final TestItem testItem2 = TestItem('item2');
      cache.cache(testItem1.label, testItem1, (TestItem item) {_evictedItems.add(item);});
      cache.cache(testItem2.label, testItem2, (TestItem item) {_evictedItems.add(item);});
      cache.commitFrame();
      expect(_evictedItems.length, 0);
      cache.reuse('item2');
      cache.commitFrame();
      expect(_evictedItems.contains(testItem1), true);
      expect(_evictedItems.contains(testItem2), false);
    });
  });
}

class TestItem {
  final String label;
  TestItem(this.label);
}
