public void FindUndeclaredVariablesFragmentDefinition()
        {
            // arrange
            ISchema schema = SchemaBuilder.New()
                             .AddStarWarsTypes()
                             .Create();

            DocumentNode document = Utf8GraphQLParser.Parse(
                @"
                query getHero {
                    ... q
                }

                fragment q on Query {
                    hero(episode: $ep) {
                        name
                    }
                }
                ");

            OperationDefinitionNode operation = document.Definitions
                                                .OfType <OperationDefinitionNode>()
                                                .First();

            var visitor       = new CollectVariablesVisitor(schema);
            var visitationMap = new CollectVariablesVisitationMap();

            visitationMap.Initialize(
                document.Definitions.OfType <FragmentDefinitionNode>()
                .ToDictionary(t => t.Name.Value));

            // act
            operation.Accept(
                visitor,
                visitationMap,
                node => VisitorAction.Continue);

            // assert
            var variables = operation.VariableDefinitions.ToList();

            variables.AddRange(visitor.VariableDeclarations);
            operation = operation.WithVariableDefinitions(variables);

            var definitions = new List <IDefinitionNode>();

            definitions.Add(operation);
            definitions.AddRange(
                document.Definitions.OfType <FragmentDefinitionNode>());

            QuerySyntaxSerializer.Serialize(
                new DocumentNode(
                    definitions)).MatchSnapshot();
        }
        public void FindUndeclaredVariablesInlineFragment()
        {
            // arrange
            ISchema schema = SchemaBuilder.New()
                             .AddStarWarsTypes()
                             .Create();

            DocumentNode document = Utf8GraphQLParser.Parse(
                @"
                query getHero {
                    ... on Query {
                        hero(episode: $ep) {
                            name
                        }
                    }
                }");

            OperationDefinitionNode operation = document.Definitions
                                                .OfType <OperationDefinitionNode>()
                                                .First();

            var visitor       = new CollectVariablesVisitor(schema);
            var visitationMap = new CollectVariablesVisitationMap();

            // act
            operation.Accept(
                visitor,
                visitationMap,
                node => VisitorAction.Continue);

            // assert
            var variables = operation.VariableDefinitions.ToList();

            variables.AddRange(visitor.VariableDeclarations);
            operation = operation.WithVariableDefinitions(variables);

            new DocumentNode(
                new IDefinitionNode[]
            {
                operation
            }).Print().MatchSnapshot();
        }