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

// VMOptions=--assert_initializer
import "package:expect/expect.dart";

bool assertsEnabled = false;

main() {
  assert((assertsEnabled = true));
  runtimeAsserts();  /// none: ok

  // Passing const expressions.
  const c00 = const AssertArgument.constFirst(true, 0, 1);
  const c01 = const AssertArgument.constLast(true, 0, 1);
  const c02 = const AssertArgument.constMiddle(true, 0, 1);
  const c03 = const AssertArgument.constMulti(true, 0, 1);
  const c04 = const AssertArgument.constFirstSuper(true, 0, 1);
  const c05 = const AssertArgument.constLastSuper(true, 0, 1);
  const c06 = const AssertArgument.constMiddleSuper(true, 0, 1);
  const c07 = const AssertArgument.constMultiSuper(true, 0, 1);

  const c08 = const AssertCompare.constFirst(1, 2);
  const c09 = const AssertCompare.constLast(1, 2);
  const c10 = const AssertCompare.constMiddle(1, 2);
  const c11 = const AssertCompare.constMulti(1, 2);
  const c12 = const AssertCompare.constFirstSuper(1, 2);
  const c13 = const AssertCompare.constLastSuper(1, 2);
  const c14 = const AssertCompare.constMiddleSuper(1, 2);
  const c15 = const AssertCompare.constMultiSuper(1, 2);

  // Failing const expressions

  const c = const AssertArgument.constFirst(false, 0, 1);       /// 01: compile-time error
  const c = const AssertArgument.constLast(false, 0, 1);        /// 02: compile-time error
  const c = const AssertArgument.constMiddle(false, 0, 1);      /// 03: compile-time error
  const c = const AssertArgument.constMulti(false, 0, 1);       /// 04: compile-time error
  const c = const AssertArgument.constFirstSuper(false, 0, 1);  /// 05: compile-time error
  const c = const AssertArgument.constLastSuper(false, 0, 1);   /// 06: compile-time error
  const c = const AssertArgument.constMiddleSuper(false, 0, 1); /// 07: compile-time error
  const c = const AssertArgument.constMultiSuper(false, 0, 1);  /// 08: compile-time error

  const c = const AssertArgument.constFirst("str", 0, 1);       /// 11: compile-time error
  const c = const AssertArgument.constLast("str", 0, 1);        /// 12: compile-time error
  const c = const AssertArgument.constMiddle("str", 0, 1);      /// 13: compile-time error
  const c = const AssertArgument.constMulti("str", 0, 1);       /// 14: compile-time error
  const c = const AssertArgument.constFirstSuper("str", 0, 1);  /// 15: compile-time error
  const c = const AssertArgument.constLastSuper("str", 0, 1);   /// 16: compile-time error
  const c = const AssertArgument.constMiddleSuper("str", 0, 1); /// 17: compile-time error
  const c = const AssertArgument.constMultiSuper("str", 0, 1);  /// 18: compile-time error

  const c = const AssertCompare.constFirst(3, 2);               /// 21: compile-time error
  const c = const AssertCompare.constLast(3, 2);                /// 22: compile-time error
  const c = const AssertCompare.constMiddle(3, 2);              /// 23: compile-time error
  const c = const AssertCompare.constMulti(3, 2);               /// 24: compile-time error
  const c = const AssertCompare.constFirstSuper(3, 2);          /// 25: compile-time error
  const c = const AssertCompare.constLastSuper(3, 2);           /// 26: compile-time error
  const c = const AssertCompare.constMiddleSuper(3, 2);         /// 27: compile-time error
  const c = const AssertCompare.constMultiSuper(3, 2);          /// 28: compile-time error

  // Functions not allowed in asserts in const execution.
  const c = const AssertArgument.constFirst(kTrue, 0, 1);       /// 31: compile-time error
  const c = const AssertArgument.constLast(kTrue, 0, 1);        /// 32: compile-time error
  const c = const AssertArgument.constMiddle(kTrue, 0, 1);      /// 33: compile-time error
  const c = const AssertArgument.constMulti(kTrue, 0, 1);       /// 34: compile-time error
  const c = const AssertArgument.constFirstSuper(kTrue, 0, 1);  /// 35: compile-time error
  const c = const AssertArgument.constLastSuper(kTrue, 0, 1);   /// 36: compile-time error
  const c = const AssertArgument.constMiddleSuper(kTrue, 0, 1); /// 37: compile-time error
  const c = const AssertArgument.constMultiSuper(kTrue, 0, 1);  /// 38: compile-time error

  const cTrue = const TrickCompare(true);
  // Value must be integer for potential-const expression to be actually const.
  const c = const AssertCompare.constFirst(cTrue, 2);           /// 41: compile-time error
  const c = const AssertCompare.constLast(cTrue, 2);            /// 42: compile-time error
  const c = const AssertCompare.constMiddle(cTrue, 2);          /// 43: compile-time error
  const c = const AssertCompare.constMulti(cTrue, 2);           /// 44: compile-time error
  const c = const AssertCompare.constFirstSuper(cTrue, 2);      /// 45: compile-time error
  const c = const AssertCompare.constLastSuper(cTrue, 2);       /// 46: compile-time error
  const c = const AssertCompare.constMiddleSuper(cTrue, 2);     /// 47: compile-time error
  const c = const AssertCompare.constMultiSuper(cTrue, 2);      /// 48: compile-time error
}


void runtimeAsserts() {

  testAssertArgumentCombinations(value, test, [testConst]) {
    test(() => new AssertArgument.first(value, 0, 1));
    test(() => new AssertArgument.last(value, 0, 1));
    test(() => new AssertArgument.middle(value, 0, 1));
    test(() => new AssertArgument.multi(value, 0, 1));
    test(() => new AssertArgument.firstSuper(value, 0, 1));
    test(() => new AssertArgument.lastSuper(value, 0, 1));
    test(() => new AssertArgument.middleSuper(value, 0, 1));
    test(() => new AssertArgument.multiSuper(value, 0, 1));
    testConst ??= test;
    testConst(() => new AssertArgument.constFirst(value, 0, 1));
    testConst(() => new AssertArgument.constLast(value, 0, 1));
    testConst(() => new AssertArgument.constMiddle(value, 0, 1));
    testConst(() => new AssertArgument.constMulti(value, 0, 1));
    testConst(() => new AssertArgument.constFirstSuper(value, 0, 1));
    testConst(() => new AssertArgument.constLastSuper(value, 0, 1));
    testConst(() => new AssertArgument.constMiddleSuper(value, 0, 1));
    testConst(() => new AssertArgument.constMultiSuper(value, 0, 1));
  }

  testAssertCompareCombinations(v1, v2, test, [testConst]) {
    test(() => new AssertCompare.first(v1, v2));
    test(() => new AssertCompare.last(v1, v2));
    test(() => new AssertCompare.middle(v1, v2));
    test(() => new AssertCompare.multi(v1, v2));
    test(() => new AssertCompare.firstSuper(v1, v2));
    test(() => new AssertCompare.lastSuper(v1, v2));
    test(() => new AssertCompare.middleSuper(v1, v2));
    test(() => new AssertCompare.multiSuper(v1, v2));
    testConst ??= test;
    testConst(() => new AssertCompare.constFirst(v1, v2));
    testConst(() => new AssertCompare.constLast(v1, v2));
    testConst(() => new AssertCompare.constMiddle(v1, v2));
    testConst(() => new AssertCompare.constMulti(v1, v2));
    testConst(() => new AssertCompare.constFirstSuper(v1, v2));
    testConst(() => new AssertCompare.constLastSuper(v1, v2));
    testConst(() => new AssertCompare.constMiddleSuper(v1, v2));
    testConst(() => new AssertCompare.constMultiSuper(v1, v2));
  }

  testAssertArgumentCombinations(true, pass);
  testAssertArgumentCombinations(kTrue, pass, failType);
  testAssertArgumentCombinations(false, failAssert);
  testAssertArgumentCombinations(kFalse, failAssert, failType);
  testAssertArgumentCombinations(42, failType);
  testAssertArgumentCombinations(null, failAssert);

  testAssertCompareCombinations(1, 2, pass);
  testAssertCompareCombinations(3, 2, failAssert);
  var TrickCompareInt = const TrickCompare(42);
  testAssertCompareCombinations(TrickCompareInt, 0, failType);
  var TrickCompareTrueFun = const TrickCompare(kTrue);
  testAssertCompareCombinations(TrickCompareTrueFun, 0, pass, failType);
  var TrickCompareFalseFun = const TrickCompare(kFalse);
  testAssertCompareCombinations(TrickCompareFalseFun, 0, failAssert, failType);
}


void pass(void action()) {
  action();
}

void failAssert(void action()) {
  if (assertsEnabled) {
    Expect.throws(action, (e) => e is AssertionError && e is! TypeError);
  } else {
    action();
  }
}

void failType(void action()) {
  if (assertsEnabled) {
    Expect.throws(action, (e) => e is TypeError);
  } else {
    action();
  }
}

bool kTrue() => true;
bool kFalse() => false;

class AssertArgument {
  final y;
  final z;
  AssertArgument.first(x, y, z) : assert(x), y = y, z = z;
  AssertArgument.last(x, y, z) : y = y, z = z, assert(x);
  AssertArgument.middle(x, y, z) : y = y, assert(x), z = z;
  AssertArgument.multi(x, y, z)
      : assert(x), y = y, assert(x), z = z, assert(x);
  AssertArgument.firstSuper(x, y, z) : assert(x), y = y, z = z, super();
  AssertArgument.lastSuper(x, y, z) : y = y, z = z, assert(x), super();
  AssertArgument.middleSuper(x, y, z) : y = y, assert(x), z = z, super();
  AssertArgument.multiSuper(x, y, z)
      : assert(x), y = y, assert(x), z = z, assert(x), super();
  const AssertArgument.constFirst(x, y, z) : assert(x), y = y, z = z;
  const AssertArgument.constLast(x, y, z) : y = y, z = z, assert(x);
  const AssertArgument.constMiddle(x, y, z) : y = y, assert(x), z = z;
  const AssertArgument.constMulti(x, y, z)
      : assert(x), y = y, assert(x), z = z, assert(x);
  const AssertArgument.constFirstSuper(x, y, z)
      : assert(x), y = y, z = z, super();
  const AssertArgument.constLastSuper(x, y, z)
      : y = y, z = z, assert(x), super();
  const AssertArgument.constMiddleSuper(x, y, z)
      : y = y, assert(x), z = z, super();
  const AssertArgument.constMultiSuper(x, y, z)
      : assert(x), y = y, assert(x), z = z, assert(x), super();
}

class AssertCompare {
  final y;
  final z;
  AssertCompare.first(y, z) : assert(y < z), y = y, z = z;
  AssertCompare.last(y, z) : y = y, z = z, assert(y < z);
  AssertCompare.middle(y, z) : y = y, assert(y < z), z = z;
  AssertCompare.multi(y, z)
      : assert(y < z), y = y, assert(y < z), z = z, assert(y < z);
  AssertCompare.firstSuper(y, z) : assert(y < z), y = y, z = z, super();
  AssertCompare.lastSuper(y, z) : y = y, z = z, assert(y < z), super();
  AssertCompare.middleSuper(y, z) : y = y, assert(y < z), z = z, super();
  AssertCompare.multiSuper(y, z)
      : assert(y < z), y = y, assert(y < z), z = z, assert(y < z), super();
  const AssertCompare.constFirst(y, z) : assert(y < z), y = y, z = z;
  const AssertCompare.constLast(y, z) : y = y, z = z, assert(y < z);
  const AssertCompare.constMiddle(y, z) : y = y, assert(y < z), z = z;
  const AssertCompare.constMulti(y, z)
      : assert(y < z), y = y, assert(y < z), z = z, assert(y < z);
  const AssertCompare.constFirstSuper(y, z)
      : assert(y < z), y = y, z = z, super();
  const AssertCompare.constLastSuper(y, z)
      : y = y, z = z, assert(y < z), super();
  const AssertCompare.constMiddleSuper(y, z)
      : y = y, assert(y < z), z = z, super();
  const AssertCompare.constMultiSuper(y, z)
      : assert(y < z), y = y, assert(y < z), z = z, assert(y < z), super();
}

class TrickCompare {
  final result;
  const TrickCompare(this.result);
  operator<(other) => result;  // Nyah-nyah!
}
