// 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.

/**
 * Provide a trivial test for identity based hashed collections, which we
 * provide here until an implementation is available in the regular libraries.
 */
// TODO(alanknight): Remove once identity-hashed collections are available.
// Issue 4161.
library identity_set_test;

import 'package:unittest/unittest.dart';
import 'package:serialization/src/serialization_helpers.dart';

class Foo {
  var x;
  Foo(this.x);
  int get hashCode => x.hashCode;
  bool operator ==(a) => a.x == x;
}

main() {
  test('basic', () {
    var one = new Foo(3);
    var two = new Foo(3);
    var map = new Map();
    var identityMap = new IdentityMap();
    map[one] = one;
    map[two] = two;
    identityMap[one] = one;
    identityMap[two] = two;
    expect(map.length, 1);
    expect(identityMap.length, 2);
    for (var each in identityMap.values) {
      expect(each, one);
    }
  });

  test('uniquing primitives', () {
    var map = new IdentityMap();
    var one = 'one';
    var two = new String.fromCharCodes(one.codeUnits);
    map[one] = 1;
    expect(map[two], 1);
    expect(map[one], 1);
  });
}
