blob: 0531aa6d9e4449e3f8fba8efc0be52c740de22ba [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. 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:typed_data';
import 'package:analyzer/src/dart/analysis/cache.dart';
import 'package:analyzer_utilities/testing/map_entry_matcher.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(CacheTest);
});
}
Uint8List _b(int length) {
return Uint8List(length);
}
@reflectiveTest
class CacheTest {
test_get() {
final cache = _newBytesCache(100);
expect(cache.get('1'), isNull);
expect(cache.map.entries, isEmpty);
cache.put('1', _b(10));
expect(cache.map.entries, [
isMapEntry('1', hasLength(10)),
]);
expect(cache.get('1'), hasLength(10));
}
test_get_reorders() {
final cache = _newBytesCache(100);
cache.put('1', _b(1));
cache.put('2', _b(2));
cache.put('3', _b(3));
cache.put('4', _b(4));
expect(cache.map.entries, [
isMapEntry('1', hasLength(1)),
isMapEntry('2', hasLength(2)),
isMapEntry('3', hasLength(3)),
isMapEntry('4', hasLength(4)),
]);
expect(cache.get('2'), hasLength(2));
expect(cache.map.entries, [
isMapEntry('1', hasLength(1)),
isMapEntry('3', hasLength(3)),
isMapEntry('4', hasLength(4)),
isMapEntry('2', hasLength(2)),
]);
}
test_put_evict_first() {
var cache = _newBytesCache(100);
// 40 + 50 < 100
cache.put('1', _b(40));
cache.put('2', _b(50));
expect(cache.map.entries, [
isMapEntry('1', hasLength(40)),
isMapEntry('2', hasLength(50)),
]);
// 40 + 50 + 30 > 100
// So, '1' is evicted.
cache.put('3', _b(30));
expect(cache.map.entries, [
isMapEntry('2', hasLength(50)),
isMapEntry('3', hasLength(30)),
]);
}
test_put_evict_firstSecond() {
var cache = _newBytesCache(100);
// 10 + 80 < 100
cache.put('1', _b(10));
cache.put('2', _b(80));
expect(cache.map.entries, [
isMapEntry('1', hasLength(10)),
isMapEntry('2', hasLength(80)),
]);
// 10 + 80 + 30 > 100
// So, '1' and '2' are evicted.
cache.put('3', _b(30));
expect(cache.map.entries, [
isMapEntry('3', hasLength(30)),
]);
}
Cache<String, Uint8List> _newBytesCache(int maxSizeBytes) =>
Cache<String, Uint8List>(maxSizeBytes, (bytes) => bytes.length);
}