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

// VMOptions=--optimization_counter_threshold=10
import 'package:expect/expect.dart';

int initCalls = 0;
int init() {
  ++initCalls;
  return 123;
}

class A {
  late int? fieldWithInit = init();
  late int fieldWithTrivialInit = 123;
  late int? fieldWithNullInit = null;
  late int fieldWithNoInit;
  late int? nullableFieldWithNoInit;
  late int? fieldWithOnlyCtorInit;
  late int? fieldWithOnlyBothInitAndCtorInit = 123;
  A()
      : fieldWithOnlyCtorInit = null,
        fieldWithOnlyBothInitAndCtorInit = null;
}

main() {
  for (int i = 0; i < 20; ++i) {
    // Late, non-final, with init.
    var a = A();
    Expect.equals(0, initCalls);
    Expect.equals(123, a.fieldWithInit);
    Expect.equals(123, a.fieldWithTrivialInit);
    Expect.equals(null, a.fieldWithNullInit);
    Expect.throws<Error>(() => a.fieldWithNoInit);
    Expect.throws<Error>(() => a.nullableFieldWithNoInit);
    Expect.equals(null, a.fieldWithOnlyCtorInit);
    Expect.equals(null, a.fieldWithOnlyBothInitAndCtorInit);
    Expect.equals(1, initCalls);
    Expect.equals(123, a.fieldWithInit);
    Expect.equals(123, a.fieldWithTrivialInit);
    Expect.equals(null, a.fieldWithNullInit);
    Expect.throws<Error>(() => a.fieldWithNoInit);
    Expect.throws<Error>(() => a.nullableFieldWithNoInit);
    Expect.equals(null, a.fieldWithOnlyCtorInit);
    Expect.equals(null, a.fieldWithOnlyBothInitAndCtorInit);
    Expect.equals(1, initCalls);
    a.fieldWithInit = 456;
    a.fieldWithTrivialInit = 456;
    a.fieldWithNullInit = 456;
    a.fieldWithNoInit = 456;
    a.nullableFieldWithNoInit = null;
    a.fieldWithOnlyCtorInit = 456;
    a.fieldWithOnlyBothInitAndCtorInit = 456;
    Expect.equals(1, initCalls);
    Expect.equals(456, a.fieldWithInit);
    Expect.equals(456, a.fieldWithTrivialInit);
    Expect.equals(456, a.fieldWithNullInit);
    Expect.equals(456, a.fieldWithNoInit);
    Expect.equals(null, a.nullableFieldWithNoInit);
    Expect.equals(456, a.fieldWithOnlyCtorInit);
    Expect.equals(456, a.fieldWithOnlyBothInitAndCtorInit);
    Expect.equals(1, initCalls);
    initCalls = 0;

    // Late, non-final, with init that's pre-empted by setter.
    var b = A();
    Expect.equals(0, initCalls);
    b.fieldWithInit = 456;
    Expect.equals(0, initCalls);
    Expect.equals(456, b.fieldWithInit);
    Expect.equals(0, initCalls);

    // Late, non-final, with init that's pre-empted by null setter.
    var c = A();
    Expect.equals(0, initCalls);
    c.fieldWithInit = null;
    Expect.equals(0, initCalls);
    Expect.equals(null, c.fieldWithInit);
    Expect.equals(0, initCalls);
    initCalls = 0;
  }
}
