/*
 * 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 constant variable must be initialized to a compile-time 
 * constant or a compile-time error occurs.
 * @description Checks that constant variables should be initialized to
 * a compile-time constant.
 * @author msyabro
 */
import "../../Utils/expect.dart";

import "dart:math" as Math;

class Foo {
  const Foo();
}

const int i = -100;
const bool b = false;
const String s = "string";
const double pi = Math.pi;
const Foo foo = const Foo();
const List<int> l = const [0, 1, 2, 3];
const Map<String, int> m = const {'a': 1, 'b': 2};
const bool bOr = true || false;
const int iPlus = 5 + i;

main() {
  Expect.identical(-100,  i);
  Expect.identical(false,  b);
  Expect.identical("string",  s);
  Expect.identical(Math.pi,  pi);
  Expect.identical(const Foo(),  foo);
  Expect.identical(const [0, 1, 2, 3],  l);
  Expect.identical(const {'a': 1, 'b': 2},  m);
  Expect.identical(true || false,  bOr);
  Expect.identical(-95,  iPlus);
}
