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

// Test re-entrant initializer - calls throw CyclicInitializationError.

var trace;

final foo = bar;

get bar {
  trace.add('bar');
  try {
    return foo ?? 1;
  } catch (e) {
    trace.add(e is CyclicInitializationError);
  }
  try {
    return foo ?? 2;
  } catch (e) {
    trace.add(e is CyclicInitializationError);
  }
  return 42;
}

void testTopLevel() {
  trace = [];
  var result = foo;
  Expect.equals(42, result);
  Expect.equals('bar,true,true', trace.join(','));
  trace = [];
  result = foo;
  Expect.equals(42, result);
  Expect.equals('', trace.join(','));
}

class X {
  static final foo = X.bar;

  static get bar {
    trace.add('X.bar');
    try {
      return foo ?? 1;
    } catch (e) {
      trace.add(e is CyclicInitializationError);
    }
    try {
      return foo ?? 2;
    } catch (e) {
      trace.add(e is CyclicInitializationError);
    }
    return 49;
  }
}

void testClassStatic() {
  trace = [];
  var result = X.foo;
  Expect.equals(49, result);
  Expect.equals('X.bar,true,true', trace.join(','));
  trace = [];
  result = X.foo;
  Expect.equals(49, result);
  Expect.equals('', trace.join(','));
}

main() {
  testTopLevel();
  testClassStatic();
}
