@@ -11,7 +11,13 @@ import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js';
1111import { inspect } from '../../jsutils/inspect.js' ;
1212
1313import { Kind } from '../kinds.js' ;
14- import { parse , parseConstValue , parseType , parseValue } from '../parser.js' ;
14+ import {
15+ parse ,
16+ parseConstValue ,
17+ parseSchemaCoordinate ,
18+ parseType ,
19+ parseValue ,
20+ } from '../parser.js' ;
1521import { Source } from '../source.js' ;
1622import { TokenKind } from '../tokenKind.js' ;
1723
@@ -679,4 +685,129 @@ describe('Parser', () => {
679685 } ) ;
680686 } ) ;
681687 } ) ;
688+
689+ describe ( 'parseSchemaCoordinate' , ( ) => {
690+ it ( 'parses Name' , ( ) => {
691+ const result = parseSchemaCoordinate ( 'MyType' ) ;
692+ expectJSON ( result ) . toDeepEqual ( {
693+ kind : Kind . SCHEMA_COORDINATE ,
694+ loc : { start : 0 , end : 6 } ,
695+ ofDirective : false ,
696+ name : {
697+ kind : Kind . NAME ,
698+ loc : { start : 0 , end : 6 } ,
699+ value : 'MyType' ,
700+ } ,
701+ memberName : undefined ,
702+ argumentName : undefined ,
703+ } ) ;
704+ } ) ;
705+
706+ it ( 'parses Name . Name' , ( ) => {
707+ const result = parseSchemaCoordinate ( 'MyType.field' ) ;
708+ expectJSON ( result ) . toDeepEqual ( {
709+ kind : Kind . SCHEMA_COORDINATE ,
710+ loc : { start : 0 , end : 12 } ,
711+ ofDirective : false ,
712+ name : {
713+ kind : Kind . NAME ,
714+ loc : { start : 0 , end : 6 } ,
715+ value : 'MyType' ,
716+ } ,
717+ memberName : {
718+ kind : Kind . NAME ,
719+ loc : { start : 7 , end : 12 } ,
720+ value : 'field' ,
721+ } ,
722+ argumentName : undefined ,
723+ } ) ;
724+ } ) ;
725+
726+ it ( 'rejects Name . Name . Name' , ( ) => {
727+ expectToThrowJSON ( ( ) =>
728+ parseSchemaCoordinate ( 'MyType.field.deep' ) ,
729+ ) . to . deep . equal ( {
730+ message : 'Syntax Error: Expected <EOF>, found ".".' ,
731+ locations : [ { line : 1 , column : 13 } ] ,
732+ } ) ;
733+ } ) ;
734+
735+ it ( 'parses Name . Name ( Name : )' , ( ) => {
736+ const result = parseSchemaCoordinate ( 'MyType.field(arg:)' ) ;
737+ expectJSON ( result ) . toDeepEqual ( {
738+ kind : Kind . SCHEMA_COORDINATE ,
739+ loc : { start : 0 , end : 18 } ,
740+ ofDirective : false ,
741+ name : {
742+ kind : Kind . NAME ,
743+ loc : { start : 0 , end : 6 } ,
744+ value : 'MyType' ,
745+ } ,
746+ memberName : {
747+ kind : Kind . NAME ,
748+ loc : { start : 7 , end : 12 } ,
749+ value : 'field' ,
750+ } ,
751+ argumentName : {
752+ kind : Kind . NAME ,
753+ loc : { start : 13 , end : 16 } ,
754+ value : 'arg' ,
755+ } ,
756+ } ) ;
757+ } ) ;
758+
759+ it ( 'rejects Name . Name ( Name : Name )' , ( ) => {
760+ expectToThrowJSON ( ( ) =>
761+ parseSchemaCoordinate ( 'MyType.field(arg: value)' ) ,
762+ ) . to . deep . equal ( {
763+ message : 'Syntax Error: Expected ")", found Name "value".' ,
764+ locations : [ { line : 1 , column : 19 } ] ,
765+ } ) ;
766+ } ) ;
767+
768+ it ( 'parses @ Name' , ( ) => {
769+ const result = parseSchemaCoordinate ( '@myDirective' ) ;
770+ expectJSON ( result ) . toDeepEqual ( {
771+ kind : Kind . SCHEMA_COORDINATE ,
772+ loc : { start : 0 , end : 12 } ,
773+ ofDirective : true ,
774+ name : {
775+ kind : Kind . NAME ,
776+ loc : { start : 1 , end : 12 } ,
777+ value : 'myDirective' ,
778+ } ,
779+ memberName : undefined ,
780+ argumentName : undefined ,
781+ } ) ;
782+ } ) ;
783+
784+ it ( 'parses @ Name ( Name : )' , ( ) => {
785+ const result = parseSchemaCoordinate ( '@myDirective(arg:)' ) ;
786+ expectJSON ( result ) . toDeepEqual ( {
787+ kind : Kind . SCHEMA_COORDINATE ,
788+ loc : { start : 0 , end : 18 } ,
789+ ofDirective : true ,
790+ name : {
791+ kind : Kind . NAME ,
792+ loc : { start : 1 , end : 12 } ,
793+ value : 'myDirective' ,
794+ } ,
795+ memberName : undefined ,
796+ argumentName : {
797+ kind : Kind . NAME ,
798+ loc : { start : 13 , end : 16 } ,
799+ value : 'arg' ,
800+ } ,
801+ } ) ;
802+ } ) ;
803+
804+ it ( 'rejects @ Name . Name' , ( ) => {
805+ expectToThrowJSON ( ( ) =>
806+ parseSchemaCoordinate ( '@myDirective.field' ) ,
807+ ) . to . deep . equal ( {
808+ message : 'Syntax Error: Expected <EOF>, found ".".' ,
809+ locations : [ { line : 1 , column : 13 } ] ,
810+ } ) ;
811+ } ) ;
812+ } ) ;
682813} ) ;
0 commit comments