| Index: tests/corelib/hash_set_test.dart
 | 
| diff --git a/tests/corelib/hash_set_test.dart b/tests/corelib/hash_set_test.dart
 | 
| index 175cba543a4c974d3de7431b72abb2822f430347..06286100d0bbc48bb82adbb120f10a584fb84d8c 100644
 | 
| --- a/tests/corelib/hash_set_test.dart
 | 
| +++ b/tests/corelib/hash_set_test.dart
 | 
| @@ -9,7 +9,7 @@ library hash_map2_test;
 | 
|  import "package:expect/expect.dart";
 | 
|  import 'dart:collection';
 | 
|  
 | 
| -testSet(Set newSet(), Set newSetFrom(Set from)) {
 | 
| +testSet(Set newSet(), Set newSetFrom(Iterable from)) {
 | 
|  
 | 
|    Set gen(int from, int to) =>
 | 
|        new Set.from(new Iterable.generate(to - from, (n) => n + from));
 | 
| @@ -220,9 +220,60 @@ testSet(Set newSet(), Set newSetFrom(Set from)) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +
 | 
| +void testIdentitySet(Set create()) {
 | 
| +  Set set = create();
 | 
| +  set.add(1);
 | 
| +  set.add(2);
 | 
| +  set.add(1);  // Integers are identical if equal.
 | 
| +  Expect.equals(2, set.length);
 | 
| +  var complex = 4;
 | 
| +  complex = set.length == 2 ? complex ~/ 4 : 87;  // Avoid compile-time constant.
 | 
| +  Expect.isTrue(set.contains(complex));  // 1 is in set, even if computed.
 | 
| +  set.clear();
 | 
| +
 | 
| +  // All compile time constants are identical to themselves.
 | 
| +  var constants = [double.INFINITY,
 | 
| +                   double.NAN, -0.0, /// 01: ok
 | 
| +                   0.0, 42, "", null, false, true, #bif, testIdentitySet];
 | 
| +  set.addAll(constants);
 | 
| +  Expect.equals(constants.length, set.length);
 | 
| +  for (var c in constants) {
 | 
| +    Expect.isTrue(set.contains(c), "constant: $c");
 | 
| +  }
 | 
| +  Expect.isTrue(set.containsAll(constants), "constants: $set");
 | 
| +  set.clear();
 | 
| +
 | 
| +  var m1 = new Mutable(1);
 | 
| +  var m2 = new Mutable(2);
 | 
| +  var m3 = new Mutable(3);
 | 
| +  var m4 = new Mutable(2);  // Equal to m2, but not identical.
 | 
| +  set.addAll([m1, m2, m3, m4]);
 | 
| +  Expect.equals(4, set.length);
 | 
| +  Expect.equals(3, m3.hashCode);
 | 
| +  m3.id = 1;
 | 
| +  Expect.equals(1, m3.hashCode);
 | 
| +  // Changing hashCode doesn't affect lookup.
 | 
| +  Expect.isTrue(set.contains(m3));
 | 
| +  Expect.isTrue(set.contains(m1));
 | 
| +  set.remove(m3);
 | 
| +  Expect.isFalse(set.contains(m3));
 | 
| +  Expect.isTrue(set.contains(m1));
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void main() {
 | 
| +  testSet(() => new Set(), (m) => new Set.from(m));
 | 
|    testSet(() => new HashSet(), (m) => new HashSet.from(m));
 | 
|    testSet(() => new LinkedHashSet(), (m) => new LinkedHashSet.from(m));
 | 
| +  testIdentitySet(() => new Set.identity());
 | 
| +  testIdentitySet(() => new HashSet.identity());
 | 
| +  testIdentitySet(() => new LinkedHashSet.identity());
 | 
| +  testIdentitySet(() => new HashSet(equals: (x, y) => identical(x, y),
 | 
| +                                    hashCode: (x) => identityHashCode(x)));
 | 
| +  testIdentitySet(
 | 
| +      () => new LinkedHashSet(equals: (x, y) => identical(x, y),
 | 
| +                              hashCode: (x) => identityHashCode(x)));
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -235,3 +286,10 @@ class BadHashCode {
 | 
|    // Can't make a bad compareTo that isn't invalid.
 | 
|    int compareTo(BadHashCode other) => id - other.id;
 | 
|  }
 | 
| +
 | 
| +class Mutable {
 | 
| +  int id;
 | 
| +  Mutable(this.id);
 | 
| +  int get hashCode => id;
 | 
| +  bool operator==(other) => other is Mutable && id == other.id;
 | 
| +}
 | 
| 
 |