// Copyright (c) 2016, 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';

mkOne() => 1;
mkTwo() => 2;

testNormal() {
  int result;
  switch(mkOne()) {
    case 0:
      result = 0;
      break;
    case 1:
      result = 1;
      break;
    case 2:
      result = 2;
      break;
    default:
      result = 3;
      break;
  }
  Expect.isTrue(result == 1);
}

testDefault() {
  int result;
  switch(null) {
    case 0:
      result = 0;
      break;
    case 1:
      result = 1;
      break;
    case 2:
      result = 2;
      break;
    default:
      result = 3;
      break;
  }
  Expect.isTrue(result == 3);
}

testFallThrough() {
  int result;
  switch(mkOne()) {
    case 0:
      result = 0;
      break;
    case 1:
    case 2:
      result = 2;
      break;
    default:
      result = 3;
      break;
  }
  Expect.isTrue(result == 2);
}

testContinue() {
  int result;
  switch(mkTwo()) {
    case 0:
      result = 0;
      break;

    setitto1:
    case 1:
      result = 1;
      continue setitto3;

    case 2:
      result = 2;
      continue setitto1;

    setitto3:
    default:
      result = 3;
      break;
  }
  Expect.isTrue(result == 3);
}

testOnlyDefault() {
  int result;
  switch(mkTwo()) {
    default:
      result = 42;
  }
  Expect.isTrue(result == 42);
}

testOnlyDefaultWithBreak() {
  int result;
  switch(mkTwo()) {
    default:
      result = 42;
  }
  Expect.isTrue(result == 42);
}

String testReturn() {
  switch(mkOne()) {
    case 0: return "bad";
    case 1: return "good";
    default: return "bad";
  }
}

regressionTest() {
  Expect.isTrue(regressionTestHelper(0, 0) == -1);
  Expect.isTrue(regressionTestHelper(4, 0) == -1);
  Expect.isTrue(regressionTestHelper(4, 1) == 42);
}

regressionTestHelper(i, j) {
  switch (i) {
    case 4:
      switch (j) {
        case 1:
          return 42;
      }
  }
  return -1;
}

regressionTest2() {
  var state = 1;
  while (state < 2) {
    switch (state) {
      case 1:
        state++;
        break;
      case 3:
      case 4:
        // We will translate this currently to an empty [Fragment] which can
        // cause issues if we would like to append/prepend to it.
        assert(false);
    }
  }
  return [1];
}

regressionTest3() {
  f(x) {
    switch (x) {
      case 1:
        return 2;
      case 2:
    }
    throw new UnsupportedError("Unexpected constant kind.");
  }
  Expect.isTrue(f(1) == 2);
}

main() {
  testNormal();
  testDefault();
  testFallThrough();
  testContinue();
  testOnlyDefault();
  testOnlyDefaultWithBreak();
  regressionTest();
  regressionTest2();
  regressionTest3();

  var result = testReturn();
  Expect.isTrue(result == "good");
}
