// Copyright (c) 2020, 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.

// dart2jsOptions=--enable-asserts --disable-inlining --disable-type-inference --no-minify

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

// This test contains many different Rti instances that are initialized at
// startup.

typedef F1 = String Function(String, {int opt1});
typedef F2 = String Function(String, {required int req1, int opt1});

class Thingy {
  const Thingy();
}

class Generic<AA> {
  const Generic();
}

bool isObject(o) => o is Object;
bool isF1(o) => o is F1;
bool isF2(o) => o is F2;
bool isThingy(o) => o is Thingy;
bool isGenericF1(o) => o is Generic<F1>;
bool isGenericF2Q(o) => o is Generic<F2?>;
bool isG3(o) => o is FutureOr<AA> Function<AA>(AA);

String foo1(String s) => s;
String foo2(String s, {int opt1 = 0}) => '$s $opt1';
String foo3(String s, {int opt1 = 0, required int req1}) => '$s $req1 $opt1';
Never foo4() => throw 'never';

void test() {
  var items = [foo1, foo2, foo3, foo4, Thingy(), Generic<F1>()];

  void check(String answers, bool Function(dynamic) predicate) {
    Expect.equals(items.length, answers.length);
    for (int i = 0; i < items.length; i++) {
      var item = items[i];
      String code = answers[i];
      bool expected = code == 'T' ||
          (code == 'S' && isStrongMode) ||
          (code == 'W' && isWeakMode);
      Expect.equals(expected, predicate(item), "$predicate '$code' $item");
    }
  }

  // T = true, S = true only in strong mode, W = true only in weak mode.
  check('TTTTTT', isObject);
  check('.TW...', isF1);
  check('..T...', isF2);
  check('....T.', isThingy);
  check('.....T', isGenericF1);
  check('......', isGenericF2Q);
  check('......', isG3);
}

void main() {
  test();
  test();
}
