// 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.

import "package:expect/expect.dart";

// Test that 'identical(a,b)' is a compile-time constant.

class C {
  final x;
  const C(this.x);
  static f3(){}
  static f4(){}
}

const i1 = 1;
const i2 = 2;
const d1 = 1.5;
const d2 = 2.5;
const b1 = true;
const b2 = false;
const s1 = "1";
const s2 = "2";
const l1 = const [1,2];
const l2 = const [2,3];
const m1 = const {"x": 1};
const m2 = const {"x": 2};
const c1 = const C(1);
const c2 = const C(2);
f1(){}
f2(){}
const id = identical;

class CT {
  final x1;
  final x2;
  bool id;
  const CT(var x1, var x2)
      : this.x1 = x1, this.x2 = x2, this.id = identical(x1, x2);
  void test(void expect(a,b), name) {
    expect(id, "$name: identical($x1,$x2)");
  }
}

const trueTests = const [
  const CT(2 - 1, i1),
  const CT(1 + 1, i2),
  const CT(2.5 - 1.0, d1),
  const CT(1.5 + 1.0, d2),
  const CT(false || true, b1),
  const CT(true && false, b2),
  const CT('$i1', s1),
  const CT('$i2', s2),
  const CT(const [i1, 2], l1),
  const CT(const [i2, 3], l2),
  const CT(const {"x": i1}, m1),
  const CT(const {"x": i2}, m2),
  const CT(const C(i1), c1),
  const CT(const C(i2), c2),
  const CT(f1, f1),
  const CT(f2, f2),
  const CT(C.f3, C.f3),
  const CT(C.f4, C.f4),
  const CT(id, identical),
];

const falseTests = const [
  const CT(i1, i2),
  const CT(d1, d2),
  const CT(b1, b2),
  const CT(s1, s2),
  const CT(l1, l2),
  const CT(m1, m2),
  const CT(c1, c2),
  const CT(f1, f2),
  const CT(i1, d1),
  const CT(d1, b1),
  const CT(b1, s1),
  const CT(s1, l1),
  const CT(l1, m1),
  const CT(m1, c1),
  const CT(c1, f1),
  const CT(f1, C.f3),
  const CT(C.f3, identical),
  const CT(identical, i1),
];

// Not a constant if it's not written 'identical'.
const idtest = id(i1, i2);  /// 01: compile-time error

// Not a constant if aliased? (Current interpretation, waiting for
// confirmation).
class T {                                     /// 02: compile-time error
  static const identical = id;                /// 02: continued
  static const idtest2 = identical(i1, i2);   /// 02: continued
}                                             /// 02: continued

main() {
  for (int i = 0; i < trueTests.length; i++) {
    trueTests[i].test(Expect.isTrue, "true[$i]");
  }
  for (int i = 0; i < falseTests.length; i++) {
    falseTests[i].test(Expect.isFalse, "false[$i]");
  }

  var x = idtest;  /// 01: continued
  var x = T.idtest2;  /// 02: continued
}

