// 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.

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();
}
