@@ -387,14 +387,79 @@ func testCaptures(t *testing.T, body, sq string, expected []string) {
387387}
388388
389389func TestQueryError (t * testing.T ) {
390- assert := assert .New (t )
391-
392- q , err := NewQuery ([]byte ("((unknown) name: (identifier))" ), getTestGrammar ())
390+ grammar := getTestGrammar ()
391+
392+ tests := []struct {
393+ name string
394+ query string
395+ expected * QueryError
396+ }{
397+ {
398+ name : "syntax error" ,
399+ query : "((expression)" ,
400+ expected : & QueryError {
401+ Type : QueryErrorSyntax ,
402+ Message : "invalid syntax at line 1 column 1\n \n ^" ,
403+ },
404+ },
405+ {
406+ name : "node type error" ,
407+ query : "((unknown))" ,
408+ expected : & QueryError {
409+ Type : QueryErrorNodeType ,
410+ Message : "invalid node type 'unknown' at line 1 column 0" ,
411+ },
412+ },
413+ {
414+ name : "field error" ,
415+ query : "(sum invalid_field: (number))" ,
416+ expected : & QueryError {
417+ Type : QueryErrorField ,
418+ Message : "invalid field 'invalid_field' at line 1 column 0" ,
419+ },
420+ },
421+ {
422+ name : "capture error" ,
423+ query : "((#eq? @missing \" value\" )" ,
424+ expected : & QueryError {
425+ Type : QueryErrorCapture ,
426+ Message : "invalid capture 'missing' at line 1 column 0" ,
427+ },
428+ },
429+ {
430+ name : "structure error" ,
431+ query : "(number (expression ) @query)" ,
432+ expected : & QueryError {
433+ Type : QueryErrorStructure ,
434+ Message : "invalid structure at line 1 column 0\n (expression ) @query)\n ^" ,
435+ },
436+ },
437+ // TODO: this error only happens when a language with incompatible version is being used
438+ // {
439+ // name: "language error",
440+ // query: "",
441+ // expected: &QueryError{
442+ // Type: QueryErrorLanguage,
443+ // Message: "incompatible language at line 1 column 0",
444+ // },
445+ // },
446+ }
393447
394- assert .Nil (q )
395- assert .NotNil (err )
396- assert .EqualValues (& QueryError {Offset : 0x02 , Type : QueryErrorNodeType ,
397- Message : "invalid node type 'unknown' at line 1 column 0" }, err )
448+ for _ , tt := range tests {
449+ t .Run (tt .name , func (t * testing.T ) {
450+ assert := assert .New (t )
451+ q , err := NewQuery ([]byte (tt .query ), grammar )
452+ if ! assert .Nil (q ) {
453+ return
454+ }
455+ assert .NotNil (err )
456+ queryErr , ok := err .(* QueryError )
457+ if assert .True (ok , "error type: %T, err: %v" , err , err ) {
458+ assert .Equal (tt .expected .Type , queryErr .Type )
459+ assert .Equal (tt .expected .Message , queryErr .Message )
460+ }
461+ })
462+ }
398463}
399464
400465func doWorkLifetime (t testing.TB , n * Node ) {
0 commit comments