// Copyright (c) 2016, 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";

main() {
  var assertsEnabled = false;
  assert((assertsEnabled = true));
  if (!assertsEnabled) return;

  // TODO(rnystrom): Test cases where the first argument to assert() is a
  // function.

  testAssertFails();
  testAssertDoesNotFail();
  testNullMessage();
  testDoesNotEvaluateMessageIfAssertSucceeds();
  testMessageExpressionThatThrows();
  testCallsToStringOnMessageLazily();
}

/// A class with a custom toString() that tracks when it is called.
class ToString {
  bool calledToString = false;

  String toString() {
    calledToString = true;
    return "toString!";
  }
}

testAssertFails() {
  try {
    assert(false, "Oops");
    Expect.fail("Assert should throw.");
  } catch (e) {
    Expect.isTrue(e.toString().contains("Oops"));
  }
}

testAssertDoesNotFail() {
  try {
    assert(true, "Oops");
  } catch (e) {
    Expect.fail("Assert should not throw.");
  }
}

testNullMessage() {
  try {
    assert(false, null);
    Expect.fail("Assert should throw.");
  } catch (e) {
    Expect.isTrue(e.toString().contains("null"));
  }
}

testDoesNotEvaluateMessageIfAssertSucceeds() {
  try {
    var evaluated = false;
    assert(true, evaluated = true);
    Expect.isFalse(evaluated);
  } catch (e) {
    Expect.fail("Assert should not throw.");
  }
}

testMessageExpressionThatThrows() {
  try {
    assert(false, throw "dang");
    Expect.fail("Should throw");
  } catch (e) {
    Expect.equals(e, "dang");
  }
}

testCallsToStringOnMessageLazily() {
  var toString = new ToString();
  try {
    assert(false, toString);
    Expect.fail("Assert should throw.");
  } catch (e) {
    Expect.isFalse(toString.calledToString);
    Expect.isTrue(e.toString().contains("toString!"));
    Expect.isTrue(toString.calledToString);
  }
}
