// Copyright (c) 2018, 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.
// Dart test program to test arithmetic operations.

import "dart:async";
import "package:expect/expect.dart";

class B {}

class C {
  B call(B b) => b;
}

typedef B BToB(B x);

typedef Object NullToObject(Null x);

C c = new C();

void check1(BToB f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  B b = new B();
  Expect.identical(f(b), b);
}

void check2(FutureOr<BToB> f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  BToB f2 = f;
  Expect.identical(f, f2);
  B b = new B();
  Expect.identical(f2(b), b);
}

void check3(NullToObject f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  Expect.isNull(f(null));
}

void check4(FutureOr<NullToObject> f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  NullToObject f2 = f;
  Expect.identical(f, f2);
  Expect.isNull(f2(null));
}

void check5(Function f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  B b = new B();
  Expect.identical(f(b), b);
}

void check6(FutureOr<Function> f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  Function f2 = f;
  Expect.identical(f, f2);
  B b = new B();
  Expect.identical(f2(b), b);
}

void check7(C x) {
  Expect.identical(c, x);
}

void check8(FutureOr<C> x) {
  Expect.identical(c, x);
}

void check9(Object o) {
  Expect.identical(c, o);
}

void check10(FutureOr<Object> o) {
  Expect.identical(c, o);
}

void check11(dynamic d) {
  Expect.identical(c, d);
}

void check12(FutureOr<dynamic> d) {
  Expect.identical(c, d);
}

main() {
  // Implicitly tears off c.call
  check1(c); //# 01: ok
  check2(c); //# 02: ok
  check3(c); //# 03: ok
  check4(c); //# 04: ok
  check5(c); //# 05: ok
  check6(c); //# 06: ok
  // Does not tear off c.call
  check7(c); //# 07: ok
  check8(c); //# 08: ok
  check9(c); //# 09: ok
  check10(c); //# 10: ok
  check11(c); //# 11: ok
  check12(c); //# 12: ok
}
