| Index: test/codegen/expect/corelib/hash_map2_test.js | 
| diff --git a/test/codegen/expect/corelib/hash_map2_test.js b/test/codegen/expect/corelib/hash_map2_test.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..84c7bd9962eaed8ea11b51ea8263793c0ddbf8f8 | 
| --- /dev/null | 
| +++ b/test/codegen/expect/corelib/hash_map2_test.js | 
| @@ -0,0 +1,294 @@ | 
| +dart_library.library('corelib/hash_map2_test', null, /* Imports */[ | 
| +  'dart_sdk', | 
| +  'expect' | 
| +], function load__hash_map2_test(exports, dart_sdk, expect) { | 
| +  'use strict'; | 
| +  const core = dart_sdk.core; | 
| +  const collection = dart_sdk.collection; | 
| +  const dart = dart_sdk.dart; | 
| +  const dartx = dart_sdk.dartx; | 
| +  const expect$ = expect.expect; | 
| +  const hash_map2_test = Object.create(null); | 
| +  let VoidToMap = () => (VoidToMap = dart.constFn(dart.functionType(core.Map, [])))(); | 
| +  let MapToMap = () => (MapToMap = dart.constFn(dart.functionType(core.Map, [core.Map])))(); | 
| +  let HashMapOfint$String = () => (HashMapOfint$String = dart.constFn(collection.HashMap$(core.int, core.String)))(); | 
| +  let MapOfint$String = () => (MapOfint$String = dart.constFn(core.Map$(core.int, core.String)))(); | 
| +  let LinkedHashMapOfint$String = () => (LinkedHashMapOfint$String = dart.constFn(collection.LinkedHashMap$(core.int, core.String)))(); | 
| +  let HashMapOfString$int = () => (HashMapOfString$int = dart.constFn(collection.HashMap$(core.String, core.int)))(); | 
| +  let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))(); | 
| +  let LinkedHashMapOfString$int = () => (LinkedHashMapOfString$int = dart.constFn(collection.LinkedHashMap$(core.String, core.int)))(); | 
| +  let intAndintToMap = () => (intAndintToMap = dart.constFn(dart.definiteFunctionType(core.Map, [core.int, core.int])))(); | 
| +  let intTobool = () => (intTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.int])))(); | 
| +  let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))(); | 
| +  let MapAndMapTovoid = () => (MapAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Map, core.Map])))(); | 
| +  let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))(); | 
| +  let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))(); | 
| +  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [])))(); | 
| +  let FnAndFnTodynamic = () => (FnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidToMap(), MapToMap()])))(); | 
| +  let VoidToHashMap = () => (VoidToHashMap = dart.constFn(dart.definiteFunctionType(collection.HashMap, [])))(); | 
| +  let MapToHashMap = () => (MapToHashMap = dart.constFn(dart.definiteFunctionType(collection.HashMap, [core.Map])))(); | 
| +  let VoidToLinkedHashMap = () => (VoidToLinkedHashMap = dart.constFn(dart.definiteFunctionType(collection.LinkedHashMap, [])))(); | 
| +  let MapToLinkedHashMap = () => (MapToLinkedHashMap = dart.constFn(dart.definiteFunctionType(collection.LinkedHashMap, [core.Map])))(); | 
| +  hash_map2_test.testMap = function(newMap, newMapFrom) { | 
| +    function gen(from, to) { | 
| +      let map = collection.LinkedHashMap.new(); | 
| +      for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) | 
| +        map[dartx.set](i, i); | 
| +      return map; | 
| +    } | 
| +    dart.fn(gen, intAndintToMap()); | 
| +    function odd(n) { | 
| +      return (dart.notNull(n) & 1) == 1; | 
| +    } | 
| +    dart.fn(odd, intTobool()); | 
| +    function even(n) { | 
| +      return (dart.notNull(n) & 1) == 0; | 
| +    } | 
| +    dart.fn(even, intTobool()); | 
| +    function addAll(toMap, fromMap) { | 
| +      fromMap[dartx.forEach](dart.fn((k, v) => { | 
| +        toMap[dartx.set](k, v); | 
| +      }, dynamicAnddynamicTovoid())); | 
| +    } | 
| +    dart.fn(addAll, MapAndMapTovoid()); | 
| +    { | 
| +      let map = newMap(); | 
| +      for (let i = 0; i < 256; i++) { | 
| +        map[dartx.set](i, i); | 
| +      } | 
| +      addAll(map, gen(256, 512)); | 
| +      addAll(map, newMapFrom(gen(512, 1000))); | 
| +      expect$.Expect.equals(1000, map[dartx.length]); | 
| +      for (let i = 0; i < 1000; i = i + 2) | 
| +        map[dartx.remove](i); | 
| +      expect$.Expect.equals(500, map[dartx.length]); | 
| +      expect$.Expect.isFalse(map[dartx.keys][dartx.any](even)); | 
| +      expect$.Expect.isTrue(map[dartx.keys][dartx.every](odd)); | 
| +      addAll(map, gen(0, 1000)); | 
| +      expect$.Expect.equals(1000, map[dartx.length]); | 
| +    } | 
| +    { | 
| +      let map = newMap(); | 
| +      map[dartx.set](0, 0); | 
| +      for (let i = 0; i < 1000; i++) { | 
| +        map[dartx.set](i + 1, i + 1); | 
| +        map[dartx.remove](i); | 
| +        expect$.Expect.equals(1, map[dartx.length]); | 
| +      } | 
| +    } | 
| +    { | 
| +      let map = newMap(); | 
| +      for (let i = 0; i < 1000; i++) { | 
| +        map[dartx.set](new hash_map2_test.BadHashCode(), 0); | 
| +      } | 
| +      expect$.Expect.equals(1000, map[dartx.length]); | 
| +    } | 
| +    { | 
| +      let map = newMap(); | 
| +      map[dartx.set](0, 0); | 
| +      map[dartx.set](1, 1); | 
| +      { | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        iter.moveNext(); | 
| +        map[dartx.set](1, 9); | 
| +        iter.moveNext(); | 
| +        map[dartx.set](2, 2); | 
| +        expect$.Expect.throws(dart.bind(iter, 'moveNext'), dart.fn(e => core.Error.is(e), dynamicTobool())); | 
| +      } | 
| +      { | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        expect$.Expect.equals(3, map[dartx.length]); | 
| +        iter.moveNext(); | 
| +        iter.moveNext(); | 
| +        iter.moveNext(); | 
| +        map[dartx.set](3, 3); | 
| +        expect$.Expect.throws(dart.bind(iter, 'moveNext'), dart.fn(e => core.Error.is(e), dynamicTobool())); | 
| +      } | 
| +      { | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        iter.moveNext(); | 
| +        map[dartx.remove](1000); | 
| +        iter.moveNext(); | 
| +        let n = core.int._check(iter.current); | 
| +        map[dartx.remove](n); | 
| +        expect$.Expect.equals(n, iter.current); | 
| +        expect$.Expect.throws(dart.bind(iter, 'moveNext'), dart.fn(e => core.Error.is(e), dynamicTobool())); | 
| +      } | 
| +      { | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        expect$.Expect.equals(3, map[dartx.length]); | 
| +        iter.moveNext(); | 
| +        iter.moveNext(); | 
| +        iter.moveNext(); | 
| +        let n = core.int._check(iter.current); | 
| +        map[dartx.remove](n); | 
| +        expect$.Expect.equals(n, iter.current); | 
| +        expect$.Expect.throws(dart.bind(iter, 'moveNext'), dart.fn(e => core.Error.is(e), dynamicTobool())); | 
| +      } | 
| +      { | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        expect$.Expect.equals(2, map[dartx.length]); | 
| +        iter.moveNext(); | 
| +        let n = core.int._check(iter.current); | 
| +        map[dartx.set](n, dart.notNull(n) * 2); | 
| +        iter.moveNext(); | 
| +        expect$.Expect.equals(map[dartx.get](iter.current), iter.current); | 
| +      } | 
| +      { | 
| +        map[dartx.putIfAbsent](4, dart.fn(() => { | 
| +          map[dartx.set](5, 5); | 
| +          map[dartx.set](4, -1); | 
| +          return 4; | 
| +        }, VoidToint())); | 
| +        expect$.Expect.equals(4, map[dartx.get](4)); | 
| +        expect$.Expect.equals(5, map[dartx.get](5)); | 
| +      } | 
| +      { | 
| +        let map2 = newMap(); | 
| +        for (let key of map[dartx.keys]) { | 
| +          map2[dartx.set](key, dart.dsend(map[dartx.get](key), '+', 1)); | 
| +        } | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        addAll(map, map2); | 
| +        iter.moveNext(); | 
| +      } | 
| +    } | 
| +    { | 
| +      let map = newMap(); | 
| +      map[dartx.putIfAbsent]("S", dart.fn(() => 0, VoidToint())); | 
| +      map[dartx.putIfAbsent]("T", dart.fn(() => 0, VoidToint())); | 
| +      map[dartx.putIfAbsent]("U", dart.fn(() => 0, VoidToint())); | 
| +      map[dartx.putIfAbsent]("C", dart.fn(() => 0, VoidToint())); | 
| +      map[dartx.putIfAbsent]("a", dart.fn(() => 0, VoidToint())); | 
| +      map[dartx.putIfAbsent]("b", dart.fn(() => 0, VoidToint())); | 
| +      map[dartx.putIfAbsent]("n", dart.fn(() => 0, VoidToint())); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey]("n")); | 
| +    } | 
| +    { | 
| +      let map = newMap(); | 
| +      for (let i = 0; i < 128; i++) { | 
| +        map[dartx.putIfAbsent](i, dart.fn(() => i, VoidToint())); | 
| +        expect$.Expect.isTrue(map[dartx.containsKey](i)); | 
| +        map[dartx.putIfAbsent](i[dartx['>>']](1), dart.fn(() => -1, VoidToint())); | 
| +      } | 
| +      for (let i = 0; i < 128; i++) { | 
| +        expect$.Expect.equals(i, map[dartx.get](i)); | 
| +      } | 
| +    } | 
| +    { | 
| +      for (let i = 1; i < 128; i++) { | 
| +        let map = newMapFrom(gen(0, i)); | 
| +        map[dartx.forEach](dart.fn((key, v) => { | 
| +          expect$.Expect.equals(key, map[dartx.get](key)); | 
| +          map[dartx.set](key, dart.dsend(key, '+', 1)); | 
| +          map[dartx.remove](1000); | 
| +          map[dartx.putIfAbsent](key, dart.fn(() => expect$.Expect.fail("SHOULD NOT BE ABSENT"), VoidTovoid())); | 
| +        }, dynamicAnddynamicTovoid())); | 
| +        for (let key of map[dartx.keys]) { | 
| +          core.int._check(key); | 
| +          expect$.Expect.equals(dart.notNull(key) + 1, map[dartx.get](key)); | 
| +          map[dartx.set](key, dart.dsend(map[dartx.get](key), '+', 1)); | 
| +          map[dartx.remove](1000); | 
| +          map[dartx.putIfAbsent](key, dart.fn(() => expect$.Expect.fail("SHOULD NOT BE ABSENT"), VoidTovoid())); | 
| +        } | 
| +        let iter = map[dartx.keys][dartx.iterator]; | 
| +        for (let key = 0; key < i; key++) { | 
| +          expect$.Expect.equals(key + 2, map[dartx.get](key)); | 
| +          map[dartx.set](key, key + 3); | 
| +          map[dartx.remove](1000); | 
| +          map[dartx.putIfAbsent](key, dart.fn(() => expect$.Expect.fail("SHOULD NOT BE ABSENT"), VoidTovoid())); | 
| +        } | 
| +        iter.moveNext(); | 
| +        for (let key = 1; key < i; key++) { | 
| +          expect$.Expect.equals(key + 3, map[dartx.get](key)); | 
| +          map[dartx.remove](key); | 
| +        } | 
| +        iter = map[dartx.keys][dartx.iterator]; | 
| +        map[dartx.set](0, 2); | 
| +        iter.moveNext(); | 
| +      } | 
| +    } | 
| +    { | 
| +      let map = newMap(); | 
| +      map[dartx.set](null, 0); | 
| +      expect$.Expect.equals(1, map[dartx.length]); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey](null)); | 
| +      expect$.Expect.isNull(map[dartx.keys][dartx.first]); | 
| +      expect$.Expect.isNull(map[dartx.keys][dartx.last]); | 
| +      map[dartx.set](null, 1); | 
| +      expect$.Expect.equals(1, map[dartx.length]); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey](null)); | 
| +      map[dartx.remove](null); | 
| +      expect$.Expect.isTrue(map[dartx.isEmpty]); | 
| +      expect$.Expect.isFalse(map[dartx.containsKey](null)); | 
| +      map = newMapFrom((() => { | 
| +        let _ = core.Map.new(); | 
| +        _[dartx.set](null, 0); | 
| +        return _; | 
| +      })()); | 
| +      expect$.Expect.equals(1, map[dartx.length]); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey](null)); | 
| +      expect$.Expect.isNull(map[dartx.keys][dartx.first]); | 
| +      expect$.Expect.isNull(map[dartx.keys][dartx.last]); | 
| +      map[dartx.set](null, 1); | 
| +      expect$.Expect.equals(1, map[dartx.length]); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey](null)); | 
| +      map[dartx.remove](null); | 
| +      expect$.Expect.isTrue(map[dartx.isEmpty]); | 
| +      expect$.Expect.isFalse(map[dartx.containsKey](null)); | 
| +      let fromMap = core.Map.new(); | 
| +      fromMap[dartx.set](1, 0); | 
| +      fromMap[dartx.set](2, 0); | 
| +      fromMap[dartx.set](3, 0); | 
| +      fromMap[dartx.set](null, 0); | 
| +      fromMap[dartx.set](4, 0); | 
| +      fromMap[dartx.set](5, 0); | 
| +      fromMap[dartx.set](6, 0); | 
| +      expect$.Expect.equals(7, fromMap[dartx.length]); | 
| +      map = newMapFrom(fromMap); | 
| +      expect$.Expect.equals(7, map[dartx.length]); | 
| +      for (let i = 7; i < 128; i++) { | 
| +        map[dartx.set](i, 0); | 
| +      } | 
| +      expect$.Expect.equals(128, map[dartx.length]); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey](null)); | 
| +      map[dartx.set](null, 1); | 
| +      expect$.Expect.equals(128, map[dartx.length]); | 
| +      expect$.Expect.isTrue(map[dartx.containsKey](null)); | 
| +      map[dartx.remove](null); | 
| +      expect$.Expect.equals(127, map[dartx.length]); | 
| +      expect$.Expect.isFalse(map[dartx.containsKey](null)); | 
| +    } | 
| +  }; | 
| +  dart.fn(hash_map2_test.testMap, FnAndFnTodynamic()); | 
| +  let const$; | 
| +  hash_map2_test.main = function() { | 
| +    expect$.Expect.isTrue(MapOfint$String().is(HashMapOfint$String().new())); | 
| +    expect$.Expect.isTrue(MapOfint$String().is(LinkedHashMapOfint$String().new())); | 
| +    expect$.Expect.isTrue(MapOfString$int().is(HashMapOfString$int().from(dart.map()))); | 
| +    expect$.Expect.isTrue(MapOfString$int().is(LinkedHashMapOfString$int().from(dart.map()))); | 
| +    expect$.Expect.isTrue(MapOfString$int().is(dart.map({}, core.String, core.int))); | 
| +    expect$.Expect.isTrue(MapOfString$int().is(const$ || (const$ = dart.const(dart.map({}, core.String, core.int))))); | 
| +    hash_map2_test.testMap(dart.fn(() => collection.HashMap.new(), VoidToHashMap()), dart.fn(m => collection.HashMap.from(m), MapToHashMap())); | 
| +    hash_map2_test.testMap(dart.fn(() => collection.LinkedHashMap.new(), VoidToLinkedHashMap()), dart.fn(m => collection.LinkedHashMap.from(m), MapToLinkedHashMap())); | 
| +  }; | 
| +  dart.fn(hash_map2_test.main, VoidTovoid()); | 
| +  hash_map2_test.BadHashCode = class BadHashCode extends core.Object { | 
| +    new() { | 
| +      this.id = (() => { | 
| +        let x = hash_map2_test.BadHashCode.idCounter; | 
| +        hash_map2_test.BadHashCode.idCounter = dart.notNull(x) + 1; | 
| +        return x; | 
| +      })(); | 
| +    } | 
| +    get hashCode() { | 
| +      return 42; | 
| +    } | 
| +  }; | 
| +  dart.setSignature(hash_map2_test.BadHashCode, { | 
| +    constructors: () => ({new: dart.definiteFunctionType(hash_map2_test.BadHashCode, [])}) | 
| +  }); | 
| +  hash_map2_test.BadHashCode.idCounter = 0; | 
| +  // Exports: | 
| +  exports.hash_map2_test = hash_map2_test; | 
| +}); | 
|  |