// 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.

// Check that calls through fields elide the call-through stub.  This
// optimization is done by the simplifier, so inlining does not need to be
// enabled.

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

const String TEST1 = r'''
class W {
  final Function _fun;
  W(this._fun);
  foo(zzz) => _fun(zzz);   // this._fun$1(zzz) -->  this._fun.call$1(zzz)
}
add1(x) => x + 1;
main() {
  var w = new W(add1);
  var x = w.foo(42);
}
''';

const String TEST2 = r'''
class W {
  final Function __fun;
  Function get _fun => __fun;
  W(this.__fun);
  foo(zzz) => _fun(zzz);   // this._fun$1(zzz) stays same.
}
add1(x) => x + 1;
main() {
  var w = new W(add1);
  var x = w.foo(42);
}
''';

main() {
  asyncTest(() => compileAll(TEST1).then((generated) {
        // Direct call through field.
        Expect.isTrue(generated.contains(r'this._fun.call$1(zzz)'));
        // No stub.
        Expect.isFalse(generated.contains(r'_fun$1:'));
        // No call to stub.
        Expect.isFalse(generated.contains(r'_fun$1('));
      }));

  asyncTest(() => compileAll(TEST2).then((generated) {
        // No call through field.
        Expect.isFalse(generated.contains(r'this._fun.call$1(zzz)'));
        // Call through stub.
        Expect.isTrue(generated.contains(r'this._fun$1(zzz)'));
        // Stub is generated.
        Expect.isTrue(generated.contains(r'_fun$1:'));
        // Call through getter (inside stub).
        Expect.isTrue(generated.contains(r'get$_fun().call$1'));
      }));
}
