blob: e56b62186a3802dfa3331e64800fe2bf040c3899 [file] [log] [blame]
// 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.
// @dart = 2.9
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?)');
}