@@ -65,6 +65,77 @@ this is used to replace
6565 "Newline" ,
6666 ] ) ;
6767 } ) ;
68+
69+ it ( "does not misinterpret C++ syntax as tokens" , ( ) => {
70+ const result = lexer . tokenize ( `SomeClass::state::something;` ) ;
71+ expect ( result . errors . length ) . toBe ( 0 ) ;
72+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
73+ expect ( tokenNames ) . toBeNull ;
74+ } ) ;
75+
76+ it ( "does not make a token from content that starts with ::" , ( ) => {
77+ const result = lexer . tokenize ( `::SomeClass::state::something;` ) ;
78+ expect ( result . errors . length ) . toBe ( 0 ) ;
79+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
80+ expect ( tokenNames ) . toBeNull ;
81+ } ) ;
82+
83+ it ( "does not make a token from content that ends with ::" , ( ) => {
84+ const result = lexer . tokenize ( `SomeClass::state::something::` ) ;
85+ expect ( result . errors . length ) . toBe ( 0 ) ;
86+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
87+ expect ( tokenNames ) . toBeNull ;
88+ } ) ;
89+
90+ it ( "does not make a token from content that starts and ends with ::" , ( ) => {
91+ const result = lexer . tokenize ( `::SomeClass::state::something::` ) ;
92+ expect ( result . errors . length ) . toBe ( 0 ) ;
93+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
94+ expect ( tokenNames ) . toBeNull ;
95+ } ) ;
96+
97+ it ( "does not make a token with a space in the state tag" , ( ) => {
98+ const result = lexer . tokenize ( `
99+ // :state -start: state-identifier
100+ SomeClass::state::something;
101+ // :state-end:
102+ ` ) ;
103+ expect ( result . errors . length ) . toBe ( 0 ) ;
104+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
105+ expect ( tokenNames ) . toBeNull ;
106+ } ) ;
107+
108+ it ( "does not make a token with a space after the start colon" , ( ) => {
109+ const result = lexer . tokenize ( `
110+ // : state-start: state-identifier
111+ SomeClass::state::something;
112+ // :state-end:
113+ ` ) ;
114+ expect ( result . errors . length ) . toBe ( 0 ) ;
115+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
116+ expect ( tokenNames ) . toBeNull ;
117+ } ) ;
118+
119+ it ( "Correctly tokenizes C++ syntax within a tag" , ( ) => {
120+ const result = lexer . tokenize ( `
121+ // :state-start: state-identifier
122+ SomeClass::state::something;
123+ // :state-end:
124+ ` ) ;
125+ expect ( result . errors . length ) . toBe ( 0 ) ;
126+ const tokenNames = result . tokens . map ( ( token ) => token . tokenType . name ) ;
127+ expect ( tokenNames ) . toStrictEqual ( [
128+ "Newline" ,
129+ "LineComment" ,
130+ "TagStart" ,
131+ "Identifier" ,
132+ "Newline" ,
133+ "Newline" ,
134+ "LineComment" ,
135+ "TagEnd" ,
136+ "Newline" ,
137+ ] ) ;
138+ } ) ;
68139} ) ;
69140
70141describe ( "custom comment lexer" , ( ) => {
@@ -116,9 +187,13 @@ describe("custom comment lexer", () => {
116187
117188 it ( "rejects comment patterns that conflict with other tokens" , ( ) => {
118189 expect ( ( ) => {
119- makeLexer ( [ makeLineCommentToken ( TAG_PATTERN ) ] ) ;
120- } ) . toThrowError ( `Errors detected in definition of Lexer:
121- The same RegExp pattern ->/:([A-z0-9-]+):[^\\S\\r\\n]*/<-has been used in all of the following Token Types: Tag, LineComment <-` ) ;
190+ try {
191+ makeLexer ( [ makeLineCommentToken ( TAG_PATTERN ) ] ) ;
192+ } catch ( e ) {
193+ expect ( e . message ) . toBe ( `Errors detected in definition of Lexer:
194+ The same RegExp pattern ->/(?<!:):([A-z0-9-]+):(?!:)[^\\S\\r\\n]*/<-has been used in all of the following Token Types: Tag, LineComment <-` ) ;
195+ }
196+ } ) ;
122197 } ) ;
123198} ) ;
124199
0 commit comments