| // Copyright (c) 2021, 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 | 
 |  | 
 | // Test the use of `null` keys in const maps. In versions before 2.12, when | 
 | // nullable types were introduced, types were nullable so it was legal to have | 
 | // `null` keys in maps. | 
 |  | 
 | library map_literal15_test; | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | void test1() { | 
 |   var m1 = const <String, int>{null: 10, 'null': 20}; | 
 |   Expect.isTrue(m1.containsKey(null)); | 
 |   Expect.isTrue(m1.containsKey(undefined())); | 
 |   Expect.equals(10, m1[null]); | 
 |   Expect.equals(10, m1[undefined()]); | 
 |   Expect.isTrue(m1.containsKey('null')); | 
 |   Expect.equals(20, m1['null']); | 
 |   // The '.keys' carry the 'String' type | 
 |   Expect.type<Iterable<String>>(m1.keys); | 
 |   Expect.type<Iterable<Comparable>>(m1.keys); | 
 |   Expect.notType<Iterable<int>>(m1.keys); | 
 | } | 
 |  | 
 | void test2() { | 
 |   var m2 = const <Comparable, int>{null: 10, 'null': 20}; | 
 |   Expect.isTrue(m2.containsKey(null)); | 
 |   Expect.isTrue(m2.containsKey(undefined())); | 
 |   Expect.equals(10, m2[null]); | 
 |   Expect.equals(10, m2[undefined()]); | 
 |   Expect.isTrue(m2.containsKey('null')); | 
 |   Expect.equals(20, m2['null']); | 
 |   // The '.keys' carry the 'Comparable' type | 
 |   Expect.notType<Iterable<String>>(m2.keys); | 
 |   Expect.type<Iterable<Comparable>>(m2.keys); | 
 |   Expect.notType<Iterable<int>>(m2.keys); | 
 | } | 
 |  | 
 | main() { | 
 |   test1(); | 
 |   test2(); | 
 | } | 
 |  | 
 | // Calling `undefined()` gives us a `null` that is implemented as JavaScript | 
 | // `undefined` on dart2js. | 
 | @pragma('dart2js:noInline') | 
 | dynamic get undefined => _undefined; | 
 |  | 
 | @pragma('dart2js:noInline') | 
 | void _undefined() {} |