99import {
1010 invalidPatterns ,
1111 getPathValues ,
12+ isUnique ,
1213} from './utilities.js' ;
1314
1415const runGenerateGlobTasks = async ( t , patterns , options ) => {
@@ -24,6 +25,11 @@ const runGenerateGlobTasks = async (t, patterns, options) => {
2425 return promiseResult ;
2526} ;
2627
28+ const getTasks = async ( t , patterns , options ) => {
29+ const tasks = await runGenerateGlobTasks ( t , patterns , options ) ;
30+ return tasks . map ( ( { patterns, options : { ignore} } ) => ( { patterns, ignore} ) ) ;
31+ } ;
32+
2733test ( 'generateGlobTasks' , async t => {
2834 const tasks = await runGenerateGlobTasks ( t , [ '*.tmp' , '!b.tmp' ] , { ignore : [ 'c.tmp' ] } ) ;
2935
@@ -99,3 +105,118 @@ test('expandDirectories option', async t => {
99105 t . deepEqual ( tasks [ 0 ] . options . ignore , [ '**/b.tmp' ] ) ;
100106 }
101107} ) ;
108+
109+ test ( 'combine tasks' , async t => {
110+ t . deepEqual (
111+ await getTasks ( t , [ 'a' , 'b' ] ) ,
112+ [ { patterns : [ 'a' , 'b' ] , ignore : [ ] } ] ,
113+ ) ;
114+
115+ t . deepEqual (
116+ await getTasks ( t , [ '!a' , 'b' ] ) ,
117+ [ { patterns : [ 'b' ] , ignore : [ ] } ] ,
118+ ) ;
119+
120+ t . deepEqual (
121+ await getTasks ( t , [ '!a' ] ) ,
122+ [ ] ,
123+ ) ;
124+
125+ t . deepEqual (
126+ await getTasks ( t , [ 'a' , 'b' , '!c' , '!d' ] ) ,
127+ [ { patterns : [ 'a' , 'b' ] , ignore : [ 'c' , 'd' ] } ] ,
128+ ) ;
129+
130+ t . deepEqual (
131+ await getTasks ( t , [ 'a' , 'b' , '!c' , '!d' , 'e' ] ) ,
132+ [
133+ { patterns : [ 'a' , 'b' ] , ignore : [ 'c' , 'd' ] } ,
134+ { patterns : [ 'e' ] , ignore : [ ] } ,
135+ ] ,
136+ ) ;
137+
138+ t . deepEqual (
139+ await getTasks ( t , [ 'a' , 'b' , '!c' , 'd' , 'e' , '!f' , '!g' , 'h' ] ) ,
140+ [
141+ { patterns : [ 'a' , 'b' ] , ignore : [ 'c' , 'f' , 'g' ] } ,
142+ { patterns : [ 'd' , 'e' ] , ignore : [ 'f' , 'g' ] } ,
143+ { patterns : [ 'h' ] , ignore : [ ] } ,
144+ ] ,
145+ ) ;
146+ } ) ;
147+
148+ test ( 'random patterns' , async t => {
149+ for ( let index = 0 ; index < 500 ; index ++ ) {
150+ const positivePatterns = [ ] ;
151+ const negativePatterns = [ ] ;
152+ const negativePatternsAtStart = [ ] ;
153+
154+ const patterns = Array . from ( { length : 1 + Math . floor ( Math . random ( ) * 20 ) } , ( _ , index ) => {
155+ const negative = Math . random ( ) > 0.5 ;
156+ let pattern = String ( index + 1 ) ;
157+ if ( negative ) {
158+ negativePatterns . push ( pattern ) ;
159+
160+ if ( positivePatterns . length === 0 ) {
161+ negativePatternsAtStart . push ( pattern ) ;
162+ }
163+
164+ pattern = `!${ pattern } ` ;
165+ } else {
166+ positivePatterns . push ( pattern ) ;
167+ }
168+
169+ return pattern ;
170+ } ) ;
171+
172+ // eslint-disable-next-line no-await-in-loop
173+ const tasks = await getTasks ( t , patterns ) ;
174+ const patternsToDebug = JSON . stringify ( patterns ) ;
175+
176+ t . true (
177+ tasks . length <= negativePatterns . length - negativePatternsAtStart . length + 1 ,
178+ `Unexpected tasks: ${ patternsToDebug } ` ,
179+ ) ;
180+
181+ for ( const [ index , { patterns, ignore} ] of tasks . entries ( ) ) {
182+ t . not (
183+ patterns . length ,
184+ 0 ,
185+ `Unexpected empty patterns: ${ patternsToDebug } ` ,
186+ ) ;
187+
188+ t . true (
189+ isUnique ( patterns ) ,
190+ `patterns should be unique: ${ patternsToDebug } ` ,
191+ ) ;
192+
193+ t . true (
194+ isUnique ( ignore ) ,
195+ `ignore should be unique: ${ patternsToDebug } ` ,
196+ ) ;
197+
198+ if ( index !== 0 && ignore . length > 0 ) {
199+ t . deepEqual (
200+ tasks [ index - 1 ] . ignore . slice ( - ignore . length ) ,
201+ ignore ,
202+ `Unexpected ignore: ${ patternsToDebug } ` ,
203+ ) ;
204+ }
205+ }
206+
207+ const allPatterns = tasks . flatMap ( ( { patterns} ) => patterns ) ;
208+ const allIgnore = tasks . flatMap ( ( { ignore} ) => ignore ) ;
209+
210+ t . is (
211+ new Set ( allPatterns ) . size ,
212+ positivePatterns . length ,
213+ `positive patterns should be in patterns: ${ patternsToDebug } ` ,
214+ ) ;
215+
216+ t . is (
217+ new Set ( allIgnore ) . size ,
218+ negativePatterns . length - negativePatternsAtStart . length ,
219+ `negative patterns should be in ignore: ${ patternsToDebug } ` ,
220+ ) ;
221+ }
222+ } ) ;
0 commit comments