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

// This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
import "package:expect/expect.dart";

import 'libImport.dart';

@pragma('dart2js:noInline')
typeTest(dynamic t) {
  if (t is T_010) {
    return true;
  }
  if (t is T_011) {
    return true;
  }
  if (t is T_111_type__1) {
    return true;
  }
  if (t is T_111_type__2) {
    return true;
  }
  if (t is T_111_type__3) {
    return true;
  }
  if (t is T_111_type__4) {
    return true;
  }
  if (t is T_111_type__5) {
    return true;
  }
  if (t is T_111_type__6) {
    return true;
  }
  if (t is T_011_type__1) {
    return true;
  }
  if (t is T_011_type__2) {
    return true;
  }
  if (t is T_011_type__3) {
    return true;
  }
  return false;
}

@pragma('dart2js:noInline')
g_010() {
  // C_*1*;
  Expect.isFalse(typeTest(C_010()));
  Expect.isFalse(typeTest(C_011()));
  Expect.isFalse(typeTest(C_111_class_1()));
  Expect.isFalse(typeTest(C_111_class_2()));
  Expect.isFalse(typeTest(C_111_class_3()));
  Expect.isFalse(typeTest(C_111_class_4()));
  Expect.isFalse(typeTest(C_111_class_5()));
  Expect.isFalse(typeTest(C_111_class_6()));
  Expect.isFalse(typeTest(C_011_class_1()));
  Expect.isFalse(typeTest(C_011_class_2()));
  Expect.isFalse(typeTest(C_011_class_3()));

  Expect.isTrue(closureC_010(C_010())(C_010()));
  Expect.isTrue(closureC_011(C_011())(C_011()));
  Expect.isTrue(closureC_111_class_1(C_111_class_1())(C_111_class_1()));
  Expect.isTrue(closureC_111_class_2(C_111_class_2())(C_111_class_2()));
  Expect.isTrue(closureC_111_class_3(C_111_class_3())(C_111_class_3()));
  Expect.isTrue(closureC_111_class_4(C_111_class_4())(C_111_class_4()));
  Expect.isTrue(closureC_111_class_5(C_111_class_5())(C_111_class_5()));
  Expect.isTrue(closureC_111_class_6(C_111_class_6())(C_111_class_6()));
  Expect.isTrue(closureC_011_class_1(C_011_class_1())(C_011_class_1()));
  Expect.isTrue(closureC_011_class_2(C_011_class_2())(C_011_class_2()));
  Expect.isTrue(closureC_011_class_3(C_011_class_3())(C_011_class_3()));

  Expect.equals(
      closureC_010(C_010()).runtimeType.toString(), '(C_010) => bool');
  Expect.equals(
      closureC_011(C_011()).runtimeType.toString(), '(C_011) => bool');
  Expect.equals(closureC_111_class_1(C_111_class_1()).runtimeType.toString(),
      '(C_111_class_1) => bool');
  Expect.equals(closureC_111_class_2(C_111_class_2()).runtimeType.toString(),
      '(C_111_class_2) => bool');
  Expect.equals(closureC_111_class_3(C_111_class_3()).runtimeType.toString(),
      '(C_111_class_3) => bool');
  Expect.equals(closureC_111_class_4(C_111_class_4()).runtimeType.toString(),
      '(C_111_class_4) => bool');
  Expect.equals(closureC_111_class_5(C_111_class_5()).runtimeType.toString(),
      '(C_111_class_5) => bool');
  Expect.equals(closureC_111_class_6(C_111_class_6()).runtimeType.toString(),
      '(C_111_class_6) => bool');
  Expect.equals(closureC_011_class_1(C_011_class_1()).runtimeType.toString(),
      '(C_011_class_1) => bool');
  Expect.equals(closureC_011_class_2(C_011_class_2()).runtimeType.toString(),
      '(C_011_class_2) => bool');
  Expect.equals(closureC_011_class_3(C_011_class_3()).runtimeType.toString(),
      '(C_011_class_3) => bool');

  Set<String> uniques = {};

  // f_*1*;
  f_010(uniques, 1);
  f_011(uniques, 1);
  f_111(uniques, 1);
  Expect.equals(3, uniques.length);
}
