@@ -109,4 +109,69 @@ describe("matchFilesAgainstRule", () => {
109109 const matched = matchFilesAgainstRule ( [ file ] , rule . match , configRoot ) ;
110110 expect ( matched ) . toContain ( file ) ;
111111 } ) ;
112+ test ( "matches rule with leading slash" , ( ) => {
113+ const result = matchFilesAgainstRule ( updatedFiles , [ "/src/core/**" ] , root ) ;
114+ expect ( result ) . toEqual ( [ resolve ( "project/src/core/index.ts" ) ] ) ;
115+ } ) ;
116+ test ( "matches rule with trailing slash" , ( ) => {
117+ const result = matchFilesAgainstRule (
118+ updatedFiles ,
119+ [ "src/core/" ] , // Should auto-expand to src/core/**
120+ root
121+ ) ;
122+ expect ( result ) . toEqual ( [ resolve ( "project/src/core/index.ts" ) ] ) ;
123+ } ) ;
124+ test ( "matches rule with whitespace" , ( ) => {
125+ const result = matchFilesAgainstRule (
126+ updatedFiles ,
127+ [ " src/core/** " ] ,
128+ root
129+ ) ;
130+ expect ( result ) . toEqual ( [ resolve ( "project/src/core/index.ts" ) ] ) ;
131+ } ) ;
132+ test ( "matches dotfiles" , ( ) => {
133+ const result = matchFilesAgainstRule ( updatedFiles , [ ".env" ] , root ) ;
134+ expect ( result ) . toEqual ( [ resolve ( "project/.env" ) ] ) ;
135+ } ) ;
136+ test ( "matches deeply nested file" , ( ) => {
137+ const result = matchFilesAgainstRule (
138+ updatedFiles ,
139+ [ "src/models/searches/**" ] ,
140+ root
141+ ) ;
142+ expect ( result ) . toEqual ( [ resolve ( "project/src/models/searches/utils.ts" ) ] ) ;
143+ } ) ;
144+ test ( "matches pattern starting with ./" , ( ) => {
145+ const result = matchFilesAgainstRule ( updatedFiles , [ "./src/core/**" ] , root ) ;
146+ expect ( result ) . toEqual ( [ resolve ( "project/src/core/index.ts" ) ] ) ;
147+ } ) ;
148+ test ( "matches pattern ending with /**/" , ( ) => {
149+ const result = matchFilesAgainstRule ( updatedFiles , [ "src/**/" ] , root ) ;
150+ expect ( result ) . toContain ( resolve ( "project/src/core/index.ts" ) ) ;
151+ expect ( result ) . toContain ( resolve ( "project/src/utils/helpers.ts" ) ) ;
152+ expect ( result ) . toContain ( resolve ( "project/src/models/searches/utils.ts" ) ) ;
153+ } ) ;
154+ test ( "matches pattern with regex metacharacters in path" , ( ) => {
155+ const specialFiles = [
156+ resolve ( "project/src/utils/file[1].ts" ) ,
157+ resolve ( "project/src/utils/file(2).ts" ) ,
158+ ] ;
159+ const result = matchFilesAgainstRule ( specialFiles , [ "src/utils/**" ] , root ) ;
160+ expect ( result ) . toEqual ( specialFiles ) ;
161+ } ) ;
162+ test ( "matches hidden file in subdirectory" , ( ) => {
163+ const hiddenFile = resolve ( "project/src/.hidden/config.ts" ) ;
164+ const result = matchFilesAgainstRule ( [ hiddenFile ] , [ "src/**" ] , root ) ;
165+ expect ( result ) . toEqual ( [ hiddenFile ] ) ;
166+ } ) ;
167+ test ( "matches file with unicode characters in path" , ( ) => {
168+ const unicodeFile = resolve ( "project/src/设计/模块.ts" ) ;
169+ const result = matchFilesAgainstRule ( [ unicodeFile ] , [ "src/**" ] , root ) ;
170+ expect ( result ) . toEqual ( [ unicodeFile ] ) ;
171+ } ) ;
172+ test ( "matches file with spaces and parentheses in path" , ( ) => {
173+ const spacedFile = resolve ( "project/src/utils/my file (copy).ts" ) ;
174+ const result = matchFilesAgainstRule ( [ spacedFile ] , [ "src/utils/**" ] , root ) ;
175+ expect ( result ) . toEqual ( [ spacedFile ] ) ;
176+ } ) ;
112177} ) ;
0 commit comments