@@ -120,7 +120,7 @@ describe('OptionsController', () => {
120120 } ) ;
121121
122122 describe ( 'mergeOptionTrees' , ( ) => {
123- it ( 'should only shallow copy root if path contains error at first place' , ( ) => {
123+ it ( 'should create absent nodes if path contains error at first place' , ( ) => {
124124 const tree = { a : { b : { c : { extra : 'extra_node' } } } , d : { e : 2 } } ;
125125 const updatedTree = { a : { b : { c : { extra : 'update' } } } , d : { e : 2 } } ;
126126 const defaultTree = { a : { b : { c : { extra : 'default' } } } } ;
@@ -137,9 +137,10 @@ describe('OptionsController', () => {
137137 expect ( result . a . b ) . toBe ( tree . a . b ) ;
138138 expect ( result . a . b . c ) . toBe ( tree . a . b . c ) ;
139139 expect ( result . a . b . c . extra ) . toBe ( tree . a . b . c . extra ) ;
140+ expect ( result . wrong_path ) . toStrictEqual ( { c : undefined } ) ;
140141 } ) ;
141142
142- it ( 'should shallow copy subtree path until faced the wrong node path' , ( ) => {
143+ it ( 'should shallow copy subtree path and create absent nodes if faced the wrong node path' , ( ) => {
143144 const tree = { a : { b : { c : { extra : 'extra_node' } } } , d : { e : 2 } } ;
144145 const updatedTree = { a : { b : { c : { extra : 'update' } } } , d : { e : 2 } } ;
145146 const defaultTree = { a : { b : { c : { extra : 'default' } } } } ;
@@ -156,6 +157,41 @@ describe('OptionsController', () => {
156157 expect ( result . a . b ) . not . toBe ( tree . a . b ) ;
157158 expect ( result . a . b . c ) . toBe ( tree . a . b . c ) ;
158159 expect ( result . a . b . c . extra ) . toBe ( tree . a . b . c . extra ) ;
160+ expect ( result . a . b . wrong_path ) . toStrictEqual ( { extra : undefined } ) ;
161+ } ) ;
162+
163+ it ( 'should correctly create absent last nodes and sync their values' , ( ) => {
164+ const tree = { a : { b : { c : { extra : 'extra_node' } } } , d : { e : 2 } } ;
165+ const updatedTree = { a : { b : { c : { newProperty : 'test' } } } , d : { e : 2 } } ;
166+ const defaultTree = { a : { b : { c : { extra : 'default' } } } } ;
167+
168+ const result = mergeOptionTrees (
169+ tree ,
170+ updatedTree ,
171+ defaultTree ,
172+ [ 'a' , 'b' , 'c' , 'newProperty' ] ,
173+ ) ;
174+
175+ expect ( result ) . not . toBe ( tree ) ;
176+ expect ( result . a ) . not . toBe ( tree . a ) ;
177+ expect ( result . a . b ) . not . toBe ( tree . a . b ) ;
178+ expect ( result . a . b . c ) . not . toBe ( tree . a . b . c ) ;
179+ expect ( result . a . b . c . newProperty ) . toBe ( updatedTree . a . b . c . newProperty ) ;
180+ } ) ;
181+
182+ it ( 'should correctly create absent middle nodes and sync their values' , ( ) => {
183+ const tree = { a : { b : { c : { extra : 'extra_node' } } } , d : { e : 2 } } ;
184+ const updatedTree = { a : { newB : { c : { newProperty : 'test' } } } , d : { e : 2 } } ;
185+ const defaultTree = { a : { b : { c : { extra : 'default' } } } } ;
186+
187+ const result = mergeOptionTrees (
188+ tree ,
189+ updatedTree ,
190+ defaultTree ,
191+ [ 'a' , 'newB' , 'c' , 'newProperty' ] ,
192+ ) ;
193+
194+ expect ( result . a . newB . c . newProperty ) . toBe ( updatedTree . a . newB . c . newProperty ) ;
159195 } ) ;
160196
161197 it ( 'should deep copy applied value from updated tree' , ( ) => {
0 commit comments