1
1
import { effect , isSignal } from '@angular/core' ;
2
- import { signalState } from '../src' ;
2
+ import { patchState , signalState } from '../src' ;
3
3
import { testEffects } from './helpers' ;
4
4
5
5
describe ( 'signalState' , ( ) => {
@@ -13,167 +13,100 @@ describe('signalState', () => {
13
13
ngrx : 'signals' ,
14
14
} ;
15
15
16
- describe ( '$update' , ( ) => {
17
- it ( 'updates state via partial state object' , ( ) => {
18
- const state = signalState ( initialState ) ;
16
+ it ( 'creates signals for nested state slices' , ( ) => {
17
+ const state = signalState ( initialState ) ;
19
18
20
- state . $update ( {
21
- user : { firstName : 'Johannes' , lastName : 'Schmidt' } ,
22
- foo : 'baz' ,
23
- } ) ;
19
+ expect ( state ( ) ) . toBe ( initialState ) ;
20
+ expect ( isSignal ( state ) ) . toBe ( true ) ;
24
21
25
- expect ( state ( ) ) . toEqual ( {
26
- ...initialState ,
27
- user : { firstName : 'Johannes' , lastName : 'Schmidt' } ,
28
- foo : 'baz' ,
29
- } ) ;
30
- } ) ;
22
+ expect ( state . user ( ) ) . toBe ( initialState . user ) ;
23
+ expect ( isSignal ( state . user ) ) . toBe ( true ) ;
31
24
32
- it ( 'updates state via updater function' , ( ) => {
33
- const state = signalState ( initialState ) ;
25
+ expect ( state . user . firstName ( ) ) . toBe ( initialState . user . firstName ) ;
26
+ expect ( isSignal ( state . user . firstName ) ) . toBe ( true ) ;
34
27
35
- state . $update ( ( state ) => ( {
36
- numbers : [ ...state . numbers , 4 ] ,
37
- ngrx : 'rocks' ,
38
- } ) ) ;
28
+ expect ( state . foo ( ) ) . toBe ( initialState . foo ) ;
29
+ expect ( isSignal ( state . foo ) ) . toBe ( true ) ;
39
30
40
- expect ( state ( ) ) . toEqual ( {
41
- ...initialState ,
42
- numbers : [ 1 , 2 , 3 , 4 ] ,
43
- ngrx : 'rocks' ,
44
- } ) ;
45
- } ) ;
31
+ expect ( state . numbers ( ) ) . toBe ( initialState . numbers ) ;
32
+ expect ( isSignal ( state . numbers ) ) . toBe ( true ) ;
33
+
34
+ expect ( state . ngrx ( ) ) . toBe ( initialState . ngrx ) ;
35
+ expect ( isSignal ( state . ngrx ) ) . toBe ( true ) ;
36
+ } ) ;
37
+
38
+ it ( 'does not modify props that are not state slices' , ( ) => {
39
+ const state = signalState ( initialState ) ;
40
+ ( state as any ) . x = 1 ;
41
+ ( state . user as any ) . x = 2 ;
42
+ ( state . user . firstName as any ) . x = 3 ;
43
+
44
+ expect ( ( state as any ) . x ) . toBe ( 1 ) ;
45
+ expect ( ( state . user as any ) . x ) . toBe ( 2 ) ;
46
+ expect ( ( state . user . firstName as any ) . x ) . toBe ( 3 ) ;
46
47
47
- it ( 'updates state via sequence of partial state objects and updater functions' , ( ) => {
48
+ expect ( ( state as any ) . y ) . toBe ( undefined ) ;
49
+ expect ( ( state . user as any ) . y ) . toBe ( undefined ) ;
50
+ expect ( ( state . user . firstName as any ) . y ) . toBe ( undefined ) ;
51
+ } ) ;
52
+
53
+ it (
54
+ 'emits new values only for affected signals' ,
55
+ testEffects ( ( tick ) => {
48
56
const state = signalState ( initialState ) ;
57
+ let numbersEmitted = 0 ;
58
+ let userEmitted = 0 ;
59
+ let firstNameEmitted = 0 ;
49
60
50
- state . $update (
51
- { user : { firstName : 'Johannes' , lastName : 'Schmidt' } } ,
52
- ( state ) => ( { numbers : [ ...state . numbers , 4 ] , foo : 'baz' } ) ,
53
- ( state ) => ( { user : { ...state . user , firstName : 'Jovan' } } ) ,
54
- { foo : 'foo' }
55
- ) ;
56
-
57
- expect ( state ( ) ) . toEqual ( {
58
- ...initialState ,
59
- user : { firstName : 'Jovan' , lastName : 'Schmidt' } ,
60
- foo : 'foo' ,
61
- numbers : [ 1 , 2 , 3 , 4 ] ,
61
+ effect ( ( ) => {
62
+ state . numbers ( ) ;
63
+ numbersEmitted ++ ;
62
64
} ) ;
63
- } ) ;
64
65
65
- it ( 'updates state immutably' , ( ) => {
66
- const state = signalState ( initialState ) ;
66
+ effect ( ( ) => {
67
+ state . user ( ) ;
68
+ userEmitted ++ ;
69
+ } ) ;
67
70
68
- state . $update ( {
69
- foo : 'bar' ,
70
- numbers : [ 3 , 2 , 1 ] ,
71
- ngrx : 'rocks' ,
71
+ effect ( ( ) => {
72
+ state . user . firstName ( ) ;
73
+ firstNameEmitted ++ ;
72
74
} ) ;
73
75
74
- expect ( state . user ( ) ) . toBe ( initialState . user ) ;
75
- expect ( state . foo ( ) ) . toBe ( initialState . foo ) ;
76
- expect ( state . numbers ( ) ) . not . toBe ( initialState . numbers ) ;
77
- expect ( state . ngrx ( ) ) . not . toBe ( initialState . ngrx ) ;
78
- } ) ;
79
- } ) ;
76
+ expect ( numbersEmitted ) . toBe ( 0 ) ;
77
+ expect ( userEmitted ) . toBe ( 0 ) ;
78
+ expect ( firstNameEmitted ) . toBe ( 0 ) ;
80
79
81
- describe ( 'nested signals' , ( ) => {
82
- it ( 'creates signals for nested state slices' , ( ) => {
83
- const state = signalState ( initialState ) ;
80
+ tick ( ) ;
84
81
85
- expect ( state ( ) ) . toBe ( initialState ) ;
86
- expect ( isSignal ( state ) ) . toBe ( true ) ;
82
+ expect ( numbersEmitted ) . toBe ( 1 ) ;
83
+ expect ( userEmitted ) . toBe ( 1 ) ;
84
+ expect ( firstNameEmitted ) . toBe ( 1 ) ;
87
85
88
- expect ( state . user ( ) ) . toBe ( initialState . user ) ;
89
- expect ( isSignal ( state . user ) ) . toBe ( true ) ;
86
+ patchState ( state , { numbers : [ 1 , 2 , 3 ] } ) ;
87
+ tick ( ) ;
90
88
91
- expect ( state . user . firstName ( ) ) . toBe ( initialState . user . firstName ) ;
92
- expect ( isSignal ( state . user . firstName ) ) . toBe ( true ) ;
89
+ expect ( numbersEmitted ) . toBe ( 2 ) ;
90
+ expect ( userEmitted ) . toBe ( 1 ) ;
91
+ expect ( firstNameEmitted ) . toBe ( 1 ) ;
93
92
94
- expect ( state . foo ( ) ) . toBe ( initialState . foo ) ;
95
- expect ( isSignal ( state . foo ) ) . toBe ( true ) ;
93
+ patchState ( state , ( state ) => ( {
94
+ user : { ...state . user , lastName : 'Schmidt' } ,
95
+ } ) ) ;
96
+ tick ( ) ;
96
97
97
- expect ( state . numbers ( ) ) . toBe ( initialState . numbers ) ;
98
- expect ( isSignal ( state . numbers ) ) . toBe ( true ) ;
98
+ expect ( numbersEmitted ) . toBe ( 2 ) ;
99
+ expect ( userEmitted ) . toBe ( 2 ) ;
100
+ expect ( firstNameEmitted ) . toBe ( 1 ) ;
99
101
100
- expect ( state . ngrx ( ) ) . toBe ( initialState . ngrx ) ;
101
- expect ( isSignal ( state . ngrx ) ) . toBe ( true ) ;
102
- } ) ;
102
+ patchState ( state , ( state ) => ( {
103
+ user : { ...state . user , firstName : 'Johannes' } ,
104
+ } ) ) ;
105
+ tick ( ) ;
103
106
104
- it ( 'does not modify props that are not state slices' , ( ) => {
105
- const state = signalState ( initialState ) ;
106
- ( state as any ) . x = 1 ;
107
- ( state . user as any ) . x = 2 ;
108
- ( state . user . firstName as any ) . x = 3 ;
109
-
110
- expect ( ( state as any ) . x ) . toBe ( 1 ) ;
111
- expect ( ( state . user as any ) . x ) . toBe ( 2 ) ;
112
- expect ( ( state . user . firstName as any ) . x ) . toBe ( 3 ) ;
113
-
114
- expect ( ( state as any ) . y ) . toBe ( undefined ) ;
115
- expect ( ( state . user as any ) . y ) . toBe ( undefined ) ;
116
- expect ( ( state . user . firstName as any ) . y ) . toBe ( undefined ) ;
117
- } ) ;
118
-
119
- it (
120
- 'emits new values only for affected signals' ,
121
- testEffects ( ( tick ) => {
122
- const state = signalState ( initialState ) ;
123
- let numbersEmitted = 0 ;
124
- let userEmitted = 0 ;
125
- let firstNameEmitted = 0 ;
126
-
127
- effect ( ( ) => {
128
- state . numbers ( ) ;
129
- numbersEmitted ++ ;
130
- } ) ;
131
-
132
- effect ( ( ) => {
133
- state . user ( ) ;
134
- userEmitted ++ ;
135
- } ) ;
136
-
137
- effect ( ( ) => {
138
- state . user . firstName ( ) ;
139
- firstNameEmitted ++ ;
140
- } ) ;
141
-
142
- expect ( numbersEmitted ) . toBe ( 0 ) ;
143
- expect ( userEmitted ) . toBe ( 0 ) ;
144
- expect ( firstNameEmitted ) . toBe ( 0 ) ;
145
-
146
- tick ( ) ;
147
-
148
- expect ( numbersEmitted ) . toBe ( 1 ) ;
149
- expect ( userEmitted ) . toBe ( 1 ) ;
150
- expect ( firstNameEmitted ) . toBe ( 1 ) ;
151
-
152
- state . $update ( { numbers : [ 1 , 2 , 3 ] } ) ;
153
- tick ( ) ;
154
-
155
- expect ( numbersEmitted ) . toBe ( 2 ) ;
156
- expect ( userEmitted ) . toBe ( 1 ) ;
157
- expect ( firstNameEmitted ) . toBe ( 1 ) ;
158
-
159
- state . $update ( ( state ) => ( {
160
- user : { ...state . user , lastName : 'Schmidt' } ,
161
- } ) ) ;
162
- tick ( ) ;
163
-
164
- expect ( numbersEmitted ) . toBe ( 2 ) ;
165
- expect ( userEmitted ) . toBe ( 2 ) ;
166
- expect ( firstNameEmitted ) . toBe ( 1 ) ;
167
-
168
- state . $update ( ( state ) => ( {
169
- user : { ...state . user , firstName : 'Johannes' } ,
170
- } ) ) ;
171
- tick ( ) ;
172
-
173
- expect ( numbersEmitted ) . toBe ( 2 ) ;
174
- expect ( userEmitted ) . toBe ( 3 ) ;
175
- expect ( firstNameEmitted ) . toBe ( 2 ) ;
176
- } )
177
- ) ;
178
- } ) ;
107
+ expect ( numbersEmitted ) . toBe ( 2 ) ;
108
+ expect ( userEmitted ) . toBe ( 3 ) ;
109
+ expect ( firstNameEmitted ) . toBe ( 2 ) ;
110
+ } )
111
+ ) ;
179
112
} ) ;
0 commit comments