// Copyright (c) 2012, 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 "package:expect/expect.dart";

const m1 = const {'__proto__': 400 + 99};
const m2 = const {'a': 499, 'b': 42};
const m3 = const {'__proto__': 499};

main() {
  Expect.equals(499, m1['__proto__']);
  Expect.equals(null, m1['b']);
  Expect.listEquals(['__proto__'], m1.keys.toList());
  Expect.listEquals([499], m1.values.toList());
  Expect.isTrue(m1.containsKey('__proto__'));
  Expect.isFalse(m1.containsKey('toString'));
  Expect.isTrue(m1.containsValue(499));
  Expect.isFalse(m1.containsValue(null));
  var seenKeys = [];
  var seenValues = [];
  m1.forEach((key, value) {
    seenKeys.add(key);
    seenValues.add(value);
  });
  Expect.listEquals(['__proto__'], seenKeys);
  Expect.listEquals([499], seenValues);
  Expect.isFalse(m1.isEmpty);
  Expect.equals(1, m1.length);
  Expect.throwsUnsupportedError(() => m1.remove('__proto__'));
  Expect.throwsUnsupportedError(() => m1.remove('b'));
  Expect.throwsUnsupportedError(() => m1.clear());
  Expect.throwsUnsupportedError(() => m1['b'] = 42);
  Expect.throwsUnsupportedError(() => m1['__proto__'] = 499);
  Expect.throwsUnsupportedError(() => m1.putIfAbsent('__proto__', () => 499));
  Expect.throwsUnsupportedError(() => m1.putIfAbsent('z', () => 499));

  Expect.equals(499, m2['a']);
  Expect.equals(42, m2['b']);
  Expect.equals(null, m2['c']);
  Expect.equals(null, m2['__proto__']);
  Expect.listEquals(['a', 'b'], m2.keys.toList());
  Expect.listEquals([499, 42], m2.values.toList());
  Expect.isTrue(m2.containsKey('a'));
  Expect.isTrue(m2.containsKey('b'));
  Expect.isFalse(m2.containsKey('toString'));
  Expect.isFalse(m2.containsKey('__proto__'));
  Expect.isTrue(m2.containsValue(499));
  Expect.isTrue(m2.containsValue(42));
  Expect.isFalse(m2.containsValue(null));
  seenKeys = [];
  seenValues = [];
  m2.forEach((key, value) {
    seenKeys.add(key);
    seenValues.add(value);
  });
  Expect.listEquals(['a', 'b'], seenKeys);
  Expect.listEquals([499, 42], seenValues);
  Expect.isFalse(m2.isEmpty);
  Expect.equals(2, m2.length);
  Expect.throwsUnsupportedError(() => m2.remove('a'));
  Expect.throwsUnsupportedError(() => m2.remove('b'));
  Expect.throwsUnsupportedError(() => m2.remove('__proto__'));
  Expect.throwsUnsupportedError(() => m2.clear());
  Expect.throwsUnsupportedError(() => m2['a'] = 499);
  Expect.throwsUnsupportedError(() => m2['b'] = 42);
  Expect.throwsUnsupportedError(() => m2['__proto__'] = 499);
  Expect.throwsUnsupportedError(() => m2.putIfAbsent('a', () => 499));
  Expect.throwsUnsupportedError(() => m2.putIfAbsent('__proto__', () => 499));
  Expect.throwsUnsupportedError(() => m2['a'] = 499);

  Expect.isTrue(identical(m1, m3));
}
