public void should_not_be_equal_if_pattern_differs()
    {
        // --arrange
        var target1 = new IsMethodParameterWithType(new UnitPattern("1"));
        var target2 = new IsMethodParameterWithType(new UnitPattern("2"));

        // --assert
        target1.Equals(target2).Should().BeFalse();
        target2.Equals(target1).Should().BeFalse();
    }
    public void should_match_only_argument_special_tag([Values(null, "tag")] object?tag)
    {
        var parameterInfo = typeof(Subject).GetMethod(nameof(Subject.Foo))?.GetParameters().Single(_ => _.ParameterType == typeof(int)) !;

        // --arrange
        var typePattern = A.Fake <IUnitPattern>();
        var target      = new IsMethodParameterWithType(typePattern);
        var unitId      = new UnitId(parameterInfo, tag);

        // --act
        target.Matches(unitId);

        // --assert
        A.CallTo(() => typePattern.Matches(An <UnitId> ._)).MustNotHaveHappened();
    }
    public void should_delegate_call_with_extracted_type()
    {
        var parameterInfo = typeof(Subject).GetMethod(nameof(Subject.Foo))?.GetParameters().Single(_ => _.ParameterType == typeof(int)) !;
        var expected      = new UnitId(typeof(int), null);

        // --arrange
        var typePattern = A.Fake <IUnitPattern>();
        var target      = new IsMethodParameterWithType(typePattern);
        var unitId      = new UnitId(parameterInfo, SpecialTag.Argument);

        // --act
        target.Matches(unitId);

        // --assert
        A.CallTo(() => typePattern.Matches(expected)).MustHaveHappenedOnceAndOnly();
    }