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

/// Variables declared by a pattern are in scope in the guard.
import "package:expect/expect.dart";

var a = 'outer';

void main() {
  testSwitchStatement();
  testSwitchExpression();
  testIfCaseStatement();
  testIfCaseElement();
}

void testSwitchStatement() {
  switch ('value') {
    case var a when _guard(a):
      break;
  }

  _expectGuard('value');
}

void testSwitchExpression() {
  (switch ('value') {
    var a when _guard(a) => 'body',
    _ => 'other',
  });

  _expectGuard('value');
}

void testIfCaseStatement() {
  if ('value' case var a when _guard(a)) {}

  _expectGuard('value');
}

void testIfCaseElement() {
  var list = [if ('value' case var a when _guard(a)) 'element'];

  _expectGuard('value');
}

String _guardArg = '';

bool _guard(String arg) {
  _guardArg = arg;
  return true;
}

void _expectGuard(String expected) {
  Expect.equals(expected, _guardArg);
  _guardArg = '';
}
