@@ -174,6 +174,76 @@ describe('Nested keys within arrays and objects are camelCased', () => {
174174
175175} ) ;
176176
177+ describe ( 'Circular references' , ( ) => {
178+ it ( 'Should handle objects with circular references' , ( ) => {
179+ const parent = {
180+ my_name : 'parent' ,
181+ } ;
182+ parent . child = parent ;
183+
184+ const selfReferentialCamel = camelCaseKeys ( parent ) ;
185+
186+ expect ( Object . keys ( selfReferentialCamel ) ) . deep . equals ( [ 'myName' , 'child' ] ) ;
187+ expect ( Object . keys ( selfReferentialCamel . child ) ) . deep . equals ( [ 'myName' , 'child' ] ) ;
188+ expect ( selfReferentialCamel ) . to . equal ( selfReferentialCamel . child ) ;
189+ } ) ;
190+
191+ it ( 'Should handle objects with circular references in their children' , ( ) => {
192+ const parent = {
193+ name : 'parent' ,
194+ } ;
195+ const child = {
196+ name : 'child' ,
197+ my_own_parent : parent ,
198+ }
199+ parent . child = child ;
200+
201+ const selfReferentialCamel = camelCaseKeys ( parent ) ;
202+
203+ expect ( Object . keys ( selfReferentialCamel ) ) . deep . equals ( [ 'name' , 'child' ] ) ;
204+ expect ( Object . keys ( selfReferentialCamel . child ) ) . deep . equals ( [ 'name' , 'myOwnParent' ] ) ;
205+ expect ( selfReferentialCamel ) . to . equal ( selfReferentialCamel . child . myOwnParent ) ;
206+ } ) ;
207+
208+ it ( 'Should handle arrays with objects with circular references in their children' , ( ) => {
209+ const parent = {
210+ name : 'parent' ,
211+ } ;
212+ const child = {
213+ name : 'child' ,
214+ my_own_parent : parent ,
215+ }
216+ parent . child = child ;
217+
218+ const selfReferentialCamel = camelCaseKeys ( [ parent ] ) ;
219+
220+ expect ( selfReferentialCamel ) . to . have . lengthOf ( 1 ) ;
221+ expect ( Object . keys ( selfReferentialCamel [ 0 ] ) ) . deep . equals ( [ 'name' , 'child' ] ) ;
222+ expect ( Object . keys ( selfReferentialCamel [ 0 ] . child ) ) . deep . equals ( [ 'name' , 'myOwnParent' ] ) ;
223+ expect ( selfReferentialCamel [ 0 ] ) . to . equal ( selfReferentialCamel [ 0 ] . child . myOwnParent ) ;
224+ } ) ;
225+
226+ it ( 'Should handle objects with circular references in arrays of their children' , ( ) => {
227+ const parent = {
228+ name : 'parent' ,
229+ } ;
230+ const child = {
231+ name : 'child' ,
232+ my_own_parent : parent ,
233+ }
234+ parent . children = [ child , child ] ;
235+
236+ const selfReferentialCamel = camelCaseKeys ( parent ) ;
237+
238+ expect ( Object . keys ( selfReferentialCamel ) ) . deep . equals ( [ 'name' , 'children' ] ) ;
239+ expect ( Object . keys ( selfReferentialCamel . children ) ) . to . have . lengthOf ( 2 ) ;
240+ expect ( Object . keys ( selfReferentialCamel . children [ 0 ] ) ) . deep . equals ( [ 'name' , 'myOwnParent' ] ) ;
241+ expect ( Object . keys ( selfReferentialCamel . children [ 1 ] ) ) . deep . equals ( [ 'name' , 'myOwnParent' ] ) ;
242+ expect ( selfReferentialCamel ) . to . equal ( selfReferentialCamel . children [ 0 ] . myOwnParent ) ;
243+ expect ( selfReferentialCamel ) . to . equal ( selfReferentialCamel . children [ 1 ] . myOwnParent ) ;
244+ } ) ;
245+ } ) ;
246+
177247describe ( 'Handling null root object' , ( ) => {
178248
179249 it ( 'Should not throw Error' , ( ) => {
0 commit comments