// 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';
import 'package:expect/variations.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' && !unsoundNullSafety) ||
          (code == 'W' && hasUnsoundNullSafety);
      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();
}
