public void ShouldReturnListOfTypeParametersOnNodeWhenKindIsSyntaxKind(
            string kind
            )
        {
            // Given
            var typeParameterIdentifierStr = "identifier-str";
            var typeParemters = new List <Node>
            {
                new NodeMock
                {
                    IdentifierStr = typeParameterIdentifierStr,
                },
            };

            var expected = new List <string>
            {
                typeParameterIdentifierStr,
            };

            var node = new NodeMock
            {
                Kind           = kind,
                TypeParameters = typeParemters,
            };

            // When
            var actual = TypeParameterIdentifier.Identify(
                node
                );

            // Then
            actual.Should()
            .BeEquivalentTo(expected);
        }
        public void ShouldValidateAgainstCacheWhenDeclarationTypeIsUsed(
            string declarationType,
            bool found
            )
        {
            // Given
            var expected         = 1;
            var identifierString = "identifier-string";
            var mockNode         = new NodeMock
            {
                IdentifierStr = identifierString,
            };

            var astMock      = new Mock <AbstractSyntaxTree>();
            var rootNodeMock = new Mock <Node>();

            astMock.Setup(
                mock => mock.RootNode
                ).Returns(
                rootNodeMock.Object
                );

            rootNodeMock.Setup(
                mock => mock.OfKind(
                    declarationType
                    )
                ).Returns(
                new List <Node>
            {
                mockNode
            }
                );

            // When
            var alias  = new InterfaceResponseTypeIdentifierCached();
            var actual = alias.Identify(
                identifierString,
                astMock.Object
                );

            actual.Should().Be(found);

            actual = alias.Identify(
                identifierString,
                astMock.Object
                );

            // Then
            actual.Should().Be(found);

            rootNodeMock.Verify(
                mock => mock.OfKind(
                    declarationType
                    ),
                Times.Exactly(expected)
                );
        }
        public async Task ShoudlOnlyReadFromASTOnceWhenCallingIdentifyAsSecondTime()
        {
            // Given
            var expected         = 1;
            var identifierString = "identifier-string";
            var mockNode         = new NodeMock
            {
                IdentifierStr = identifierString,
            };

            var astMock      = new Mock <AbstractSyntaxTree>();
            var rootNodeMock = new Mock <Node>();

            astMock.Setup(
                mock => mock.RootNode
                ).Returns(
                rootNodeMock.Object
                );

            rootNodeMock.Setup(
                mock => mock.OfKind(
                    SyntaxKind.TypeAliasDeclaration
                    )
                ).Returns(
                new List <Node>
            {
                mockNode
            }
                );

            // When
            var alias  = new AliasTypeIdentifierCached();
            var actual = alias.Identify(
                identifierString,
                astMock.Object
                );

            actual.Should().BeTrue();

            actual = alias.Identify(
                identifierString,
                astMock.Object
                );

            // Then
            actual.Should().BeTrue();

            rootNodeMock.Verify(
                mock => mock.OfKind(
                    SyntaxKind.TypeAliasDeclaration
                    ),
                Times.Exactly(expected)
                );
        }
        public void ShouldReturnEmptyListWhenTypeParametersAreNull(
            string kind
            )
        {
            // Given
            var typeParemters = default(List <Node>);

            var node = new NodeMock
            {
                Kind           = kind,
                TypeParameters = typeParemters,
            };

            // When
            var actual = TypeParameterIdentifier.Identify(
                node
                );

            // Then
            actual.Should().BeEmpty();
        }