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

/*member: main:[null]*/
main() {
  switchWithoutDefault();
  switchWithDefault();
  switchWithDefaultWithoutBreak();
  switchWithContinue();
  switchWithoutContinue();
}

////////////////////////////////////////////////////////////////////////////////
// Switch statement without default case.
////////////////////////////////////////////////////////////////////////////////

/*member: _switchWithoutDefault:Union(null, [exact=JSString], [exact=JSUInt31])*/
_switchWithoutDefault(/*[exact=JSUInt31]*/ o) {
  var local;
  switch (o) {
    case 0:
      local = 0;
      break;
    case 1:
      local = '';
      break;
  }
  return local;
}

/*member: switchWithoutDefault:[null]*/
switchWithoutDefault() {
  _switchWithoutDefault(0);
  _switchWithoutDefault(1);
}

////////////////////////////////////////////////////////////////////////////////
// Switch statement with default case.
////////////////////////////////////////////////////////////////////////////////

/*member: _switchWithDefault:Union([exact=JSString], [exact=JSUInt31])*/
_switchWithDefault(/*[exact=JSUInt31]*/ o) {
  var local;
  switch (o) {
    case 0:
      local = 0;
      break;
    case 1:
    default:
      local = '';
      break;
  }
  return local;
}

/*member: switchWithDefault:[null]*/
switchWithDefault() {
  _switchWithDefault(0);
  _switchWithDefault(1);
}

////////////////////////////////////////////////////////////////////////////////
// Switch statement with default case without break.
////////////////////////////////////////////////////////////////////////////////

/*member: _switchWithDefaultWithoutBreak:Union([exact=JSString], [exact=JSUInt31])*/
_switchWithDefaultWithoutBreak(/*[exact=JSUInt31]*/ o) {
  var local;
  switch (o) {
    case 0:
      local = 0;
      break;
    case 1:
    default:
      local = '';
  }
  return local;
}

/*member: switchWithDefaultWithoutBreak:[null]*/
switchWithDefaultWithoutBreak() {
  _switchWithDefaultWithoutBreak(0);
  _switchWithDefaultWithoutBreak(1);
}

////////////////////////////////////////////////////////////////////////////////
// Switch statement with continue.
////////////////////////////////////////////////////////////////////////////////

/*member: _switchWithContinue:Union([exact=JSBool], [exact=JSString])*/
_switchWithContinue(/*[exact=JSUInt31]*/ o) {
  dynamic local;
  switch (o) {
    case 0:
      local = 0;
      continue label;
    label:
    case 1:
      local = local. /*Union(null, [exact=JSString], [exact=JSUInt31])*/ isEven;
      break;
    case 2:
    default:
      local = '';
  }
  return local;
}

/*member: switchWithContinue:[null]*/
switchWithContinue() {
  _switchWithContinue(0);
  _switchWithContinue(1);
}

////////////////////////////////////////////////////////////////////////////////
// Switch statement without continue. Identical to previous test but without
// the continue statement.
////////////////////////////////////////////////////////////////////////////////

/*member: _switchWithoutContinue:Union([exact=JSString], [exact=JSUInt31])*/
_switchWithoutContinue(/*[exact=JSUInt31]*/ o) {
  dynamic local;
  switch (o) {
    case 0:
      local = 0;
      break;
    case 1:
      local = local. /*[null]*/ isEven;
      break;
    case 2:
    default:
      local = '';
  }
  return local;
}

/*member: switchWithoutContinue:[null]*/
switchWithoutContinue() {
  _switchWithoutContinue(0);
  _switchWithoutContinue(1);
}
