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

library test.delgate_function_invocation;

import 'dart:mirrors';

import 'package:expect/expect.dart';

class Proxy {
  var targetMirror;
  Proxy(target) : this.targetMirror = reflect(target);
  noSuchMethod(invocation) => targetMirror.delegate(invocation);
}

testClosure() {
  dynamic proxy = new Proxy(() => 42);
  Expect.equals(42, proxy());
  Expect.equals(42, proxy.call());
}

class FakeFunction {
  call() => 43;
}

testFakeFunction() {
  dynamic proxy = new Proxy(new FakeFunction());
  Expect.equals(43, proxy());
  Expect.equals(43, proxy.call());
}

topLevelFunction() => 44;

testTopLevelTearOff() {
  dynamic proxy = new Proxy(topLevelFunction);
  Expect.equals(44, proxy());
  Expect.equals(44, proxy.call());
}

class C {
  method() => 45;
}

testInstanceTearOff() {
  dynamic proxy = new Proxy(new C().method);
  Expect.equals(45, proxy());
  Expect.equals(45, proxy.call());
}

main() {
  testClosure();
  testFakeFunction();
  testTopLevelTearOff();
  testInstanceTearOff();
}
