// Copyright (c) 2013, 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';
import 'package:async_helper/async_helper.dart';
import '../compiler_helper.dart';

const String TEST_ONE = r"""
  foo(a) {
    var myVariableName = a.toString();
    print(myVariableName);
    print(myVariableName);
  }
""";

const String TEST_TWO = r"""
  class A {
    var length;
  }
  foo(a) {
    print([]); // Make sure the array class is instantiated.
    return new A().length + a.length;
  }
""";

main() {
  runTests() async {
    // Check that one-shot interceptors preserve variable names, see
    // https://code.google.com/p/dart/issues/detail?id=8106.
    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
      Expect.isTrue(
          generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\$\(a\)')));
      Expect.isTrue(generated.contains('myVariableName'));
    });
    // Check that an intercepted getter that does not need to be
    // intercepted, is turned into a regular getter call or field
    // access.
    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
      Expect.isFalse(generated.contains(r'a.get$length()'));
      Expect.isTrue(
          generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
      Expect.isTrue(
          generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
    });
  }

  asyncTest(() async {
    print('--test from kernel------------------------------------------------');
    await runTests();
  });
}
