// Copyright (c) 2012, 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 = 2.9

import "package:expect/expect.dart";

final x = foo();
var x2 = foo2();
var x3 = foo3();
var x4 = foo4();
var x5 = foo5();
final x6 = foo6();
int x7 = x7 + 1;

foo() {
  throw "interrupt initialization";
}

foo2() {
  x2 = 499;
  throw "interrupt initialization";
}

foo3() => x3 + 1;
foo4() {
  x4 = 498;
  x4 = x4 + 1;
  return x4;
}

foo5() {
  x5 = 498;
  x5 = x5 + 1;
}

foo6() {
  try {
    return x5 + 1;
  } catch (e) {
    return 499;
  }
}

fib(x) {
  if (x is! int) return 0;
  if (x < 2) return x;
  return fib(x - 1) + fib(x - 2);
}

main() {
  Expect.throws(() => fib(x), (e) => e == "interrupt initialization");
  Expect.equals(null, x);

  Expect.throws(() => fib(x2), (e) => e == "interrupt initialization");
  Expect.equals(null, x2);

  Expect.throws(() => fib(x3), (e) => e is CyclicInitializationError);
  Expect.equals(null, x3);

  Expect.equals(499, x4);

  Expect.equals(null, x5);

  Expect.equals(499, x6);

  Expect.throws(() => fib(x7), (e) => e is CyclicInitializationError);
}
