// Copyright (c) 2021, 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';

// Tests where late variable or field has a predictable value. An incorrect
// optimization might try to eliminate part of the check.

class C1 {
  late String lastTag;

  int zero(String tag) {
    lastTag = tag;
    return 0;
  }

  int one(String tag) {
    lastTag = tag;
    return 1;
  }

  int? returnNull(String tag) {
    lastTag = tag;
    return null;
  }

  late int? i1 = zero('C1.i1');
  late int i2 = zero('C1.i2');
  late int? i3 = returnNull('C1.i3');
  late int i4 = one('C1.i4');
}

void test1() {
  for (int i = 0; i < 10; i++) {
    final c = C1();

    Expect.equals(0, c.i1);
    Expect.equals('C1.i1', c.lastTag);
    Expect.equals(0, c.i2);
    Expect.equals('C1.i2', c.lastTag);
    Expect.equals(null, c.i3);
    Expect.equals('C1.i3', c.lastTag);

    Expect.equals(0, c.i1);
    Expect.equals('C1.i3', c.lastTag);
    Expect.equals(0, c.i2);
    Expect.equals('C1.i3', c.lastTag);
    Expect.equals(null, c.i3);
    Expect.equals('C1.i3', c.lastTag);

    Expect.equals(1, c.i4);
    Expect.equals('C1.i4', c.lastTag);
  }
}

class C2 {
  late String lastTag;

  int zero(String tag) {
    lastTag = tag;
    return 0;
  }

  int one(String tag) {
    lastTag = tag;
    return 1;
  }

  int? returnNull(String tag) {
    lastTag = tag;
    return null;
  }

  late final int? i1 = zero('C2.i1');
  late final int i2 = zero('C2.i2');
  late final int? i3 = returnNull('C2.i3');
  late int i4 = one('C2.i4');
}

void test2() {
  final c = C2();

  Expect.equals(0, c.i1);
  Expect.equals('C2.i1', c.lastTag);
  Expect.equals(0, c.i2);
  Expect.equals('C2.i2', c.lastTag);
  Expect.equals(null, c.i3);
  Expect.equals('C2.i3', c.lastTag);

  Expect.equals(0, c.i1);
  Expect.equals('C2.i3', c.lastTag);
  Expect.equals(0, c.i2);
  Expect.equals('C2.i3', c.lastTag);
  Expect.equals(null, c.i3);
  Expect.equals('C2.i3', c.lastTag);

  Expect.equals(1, c.i4);
  Expect.equals('C2.i4', c.lastTag);
}

main() {
  test1();
  test2();
}
