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

import 'package:expect/expect.dart';

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

class A {
  late double? fieldWithInit = init();
  late double fieldWithTrivialInit = 1.23;
  late double? fieldWithNullInit = null;
  late double fieldWithNoInit;
}

main() {
  // Late, non-final, with init.
  var a = A();
  Expect.equals(0, initCalls);
  Expect.equals(1.23, a.fieldWithInit);
  Expect.equals(1.23, a.fieldWithTrivialInit);
  Expect.equals(null, a.fieldWithNullInit);
  Expect.throws<Error>(() => a.fieldWithNoInit);
  Expect.equals(1, initCalls);
  Expect.equals(1.23, a.fieldWithInit);
  Expect.equals(1.23, a.fieldWithTrivialInit);
  Expect.equals(null, a.fieldWithNullInit);
  Expect.throws<Error>(() => a.fieldWithNoInit);
  Expect.equals(1, initCalls);
  a.fieldWithInit = 4.56;
  a.fieldWithTrivialInit = 4.56;
  a.fieldWithNullInit = 4.56;
  a.fieldWithNoInit = 4.56;
  Expect.equals(1, initCalls);
  Expect.equals(4.56, a.fieldWithInit);
  Expect.equals(4.56, a.fieldWithTrivialInit);
  Expect.equals(4.56, a.fieldWithNullInit);
  Expect.equals(4.56, a.fieldWithNoInit);
  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 = 4.56;
  Expect.equals(0, initCalls);
  Expect.equals(4.56, 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);
}
