// 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.
// Dart test program to test check that we can parse labels.

import "package:expect/expect.dart";

class Helper {
  static int ticks = 0;

  // Helper function to prevent endless loops in case labels or
  // break/continue is broken.
  static doAgain() {
    ++ticks;
    if (ticks > 300) {
      // obfuscating man's assert(false)
      Expect.equals(true, false);
    }
    return true;
  }

  static test1() {
    var i = 1;
    while (doAgain()) {
      if (i > 0) break;
      return 0;
    }
    return 111;
  }

  static test2() {
    // Make sure we break out to default label.
    var i = 1;
    L:
    while (doAgain()) {
      // unused label
      if (i > 0) break;
      return 0;
    }
    return 111;
  }

  static test3() {
    // Make sure we break out of outer loop.
    var i = 1;
    L:
    while (doAgain()) {
      while (doAgain()) {
        if (i > 0) break L;
        return 0;
      }
      return 1;
    }
    return 111;
  }

  static test4() {
    // Make sure we break out of inner loop.
    var i = 100;
    L:
    while (doAgain()) {
      // unused label
      while (doAgain()) {
        if (i > 0) break;
        return 0;
      }
      return 111;
    }
    return 1;
  }

  static test5() {
    // Make sure we jump to loop condition.
    var i = 10;
    while (i > 0) {
      i--;
      if (true) continue; // without the if the following return is dead code.
      return 0;
    }
    return 111;
  }

  static test6() {
    // Make sure we jump to loop condition.
    L:
    for (int i = 10; i > 0; i--) {
      // unreferenced label, should warn
      if (true) continue; // without the if the following return is dead code.
      return 0;
    }
    // Make sure this L does not conflict with previous L.
    var k = 20;
    L:
    while (doAgain()) {
      L0:
      while (doAgain()) break L; // unreferenced label L0, should warn
      return 1;
    }
    return 111;
  }

  static test7() {
    // Just weird stuff.
    var i = 10;
    L:
    do {
      L:
      while (doAgain()) {
        if (true) break L; // without the if the following line is dead code.
        continue L;
      }
      i = 0;
      continue L;
    } while (i == 10 && doAgain());
    return 111;
  }

  static test8() {
    L:
    while (false) {
      var L = 33; // OK, shouldn't collide with label.
      if (true) break L;
    }
    return 111;
  }

  static test9() {
    var i = 111;
    L1:
    if (i == 0) {
      // unreferenced label, should warn
      return 0;
    }

    L2:
    while (i == 0) {
      // unreferenced label, should warn
      return 0;
    }

    L3: // useless label, should warn
    return i;
  }

  // Labels should be allowed on block/if/for/switch/while/do stmts.
  static test10() {
    int i = 111;
    // block
    while (doAgain()) {
      L:
      {
        while (doAgain()) {
          break L;
        }
        i--;
      }
      break;
    }
    Expect.equals(111, i);

    while (doAgain()) {
      L:
      if (doAgain()) {
        while (doAgain()) {
          break L;
        }
        i--;
      }
      break;
    }
    Expect.equals(111, i);

    while (doAgain()) {
      L:
      for (; doAgain();) {
        while (doAgain()) {
          break L;
        }
        i--;
      }
      break;
    }
    Expect.equals(111, i);

    L:
    for (i in [111]) {
      while (doAgain()) {
        break L;
      }
      i--;
      break;
    }
    Expect.equals(111, i);

    L:
    for (var j in [111]) {
      while (doAgain()) {
        break L;
      }
      i--;
      break;
    }
    Expect.equals(111, i);

    while (doAgain()) {
      L:
      switch (i) {
        case 111:
          while (doAgain()) {
            break L;
          }
          i--;
          break;
        default:
          i--;
      }
      break;
    }
    Expect.equals(111, i);

    while (doAgain()) {
      L:
      do {
        while (doAgain()) {
          break L;
        }
        i--;
      } while (doAgain());
      break;
    }
    Expect.equals(111, i);

    while (doAgain()) {
      L:
      try {
        while (doAgain()) {
          break L;
        }
        i--;
      } finally {}
      break;
    }
    Expect.equals(111, i);

    return i;
  }

  static test11() {
    // Kind of odd, but is valid and shouldn't be flagged as useless either.
    L:
    break L;
    return 111;
  }

  static test12() {
    int i = 111;

    // label the inner block on compound stmts
    if (true)
      L:
      {
        while (doAgain()) {
          break L;
        }
        i--;
      }
    Expect.equals(111, i);

    // loop will execute each time, but won't execute code below the break
    var forCount = 0;
    for (forCount = 0; forCount < 2; forCount++)
      L:
      {
        while (doAgain()) {
          break L;
        }
        i--;
        break;
      }
    Expect.equals(111, i);
    Expect.equals(forCount, 2);

    for (i in [111])
      L:
      {
        while (doAgain()) {
          break L;
        }
        i--;
        break;
      }
    Expect.equals(111, i);

    for (var j in [111])
      L:
      {
        while (doAgain()) {
          break L;
        }
        i--;
        break;
      }
    Expect.equals(111, i);

    if (false) {} else
      L:
      {
        while (doAgain()) {
          break L;
        }
        i--;
      }
    Expect.equals(111, i);

    int whileCount = 0;
    while (whileCount < 2)
      L:
      {
        whileCount++;
        while (doAgain()) {
          break L;
        }
        i--;
        break;
      }
    Expect.equals(111, i);
    Expect.equals(2, whileCount);

    return i;
  }
}

class LabelTest {
  static testMain() {
    Expect.equals(111, Helper.test1());
    Expect.equals(111, Helper.test2());
    Expect.equals(111, Helper.test3());
    Expect.equals(111, Helper.test4());
    Expect.equals(111, Helper.test5());
    Expect.equals(111, Helper.test6());
    Expect.equals(111, Helper.test7());
    Expect.equals(111, Helper.test8());
    Expect.equals(111, Helper.test9());
    Expect.equals(111, Helper.test10());
    Expect.equals(111, Helper.test11());
    Expect.equals(111, Helper.test12());
  }
}

main() {
  LabelTest.testMain();
}
