// 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:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../generated/test_support.dart';
import '../dart/resolution/context_collection_resolution.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(
      NotInitializedPotentiallyNonNullableLocalVariableTest,
    );
  });
}

@reflectiveTest
class NotInitializedPotentiallyNonNullableLocalVariableTest
    extends PubPackageResolutionTest with WithNullSafetyMixin {
  test_assignment_leftExpression() async {
    await assertErrorsInCode(r'''
void f() {
  List<int> v;
  v[0] = (v = [1, 2])[1];
  v;
}
''', [
      _notAssignedError(28, 1),
    ]);
  }

  test_assignment_leftLocal_compound() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  v += 1;
  v;
}
''', [
      _notAssignedError(22, 1),
    ]);
  }

  test_assignment_leftLocal_compound_assignInRight() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  v += (v = v);
}
''', [
      _notAssignedError(22, 1),
      _notAssignedError(32, 1),
    ]);
  }

  test_assignment_leftLocal_pure_eq() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  v = 0;
  v;
}
''');
  }

  test_assignment_leftLocal_pure_eq_self() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  v = v;
}
''', [
      _notAssignedError(26, 1),
    ]);
  }

  test_assignment_leftLocal_pure_questionEq() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  v ??= 0;
}
''', [
      _notAssignedError(22, 1),
      error(StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION, 28, 1),
    ]);
  }

  test_assignment_leftLocal_pure_questionEq_self() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  v ??= v;
}
''', [
      _notAssignedError(22, 1),
      error(StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION, 28, 1),
      _notAssignedError(28, 1),
    ]);
  }

  test_basic() async {
    await assertNoErrorsInCode('''
void f() {
  int v;
  v = 0;
  v;
}
''');
  }

  test_binaryExpression_ifNull_left() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  (v = 0) ?? 0;
  v;
}
''', [
      error(StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION, 33, 1),
    ]);
  }

  test_binaryExpression_ifNull_right() async {
    await assertErrorsInCode(r'''
void f(int a) {
  int v;
  a ?? (v = 0);
  v;
}
''', [
      error(StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION, 32, 7),
      _notAssignedError(43, 1),
    ]);
  }

  test_binaryExpression_logicalAnd_left() async {
    await assertNoErrorsInCode(r'''
main(bool c) {
  int v;
  ((v = 0) >= 0) && c;
  v;
}
''');
  }

  test_binaryExpression_logicalAnd_right() async {
    await assertErrorsInCode(r'''
main(bool c) {
  int v;
  c && ((v = 0) >= 0);
  v;
}
''', [
      _notAssignedError(49, 1),
    ]);
  }

  test_binaryExpression_logicalOr_left() async {
    await assertNoErrorsInCode(r'''
main(bool c) {
  int v;
  ((v = 0) >= 0) || c;
  v;
}
''');
  }

  test_binaryExpression_logicalOr_right() async {
    await assertErrorsInCode(r'''
main(bool c) {
  int v;
  c || ((v = 0) >= 0);
  v;
}
''', [
      _notAssignedError(49, 1),
    ]);
  }

  test_binaryExpression_plus_left() async {
    await assertNoErrorsInCode(r'''
main() {
  int v;
  (v = 0) + 1;
  v;
}
''');
  }

  test_binaryExpression_plus_right() async {
    await assertNoErrorsInCode(r'''
main() {
  int v;
  1 + (v = 0);
  v;
}
''');
  }

  test_conditional_both() async {
    await assertNoErrorsInCode(r'''
f(bool b) {
  int v;
  b ? (v = 1) : (v = 2);
  v;
}
''');
  }

  test_conditional_else() async {
    await assertErrorsInCode(r'''
f(bool b) {
  int v;
  b ? 1 : (v = 2);
  v;
}
''', [
      _notAssignedError(42, 1),
    ]);
  }

  test_conditional_then() async {
    await assertErrorsInCode(r'''
f(bool b) {
  int v;
  b ? (v = 1) : 2;
  v;
}
''', [
      _notAssignedError(42, 1),
    ]);
  }

  test_conditionalExpression_condition() async {
    await assertNoErrorsInCode(r'''
main() {
  int v;
  (v = 0) >= 0 ? 1 : 2;
  v;
}
''');
  }

  test_doWhile_break_afterAssignment() async {
    await assertNoErrorsInCode(r'''
void f(bool b) {
  int v;
  do {
    v = 0;
    v;
    if (b) break;
  } while (b);
  v;
}
''');
  }

  test_doWhile_break_beforeAssignment() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  do {
    if (b) break;
    v = 0;
  } while (b);
  v;
}
''', [
      _notAssignedError(79, 1),
    ]);
  }

  test_doWhile_breakOuterFromInner() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2, v3;
  L1: do {
    do {
      v1 = 0;
      if (b) break L1;
      v2 = 0;
      v3 = 0;
    } while (b);
    v2;
  } while (b);
  v1;
  v3;
}
''', [
      _notAssignedError(168, 2),
    ]);
  }

  test_doWhile_condition() async {
    await assertErrorsInCode(r'''
void f() {
  int v1, v2;
  do {
    v1; // assigned in the condition, but not yet
  } while ((v1 = 0) + (v2 = 0) >= 0);
  v2;
}
''', [
      _notAssignedError(36, 2),
    ]);
  }

  test_doWhile_condition_break() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  do {
    if (b) break;
  } while ((v = 0) >= 0);
  v;
}
''', [
      _notAssignedError(79, 1),
    ]);
  }

  test_doWhile_condition_break_continue() async {
    await assertErrorsInCode(r'''
void f(bool b1, b2) {
  int v1, v2, v3, v4, v5, v6;
  do {
    v1 = 0; // visible outside, visible to the condition
    if (b1) break;
    v2 = 0; // not visible outside, visible to the condition
    v3 = 0; // not visible outside, visible to the condition
    if (b2) continue;
    v4 = 0; // not visible
    v5 = 0; // not visible
  } while ((v6 = v1 + v2 + v4) == 0); // has break => v6 is not visible outside
  v1;
  v3;
  v5;
  v6;
}
''', [
      _notAssignedError(360, 2),
      _notAssignedError(421, 2),
      _notAssignedError(427, 2),
      _notAssignedError(433, 2),
    ]);
  }

  test_doWhile_condition_continue() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2, v3, v4;
  do {
    v1 = 0; // visible outside, visible to the condition
    if (b) continue;
    v2 = 0; // not visible
    v3 = 0; // not visible
  } while ((v4 = v1 + v2) == 0); // no break => v4 visible outside
  v1;
  v3;
  v4;
}
''', [
      _notAssignedError(200, 2),
      _notAssignedError(253, 2),
    ]);
  }

  test_doWhile_continue_beforeAssignment() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  do {
    if (b) continue;
    v = 0;
  } while (b);
  v;
}
''', [
      _notAssignedError(82, 1),
    ]);
  }

  test_doWhile_true_assignInBreak() async {
    await assertNoErrorsInCode(r'''
void f(bool b) {
  int v;
  do {
    if (b) {
      v = 0;
      break;
    }
  } while (true);
  v;
}
''');
  }

  test_for_body() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  for (; b;) {
    v = 0;
  }
  v;
}
''', [
      _notAssignedError(58, 1),
    ]);
  }

  test_for_break() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  for (; b;) {
    v1 = 0;
    if (b) break;
    v2 = 0;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(94, 2),
      _notAssignedError(100, 2),
    ]);
  }

  test_for_break_updaters() async {
    await assertNoErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  for (; b; v1 + v2) {
    v1 = 0;
    if (b) break;
    v2 = 0;
  }
}
''');
  }

  test_for_condition() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  for (; (v = 0) >= 0;) {
    v;
  }
  v;
}
''');
  }

  test_for_continue() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  for (; b;) {
    v1 = 0;
    if (b) continue;
    v2 = 0;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(97, 2),
      _notAssignedError(103, 2),
    ]);
  }

  test_for_continue_updaters() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  for (; b; v1 + v2) {
    v1 = 0;
    if (b) continue;
    v2 = 0;
  }
}
''', [
      _notAssignedError(48, 2),
    ]);
  }

  test_for_initializer_expression() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  for (v = 0;;) {
    v;
  }
  v;
}
''', [
      error(HintCode.DEAD_CODE, 51, 2),
    ]);
  }

  test_for_initializer_variable() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  for (var t = (v = 0);;) {
    v;
  }
  v;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 31, 1),
      error(HintCode.DEAD_CODE, 61, 2),
    ]);
  }

  test_for_updaters() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2, v3, v4;
  for (; b; v1 = 0, v2 = 0, v3 = 0, v4) {
    v1;
  }
  v2;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 31, 2),
      _notAssignedError(75, 2),
      _notAssignedError(85, 2),
      _notAssignedError(95, 2),
    ]);
  }

  test_for_updaters_afterBody() async {
    await assertNoErrorsInCode(r'''
void f(bool b) {
  int v;
  for (; b; v) {
    v = 0;
  }
}
''');
  }

  test_forEach() async {
    await assertErrorsInCode(r'''
void f() {
  List<int> v1;
  int v2;
  for (var _ in (v1 = [0, 1, 2])) {
    v2 = 0;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(97, 2),
    ]);
  }

  test_forEach_break() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  for (var _ in [0, 1, 2]) {
    v1 = 0;
    if (b) break;
    v2 = 0;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(108, 2),
      _notAssignedError(114, 2),
    ]);
  }

  test_forEach_continue() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  for (var _ in [0, 1, 2]) {
    v1 = 0;
    if (b) continue;
    v2 = 0;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(111, 2),
      _notAssignedError(117, 2),
    ]);
  }

  test_functionExpression_closure_read() async {
    await assertErrorsInCode(r'''
void f() {
  int v1, v2;

  v1 = 0;

  [0, 1, 2].forEach((t) {
    v1;
    v2;
  });
}
''', [
      _notAssignedError(75, 2),
    ]);
  }

  test_functionExpression_closure_write() async {
    await assertErrorsInCode(r'''
void f() {
  int v;

  [0, 1, 2].forEach((t) {
    v = t;
  });

  v;
}
''', [
      _notAssignedError(67, 1),
    ]);
  }

  test_functionExpression_localFunction_local() async {
    await assertErrorsInCode(r'''
void f() {
  int v;

  v = 0;

  void f() {
    int v; // 1
    v;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
      error(HintCode.UNUSED_ELEMENT, 38, 1),
      _notAssignedError(64, 1),
    ]);
  }

  test_functionExpression_localFunction_local2() async {
    await assertErrorsInCode(r'''
void f() {
  int v1;

  v1 = 0;

  void f() {
    int v2, v3;
    v2 = 0;
    v1;
    v2;
    v3;
  }
}
''', [
      error(HintCode.UNUSED_ELEMENT, 40, 1),
      _notAssignedError(94, 2),
    ]);
  }

  test_functionExpression_localFunction_read() async {
    await assertErrorsInCode(r'''
void f() {
  int v1, v2;

  v1 = 0;

  void f() {
    v1;
    v2;
  }

  v2 = 0;
}
''', [
      error(HintCode.UNUSED_ELEMENT, 44, 1),
      _notAssignedError(62, 2),
    ]);
  }

  test_functionExpression_localFunction_write() async {
    await assertErrorsInCode(r'''
void f() {
  int v;

  void f() {
    v = 0;
  }

  v;
}
''', [
      error(HintCode.UNUSED_ELEMENT, 28, 1),
      _notAssignedError(52, 1),
    ]);
  }

  test_futureOr_questionArgument_none() async {
    await assertErrorsInCode('''
import 'dart:async';

f() {
  FutureOr<int?> v;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 45, 1),
    ]);
  }

  test_hasInitializer() async {
    await assertNoErrorsInCode('''
f() {
  int v = 0;
  v;
}
''');
  }

  test_if_condition() async {
    await assertNoErrorsInCode(r'''
main() {
  int v;
  if ((v = 0) >= 0) {
    v;
  } else {
    v;
  }
  v;
}
''');
  }

  test_if_condition_false() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  if (false) {
    // not assigned
  } else {
    v = 0;
  }
  v;
}
''', [
      error(HintCode.DEAD_CODE, 33, 25),
    ]);
  }

  test_if_condition_logicalAnd() async {
    await assertErrorsInCode(r'''
void f(bool b, int i) {
  int v;
  if (b && (v = i) > 0) {
    v;
  } else {
    v;
  }
  v;
}
''', [
      _notAssignedError(81, 1),
      _notAssignedError(90, 1),
    ]);
  }

  test_if_condition_logicalOr() async {
    await assertErrorsInCode(r'''
void f(bool b, int i) {
  int v;
  if (b || (v = i) > 0) {
    v;
  } else {
    v;
  }
  v;
}
''', [
      _notAssignedError(63, 1),
      _notAssignedError(90, 1),
    ]);
  }

  test_if_condition_notFalse() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  if (!false) {
    v = 0;
  }
  v;
}
''');
  }

  test_if_condition_notTrue() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  if (!true) {
    // not assigned
  } else {
    v = 0;
  }
  v;
}
''', [
      error(HintCode.DEAD_CODE, 33, 25),
    ]);
  }

  test_if_condition_true() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  if (true) {
    v = 0;
  }
  v;
}
''');
  }

  test_if_then() async {
    await assertErrorsInCode(r'''
main(bool c) {
  int v;
  if (c) {
    v = 0;
  }
  v;
}
''', [
      _notAssignedError(52, 1),
    ]);
  }

  test_if_thenElse_all() async {
    await assertNoErrorsInCode(r'''
main(bool c) {
  int v;
  if (c) {
    v = 0;
    v;
  } else {
    v = 0;
    v;
  }
  v;
}
''');
  }

  test_if_thenElse_else() async {
    await assertErrorsInCode(r'''
main(bool c) {
  int v;
  if (c) {
    // not assigned
  } else {
    v = 0;
  }
  v;
}
''', [
      _notAssignedError(83, 1),
    ]);
  }

  test_if_thenElse_then() async {
    await assertErrorsInCode(r'''
main(bool c) {
  int v;
  if (c) {
    v = 0;
  } else {
    // not assigned
  }
  v;
}
''', [
      _notAssignedError(83, 1),
    ]);
  }

  test_late() async {
    await assertNoErrorsInCode('''
f() {
  late int v;

  void g() {
    v = 0;
  }

  g();
  v;
}
''');
  }

  test_noInitializer() async {
    await assertErrorsInCode('''
f() {
  int v;
  v;
}
''', [
      _notAssignedError(17, 1),
    ]);
  }

  test_noInitializer_typeParameter() async {
    await assertErrorsInCode('''
f<T>() {
  T v;
  v;
}
''', [
      _notAssignedError(18, 1),
    ]);
  }

  test_notUsed() async {
    await assertErrorsInCode('''
void f() {
  int v;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
    ]);
  }

  test_nullable() async {
    await assertNoErrorsInCode('''
f() {
  int? v;
  v;
}
''');
  }

  test_switch_case1_default() async {
    await assertErrorsInCode(r'''
void f(int e) {
  int v;
  switch (e) {
    case 1:
      v = 0;
      break;
    case 2:
      // not assigned
      break;
    default:
      v = 0;
  }
  v;
}
''', [
      _notAssignedError(157, 1),
    ]);
  }

  test_switch_case2_default() async {
    await assertErrorsInCode(r'''
void f(int e) {
  int v1, v2;
  switch (e) {
    case 1:
      v1 = 0;
      v2 = 0;
      v1;
      break;
    default:
      v1 = 0;
      v1;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(157, 2),
    ]);
  }

  test_switch_case_default_break() async {
    await assertErrorsInCode(r'''
void f(bool b, int e) {
  int v1, v2;
  switch (e) {
    case 1:
      v1 = 0;
      if (b) break;
      v2 = 0;
      break;
    default:
      v1 = 0;
      if (b) break;
      v2 = 0;
  }
  v1;
  v2;
}
''', [
      _notAssignedError(199, 2),
    ]);
  }

  test_switch_case_default_continue() async {
    // We don't analyze to which `case` we go from `continue L`,
    // but we don't have to. If all cases assign, then the variable is
    // removed from the unassigned set in the `breakState`. And if there is a
    // case when it is not assigned, then the variable will be left unassigned
    // in the `breakState`.
    await assertNoErrorsInCode(r'''
void f(int e) {
  int v;
  switch (e) {
    L: case 1:
      v = 0;
      break;
    case 2:
      continue L;
    default:
      v = 0;
  }
  v;
}
''');
  }

  test_switch_case_noDefault() async {
    await assertErrorsInCode(r'''
void f(int e) {
  int v;
  switch (e) {
    case 1:
      v = 0;
      break;
  }
  v;
}
''', [
      _notAssignedError(84, 1),
    ]);
  }

  test_switch_expression() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  switch (v = 0) {}
  v;
}
''');
  }

  test_tryCatch_body() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  try {
    v = 0;
  } catch (_) {
    // not assigned
  }
  v;
}
''', [
      _notAssignedError(81, 1),
    ]);
  }

  test_tryCatch_body_catch() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  try {
    g();
    v = 0;
  } catch (_) {
    v = 0;
  }
  v;
}

void g() {}
''');
  }

  test_tryCatch_body_catchRethrow() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  try {
    v = 0;
  } catch (_) {
    rethrow;
  }
  v;
}
''');
  }

  test_tryCatch_catch() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  try {
    // not assigned
  } catch (_) {
    v = 0;
  }
  v;
}
''', [
      _notAssignedError(81, 1),
    ]);
  }

  test_tryCatchFinally_body() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  try {
    v = 0;
  } catch (_) {
    // not assigned
  } finally {
    // not assigned
  }
  v;
}
''', [
      _notAssignedError(115, 1),
    ]);
  }

  test_tryCatchFinally_catch() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  try {
    // not assigned
  } catch (_) {
    v = 0;
  } finally {
    // not assigned
  }
  v;
}
''', [
      _notAssignedError(115, 1),
    ]);
  }

  test_tryCatchFinally_finally() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  try {
    // not assigned
  } catch (_) {
    // not assigned
  } finally {
    v = 0;
  }
  v;
}
''');
  }

  test_tryCatchFinally_useInFinally() async {
    await assertErrorsInCode(r'''
f() {
  int x;
  try {
    g(); // may throw an exception
    x = 1;
  } catch (_) {
    x = 1;
  } finally {
    x; // BAD
  }
}

void g() {}
''', [
      _notAssignedError(114, 1),
    ]);
  }

  test_tryFinally_body() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  try {
    v = 0;
  } finally {
    // not assigned
  }
  v;
}
''');
  }

  test_tryFinally_finally() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  try {
    // not assigned
  } finally {
    v = 0;
  }
  v;
}
''');
  }

  test_type_dynamic() async {
    await assertErrorsInCode('''
f() {
  dynamic v;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 16, 1),
    ]);
  }

  test_type_dynamicImplicit() async {
    await assertErrorsInCode('''
f() {
  var v;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
    ]);
  }

  test_type_void() async {
    await assertErrorsInCode('''
f() {
  void v;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
    ]);
  }

  test_while_condition() async {
    await assertNoErrorsInCode(r'''
void f() {
  int v;
  while ((v = 0) >= 0) {
    v;
  }
  v;
}
''');
  }

  test_while_condition_notTrue() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  while (b) {
    v = 0;
    v;
  }
  v;
}
''', [
      _notAssignedError(64, 1),
    ]);
  }

  test_while_true_break_afterAssignment() async {
    await assertNoErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  while (true) {
    v1 = 0;
    v1;
    if (b) break;
    v2 = 0;
    v1;
    v2;
  }
  v1;
}
''');
  }

  test_while_true_break_beforeAssignment() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  while (true) {
    if (b) break;
    v = 0;
    v;
  }
  v;
}
''', [
      _notAssignedError(85, 1),
    ]);
  }

  test_while_true_break_if() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  while (true) {
    if (b) {
      v = 0;
      break;
    } else {
      v = 0;
      break;
    }
    v;
  }
  v;
}
''', [
      error(HintCode.DEAD_CODE, 131, 2),
    ]);
  }

  test_while_true_break_if2() async {
    await assertNoErrorsInCode(r'''
void f(bool b) {
  var v;
  while (true) {
    if (b) {
      break;
    } else {
      v = 0;
    }
    v;
  }
}
''');
  }

  test_while_true_break_if3() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2;
  while (true) {
    if (b) {
      v1 = 0;
      v2 = 0;
      if (b) break;
    } else {
      if (b) break;
      v1 = 0;
      v2 = 0;
    }
    v1;
  }
  v2;
}
''', [
      _notAssignedError(190, 2),
    ]);
  }

  test_while_true_breakOuterFromInner() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v1, v2, v3;
  L1: while (true) {
    L2: while (true) {
      v1 = 0;
      if (b) break L1;
      v2 = 0;
      v3 = 0;
      if (b) break L2;
    }
    v2;
  }
  v1;
  v3;
}
''', [
      _notAssignedError(193, 2),
    ]);
  }

  test_while_true_continue() async {
    await assertErrorsInCode(r'''
void f(bool b) {
  int v;
  while (true) {
    if (b) continue;
    v = 0;
  }
  v;
}
''', [
      error(HintCode.DEAD_CODE, 81, 2),
      error(
          CompileTimeErrorCode
              .NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE,
          81,
          1),
    ]);
  }

  test_while_true_noBreak() async {
    await assertErrorsInCode(r'''
void f() {
  int v;
  while (true) {
    // No assignment, but no break.
    // So, we don't exit the loop.
  }
  v;
}
''', [
      error(HintCode.DEAD_CODE, 114, 2),
      error(
          CompileTimeErrorCode
              .NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE,
          114,
          1),
    ]);
  }

  ExpectedError _notAssignedError(int offset, int length) {
    return error(
        CompileTimeErrorCode
            .NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE,
        offset,
        length);
  }
}
