1+ /* eslint-disable @typescript-eslint/restrict-plus-operands */
12import { createStore } from '../create-store'
23import { computed } from './computed'
34import { deep } from './deep'
@@ -100,7 +101,8 @@ it('deep store from computed', () => {
100101
101102 let store = createStore < Deep > ( { some : { deep : 1 } } )
102103 let someDeep = computed ( ( ) => deep ( store , 'some.deep' ) )
103- let unsub = computed ( ( ) => deep ( someDeep ) ) . listen ( value => {
104+ let nextDeep = computed ( ( ) => deep ( someDeep ) )
105+ let unsub = nextDeep . listen ( value => {
104106 data . push ( value )
105107 } )
106108
@@ -111,6 +113,7 @@ it('deep store from computed', () => {
111113
112114 expect ( data ) . toEqual ( [ 2 , 3 , 4 , 5 ] )
113115 expect ( someDeep . get ( ) ) . toBe ( 5 )
116+ expect ( nextDeep . get ( ) ) . toBe ( 5 )
114117 unsub ( )
115118} )
116119
@@ -128,7 +131,6 @@ it('prevent watch', () => {
128131 let someDeep = computed ( ( ) => take ( store , 'some.deep' ) )
129132 let unsub = computed ( ( ) => {
130133 let value = take ( someDeep )
131- // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
132134 return value * deep ( store , 'some.test' )
133135 } ) . listen ( value => {
134136 data . push ( value )
@@ -143,3 +145,178 @@ it('prevent watch', () => {
143145 expect ( someDeep . get ( ) ) . toBe ( 5 )
144146 unsub ( )
145147} )
148+
149+ it ( 'prevents diamond dependency problem' , ( ) => {
150+ let store = createStore ( { count : 0 } )
151+ let values : string [ ] = [ ]
152+
153+ let a = computed ( ( ) => {
154+ return 'a' + deep ( store , 'count' )
155+ } )
156+
157+ let b = computed ( ( ) => {
158+ return 'b' + deep ( store , 'count' )
159+ } )
160+
161+ let combined = computed ( ( ) => {
162+ return take ( a ) + take ( b )
163+ } )
164+
165+ let unsubscribe = combined . subscribe ( v => {
166+ values . push ( v )
167+ } )
168+
169+ expect ( values ) . toEqual ( [ 'a0b0' ] )
170+
171+ store . set ( 'count' , 1 )
172+ expect ( values ) . toEqual ( [ 'a0b0' , 'a1b1' ] )
173+
174+ unsubscribe ( )
175+ } )
176+
177+
178+ it ( 'prevent watchss' , ( ) => {
179+ type Deep = {
180+ some : {
181+ deep : number
182+ test : number
183+ }
184+ }
185+
186+ let data : ( number | undefined ) [ ] = [ ]
187+
188+ let store = createStore < Deep > ( { some : { deep : 1 , test : 2 } } )
189+ let someDeep = computed ( ( ) => take ( store , 'some.deep' ) )
190+ let unsub = computed ( ( ) => {
191+ let value = deep ( someDeep )
192+ return value * deep ( store , 'some.test' )
193+ } ) . listen ( value => {
194+ data . push ( value )
195+ } )
196+
197+ store . set ( 'some.deep' , 2 )
198+ store . set ( 'some.deep' , 3 )
199+ store . set ( 'some.deep' , 4 )
200+ store . set ( 'some.deep' , 5 )
201+
202+ expect ( data ) . toEqual ( [ 4 , 6 , 8 , 10 ] )
203+ expect ( someDeep . get ( ) ) . toBe ( 5 )
204+ unsub ( )
205+ } )
206+
207+ it ( 'works without reactive' , ( ) => {
208+ expect . assertions ( 1 )
209+ let store = createStore ( {
210+ some : { deep : { path : 3 , test : 2 , some : 4 } }
211+ } )
212+
213+ let pathMult = computed ( ( ) => {
214+ let path = deep ( store , 'some.deep.path' )
215+ return path * 2
216+ } )
217+
218+ let nextDataGetter = computed ( ( ) => {
219+ return pathMult . get ( ) / 2
220+ } )
221+
222+ let unsub2 = nextDataGetter . subscribe ( val => {
223+ expect ( val ) . toBe ( 3 )
224+ } )
225+ store . set ( 'some.deep.path' , 4 )
226+ store . set ( 'some.deep.path' , 5 )
227+ unsub2 ( )
228+ } )
229+
230+ //!!!!
231+
232+ it ( 're-listen: when listener is last - container will destroy' , ( ) => {
233+ let events : number [ ] = [ ]
234+ let store = createStore ( { count : 0 } )
235+
236+ let mult = computed ( ( ) => {
237+ let count = deep ( store , 'count' )
238+ return count
239+ } )
240+
241+ let unbind = mult . listen ( num => {
242+ events . push ( num )
243+ } )
244+
245+ store . set ( 'count' , 1 )
246+ store . set ( 'count' , 2 )
247+ store . set ( 'count' , 3 )
248+
249+ unbind ( )
250+
251+ let unbind2 = mult . listen ( num => {
252+ events . push ( num )
253+ } )
254+
255+ store . set ( 'count' , 12 )
256+ store . set ( 'count' , 22 )
257+ store . set ( 'count' , 32 )
258+
259+ unbind2 ( )
260+ expect ( events ) . toEqual ( [ 1 , 2 , 3 , 12 , 22 , 32 ] )
261+ } )
262+
263+ it ( 're-listen: when store is off' , ( ) => {
264+ let events : number [ ] = [ ]
265+ let store = createStore ( { count : 0 } )
266+
267+ let mult = computed ( ( ) => {
268+ let count = deep ( store , 'count' )
269+ return count
270+ } )
271+
272+ mult . listen ( num => {
273+ events . push ( num )
274+ } )
275+
276+ store . set ( 'count' , 1 )
277+ store . set ( 'count' , 2 )
278+ store . set ( 'count' , 3 )
279+
280+ store . off ( )
281+ let unbind2 = mult . listen ( num => {
282+ events . push ( num )
283+ } )
284+ store . set ( 'count' , 12 )
285+ store . set ( 'count' , 22 )
286+ store . set ( 'count' , 32 )
287+
288+ unbind2 ( )
289+ expect ( events ) . toEqual ( [ 1 , 2 , 3 , 12 , 22 , 32 ] )
290+ } )
291+
292+ it . skip ( 're-listen: when on of many stores are off' , ( ) => {
293+ let events : number [ ] = [ ]
294+ let store = createStore ( { count : 0 } )
295+ let store2 = createStore ( { count : 0 } )
296+
297+ let mult = computed ( ( ) => {
298+ return deep ( store , 'count' ) + deep ( store2 , 'count' )
299+ } )
300+
301+ mult . listen ( num => {
302+ events . push ( num )
303+ } )
304+
305+ store . set ( 'count' , 1 )
306+ store . set ( 'count' , 2 )
307+ store . set ( 'count' , 3 )
308+
309+ store . off ( )
310+
311+ store2 . set ( 'count' , 12 )
312+ store2 . set ( 'count' , 22 )
313+ store2 . set ( 'count' , 32 )
314+
315+ store2 . off ( )
316+
317+ store2 . set ( 'count' , 12 )
318+ store2 . set ( 'count' , 22 )
319+ store2 . set ( 'count' , 32 )
320+
321+ expect ( events ) . toEqual ( [ 1 , 2 , 3 , 15 , 25 , 35 ] )
322+ } )
0 commit comments