// Copyright (c) 2018, 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.

/// This file contains tests of assertions when assertions are _disabled_. The
/// file 'assert_message_throw_ea.dart' contains similar tests for when
/// assertions are _enabled_.

/*member: main:[null|powerset={null}]*/
main(/*[null|subclass=Object|powerset={null}{IN}{GFUO}{IMN}]*/ args) {
  test0();
  test1(args == null);
  test2(args == null);
  test3(args);
}

// Check that `throw` in the message is handled conditionally.
/*member: test0:Container([exact=JSExtendableArray|powerset={I}{G}{M}], element: [empty|powerset=empty], length: 0, powerset: {I}{G}{M})*/
test0() {
  assert(true, throw "unreachable");
  var list = [];
  return list;
}

// Check that side-effects of the assert message is not included after the
// assert.
/*member: test1:[null|powerset={null}]*/
test1(/*[exact=JSBool|powerset={I}{O}{N}]*/ b) {
  var a;
  assert(b, a = 42);
  return a;
}

// Check that side-effects of the assert message is included after the assert
// through the thrown exception.
/*member: test2:[null|powerset={null}]*/
test2(/*[exact=JSBool|powerset={I}{O}{N}]*/ b) {
  var a;
  try {
    assert(b, a = 42);
  } catch (e) {}
  return a;
}

// Check that type tests are preserved after the assert.
/*member: test3:[null|subclass=Object|powerset={null}{IN}{GFUO}{IMN}]*/
test3(/*[null|subclass=Object|powerset={null}{IN}{GFUO}{IMN}]*/ a) {
  assert(a is int);
  return a;
}
