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