import { Cache } from '..';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';

moduleFor(
  'Cache',
  class extends AbstractTestCase {
    ['@test basic'](assert) {
      let cache = new Cache(100, key => key.toUpperCase());

      assert.equal(cache.get('foo'), 'FOO');
      assert.equal(cache.get('bar'), 'BAR');
      assert.equal(cache.get('foo'), 'FOO');
    }

    ['@test explicit sets'](assert) {
      let cache = new Cache(100, key => key.toUpperCase());

      assert.equal(cache.get('foo'), 'FOO');

      assert.equal(cache.set('foo', 'FOO!!!'), 'FOO!!!');

      assert.equal(cache.get('foo'), 'FOO!!!');

      assert.strictEqual(cache.set('foo', undefined), undefined);

      assert.strictEqual(cache.get('foo'), undefined);
    }

    ['@test caches computation correctly'](assert) {
      let count = 0;
      let cache = new Cache(100, key => {
        count++;
        return key.toUpperCase();
      });

      assert.equal(count, 0);
      cache.get('foo');
      assert.equal(count, 1);
      cache.get('bar');
      assert.equal(count, 2);
      cache.get('bar');
      assert.equal(count, 2);
      cache.get('foo');
      assert.equal(count, 2);
    }

    ['@test handles undefined value correctly'](assert) {
      let count = 0;
      let cache = new Cache(100, () => {
        count++;
      });

      assert.equal(count, 0);
      assert.strictEqual(cache.get('foo'), undefined);
      assert.equal(count, 1);
      assert.strictEqual(cache.get('bar'), undefined);
      assert.equal(count, 2);
      assert.strictEqual(cache.get('bar'), undefined);
      assert.equal(count, 2);
      assert.strictEqual(cache.get('foo'), undefined);
      assert.equal(count, 2);
    }

    ['@test continues working after reaching cache limit'](assert) {
      let cache = new Cache(3, key => key.toUpperCase());

      cache.get('a');
      cache.get('b');
      cache.get('c');

      assert.equal(cache.get('d'), 'D');
      assert.equal(cache.get('a'), 'A');
      assert.equal(cache.get('b'), 'B');
      assert.equal(cache.get('c'), 'C');
    }
  }
);