// Copyright (c) 2013, 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 general expression as keys in map literals.

library map_literal5_test;

import "package:expect/expect.dart";

void main() {
  test(true);
  test(false);
}

void test(bool b) {
  var m = create(b);
  Expect.equals(b, m.containsKey(true));
  Expect.equals(b, m.containsKey(2));
  Expect.equals(b, m.containsKey(1));
  Expect.equals(!b, m.containsKey(false));
  Expect.equals(!b, m.containsKey("bar"));
  Expect.equals(!b, m.containsKey("foo"));
  if (b) {
    Expect.equals(0, m[true]);
    Expect.equals(3, m[2]);
    Expect.equals(2, m[1]);
  } else {
    Expect.equals(0, m[false]);
    Expect.equals("baz", m["bar"]);
    Expect.equals(2, m["foo"]);
  }
}

Map create(bool b) {
  return {
    b: 0,
    m(b): n(b),
    b ? 1 : "foo": 2,
  };
}

Object m(bool b) => b ? 2 : "bar";
Object n(bool b) => b ? 3 : "baz";
