@@ -70,6 +70,60 @@ test('merge()', async function (t) {
7070 } ,
7171 )
7272
73+ t . test ( 'with overflow objects (from arrayLimit)' , function ( st ) {
74+ st . test ( 'merges primitive into overflow object at next index' , function ( s2t ) {
75+ // Create an overflow object via combine
76+ var overflow = utils . combine ( [ 'a' ] , 'b' , 1 , false ) ;
77+ s2t . ok ( utils . isOverflow ( overflow ) , 'overflow object is marked' ) ;
78+ var merged = utils . merge ( overflow , 'c' ) ;
79+ s2t . deepEqual ( merged , { 0 : 'a' , 1 : 'b' , 2 : 'c' } , 'adds primitive at next numeric index' ) ;
80+ s2t . end ( ) ;
81+ } ) ;
82+
83+ st . test ( 'merges primitive into regular object with numeric keys normally' , function ( s2t ) {
84+ var obj = { 0 : 'a' , 1 : 'b' } ;
85+ s2t . notOk ( utils . isOverflow ( obj ) , 'plain object is not marked as overflow' ) ;
86+ var merged = utils . merge ( obj , 'c' ) ;
87+ s2t . deepEqual ( merged , { 0 : 'a' , 1 : 'b' , c : true } , 'adds primitive as key (not at next index)' ) ;
88+ s2t . end ( ) ;
89+ } ) ;
90+
91+ st . test ( 'merges primitive into object with non-numeric keys normally' , function ( s2t ) {
92+ var obj = { foo : 'bar' } ;
93+ var merged = utils . merge ( obj , 'baz' ) ;
94+ s2t . deepEqual ( merged , { foo : 'bar' , baz : true } , 'adds primitive as key with value true' ) ;
95+ s2t . end ( ) ;
96+ } ) ;
97+
98+ st . test ( 'merges overflow object into primitive' , function ( s2t ) {
99+ // Create an overflow object via combine
100+ var overflow = utils . combine ( [ ] , 'b' , 0 , false ) ;
101+ s2t . ok ( utils . isOverflow ( overflow ) , 'overflow object is marked' ) ;
102+ var merged = utils . merge ( 'a' , overflow ) ;
103+ s2t . ok ( utils . isOverflow ( merged ) , 'result is also marked as overflow' ) ;
104+ s2t . deepEqual ( merged , { 0 : 'a' , 1 : 'b' } , 'creates object with primitive at 0, source values shifted' ) ;
105+ s2t . end ( ) ;
106+ } ) ;
107+
108+ st . test ( 'merges overflow object with multiple values into primitive' , function ( s2t ) {
109+ // Create an overflow object via combine
110+ var overflow = utils . combine ( [ 'b' ] , 'c' , 1 , false ) ;
111+ s2t . ok ( utils . isOverflow ( overflow ) , 'overflow object is marked' ) ;
112+ var merged = utils . merge ( 'a' , overflow ) ;
113+ s2t . deepEqual ( merged , { 0 : 'a' , 1 : 'b' , 2 : 'c' } , 'shifts all source indices by 1' ) ;
114+ s2t . end ( ) ;
115+ } ) ;
116+
117+ st . test ( 'merges regular object into primitive as array' , function ( s2t ) {
118+ var obj = { foo : 'bar' } ;
119+ var merged = utils . merge ( 'a' , obj ) ;
120+ s2t . deepEqual ( merged , [ 'a' , { foo : 'bar' } ] , 'creates array with primitive and object' ) ;
121+ s2t . end ( ) ;
122+ } ) ;
123+
124+ st . end ( ) ;
125+ } ) ;
126+
73127 t . end ( )
74128} )
75129
@@ -136,6 +190,71 @@ test('combine()', async function (t) {
136190 st . end ( )
137191 } )
138192
193+ t . test ( 'with arrayLimit' , function ( st ) {
194+ st . test ( 'under the limit' , function ( s2t ) {
195+ var combined = utils . combine ( [ 'a' , 'b' ] , 'c' , 10 , false ) ;
196+ s2t . deepEqual ( combined , [ 'a' , 'b' , 'c' ] , 'returns array when under limit' ) ;
197+ s2t . ok ( Array . isArray ( combined ) , 'result is an array' ) ;
198+ s2t . end ( ) ;
199+ } ) ;
200+
201+ st . test ( 'exactly at the limit stays as array' , function ( s2t ) {
202+ var combined = utils . combine ( [ 'a' , 'b' ] , 'c' , 3 , false ) ;
203+ s2t . deepEqual ( combined , [ 'a' , 'b' , 'c' ] , 'stays as array when exactly at limit' ) ;
204+ s2t . ok ( Array . isArray ( combined ) , 'result is an array' ) ;
205+ s2t . end ( ) ;
206+ } ) ;
207+
208+ st . test ( 'over the limit' , function ( s2t ) {
209+ var combined = utils . combine ( [ 'a' , 'b' , 'c' ] , 'd' , 3 , false ) ;
210+ s2t . deepEqual ( combined , { 0 : 'a' , 1 : 'b' , 2 : 'c' , 3 : 'd' } , 'converts to object when over limit' ) ;
211+ s2t . notOk ( Array . isArray ( combined ) , 'result is not an array' ) ;
212+ s2t . end ( ) ;
213+ } ) ;
214+
215+ st . test ( 'with arrayLimit 0' , function ( s2t ) {
216+ var combined = utils . combine ( [ ] , 'a' , 0 , false ) ;
217+ s2t . deepEqual ( combined , { 0 : 'a' } , 'converts single element to object with arrayLimit 0' ) ;
218+ s2t . notOk ( Array . isArray ( combined ) , 'result is not an array' ) ;
219+ s2t . end ( ) ;
220+ } ) ;
221+
222+ st . test ( 'with plainObjects option' , function ( s2t ) {
223+ var combined = utils . combine ( [ 'a' ] , 'b' , 1 , true ) ;
224+ var expected = { __proto__ : null , 0 : 'a' , 1 : 'b' } ;
225+ s2t . deepEqual ( combined , expected , 'converts to object with null prototype' ) ;
226+ s2t . equal ( Object . getPrototypeOf ( combined ) , null , 'result has null prototype when plainObjects is true' ) ;
227+ s2t . end ( ) ;
228+ } ) ;
229+
230+ st . end ( ) ;
231+ } ) ;
232+
233+ t . test ( 'with existing overflow object' , function ( st ) {
234+ st . test ( 'adds to existing overflow object at next index' , function ( s2t ) {
235+ // Create overflow object first via combine
236+ var overflow = utils . combine ( [ 'a' ] , 'b' , 1 , false ) ;
237+ s2t . ok ( utils . isOverflow ( overflow ) , 'initial object is marked as overflow' ) ;
238+
239+ var combined = utils . combine ( overflow , 'c' , 10 , false ) ;
240+ s2t . equal ( combined , overflow , 'returns the same object (mutated)' ) ;
241+ s2t . deepEqual ( combined , { 0 : 'a' , 1 : 'b' , 2 : 'c' } , 'adds value at next numeric index' ) ;
242+ s2t . end ( ) ;
243+ } ) ;
244+
245+ st . test ( 'does not treat plain object with numeric keys as overflow' , function ( s2t ) {
246+ var plainObj = { 0 : 'a' , 1 : 'b' } ;
247+ s2t . notOk ( utils . isOverflow ( plainObj ) , 'plain object is not marked as overflow' ) ;
248+
249+ // combine treats this as a regular value, not an overflow object to append to
250+ var combined = utils . combine ( plainObj , 'c' , 10 , false ) ;
251+ s2t . deepEqual ( combined , [ { 0 : 'a' , 1 : 'b' } , 'c' ] , 'concatenates as regular values' ) ;
252+ s2t . end ( ) ;
253+ } ) ;
254+
255+ st . end ( ) ;
256+ } ) ;
257+
139258 t . end ( )
140259} )
141260
0 commit comments