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

// Dart test program to test check that we don't fail to compile when an
// inlinable method contains a throw.

import 'package:expect/expect.dart';

dynamic x = false;

bool? called;

bool callMeTrue() {
  called = true;
  return true;
}

bool callMeFalse() {
  called = true;
  return false;
}

void callMe() {
  called = true;
}

testCallThenThrow(fn) {
  called = false;
  Expect.throws(() => fn());
  Expect.isTrue(called);
}

testCall(fn) {
  called = false;
  fn();
  Expect.isTrue(called);
}

testNoThrow(fn) {
  called = false;
  Expect.throws(() => fn());
  Expect.isFalse(called);
}

kast(x) {
  throw x;
}

ternary(a, b, c) {
  if (x == 2) throw "ternary";
}

hest() => kast("hest");
hest2() {
  return kast("hest2");
}

foo() => true || kast("foo");
bar() => false || kast("foo");
barc() => callMeTrue() || kast("foo");
barCallThrow() => callMeFalse() || kast("foo");
baz(x) => x ? kast("baz") : 0;
bazc() => callMeFalse() ? kast("baz") : 0;
bazCallThrow() => callMeTrue() ? kast("baz") : 0;
fizz(x) => x ? 0 : kast("baz");
fizzc() => callMeTrue() ? 0 : kast("baz");
fizzCallThrow() => callMeFalse() ? 0 : kast("baz");
fuzz() => kast("baz") ? 0 : 1;
farce() => !kast("baz");
unary() => ~(kast("baz"));
boo() {
  callMe();
  x = kast("boo");
}

yo() {
  throw kast("yo");
}

bin() {
  return 5 * kast("bin");
}

binCallThrow() {
  return (callMe() as dynamic) * kast("binct");
}

hoo() {
  x[kast("hoo")] = 0;
  x[kast("hoo")];
  kast("hoo").x = 0;
  kast("hoo").x;
}

switcheroo() {
  switch (kast("switcheroo")) {
    case 0:
      boo();
  }
}

class ThrowConstructor {
  ThrowConstructor()
      : foo = callMeTrue(),
        bar = kast("ThrowConstructor") {
    called = false;
  }

  bool foo;
  var bar;
}

throwConstructor() {
  called = false;
  return new ThrowConstructor();
}

cascade() {
  return []..add(callMeTrue())..add(kast("cascade"));
}

interpole() => "inter${kast('tada!')}pole";
interpoleCallThrow() => "inter${callMeTrue()}...${kast('tada!')}pole";

call1() => ternary(0, kast("call1"), 1);
call2() => ternary(kast("call2"), 0, 1);
call3() => ternary(0, 1, kast("call3"));
call1c() => ternary(callMe() as dynamic, kast("call1"), 1);
call3c() => ternary(callMeTrue(), 1, kast("call3"));
call4c() => ternary(0, callMeTrue(), kast("call3"));

sendSet() {
  var x = kast("sendSet");
}

sendSetCallThrow() {
  var x = callMe() as dynamic, y = kast("sendSet");
}

isSend() => kast("isSend") is int;

vile() {
  while (kast("vile")) {
    callMe();
  }
}

dovile() {
  var x = 0;
  do {
    callMe();
    x = 1;
  } while (kast("vile"));
  print(x);
}

dovileBreak() {
  var x = 0;
  do {
    callMe();
    x = 1;
    break;
  } while (kast("vile"));
  return (x);
}

dovileContinue() {
  var x = 0;
  do {
    callMe();
    x = 1;
    continue;
  } while (kast("vile"));
  return (x);
}

dovileBreakContinue(x) {
  do {
    callMe();
    if (x == 1) break;
    continue;
  } while (kast("vile"));
  return (x);
}

faar1() {
  callMe();
  for (kast("faar"); called = false; called = false) {
    called = false;
  }
}

faar2() {
  for (callMe(); kast("faar"); called = false) {
    called = false;
  }
}

faar3() {
  for (; true; kast("faar")) {
    callMe();
  }
  called = false;
}

faar4() {
  callMe();
  for (kast("faar"); called = false; called = false) {
    called = false;
    continue;
  }
}

faar5() {
  for (callMe(); kast("faar"); called = false) {
    called = false;
    continue;
  }
}

faar6() {
  for (; true; kast("faar")) {
    callMe();
    continue;
  }
  called = false;
}

faar7() {
  callMe();
  for (kast("faar"); called = false; called = false) {
    called = false;
    break;
  }
}

faar8() {
  for (callMe(); kast("faar"); called = false) {
    called = false;
    break;
  }
}

faar9() {
  for (; true; kast("faar")) {
    callMe();
    break;
    called = false;
  }
}

main() {
  Expect.throws(hest);
  Expect.throws(hest2);
  foo();
  Expect.throws(bar);
  testCall(barc);
  testCallThenThrow(barCallThrow);
  Expect.equals(0, baz(false));
  Expect.throws(() => baz(true));
  testCall(bazc);
  testCallThenThrow(bazCallThrow);
  Expect.throws(() => fizz(false));
  testCall(fizzc);
  testCallThenThrow(fizzCallThrow);
  Expect.throws(fuzz);
  Expect.throws(farce);
  Expect.throws(unary);
  testCallThenThrow(boo);
  Expect.throws(yo);
  Expect.throws(bin);
  testCallThenThrow(binCallThrow);
  Expect.throws(hoo);
  Expect.throws(switcheroo);
  Expect.throws(interpole);
  testCallThenThrow(interpoleCallThrow);
  Expect.throws(call1);
  Expect.throws(call2);
  Expect.throws(call3);
  testCallThenThrow(call1c);
  testCallThenThrow(call3c);
  testCallThenThrow(call4c);
  Expect.throws(sendSet);
  testCallThenThrow(sendSetCallThrow);
  Expect.throws(isSend);
  testNoThrow(vile);
  testCallThenThrow(dovile);
  testCall(dovileBreak);
  testCallThenThrow(dovileContinue);
  testCallThenThrow(throwConstructor);
  testCallThenThrow(cascade);
  dovileBreakContinue(1);
  testCallThenThrow(faar1);
  testCallThenThrow(faar2);
  testCallThenThrow(faar3);
  testCallThenThrow(faar4);
  testCallThenThrow(faar5);
  testCallThenThrow(faar6);
  testCallThenThrow(faar7);
  testCallThenThrow(faar8);
  testCall(faar9);
}
