11import { mount } from 'enzyme' ;
2- import { Cmd , Dispatcher , Sub , Task } from 'tea-cup-core' ;
3- import { extendJest , ProgramProps , updateUntilIdle } from 'react-tea-cup' ;
2+ import { Cmd , Dispatcher , noCmd , Port , Sub , Task } from 'tea-cup-core' ;
3+ import { DevTools , extendJest , Program , ProgramProps , updateUntilIdle } from 'react-tea-cup' ;
44import React from 'react' ;
55
66extendJest ( expect ) ;
77
8- const init1 : ( ) => [ number , Cmd < string > ] = ( ) => {
9- return [ 0 , toCmd ( 'go' ) ] ;
10- } ;
8+ // const toCmd = (msg: string) => Task.perform(Time.in(0), () => msg);
9+ const toCmd = ( msg : string ) => Task . perform ( Task . succeed ( 0 ) , ( ) => msg ) ;
1110
12- const view1 : ( dispatch : Dispatcher < string > , model : number ) => React . ReactNode = (
13- dispatch : Dispatcher < string > ,
14- model : number ,
15- ) => {
16- return < div className = { 'count' } > { model } </ div > ;
17- } ;
11+ describe ( 'Test Program using updateUntilIdle()' , ( ) => {
12+ const init1 : ( ) => [ number , Cmd < string > ] = ( ) => {
13+ return [ 0 , toCmd ( 'go' ) ] ;
14+ } ;
1815
19- const update1 : ( msg : string , model : number ) => [ number , Cmd < string > ] = ( msg : string , model : number ) => {
20- return [ model + 1 , model < 5 ? toCmd ( 'go' ) : Cmd . none ( ) ] ;
21- } ;
16+ const view1 : ( dispatch : Dispatcher < string > , model : number ) => React . ReactNode = (
17+ dispatch : Dispatcher < string > ,
18+ model : number ,
19+ ) => {
20+ return < div className = { 'count' } > { model } </ div > ;
21+ } ;
2222
23- // const toCmd = (msg: string) => Task.perform(Time.in(0), () => msg);
24- const toCmd = ( msg : string ) => Task . perform ( Task . succeed ( 0 ) , ( ) => msg ) ;
23+ const update1 : ( msg : string , model : number ) => [ number , Cmd < string > ] = ( msg : string , model : number ) => {
24+ return [ model + 1 , model < 5 ? toCmd ( 'go' ) : Cmd . none ( ) ] ;
25+ } ;
2526
26- describe ( 'Test Program' , ( ) => {
2727 it ( 'expect when program is idle' , ( ) => {
2828 const props : ProgramProps < number , string > = {
2929 init : init1 ,
@@ -38,3 +38,62 @@ describe('Test Program', () => {
3838 } ) ;
3939 } ) ;
4040} ) ;
41+
42+ describe ( 'Test Program using DevTools' , ( ) => {
43+ const init1 : ( ) => [ ReadonlyArray < string > , Cmd < string > ] = ( ) => {
44+ return noCmd ( [ ] ) ;
45+ } ;
46+
47+ const view1 : ( dispatch : Dispatcher < string > , model : ReadonlyArray < string > ) => React . ReactNode = (
48+ dispatch : Dispatcher < string > ,
49+ model : ReadonlyArray < string > ,
50+ ) => {
51+ return < div className = { 'history' } > { model . join ( ' ' ) } </ div > ;
52+ } ;
53+
54+ const update1 : ( msg : string , model : ReadonlyArray < string > ) => [ ReadonlyArray < string > , Cmd < string > ] = (
55+ msg : string ,
56+ model : ReadonlyArray < string > ,
57+ ) => {
58+ return noCmd ( model . concat ( [ msg ] ) ) ;
59+ } ;
60+
61+ const port1 : Port < string > = new Port < string > ( ) ;
62+
63+ it ( 'stop dispatching when unmounted' , ( ) => {
64+ const devTools = DevTools . init ( window ) ;
65+ const props : ProgramProps < number , ReadonlyArray < string > > = {
66+ init : init1 ,
67+ view : view1 ,
68+ update : update1 ,
69+ subscriptions : ( ) => port1 . subscribe ( ( msg ) => msg ) ,
70+ devTools,
71+ } ;
72+
73+ const wrapper = mount ( < Program { ...props } /> ) ;
74+
75+ expect ( devTools . lastEvent ( ) . tag ) . toEqual ( 'init' ) ;
76+ expect ( devTools . lastEvent ( ) . model ) . toEqual ( [ ] ) ;
77+ expect ( devTools . lastModel ( ) ) . toEqual ( [ ] ) ;
78+
79+ port1 . send ( 'first' ) ;
80+
81+ expect ( devTools . lastEvent ( ) . tag ) . toEqual ( 'updated' ) ;
82+ expect ( devTools . lastEvent ( ) . msg ) . toEqual ( 'first' ) ;
83+ expect ( devTools . lastModel ( ) ) . toEqual ( [ 'first' ] ) ;
84+
85+ port1 . send ( 'second' ) ;
86+
87+ expect ( devTools . lastEvent ( ) . tag ) . toEqual ( 'updated' ) ;
88+ expect ( devTools . lastEvent ( ) . msg ) . toEqual ( 'second' ) ;
89+ expect ( devTools . lastModel ( ) ) . toEqual ( [ 'first' , 'second' ] ) ;
90+
91+ wrapper . unmount ( ) ;
92+
93+ port1 . send ( 'too-late' ) ;
94+
95+ expect ( devTools . lastEvent ( ) . tag ) . toEqual ( 'updated' ) ;
96+ expect ( devTools . lastEvent ( ) . msg ) . toEqual ( 'second' ) ;
97+ expect ( devTools . lastModel ( ) ) . toEqual ( [ 'first' , 'second' ] ) ;
98+ } ) ;
99+ } ) ;
0 commit comments