// 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 'package:analyzer/src/dart/analysis/cache.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(CacheTest);
  });
}

List<int> _b(int length) {
  return new List<int>(length);
}

@reflectiveTest
class CacheTest {
  test_get_notFound_evict() {
    var cache = _newBytesCache(100);

    // Request '1'.  Nothing found.
    expect(cache.get('1', _noBytes), isNull);

    // Add enough data to the store to force an eviction.
    cache.put('2', _b(40));
    cache.put('3', _b(40));
    cache.put('4', _b(40));
  }

  test_get_notFound_retry() {
    var cache = _newBytesCache(100);

    // Request '1'.  Nothing found.
    expect(cache.get('1', _noBytes), isNull);

    // Request '1' again.
    // The previous `null` result should not have been cached.
    expect(cache.get('1', () => _b(40)), isNotNull);
  }

  test_get_put_evict() {
    var cache = _newBytesCache(100);

    // Keys: [1, 2].
    cache.put('1', _b(40));
    cache.put('2', _b(50));

    // Request '1', so now it is the most recently used.
    // Keys: [2, 1].
    cache.get('1', _noBytes);

    // 40 + 50 + 30 > 100
    // So, '2' is evicted.
    cache.put('3', _b(30));
    expect(cache.get('1', _noBytes), hasLength(40));
    expect(cache.get('2', _noBytes), isNull);
    expect(cache.get('3', _noBytes), hasLength(30));
  }

  test_put_evict_first() {
    var cache = _newBytesCache(100);

    // 40 + 50 < 100
    cache.put('1', _b(40));
    cache.put('2', _b(50));
    expect(cache.get('1', _noBytes), hasLength(40));
    expect(cache.get('2', _noBytes), hasLength(50));

    // 40 + 50 + 30 > 100
    // So, '1' is evicted.
    cache.put('3', _b(30));
    expect(cache.get('1', _noBytes), isNull);
    expect(cache.get('2', _noBytes), hasLength(50));
    expect(cache.get('3', _noBytes), hasLength(30));
  }

  test_put_evict_firstAndSecond() {
    var cache = _newBytesCache(100);

    // 10 + 80 < 100
    cache.put('1', _b(10));
    cache.put('2', _b(80));
    expect(cache.get('1', _noBytes), hasLength(10));
    expect(cache.get('2', _noBytes), hasLength(80));

    // 10 + 80 + 30 > 100
    // So, '1' and '2' are evicted.
    cache.put('3', _b(30));
    expect(cache.get('1', _noBytes), isNull);
    expect(cache.get('2', _noBytes), isNull);
    expect(cache.get('3', _noBytes), hasLength(30));
  }

  Cache<String, List<int>> _newBytesCache(int maxSizeBytes) =>
      new Cache<String, List<int>>(maxSizeBytes, (bytes) => bytes.length);

  static List<int> _noBytes() => null;
}
