66 * found in the LICENSE file at https://angular.io/license
77 *
88 */
9+ // tslint:disable:no-global-tslint-disable no-big-function
910import { logging } from '@angular-devkit/core' ;
1011import { Arguments , Option , OptionType } from './interface' ;
1112import { ParseArgumentException , parseArguments } from './parser' ;
@@ -64,6 +65,10 @@ describe('parseArguments', () => {
6465 '--str=false val1 val2' : { str : 'false' , p1 : 'val1' , p2 : 'val2' } ,
6566 '--str=false val1 val2 --num1' : { str : 'false' , p1 : 'val1' , p2 : 'val2' , '--' : [ '--num1' ] } ,
6667 '--str=false val1 --num1 val2' : { str : 'false' , p1 : 'val1' , '--' : [ '--num1' , 'val2' ] } ,
68+ '--bool --bool=false' : { bool : false } ,
69+ '--bool --bool=false --bool' : { bool : true } ,
70+ '--num=1 --num=2 --num=3' : { num : 3 } ,
71+ '--str=1 --str=2 --str=3' : { str : '3' } ,
6772 'val1 --num=1 val2' : { num : 1 , p1 : 'val1' , p2 : 'val2' } ,
6873 '--p1=val1 --num=1 val2' : { num : 1 , p1 : 'val1' , p2 : 'val2' } ,
6974 '--p1=val1 --num=1 --p2=val2 val3' : { num : 1 , p1 : 'val1' , p2 : 'val2' , '--' : [ 'val3' ] } ,
@@ -74,6 +79,7 @@ describe('parseArguments', () => {
7479 ] ,
7580 '--bool val1 --etc --num=1 val2 --v' : { bool : true , num : 1 , p1 : 'val1' , p2 : 'val2' ,
7681 '--' : [ '--etc' , '--v' ] } ,
82+ '--arr=a d' : { arr : [ 'a' ] , p1 : 'd' } ,
7783 '--arr=a --arr=b --arr c d' : { arr : [ 'a' , 'b' , 'c' ] , p1 : 'd' } ,
7884 '--arr=1 --arr --arr c d' : { arr : [ '1' , '' , 'c' ] , p1 : 'd' } ,
7985 '--arr=1 --arr --arr c d e' : { arr : [ '1' , '' , 'c' ] , p1 : 'd' , p2 : 'e' } ,
@@ -197,4 +203,35 @@ describe('parseArguments', () => {
197203 expect ( messages [ 1 ] ) . toMatch ( / \b A B C D \b / ) ;
198204 messages . shift ( ) ;
199205 } ) ;
206+
207+ it ( 'handles a flag being added multiple times' , ( ) => {
208+ const options = [
209+ { name : 'bool' , aliases : [ ] , type : OptionType . Boolean , description : '' } ,
210+ ] ;
211+
212+ const logger = new logging . Logger ( '' ) ;
213+ const messages : string [ ] = [ ] ;
214+
215+ logger . subscribe ( entry => messages . push ( entry . message ) ) ;
216+
217+ let result = parseArguments ( [ '--bool' ] , options , logger ) ;
218+ expect ( result ) . toEqual ( { bool : true } ) ;
219+ expect ( messages ) . toEqual ( [ ] ) ;
220+
221+ result = parseArguments ( [ '--bool' , '--bool' ] , options , logger ) ;
222+ expect ( result ) . toEqual ( { bool : true } ) ;
223+ expect ( messages ) . toEqual ( [ ] ) ;
224+
225+ result = parseArguments ( [ '--bool' , '--bool=false' ] , options , logger ) ;
226+ expect ( result ) . toEqual ( { bool : false } ) ;
227+ expect ( messages . length ) . toEqual ( 1 ) ;
228+ expect ( messages [ 0 ] ) . toMatch ( / \b b o o l \b .* \b t r u e \b .* \b f a l s e \b / ) ;
229+ messages . shift ( ) ;
230+
231+ result = parseArguments ( [ '--bool' , '--bool=false' , '--bool=false' ] , options , logger ) ;
232+ expect ( result ) . toEqual ( { bool : false } ) ;
233+ expect ( messages . length ) . toEqual ( 1 ) ;
234+ expect ( messages [ 0 ] ) . toMatch ( / \b b o o l \b .* \b t r u e \b .* \b f a l s e \b / ) ;
235+ messages . shift ( ) ;
236+ } ) ;
200237} ) ;
0 commit comments