// 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.
// SharedOptions=--assert-message

import "package:expect/expect.dart";

@AssumeDynamic() @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('constant function', () { assert(() => false, 'Mumble'); });
}

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

test4() {
  testFalse('variable function',
      () { 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 checkedMode {
  bool b = false;
  assert((b = true));
  return b;
}

main() {
  if (!checkedMode) return;

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