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

@pragma('dart2js:assumeDynamic')
@pragma('dart2js:noInline')
confuse(x) => x;

testFalse(name, fault) {
  try {
    fault();
  } catch (e) {
    Expect.isTrue(e is AssertionError, '$name: is AssertionError');
    Expect.isTrue('$e'.contains('Mumble'), '$name: <<$e>> contains "Mumble"');
    return;
  }
  Expect.fail('Expected assert to throw');
}

test1() {
  testFalse('constant false', () {
    assert(false, 'Mumble');
  });
}

test2() {
  testFalse('variable false', () {
    assert(confuse(false), 'Mumble');
  });
}

testTypeErrors() {
  check(name, fault) {
    try {
      fault();
    } catch (e) {
      Expect.isTrue(
          e is TypeError, 'name: <<$e>> (${e.runtimeType}) is TypeError');
      return;
    }
    Expect.fail('Expected assert to throw');
  }

  check('constant type error', () {
    assert(null, 'Mumble');
  });
  check('variable type error', () {
    assert(confuse(null), 'Mumble');
  });
  check('function type error', () {
    assert(confuse(() => null), 'Mumble');
  });
}

testMessageEffect1() {
  var v = 1;
  // Message is not evaluated on succeeding assert.
  assert(confuse(true), '${v = 123}');
  Expect.equals(1, v);
}

testMessageEffect2() {
  var v = 1;
  try {
    // Message is evaluated to produce AssertionError argument on failing
    // assert.
    assert(confuse(false), '${v = 123}');
  } catch (e) {
    Expect.equals(123, v);
    Expect.isTrue('$e'.contains('123'), '<<$e>> contains "123"');
    return;
  }
  Expect.fail('Expected assert to throw');
}

testMessageEffect3() {
  var v = 1;
  try {
    // Message is evaluated to produce AssertionError argument on failing
    // assert.
    assert(confuse(() => ++v > 100), '${++v}');
  } catch (e) {
    Expect.equals(3, v);
    Expect.isTrue('$e'.contains('3'), '<<$e>> contains "3"');
    return;
  }
  Expect.fail('Expected assert to throw');
}

bool get assertionsEnabled {
  bool b = false;
  assert((b = true));
  return b;
}

main() {
  if (!assertionsEnabled) return;

  test1();
  test2();
  testTypeErrors();
  testMessageEffect1();
  testMessageEffect2();
  testMessageEffect3();
}
