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

import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../../generated/type_system_test.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(TypeReferencesAnyTest);
  });
}

@reflectiveTest
class TypeReferencesAnyTest extends AbstractTypeSystemNullSafetyTest {
  late TypeParameterElement T;
  late TypeParameterType T_none;

  @override
  void setUp() {
    super.setUp();

    T = typeParameter('T');
    T_none = typeParameterTypeNone(T);
  }

  test_false() {
    _checkFalse(dynamicNone);
    _checkFalse(intNone);
    _checkFalse(neverNone);
    _checkFalse(voidNone);
    _checkFalse(listNone(intNone));
  }

  test_true() {
    _checkTrue(T_none);
    _checkTrue(listNone(T_none));
    _checkTrue(mapNone(T_none, intNone));
    _checkTrue(mapNone(intNone, T_none));

    _checkTrue(functionTypeNone(returnType: T_none));

    _checkTrue(
      functionTypeNone(returnType: voidNone, parameters: [
        requiredParameter(type: T_none),
      ]),
    );

    _checkTrue(
      functionTypeNone(
        typeFormals: [
          typeParameter('U', bound: T_none),
        ],
        returnType: voidNone,
      ),
    );
  }

  void _checkFalse(DartType type) {
    var actual = (type as TypeImpl).referencesAny({T});
    expect(actual, isFalse);
  }

  void _checkTrue(DartType type) {
    var actual = (type as TypeImpl).referencesAny({T});
    expect(actual, isTrue);
  }
}
