...

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

Documentation: github.com/vektah/gqlparser/v2/parser

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

View as plain text