// Copyright (c) 2014, 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.
// Test constant folding on numbers.

import 'package:async_helper/async_helper.dart';
import '../compiler_helper.dart';

const String SIMPLY_EMPTY = """
int foo(x) => x;
void main() {
  var a = foo(4);
  var b = 1;
  switch (a) {
    case 1:
      b += 2;
      a = 0;
  }
  print(a);
}
""";

const String TOTAL = """
void main() {
  for (int a = 0; a < 3; a++) {
    switch (a) {
      case 0:
        a = 99;
        break;
      case 1:
        a = 2;
        break;
      case 2:
        a = 1;
        break;
      default:
        a = 33;
    }
  }
  print(a);
}
""";

const String OPTIMIZED = """
void main() {
  var b;
  for (int a = 0; a < 3; a++) {
    switch (a) {
      case 1:
      case 2:
        b = 0;
        ++a;
        break;
      default:
        b = 0;
    }
  }
  print(a+b);
}
""";

const String LABEL = """
void main() {
  var b;
  for (int a = 0; a < 3; a++) {
    switch (a) {
      case 1:
        break;
      case 2:
        b = 0;
        continue K;
      K: case 3:
        b = 19;
      default:
        b = 5;
    }
  }
  print(a+b);
}
""";

const String DEFLABEL = """
void main() {
  var b;
  for (int a = 0; a < 3; a++) {
    switch (a) {
      case 1:
        continue L;
      case 2:
        b = 0;
        break;
      L: default:
        b = 5;
    }
  }
  print(a+b);
}
""";

const String EMPTYDEFLABEL = """
void main() {
  var b;
  for (int a = 0; a < 3; a++) {
    switch (a) {
      case 1:
        continue L;
      case 2:
        b = 0;
        break;
      L: default:
    }
  }
  print(a+b);
}
""";

main() {
  var def = new RegExp(r"default:");
  var defOrCase3 = new RegExp(r"(default:|case 3):");
  var case3 = new RegExp(r"case 3:");

  runTests({bool useKernel}) async {
    await compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def, useKernel: useKernel);
    await compileAndDoNotMatch(TOTAL, 'main', defOrCase3, useKernel: useKernel);
    await compileAndDoNotMatch(OPTIMIZED, 'main', def, useKernel: useKernel);
    await compileAndMatch(LABEL, 'main', case3, useKernel: useKernel);
    await compileAndMatch(DEFLABEL, 'main', def, useKernel: useKernel);
    await compileAndMatch(EMPTYDEFLABEL, 'main', def, useKernel: useKernel);
  }

  asyncTest(() async {
    print('--test from ast---------------------------------------------------');
    await runTests(useKernel: false);
    print('--test from kernel------------------------------------------------');
    await runTests(useKernel: true);
  });
}
