@@ -11,7 +11,13 @@ import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js';
11
11
import { inspect } from '../../jsutils/inspect.js' ;
12
12
13
13
import { 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' ;
15
21
import { Source } from '../source.js' ;
16
22
import { TokenKind } from '../tokenKind.js' ;
17
23
@@ -679,4 +685,178 @@ describe('Parser', () => {
679
685
} ) ;
680
686
} ) ;
681
687
} ) ;
688
+
689
+ describe ( 'parseSchemaCoordinate' , ( ) => {
690
+ it ( 'parses Name' , ( ) => {
691
+ const result = parseSchemaCoordinate ( 'MyType' ) ;
692
+ expectJSON ( result ) . toDeepEqual ( {
693
+ kind : Kind . TYPE_COORDINATE ,
694
+ loc : { start : 0 , end : 6 } ,
695
+ name : {
696
+ kind : Kind . NAME ,
697
+ loc : { start : 0 , end : 6 } ,
698
+ value : 'MyType' ,
699
+ } ,
700
+ } ) ;
701
+ } ) ;
702
+
703
+ it ( 'parses Name . Name' , ( ) => {
704
+ const result = parseSchemaCoordinate ( 'MyType.field' ) ;
705
+ expectJSON ( result ) . toDeepEqual ( {
706
+ kind : Kind . MEMBER_COORDINATE ,
707
+ loc : { start : 0 , end : 12 } ,
708
+ name : {
709
+ kind : Kind . NAME ,
710
+ loc : { start : 0 , end : 6 } ,
711
+ value : 'MyType' ,
712
+ } ,
713
+ memberName : {
714
+ kind : Kind . NAME ,
715
+ loc : { start : 7 , end : 12 } ,
716
+ value : 'field' ,
717
+ } ,
718
+ } ) ;
719
+ } ) ;
720
+
721
+ it ( 'rejects Name . Name . Name' , ( ) => {
722
+ expect ( ( ) => parseSchemaCoordinate ( 'MyType.field.deep' ) )
723
+ . to . throw ( )
724
+ . to . deep . include ( {
725
+ message : 'Syntax Error: Expected <EOF>, found ..' ,
726
+ locations : [ { line : 1 , column : 13 } ] ,
727
+ } ) ;
728
+ } ) ;
729
+
730
+ it ( 'parses Name . Name ( Name : )' , ( ) => {
731
+ const result = parseSchemaCoordinate ( 'MyType.field(arg:)' ) ;
732
+ expectJSON ( result ) . toDeepEqual ( {
733
+ kind : Kind . ARGUMENT_COORDINATE ,
734
+ loc : { start : 0 , end : 18 } ,
735
+ name : {
736
+ kind : Kind . NAME ,
737
+ loc : { start : 0 , end : 6 } ,
738
+ value : 'MyType' ,
739
+ } ,
740
+ fieldName : {
741
+ kind : Kind . NAME ,
742
+ loc : { start : 7 , end : 12 } ,
743
+ value : 'field' ,
744
+ } ,
745
+ argumentName : {
746
+ kind : Kind . NAME ,
747
+ loc : { start : 13 , end : 16 } ,
748
+ value : 'arg' ,
749
+ } ,
750
+ } ) ;
751
+ } ) ;
752
+
753
+ it ( 'rejects Name . Name ( Name : Name )' , ( ) => {
754
+ expect ( ( ) => parseSchemaCoordinate ( 'MyType.field(arg: value)' ) )
755
+ . to . throw ( )
756
+ . to . deep . include ( {
757
+ message : 'Syntax Error: Invalid character: " ".' ,
758
+ locations : [ { line : 1 , column : 18 } ] ,
759
+ } ) ;
760
+ } ) ;
761
+
762
+ it ( 'parses @ Name' , ( ) => {
763
+ const result = parseSchemaCoordinate ( '@myDirective' ) ;
764
+ expectJSON ( result ) . toDeepEqual ( {
765
+ kind : Kind . DIRECTIVE_COORDINATE ,
766
+ loc : { start : 0 , end : 12 } ,
767
+ name : {
768
+ kind : Kind . NAME ,
769
+ loc : { start : 1 , end : 12 } ,
770
+ value : 'myDirective' ,
771
+ } ,
772
+ } ) ;
773
+ } ) ;
774
+
775
+ it ( 'parses @ Name ( Name : )' , ( ) => {
776
+ const result = parseSchemaCoordinate ( '@myDirective(arg:)' ) ;
777
+ expectJSON ( result ) . toDeepEqual ( {
778
+ kind : Kind . DIRECTIVE_ARGUMENT_COORDINATE ,
779
+ loc : { start : 0 , end : 18 } ,
780
+ name : {
781
+ kind : Kind . NAME ,
782
+ loc : { start : 1 , end : 12 } ,
783
+ value : 'myDirective' ,
784
+ } ,
785
+ argumentName : {
786
+ kind : Kind . NAME ,
787
+ loc : { start : 13 , end : 16 } ,
788
+ value : 'arg' ,
789
+ } ,
790
+ } ) ;
791
+ } ) ;
792
+
793
+ it ( 'parses __Type' , ( ) => {
794
+ const result = parseSchemaCoordinate ( '__Type' ) ;
795
+ expectJSON ( result ) . toDeepEqual ( {
796
+ kind : Kind . TYPE_COORDINATE ,
797
+ loc : { start : 0 , end : 6 } ,
798
+ name : {
799
+ kind : Kind . NAME ,
800
+ loc : { start : 0 , end : 6 } ,
801
+ value : '__Type' ,
802
+ } ,
803
+ } ) ;
804
+ } ) ;
805
+
806
+ it ( 'parses Type.__metafield' , ( ) => {
807
+ const result = parseSchemaCoordinate ( 'Type.__metafield' ) ;
808
+ expectJSON ( result ) . toDeepEqual ( {
809
+ kind : Kind . MEMBER_COORDINATE ,
810
+ loc : { start : 0 , end : 16 } ,
811
+ name : {
812
+ kind : Kind . NAME ,
813
+ loc : { start : 0 , end : 4 } ,
814
+ value : 'Type' ,
815
+ } ,
816
+ memberName : {
817
+ kind : Kind . NAME ,
818
+ loc : { start : 5 , end : 16 } ,
819
+ value : '__metafield' ,
820
+ } ,
821
+ } ) ;
822
+ } ) ;
823
+
824
+ it ( 'parses Type.__metafield(arg:)' , ( ) => {
825
+ const result = parseSchemaCoordinate ( 'Type.__metafield(arg:)' ) ;
826
+ expectJSON ( result ) . toDeepEqual ( {
827
+ kind : Kind . ARGUMENT_COORDINATE ,
828
+ loc : { start : 0 , end : 22 } ,
829
+ name : {
830
+ kind : Kind . NAME ,
831
+ loc : { start : 0 , end : 4 } ,
832
+ value : 'Type' ,
833
+ } ,
834
+ fieldName : {
835
+ kind : Kind . NAME ,
836
+ loc : { start : 5 , end : 16 } ,
837
+ value : '__metafield' ,
838
+ } ,
839
+ argumentName : {
840
+ kind : Kind . NAME ,
841
+ loc : { start : 17 , end : 20 } ,
842
+ value : 'arg' ,
843
+ } ,
844
+ } ) ;
845
+ } ) ;
846
+
847
+ it ( 'rejects @ Name . Name' , ( ) => {
848
+ expect ( ( ) => parseSchemaCoordinate ( '@myDirective.field' ) )
849
+ . to . throw ( )
850
+ . to . deep . include ( {
851
+ message : 'Syntax Error: Expected <EOF>, found ..' ,
852
+ locations : [ { line : 1 , column : 13 } ] ,
853
+ } ) ;
854
+ } ) ;
855
+
856
+ it ( 'accepts a Source object' , ( ) => {
857
+ expect ( parseSchemaCoordinate ( 'MyType' ) ) . to . deep . equal (
858
+ parseSchemaCoordinate ( new Source ( 'MyType' ) ) ,
859
+ ) ;
860
+ } ) ;
861
+ } ) ;
682
862
} ) ;
0 commit comments