// Copyright (c) 2022, 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";

main() {
  switchStatementBodyScope();
  ifCaseThenScope();

  unsharedPatternVariableShadows();

  sharedPatternVariableShadows(0);
  sharedPatternVariableShadows(1);
}

var topLevel = 'top-level';

/// Pattern variables are in a scope surrounding the body scope.
void switchStatementBodyScope() {
  switch ('pattern') {
    case var x:
      // Not a collision:
      var x = 'local';
      Expect.equals('local', x);
    default: // ignore: unreachable_switch_default
      Expect.fail('Should not reach this.');
  }
}

/// Pattern variables are in a scope surrounding the if-case then scope.
void ifCaseThenScope() {
  // Not an error: Then statement is in separate scope.
  if ('pattern' case var x) var x = 'local';
}

/// Unshared variables shadow variables in outer scopes.
void unsharedPatternVariableShadows() {
  var local = 'local';

  switch (('pat', 'tern')) {
    case (String topLevel, String local):
      Expect.equals('pat tern', '$topLevel $local');

      // Assign to pattern variable.
      local = 'assigned';
    default: // ignore: unreachable_switch_default
      Expect.fail('Should not reach this.');
  }

  // Outer local is not assigned.
  Expect.equals('local', local);
}

/// Shared variables shadow variables in outer scopes.
void sharedPatternVariableShadows(Object value) {
  var local = 'local';

  switch (('pat', 'tern')) {
    case (String topLevel, String local) when value == 0:
    case (String topLevel, String local) when value == 1:
      Expect.equals('pat tern', '$topLevel $local');

      // Assign to pattern variable.
      local = 'assigned';
    default:
      Expect.fail('Should not reach this.');
  }

  // Outer local is not assigned.
  Expect.equals('local', local);
}

