// Copyright (c) 2012, 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.

// @dart = 2.9

import 'dart:html';

import 'package:expect/minitest.dart';

main() {
  setUp(() {
    window.localStorage['key1'] = 'val1';
    window.localStorage['key2'] = 'val2';
    window.localStorage['key3'] = 'val3';
  });

  tearDown(() {
    window.localStorage.clear();
  });

  test('containsValue', () {
    expect(window.localStorage.containsValue('does not exist'), isFalse);
    expect(window.localStorage.containsValue('key1'), isFalse);
    expect(window.localStorage.containsValue('val1'), isTrue);
    expect(window.localStorage.containsValue('val3'), isTrue);
  });

  test('containsKey', () {
    expect(window.localStorage.containsKey('does not exist'), isFalse);
    expect(window.localStorage.containsKey('val1'), isFalse);
    expect(window.localStorage.containsKey('key1'), isTrue);
    expect(window.localStorage.containsKey('key3'), isTrue);
  });

  test('[]', () {
    expect(window.localStorage['does not exist'], isNull);
    expect(window.localStorage['key1'], 'val1');
    expect(window.localStorage['key3'], 'val3');
  });

  test('[]=', () {
    expect(window.localStorage['key4'], isNull);
    window.localStorage['key4'] = 'val4';
    expect(window.localStorage['key4'], 'val4');

    expect(window.localStorage['key3'], 'val3');
    window.localStorage['key3'] = 'val3-new';
    expect(window.localStorage['key3'], 'val3-new');
  });

  test('putIfAbsent', () {
    expect(window.localStorage['key4'], isNull);
    expect(window.localStorage.putIfAbsent('key4', () => 'val4'), 'val4');
    expect(window.localStorage['key4'], 'val4');

    expect(window.localStorage['key3'], 'val3');
    expect(
        window.localStorage.putIfAbsent('key3', () {
          fail('should not be called');
          return 'unused';
        }),
        'val3');
    expect(window.localStorage['key3'], 'val3');
  });

  test('remove', () {
    expect(window.localStorage.remove('does not exist'), isNull);
    expect(window.localStorage.remove('key3'), 'val3');
    expect(window.localStorage, equals({'key1': 'val1', 'key2': 'val2'}));
  });

  test('clear', () {
    window.localStorage.clear();
    expect(window.localStorage, equals({}));
  });

  test('forEach', () {
    var results = <String, String>{};
    window.localStorage.forEach((k, v) {
      results[k] = v;
    });
    expect(results, equals({'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}));
  });

  test('getKeys', () {
    expect(window.localStorage.keys.toList(),
        unorderedEquals(['key1', 'key2', 'key3']));
  });

  test('getVals', () {
    expect(window.localStorage.values.toList(),
        unorderedEquals(['val1', 'val2', 'val3']));
  });

  test('getEntries', () {
    var results = <String, String>{};
    window.localStorage.entries.forEach((e) {
      results[e.key] = e.value;
    });
    expect(results, equals({'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}));
  });

  test('length', () {
    expect(window.localStorage.length, 3);
    window.localStorage.clear();
    expect(window.localStorage.length, 0);
  });

  test('isEmpty', () {
    expect(window.localStorage.isEmpty, isFalse);
    window.localStorage.clear();
    expect(window.localStorage.isEmpty, isTrue);
  });
}
