1+ /* eslint-disable no-use-before-define */
12import {
23 createApp ,
34 injectable ,
@@ -9,6 +10,8 @@ import {
910 ModuleOptions ,
1011 inject ,
1112 ClassProvider ,
13+ multiInject ,
14+ multiOptional ,
1215} from '../..' ;
1316
1417test ( 'base `load`' , async ( ) => {
@@ -106,6 +109,47 @@ test('base `load` with multi-modules', async () => {
106109 }
107110 }
108111
112+ @injectable ( {
113+ name : 'Counter1' ,
114+ } )
115+ class Counter1 {
116+ @state
117+ count1 = 0 ;
118+ }
119+
120+ @injectable ( {
121+ name : 'Counter2' ,
122+ } )
123+ class Counter2 {
124+ constructor ( public counter1 : Counter1 ) { }
125+
126+ @state
127+ count2 = 0 ;
128+ }
129+
130+ interface ITodo {
131+ list : string [ ] ;
132+ add ( text : string ) : void ;
133+ counter1 : Counter1 ;
134+ counter2 : Counter2 ;
135+ }
136+
137+ @injectable ( )
138+ class Todo implements ITodo {
139+ constructor (
140+ public counter1 : Counter1 ,
141+ @inject ( 'counter2token' ) public counter2 : Counter2
142+ ) { }
143+
144+ @state
145+ list : string [ ] = [ ] ;
146+
147+ @action
148+ add ( text : string ) {
149+ this . list . push ( text ) ;
150+ }
151+ }
152+
109153 const app = createApp ( {
110154 modules : [ { provide : 'Counter0' , useClass : Counter0 } ] ,
111155 main : Counter ,
@@ -114,6 +158,92 @@ test('base `load` with multi-modules', async () => {
114158 } ,
115159 } ) ;
116160
161+ expect ( Object . values ( app . store ?. getState ( ) ) ) . toEqual ( [
162+ { count0 : 0 } ,
163+ { count : 0 } ,
164+ ] ) ;
165+ expect ( app . instance . todo ) . toBeUndefined ( ) ;
166+ await app . instance . loadTodoModule ( [
167+ { provide : 'todo' , useClass : Todo } ,
168+ { provide : 'counter2token' , useClass : Counter2 } ,
169+ ] ) ;
170+ expect ( app . instance . todo ) . toBeInstanceOf ( Todo ) ;
171+ expect ( app . instance . todoModule ) . toBe ( app . instance . todo ) ;
172+ expect ( Object . values ( app . store ?. getState ( ) ) ) . toEqual ( [
173+ { count0 : 0 } ,
174+ { count : 0 } ,
175+ {
176+ list : [ ] ,
177+ } ,
178+ { count2 : 0 } ,
179+ { count1 : 0 } ,
180+ ] ) ;
181+ expect ( app . instance . todo . counter2 . counter1 ) . toBeInstanceOf ( Counter1 ) ;
182+ } ) ;
183+
184+ test ( 'base `load` with multi-modules and multi injection' , async ( ) => {
185+ @injectable ( {
186+ name : 'Counter0' ,
187+ } )
188+ class Counter0 {
189+ @state
190+ count0 = 0 ;
191+ }
192+
193+ @injectable ( {
194+ name : 'Counter3' ,
195+ } )
196+ class Counter3 {
197+ @state
198+ count3 = 0 ;
199+ }
200+
201+ @injectable ( {
202+ name : 'Counter4' ,
203+ } )
204+ class Counter4 {
205+ @state
206+ count4 = 0 ;
207+ }
208+
209+ @injectable ( {
210+ name : 'Counter5' ,
211+ } )
212+ class Counter5 {
213+ @state
214+ count5 = 0 ;
215+ }
216+
217+ @injectable ( )
218+ class Counter {
219+ constructor (
220+ @inject ( 'Counter0' ) public counter0 : Counter0 ,
221+ @inject ( 'Counter3' ) public counter3 : Counter3 ,
222+ @multiInject ( 'Counter4' ) public counter4 : Counter4 [ ] ,
223+ public moduleRef : ModuleRef ,
224+ @optional ( 'todo' ) public todo ?: ITodo ,
225+ @optional ( 'todo1' ) public todo1 ?: ITodo ,
226+ @multiOptional ( 'Counter5' ) public counter5 ?: Counter5 [ ]
227+ ) { }
228+
229+ async loadTodoModule ( modules : ModuleOptions [ ] = [ ] ) {
230+ const container = await load ( this , modules ) ;
231+ this . todo = container . get ( 'todo' ) ;
232+ }
233+
234+ get todoModule ( ) {
235+ return this . moduleRef . get ( 'todo' ) ;
236+ }
237+
238+ @state
239+ count = 0 ;
240+
241+ @action
242+ increase ( ) {
243+ this . count += 1 ;
244+ }
245+ }
246+
117247 @injectable ( {
118248 name : 'Counter1' ,
119249 } )
@@ -154,25 +284,50 @@ test('base `load` with multi-modules', async () => {
154284 this . list . push ( text ) ;
155285 }
156286 }
287+
288+ const app = createApp ( {
289+ modules : [
290+ { provide : 'Counter0' , useClass : Counter0 } ,
291+ { provide : 'Counter3' , useClass : Counter3 } ,
292+ { provide : 'Counter4' , useClass : Counter4 } ,
293+ { provide : 'Counter5' , useClass : Counter5 } ,
294+ ] ,
295+ main : Counter ,
296+ render : ( ) => {
297+ //
298+ } ,
299+ } ) ;
300+
157301 expect ( Object . values ( app . store ?. getState ( ) ) ) . toEqual ( [
158302 { count0 : 0 } ,
303+ { count3 : 0 } ,
304+ { count4 : 0 } ,
305+ { count5 : 0 } ,
159306 { count : 0 } ,
160307 ] ) ;
161308 expect ( app . instance . todo ) . toBeUndefined ( ) ;
162309 await app . instance . loadTodoModule ( [
163310 { provide : 'todo' , useClass : Todo } ,
311+ { provide : 'Counter3' , useClass : Counter3 } ,
164312 { provide : 'counter2token' , useClass : Counter2 } ,
313+ { provide : 'Counter4' , useClass : Counter4 } ,
314+ { provide : 'Counter5' , useClass : Counter5 } ,
165315 ] ) ;
166316 expect ( app . instance . todo ) . toBeInstanceOf ( Todo ) ;
167317 expect ( app . instance . todoModule ) . toBe ( app . instance . todo ) ;
168318 expect ( Object . values ( app . store ?. getState ( ) ) ) . toEqual ( [
169319 { count0 : 0 } ,
320+ { count3 : 0 } ,
321+ { count4 : 0 } ,
322+ { count5 : 0 } ,
170323 { count : 0 } ,
324+ { count4 : 0 } ,
325+ { count5 : 0 } ,
171326 {
172327 list : [ ] ,
173328 } ,
174329 { count2 : 0 } ,
175330 { count1 : 0 } ,
176331 ] ) ;
177- expect ( app . instance . todo . counter2 . counter1 ) . toBeInstanceOf ( Counter1 ) ;
332+ expect ( app . instance . todo ! . counter2 . counter1 ) . toBeInstanceOf ( Counter1 ) ;
178333} ) ;
0 commit comments