@@ -213,6 +213,18 @@ test('parse()', function (t) {
213213 st . end ( ) ;
214214 } ) ;
215215
216+ t . test ( 'ignores prototype keys when depth = 0 and allowPrototypes is false' , function ( st ) {
217+ st . deepEqual ( qs . parse ( 'toString=foo' , { depth : 0 } ) , { } ) ;
218+ st . deepEqual ( qs . parse ( 'hasOwnProperty=bar' , { depth : 0 } ) , { } ) ;
219+ st . deepEqual ( qs . parse ( 'toString=foo&a=b' , { depth : 0 } ) , { a : 'b' } ) ;
220+ st . end ( ) ;
221+ } ) ;
222+
223+ t . test ( 'allows prototype keys when depth = 0 and allowPrototypes is true' , function ( st ) {
224+ st . deepEqual ( qs . parse ( 'toString=foo' , { depth : 0 , allowPrototypes : true } ) , { toString : 'foo' } ) ;
225+ st . end ( ) ;
226+ } ) ;
227+
216228 t . test ( 'uses original key when depth = false' , function ( st ) {
217229 st . deepEqual ( qs . parse ( 'a[0]=b&a[1]=c' , { depth : false } ) , { 'a[0]' : 'b' , 'a[1]' : 'c' } ) ;
218230 st . deepEqual ( qs . parse ( 'a[0][0]=b&a[0][1]=c&a[1]=d&e=2' , { depth : false } ) , { 'a[0][0]' : 'b' , 'a[0][1]' : 'c' , 'a[1]' : 'd' , e : '2' } ) ;
@@ -1074,6 +1086,15 @@ test('parse()', function (t) {
10741086 } ;
10751087
10761088 st . deepEqual ( qs . parse ( 'KeY=vAlUe' , { decoder : decoder } ) , { key : 'VALUE' } ) ;
1089+
1090+ var noopDecoder = function ( ) { return 'x' ; } ;
1091+ noopDecoder ( ) ;
1092+ st [ 'throws' ] (
1093+ function ( ) { decoder ( 'x' , noopDecoder , 'utf-8' , 'unknown' ) ; } ,
1094+ 'this should never happen! type: unknown' ,
1095+ 'decoder throws for unexpected type'
1096+ ) ;
1097+
10771098 st . end ( ) ;
10781099 } ) ;
10791100
@@ -1103,6 +1124,14 @@ test('parse()', function (t) {
11031124 new RangeError ( 'Parameter limit exceeded. Only 3 parameters allowed.' ) ,
11041125 'throws error when parameter limit is exceeded'
11051126 ) ;
1127+
1128+ sst [ 'throws' ] (
1129+ function ( ) {
1130+ qs . parse ( 'a=1&b=2' , { parameterLimit : 1 , throwOnLimitExceeded : true } ) ;
1131+ } ,
1132+ new RangeError ( 'Parameter limit exceeded. Only 1 parameter allowed.' ) ,
1133+ 'throws error with singular "parameter" when parameterLimit is 1'
1134+ ) ;
11061135 sst . end ( ) ;
11071136 } ) ;
11081137
@@ -1189,6 +1218,14 @@ test('parse()', function (t) {
11891218 'throws error when a sparse index exceeds arrayLimit'
11901219 ) ;
11911220
1221+ sst [ 'throws' ] (
1222+ function ( ) {
1223+ qs . parse ( 'a[2]=b' , { arrayLimit : 1 , throwOnLimitExceeded : true } ) ;
1224+ } ,
1225+ new RangeError ( 'Array limit exceeded. Only 1 element allowed in an array.' ) ,
1226+ 'throws error with singular "element" when arrayLimit is 1'
1227+ ) ;
1228+
11921229 sst . end ( ) ;
11931230 } ) ;
11941231
@@ -1206,6 +1243,17 @@ test('parse()', function (t) {
12061243 sst . end ( ) ;
12071244 } ) ;
12081245
1246+ st . test ( 'throws when duplicate bracket keys exceed arrayLimit with throwOnLimitExceeded' , function ( sst ) {
1247+ sst [ 'throws' ] (
1248+ function ( ) {
1249+ qs . parse ( 'a[]=1&a[]=2&a[]=3&a[]=4&a[]=5&a[]=6' , { arrayLimit : 5 , throwOnLimitExceeded : true } ) ;
1250+ } ,
1251+ new RangeError ( 'Array limit exceeded. Only 5 elements allowed in an array.' ) ,
1252+ 'throws error when duplicate bracket notation exceeds array limit'
1253+ ) ;
1254+ sst . end ( ) ;
1255+ } ) ;
1256+
12091257 st . end ( ) ;
12101258 } ) ;
12111259
@@ -1462,6 +1510,14 @@ test('comma + arrayLimit', function (t) {
14621510 new RangeError ( 'Array limit exceeded. Only 3 elements allowed in an array.' ) ,
14631511 'throws error when comma-split exceeds array limit'
14641512 ) ;
1513+
1514+ st [ 'throws' ] (
1515+ function ( ) {
1516+ qs . parse ( 'a=1,2,3' , { comma : true , arrayLimit : 1 , throwOnLimitExceeded : true } ) ;
1517+ } ,
1518+ new RangeError ( 'Array limit exceeded. Only 1 element allowed in an array.' ) ,
1519+ 'throws error with singular "element" when arrayLimit is 1'
1520+ ) ;
14651521 st . end ( ) ;
14661522 } ) ;
14671523
@@ -1564,5 +1620,29 @@ test('mixed array and object notation', function (t) {
15641620 st . end ( ) ;
15651621 } ) ;
15661622
1623+ t . test ( 'uses existing array length for currentArrayLength when parsing object input with bracket keys' , function ( st ) {
1624+ var input = { } ;
1625+ var arr = [ 'x' , 'y' ] ;
1626+ arr . a = [ 'z' , 'w' ] ;
1627+ input [ 'a[]' ] = arr ;
1628+ st . deepEqual ( qs . parse ( input ) , { a : [ 'x' , 'y' ] } , 'parses object input with bracket keys using existing array values' ) ;
1629+ st . end ( ) ;
1630+ } ) ;
1631+
1632+ t . test ( 'throws with singular message when object input bracket key exceeds arrayLimit of 1' , function ( st ) {
1633+ var input = { } ;
1634+ var arr = [ 'x' ] ;
1635+ arr . a = [ 'z' , 'w' ] ;
1636+ input [ 'a[]' ] = arr ;
1637+ st [ 'throws' ] (
1638+ function ( ) {
1639+ qs . parse ( input , { throwOnLimitExceeded : true , arrayLimit : 1 } ) ;
1640+ } ,
1641+ new RangeError ( 'Array limit exceeded. Only 1 element allowed in an array.' ) ,
1642+ 'throws singular error for object input exceeding arrayLimit 1'
1643+ ) ;
1644+ st . end ( ) ;
1645+ } ) ;
1646+
15671647 t . end ( ) ;
15681648} ) ;
0 commit comments