@@ -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
@@ -864,4 +870,129 @@ describe('Parser', () => {
864870 } ) ;
865871 } ) ;
866872 } ) ;
873+
874+ describe ( 'parseSchemaCoordinate' , ( ) => {
875+ it ( 'parses Name' , ( ) => {
876+ const result = parseSchemaCoordinate ( 'MyType' ) ;
877+ expectJSON ( result ) . toDeepEqual ( {
878+ kind : Kind . SCHEMA_COORDINATE ,
879+ loc : { start : 0 , end : 6 } ,
880+ ofDirective : false ,
881+ name : {
882+ kind : Kind . NAME ,
883+ loc : { start : 0 , end : 6 } ,
884+ value : 'MyType' ,
885+ } ,
886+ memberName : undefined ,
887+ argumentName : undefined ,
888+ } ) ;
889+ } ) ;
890+
891+ it ( 'parses Name . Name' , ( ) => {
892+ const result = parseSchemaCoordinate ( 'MyType.field' ) ;
893+ expectJSON ( result ) . toDeepEqual ( {
894+ kind : Kind . SCHEMA_COORDINATE ,
895+ loc : { start : 0 , end : 12 } ,
896+ ofDirective : false ,
897+ name : {
898+ kind : Kind . NAME ,
899+ loc : { start : 0 , end : 6 } ,
900+ value : 'MyType' ,
901+ } ,
902+ memberName : {
903+ kind : Kind . NAME ,
904+ loc : { start : 7 , end : 12 } ,
905+ value : 'field' ,
906+ } ,
907+ argumentName : undefined ,
908+ } ) ;
909+ } ) ;
910+
911+ it ( 'rejects Name . Name . Name' , ( ) => {
912+ expectToThrowJSON ( ( ) =>
913+ parseSchemaCoordinate ( 'MyType.field.deep' ) ,
914+ ) . to . deep . equal ( {
915+ message : 'Syntax Error: Expected <EOF>, found ".".' ,
916+ locations : [ { line : 1 , column : 13 } ] ,
917+ } ) ;
918+ } ) ;
919+
920+ it ( 'parses Name . Name ( Name : )' , ( ) => {
921+ const result = parseSchemaCoordinate ( 'MyType.field(arg:)' ) ;
922+ expectJSON ( result ) . toDeepEqual ( {
923+ kind : Kind . SCHEMA_COORDINATE ,
924+ loc : { start : 0 , end : 18 } ,
925+ ofDirective : false ,
926+ name : {
927+ kind : Kind . NAME ,
928+ loc : { start : 0 , end : 6 } ,
929+ value : 'MyType' ,
930+ } ,
931+ memberName : {
932+ kind : Kind . NAME ,
933+ loc : { start : 7 , end : 12 } ,
934+ value : 'field' ,
935+ } ,
936+ argumentName : {
937+ kind : Kind . NAME ,
938+ loc : { start : 13 , end : 16 } ,
939+ value : 'arg' ,
940+ } ,
941+ } ) ;
942+ } ) ;
943+
944+ it ( 'rejects Name . Name ( Name : Name )' , ( ) => {
945+ expectToThrowJSON ( ( ) =>
946+ parseSchemaCoordinate ( 'MyType.field(arg: value)' ) ,
947+ ) . to . deep . equal ( {
948+ message : 'Syntax Error: Expected ")", found Name "value".' ,
949+ locations : [ { line : 1 , column : 19 } ] ,
950+ } ) ;
951+ } ) ;
952+
953+ it ( 'parses @ Name' , ( ) => {
954+ const result = parseSchemaCoordinate ( '@myDirective' ) ;
955+ expectJSON ( result ) . toDeepEqual ( {
956+ kind : Kind . SCHEMA_COORDINATE ,
957+ loc : { start : 0 , end : 12 } ,
958+ ofDirective : true ,
959+ name : {
960+ kind : Kind . NAME ,
961+ loc : { start : 1 , end : 12 } ,
962+ value : 'myDirective' ,
963+ } ,
964+ memberName : undefined ,
965+ argumentName : undefined ,
966+ } ) ;
967+ } ) ;
968+
969+ it ( 'parses @ Name ( Name : )' , ( ) => {
970+ const result = parseSchemaCoordinate ( '@myDirective(arg:)' ) ;
971+ expectJSON ( result ) . toDeepEqual ( {
972+ kind : Kind . SCHEMA_COORDINATE ,
973+ loc : { start : 0 , end : 18 } ,
974+ ofDirective : true ,
975+ name : {
976+ kind : Kind . NAME ,
977+ loc : { start : 1 , end : 12 } ,
978+ value : 'myDirective' ,
979+ } ,
980+ memberName : undefined ,
981+ argumentName : {
982+ kind : Kind . NAME ,
983+ loc : { start : 13 , end : 16 } ,
984+ value : 'arg' ,
985+ } ,
986+ } ) ;
987+ } ) ;
988+
989+ it ( 'rejects @ Name . Name' , ( ) => {
990+ expectToThrowJSON ( ( ) =>
991+ parseSchemaCoordinate ( '@myDirective.field' ) ,
992+ ) . to . deep . equal ( {
993+ message : 'Syntax Error: Expected <EOF>, found ".".' ,
994+ locations : [ { line : 1 , column : 13 } ] ,
995+ } ) ;
996+ } ) ;
997+ } ) ;
867998} ) ;
0 commit comments