// Copyright (c) 2017, 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.
// VMOptions=--assert_initializer
//
// Dart test program testing assert statements.

import "package:expect/expect.dart";

class C {
  static bool check(x, y) => x < y;
  static bool staticTrue() => true;
  final int x;
  const C(this.x);

  C.c01(this.x, y) : assert(x < y);
  C.c02(x, y) : x = x, assert(x < y);
  C.c03(x, y) : assert(x < y), x = x;
  C.c04(this.x, y) : super(), assert(x < y);
  C.c05(this.x, y) : assert(x < y), super();
  C.c06(x, y) : x = x, super(), assert(x < y);
  C.c07(x, y) : assert(x < y), super(), x = x;
  C.c08(x, y) : assert(x < y), super(), x = x, assert(y > x);
  C.c09(this.x, y) : assert(x < y, "$x < $y");
  C.c10(this.x, y) : assert(x < y,);
  C.c11(this.x, y) : assert(x < y, "$x < $y",);

  const C.cc01(this.x, y) : assert(x < y);
  const C.cc02(x, y) : x = x, assert(x < y);
  const C.cc03(x, y) : assert(x < y), x = x;
  const C.cc04(this.x, y) : super(), assert(x < y);
  const C.cc05(this.x, y) : assert(x < y), super();
  const C.cc06(x, y) : x = x, super(), assert(x < y);
  const C.cc07(x, y) : assert(x < y), super(), x = x;
  const C.cc08(x, y) : assert(x < y), super(), x = x, assert(y > x);
  const C.cc09(this.x, y) : assert(x < y, "$x < $y");
  const C.cc10(this.x, y) : assert(x < y,);
  const C.cc11(this.x, y) : assert(x < y, "$x < $y",);

  C.nc01(this.x, y) : assert(check(x, y));
  C.nc02(x, y) : x = x, assert(check(x, y));
  C.nc03(x, y) : assert(check(x, y)), x = x;
  C.nc04(this.x, y) : super(), assert(check(x, y));
  C.nc05(this.x, y) : assert(check(x, y)), super();
  C.nc06(x, y) : x = x, super(), assert(check(x, y));
  C.nc07(x, y) : assert(check(x, y)), super(), x = x;
  C.nc08(x, y) : assert(check(x, y)), super(), x = x, assert(y > x);
  C.nc09(this.x, y) : assert(check(x, y), "$x < $y");
  C.nc10(this.x, y) : assert(check(x, y),);
  C.nc11(this.x, y) : assert(check(x, y), "$x < $y",);
}


main() {
  // Test all constructors with both succeeding and failing asserts.
  test(1, 2);
  test(2, 1);

  const c1 = const C(1);

  // Asserts do not affect canonization.
  Expect.identical(c1, const C.cc01(1, 2));
  Expect.identical(c1, const C.cc02(1, 2));
  Expect.identical(c1, const C.cc03(1, 2));
  Expect.identical(c1, const C.cc04(1, 2));
  Expect.identical(c1, const C.cc05(1, 2));
  Expect.identical(c1, const C.cc06(1, 2));
  Expect.identical(c1, const C.cc07(1, 2));
  Expect.identical(c1, const C.cc08(1, 2));
  Expect.identical(c1, const C.cc09(1, 2));
  Expect.identical(c1, const C.cc10(1, 2));
  Expect.identical(c1, const C.cc11(1, 2));
}

void test(int x, int y) {
  bool assertionsEnabled = false;
  assert(assertionsEnabled = true);

  bool Function(C Function()) doTest = (assertionsEnabled && x >= y)
    ? (f) { Expect.throws(f, (e) => e is AssertionError); }
    : (f) { Expect.equals(x, f().x); };

  doTest(() => new C.c01(x, y));
  doTest(() => new C.c02(x, y));
  doTest(() => new C.c03(x, y));
  doTest(() => new C.c04(x, y));
  doTest(() => new C.c05(x, y));
  doTest(() => new C.c06(x, y));
  doTest(() => new C.c07(x, y));
  doTest(() => new C.c08(x, y));
  doTest(() => new C.c09(x, y));
  doTest(() => new C.c10(x, y));
  doTest(() => new C.c11(x, y));
  doTest(() => new C.cc01(x, y));
  doTest(() => new C.cc02(x, y));
  doTest(() => new C.cc03(x, y));
  doTest(() => new C.cc04(x, y));
  doTest(() => new C.cc05(x, y));
  doTest(() => new C.cc06(x, y));
  doTest(() => new C.cc07(x, y));
  doTest(() => new C.cc08(x, y));
  doTest(() => new C.cc09(x, y));
  doTest(() => new C.cc10(x, y));
  doTest(() => new C.cc11(x, y));
  doTest(() => new C.nc01(x, y));
  doTest(() => new C.nc02(x, y));
  doTest(() => new C.nc03(x, y));
  doTest(() => new C.nc04(x, y));
  doTest(() => new C.nc05(x, y));
  doTest(() => new C.nc06(x, y));
  doTest(() => new C.nc07(x, y));
  doTest(() => new C.nc08(x, y));
  doTest(() => new C.nc09(x, y));
  doTest(() => new C.nc10(x, y));
  doTest(() => new C.nc11(x, y));
}

