...

Source file src/github.com/vektah/gqlparser/parser/parser_test.go

Documentation: github.com/vektah/gqlparser/parser

     1  package parser
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  	"github.com/vektah/gqlparser/ast"
     8  	"github.com/vektah/gqlparser/lexer"
     9  )
    10  
    11  func TestParserUtils(t *testing.T) {
    12  	t.Run("test lookaround", func(t *testing.T) {
    13  		p := newParser("asdf 1.0 turtles")
    14  		require.Equal(t, "asdf", p.peek().Value)
    15  		require.Equal(t, "asdf", p.expectKeyword("asdf").Value)
    16  		require.Equal(t, "asdf", p.prev.Value)
    17  		require.Nil(t, p.err)
    18  
    19  		require.Equal(t, "1.0", p.peek().Value)
    20  		require.Equal(t, "1.0", p.peek().Value)
    21  		require.Equal(t, "1.0", p.expect(lexer.Float).Value)
    22  		require.Equal(t, "1.0", p.prev.Value)
    23  		require.Nil(t, p.err)
    24  
    25  		require.True(t, p.skip(lexer.Name))
    26  		require.Nil(t, p.err)
    27  
    28  		require.Equal(t, lexer.EOF, p.peek().Kind)
    29  		require.Nil(t, p.err)
    30  	})
    31  
    32  	t.Run("test many", func(t *testing.T) {
    33  		t.Run("can read array", func(t *testing.T) {
    34  			p := newParser("[a b c d]")
    35  
    36  			var arr []string
    37  			p.many(lexer.BracketL, lexer.BracketR, func() {
    38  				arr = append(arr, p.next().Value)
    39  			})
    40  			require.Nil(t, p.err)
    41  			require.Equal(t, []string{"a", "b", "c", "d"}, arr)
    42  
    43  			require.Equal(t, lexer.EOF, p.peek().Kind)
    44  			require.Nil(t, p.err)
    45  		})
    46  
    47  		t.Run("return if open is not found", func(t *testing.T) {
    48  			p := newParser("turtles are happy")
    49  
    50  			p.many(lexer.BracketL, lexer.BracketR, func() {
    51  				t.Error("cb should not be called")
    52  			})
    53  			require.Nil(t, p.err)
    54  			require.Equal(t, "turtles", p.next().Value)
    55  		})
    56  
    57  		t.Run("will stop on error", func(t *testing.T) {
    58  			p := newParser("[a b c d]")
    59  
    60  			var arr []string
    61  			p.many(lexer.BracketL, lexer.BracketR, func() {
    62  				arr = append(arr, p.next().Value)
    63  				if len(arr) == 2 {
    64  					p.error(p.peek(), "boom")
    65  				}
    66  			})
    67  			require.EqualError(t, p.err, "input.graphql:1: boom")
    68  			require.Equal(t, []string{"a", "b"}, arr)
    69  		})
    70  	})
    71  
    72  	t.Run("test some", func(t *testing.T) {
    73  		t.Run("can read array", func(t *testing.T) {
    74  			p := newParser("[a b c d]")
    75  
    76  			var arr []string
    77  			p.some(lexer.BracketL, lexer.BracketR, func() {
    78  				arr = append(arr, p.next().Value)
    79  			})
    80  			require.Nil(t, p.err)
    81  			require.Equal(t, []string{"a", "b", "c", "d"}, arr)
    82  
    83  			require.Equal(t, lexer.EOF, p.peek().Kind)
    84  			require.Nil(t, p.err)
    85  		})
    86  
    87  		t.Run("can't read empty array", func(t *testing.T) {
    88  			p := newParser("[]")
    89  
    90  			var arr []string
    91  			p.some(lexer.BracketL, lexer.BracketR, func() {
    92  				arr = append(arr, p.next().Value)
    93  			})
    94  			require.EqualError(t, p.err, "input.graphql:1: expected at least one definition, found ]")
    95  			require.Equal(t, []string(nil), arr)
    96  			require.NotEqual(t, lexer.EOF, p.peek().Kind)
    97  		})
    98  
    99  		t.Run("return if open is not found", func(t *testing.T) {
   100  			p := newParser("turtles are happy")
   101  
   102  			p.some(lexer.BracketL, lexer.BracketR, func() {
   103  				t.Error("cb should not be called")
   104  			})
   105  			require.Nil(t, p.err)
   106  			require.Equal(t, "turtles", p.next().Value)
   107  		})
   108  
   109  		t.Run("will stop on error", func(t *testing.T) {
   110  			p := newParser("[a b c d]")
   111  
   112  			var arr []string
   113  			p.some(lexer.BracketL, lexer.BracketR, func() {
   114  				arr = append(arr, p.next().Value)
   115  				if len(arr) == 2 {
   116  					p.error(p.peek(), "boom")
   117  				}
   118  			})
   119  			require.EqualError(t, p.err, "input.graphql:1: boom")
   120  			require.Equal(t, []string{"a", "b"}, arr)
   121  		})
   122  	})
   123  
   124  	t.Run("test errors", func(t *testing.T) {
   125  		p := newParser("foo bar")
   126  
   127  		p.next()
   128  		p.error(p.peek(), "test error")
   129  		p.error(p.peek(), "secondary error")
   130  
   131  		require.EqualError(t, p.err, "input.graphql:1: test error")
   132  
   133  		require.Equal(t, "foo", p.peek().Value)
   134  		require.Equal(t, "foo", p.next().Value)
   135  		require.Equal(t, "foo", p.peek().Value)
   136  	})
   137  
   138  	t.Run("unexpected error", func(t *testing.T) {
   139  		p := newParser("1 3")
   140  		p.unexpectedError()
   141  		require.EqualError(t, p.err, "input.graphql:1: Unexpected Int \"1\"")
   142  	})
   143  
   144  	t.Run("unexpected error", func(t *testing.T) {
   145  		p := newParser("1 3")
   146  		p.unexpectedToken(p.next())
   147  		require.EqualError(t, p.err, "input.graphql:1: Unexpected Int \"1\"")
   148  	})
   149  
   150  	t.Run("expect error", func(t *testing.T) {
   151  		p := newParser("foo bar")
   152  		p.expect(lexer.Float)
   153  
   154  		require.EqualError(t, p.err, "input.graphql:1: Expected Float, found Name")
   155  	})
   156  
   157  	t.Run("expectKeyword error", func(t *testing.T) {
   158  		p := newParser("foo bar")
   159  		p.expectKeyword("baz")
   160  
   161  		require.EqualError(t, p.err, "input.graphql:1: Expected \"baz\", found Name \"foo\"")
   162  	})
   163  }
   164  
   165  func newParser(input string) parser {
   166  	return parser{lexer: lexer.New(&ast.Source{Input: input, Name: "input.graphql"})}
   167  }
   168  

View as plain text