// Copyright (c) 2011, 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.

/// @assertion A map literal denotes a map object.
/// mapLiteral:
///   const? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)?
///   '}'
/// ;
/// mapLiteralEntry:
///   expression ':' expression
/// ;
/// A map literal consists of zero or more entries. Each entry has a key and a
/// value. Each key and each value is denoted by an expression.
/// @description Checks that various map keys don't produce a compile-time
/// errors.
/// @author msyabro

topFunc() {}

class S {
  const S();
}

class Test  {
  method() {}
  var id;

  expressions() {
    Map x;
    x = {};

    x = {"1": 1, "2": true, "3": null, "4": ""};
    x = {"map": {"1": 1, "2": 2}, "list": []};

    x = {"": () {}, "f": () => 1, "g": (p1) {return p1;}};

    x = {"top-level": topFunc(), "method": this.method()};

    x = {"assignment": id = 1, "compound": id *= 1};

    x = {"==": id == 1, "===": identical(1, 2), "!=": true != false};

    x = {">": 1 > 2, ">=": 3 >= 3, "<=": 0 <= 4, "<": id < 1};

    x = {"||": true || false, "&&": false && false};

    x = {"|": 20 | 0, "&": 7 & 2, "^": 1 ^ 1};

    x = {"+": 1e7 + 1e-7, "-": 7 - 100e-100};

    x = {"*": 2 * 3, "/": 0 / 1, "%": 5 % 1, "~/": .5 ~/ 2};

    x = {"conditional": 1 + 2 > 3 ? [] : 1 < 3 ? {} : () {}};

    x = {"this": this, "new": new Test()};

    x = {"class": const S(), "map": const {}, "list": const [1]};

    x = {"<<": 1 << 1, ">>": 10 >> 2};

    x = {">>>": 1 >>> 1, 1222 >>> 10: 14};

    x = {"-": -1, "!": !true, "~": ~id};

    x = {"++": id++, "--": --id};

    x = {"is bool": true is bool, "is not int": false is! int};

    x = {5: true, 6: false};

    x = {1+5: true, 1+6: false};
  }

  constants() {
    var x;
    x = const {};

    x = const <String, int>{"key1": 1, "key2": 2 + 2};
    x = const <String, String>{"1": "2", "3": "4"};
    x = const <String, List>{"l1": const [], "l2": const [1, 2, 3]};
    x = const <String, Map>{"" : const {}};
    x = const {"int": 1, "bool" : true, "S": const S(), "list": const []};
  }

  typeVariables() {
    var x;
    x = <String, int>{"key": 1};
    x = <String, String>{"key": "value"};
    x = <String, bool>{"key": true};
    x = <String, Test>{"key": new Test()};
    x = <String, Function>{"key": () {}};
  }

  endsWithComma() {
    var x1 = {"1": 2,};
    var x2 = const {"1": true, "2": false,};
    var x3 = <String, int>{"key": 1,};
  }

  interpolation() {
    var x = 1;
    var y = true;
    var z = new Object();
    var map;

    map = <String, int>{"variable $x" : 1, "${x + 1}": 2};
    map = <String, bool>{"variable $y": true, "${y && false}": false};
    map = <String, Object>{"variable $z": new Object()};
  }

}

main() {
  Test t = new Test();
  t.expressions();
  t.constants();
  t.typeVariables();
  t.endsWithComma();
  t.interpolation();
}
