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

/// @assertion The switch statement supports dispatching control among a large
/// number of cases.
/// switchStatement:
///   switch '(' expression ')' '{' switchCase* defaultCase? '}'
/// ;
/// switchCase:
///   label* case expression ':' statements
/// ;
/// defaultCase:
///   label* default ':' statements
/// ;
/// @description Checks that a switch statement with all kinds of case
/// expressions (as long as they're allowed by spec) works as expected.
/// @author rodionov
/// @issue 7537

import '../../../Utils/expect.dart';

switchTestBool(value) {
  var result;

  switch (value) {
    case true:
      {result = 1;}
      break;

    label: case false && true:
      result = 2;
      break;

    default:
      result = -1;
  }
  return result;
}

switchTestInt(value) {
  var result;

  switch (value) {
    case 1:
      {result = 1;}
      break;

    label: case 7 << 2:
      result = 2;
      break;

    case 1 ^ 5:
      result = 3;
      break;

    default:
      result = -1;
  }
  return result;
}

switchTestStr(value) {
  var result;

  switch (value) {
    case 'foo':
      {result = 1;}
      break;

    label: case r"""bar""":
      result = 2;
      break;

    default:
      result = -1;
  }
  return result;
}

main() {
  Expect.equals(1, switchTestBool(true));
  Expect.equals(2, switchTestBool(false));
  Expect.equals(-1, switchTestBool(null));

  Expect.equals(1, switchTestInt(1));
  Expect.equals(2, switchTestInt(28));
  Expect.equals(3, switchTestInt(4));
  Expect.equals(-1, switchTestInt(0));
  Expect.equals(-1, switchTestInt(null));

  Expect.equals(1, switchTestStr("foo"));
  Expect.equals(2, switchTestStr("bar"));
  Expect.equals(-1, switchTestStr(null));
  Expect.equals(-1, switchTestStr("abyrvalg"));

  switch (1) {
    case 0:
    case 1:
  }

  switch (1) {
    case 0:
    case 1:
    default:
  }

  switch (1) {}

  switch (1) {
    $: default:
  }

}
