| // Copyright (c) 2019, 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. | 
 |  | 
 | import 'dart:collection'; | 
 | import 'package:expect/expect.dart'; | 
 |  | 
 | main() { | 
 |   // Regression test for https://github.com/dart-lang/sdk/issues/36052. | 
 |   // JS compilers shouldn't produce `undefined` when a Map/Set key is not found. | 
 |   testMap({}); | 
 |   testMap(Map.identity()); | 
 |   testMap(LinkedHashMap( | 
 |       equals: (x, y) => x == y, | 
 |       hashCode: (x) => x.hashCode, | 
 |       isValidKey: (_) => true)); | 
 |  | 
 |   testSet(Set()); | 
 |   testSet(Set.identity()); | 
 |   testSet(LinkedHashSet( | 
 |       equals: (x, y) => x == y, | 
 |       hashCode: (x) => x.hashCode, | 
 |       isValidKey: (_) => true)); | 
 | } | 
 |  | 
 | testMap(Map<Object, Object?> map) { | 
 |   var t = map.runtimeType.toString(); | 
 |   var s = ' (length ${map.length})'; | 
 |   checkUndefined('$t.[]$s', map['hi']); | 
 |   checkUndefined('$t.putIfAbsent$s', map.putIfAbsent('hi', () {})); | 
 |   checkUndefined('$t.remove$s', map.remove('hi')); | 
 |   if (map.isEmpty) { | 
 |     map['hello'] = 'there'; | 
 |     testMap(map); | 
 |   } | 
 | } | 
 |  | 
 | testSet(Set<Object> set) { | 
 |   var t = set.runtimeType.toString(); | 
 |   var s = ' (length ${set.length})'; | 
 |   checkUndefined('$t.lookup$s', set.lookup('hi')); | 
 |   if (set.isEmpty) { | 
 |     set.add('hello'); | 
 |     testSet(set); | 
 |   } | 
 | } | 
 |  | 
 | /// Fails if [x] incorrectly uses the default argument instead of being `null` | 
 | /// (i.e. because `x` is undefined). | 
 | checkUndefined(String method, [Object? x = 'error']) { | 
 |   // TODO(jmesserly): this check is specific to implementation details of DDC's | 
 |   // current calling conventions. These conventions may change. | 
 |   // Ideally we'd have an `undefined` constant in "package:js" and use that | 
 |   // here instead. | 
 |   Expect.isNull(x, | 
 |       'error in $method: result treated as missing argument (JS undefined?)'); | 
 | } |