// Copyright (c) 2012, 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 that parameters keep their names in the output.

import 'compiler_helper.dart';

const String TEST_ONE = r"""
void foo(bar) {
  var a = 1;
  if (bar) {
    a = 2;
  } else {
    a = 3;
  }
  print(a);
}
""";

const String TEST_TWO = r"""
void main() {
  var t = 0;
  for (var i = 0; i == 0; i = i + 1) {
    t = t + 10;
  }
  print(t);
}
""";

const String TEST_THREE = r"""
foo(b, c, d) {
  var val = 42;
  if (b) {
    c = c && d;
    if (c) {
      val = 43;
    }
  }
  return val;
}
""";

const String TEST_FOUR = r"""
foo() {
  var a = true;
  var b = false;
  for (var i = 0; a; i = i + 1) {
    if (i == 9) a = false;
    for (var j = 0; b; j = j + 1) {
      if (j == 9) b = false;
    }
  }
  print(a);
  print(b);
}
""";

main() {
  compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;");
  compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);");

  compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10");
  compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x");

  // Check that we don't have 'd = d' (using regexp back references).
  compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1');
  compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x');
  // Check that a store just after the declaration of the local
  // only generates one instruction.
  compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42');

  var generated = compile(TEST_FOUR, entry: 'foo');
  compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;');
}
