@@ -3,6 +3,7 @@ import { extendJest, Cmd, Sub, Task, Program, ProgramProps } from "react-tea-cup
33import React , { ReactNode } from 'react' ;
44import { Dispatcher } from 'tea-cup-core' ;
55import { view } from './Counter' ;
6+ import { ReactElement } from 'react' ;
67// import 'jest-enzyme';
78
89extendJest ( expect ) ;
@@ -45,7 +46,7 @@ describe('Test Program', () => {
4546 update : update1 ,
4647 subscriptions : ( ) => Sub . none < string > ( )
4748 }
48- return updateUntilIdle ( props ) . then ( ( [ model , wrapper ] ) => {
49+ return updateUntilIdle ( props , mount ) . then ( ( [ model , wrapper ] ) => {
4950 expect ( model ) . toEqual ( 6 )
5051 // expect(wrapper).toHaveHTML('')
5152 expect ( wrapper . find ( '.count' ) ) . toHaveText ( '6' )
@@ -59,32 +60,33 @@ function mountWhenIdle<Model, Msg>(props: ProgramProps<Model, Msg>) {
5960 return testable . mountWhenIdle ( )
6061}
6162
62- type WrapperType < Model , Msg > = ReactWrapper < Program < Model , Msg > , ProgramProps < Model , Msg > , never >
63- type ResolveType < Model , Msg > = ( idle : [ Model , WrapperType < Model , Msg > ] ) => void ;
63+ type Trigger < Model , Msg , T > = ( node : ReactElement < ProgramProps < Model , Msg > > ) => T
64+ // type WrapperType<Model, Msg> = ReactWrapper<Program<Model, Msg>, ProgramProps<Model, Msg>, never>
65+ type ResolveType < Model , T > = ( idle : [ Model , T ] ) => void ;
6466
65- function updateUntilIdle < Model , Msg > ( props : ProgramProps < Model , Msg > ) : Promise < [ Model , WrapperType < Model , Msg > ] > {
67+ function updateUntilIdle < Model , Msg , T > ( props : ProgramProps < Model , Msg > , fun : Trigger < Model , Msg , T > ) : Promise < [ Model , T ] > {
6668 return new Promise ( resolve => {
67- mount ( < Program { ...testableProps ( resolve , props ) } /> )
69+ fun ( < Program { ...testableProps ( resolve , props , fun ) } /> )
6870 } )
6971}
7072
71- function testableProps < Model , Msg > ( resolve : ResolveType < Model , Msg > , props : ProgramProps < Model , Msg > ) {
72- const tprops : ProgramProps < TestableModel < Model , Msg > , Msg > = {
73+ function testableProps < Model , Msg , T > ( resolve : ResolveType < Model , T > , props : ProgramProps < Model , Msg > , fun : Trigger < Model , Msg , T > ) {
74+ const tprops : ProgramProps < TestableModel < Model , Msg , T > , Msg > = {
7375 init : initTestable ( resolve , props . init ) ,
7476 view : viewTestable ( props . view ) ,
7577 update : updateTestable ( ( props . update ) ) ,
76- subscriptions : suscriptionsTestable ( props )
78+ subscriptions : suscriptionsTestable ( props , fun )
7779 }
7880 return tprops
7981}
8082
81- type TestableModel < Model , Msg > = {
82- readonly resolve : ResolveType < Model , Msg > ;
83+ type TestableModel < Model , Msg , T > = {
84+ readonly resolve : ResolveType < Model , T > ;
8385 readonly cmds : Cmd < Msg > [ ] ;
8486 readonly model : Model ;
8587}
8688
87- function initTestable < Model , Msg > ( resolve : ResolveType < Model , Msg > , init : ProgramProps < Model , Msg > [ 'init' ] ) : ProgramProps < TestableModel < Model , Msg > , Msg > [ 'init' ] {
89+ function initTestable < Model , Msg , T > ( resolve : ResolveType < Model , T > , init : ProgramProps < Model , Msg > [ 'init' ] ) : ProgramProps < TestableModel < Model , Msg , T > , Msg > [ 'init' ] {
8890 const mac = init ( ) ;
8991 return ( ) => [ {
9092 resolve,
@@ -93,12 +95,12 @@ function initTestable<Model, Msg>(resolve: ResolveType<Model, Msg>, init: Progra
9395 } , Cmd . none ( ) ] ;
9496}
9597
96- function viewTestable < Model , Msg > ( view : ProgramProps < Model , Msg > [ 'view' ] ) : ProgramProps < TestableModel < Model , Msg > , Msg > [ 'view' ] {
97- return ( dispatch : Dispatcher < Msg > , model : TestableModel < Model , Msg > ) => view ( dispatch , model . model ) ;
98+ function viewTestable < Model , Msg , T > ( view : ProgramProps < Model , Msg > [ 'view' ] ) : ProgramProps < TestableModel < Model , Msg , T > , Msg > [ 'view' ] {
99+ return ( dispatch : Dispatcher < Msg > , model : TestableModel < Model , Msg , T > ) => view ( dispatch , model . model ) ;
98100}
99101
100- function updateTestable < Model , Msg > ( update : ProgramProps < Model , Msg > [ 'update' ] ) : ProgramProps < TestableModel < Model , Msg > , Msg > [ 'update' ] {
101- return ( msg : Msg , model : TestableModel < Model , Msg > ) => {
102+ function updateTestable < Model , Msg , T > ( update : ProgramProps < Model , Msg > [ 'update' ] ) : ProgramProps < TestableModel < Model , Msg , T > , Msg > [ 'update' ] {
103+ return ( msg : Msg , model : TestableModel < Model , Msg , T > ) => {
102104 const [ model1 , cmd1 ] = update ( msg , model . model ) ;
103105 const cmds = [ cmd1 ] . filter ( cmd => cmd . constructor . name !== 'CmdNone' )
104106 return [ {
@@ -109,17 +111,17 @@ function updateTestable<Model, Msg>(update: ProgramProps<Model, Msg>['update']):
109111 }
110112}
111113
112- function suscriptionsTestable < Model , Msg > ( props : ProgramProps < Model , Msg > ) : ProgramProps < TestableModel < Model , Msg > , Msg > [ 'subscriptions' ] {
113- return ( model : TestableModel < Model , Msg > ) => {
114+ function suscriptionsTestable < Model , Msg , T > ( props : ProgramProps < Model , Msg > , fun : Trigger < Model , Msg , T > ) : ProgramProps < TestableModel < Model , Msg , T > , Msg > [ 'subscriptions' ] {
115+ return ( model : TestableModel < Model , Msg , T > ) => {
114116 const subs = props . subscriptions ( model . model ) ;
115117 if ( model . cmds . length === 0 ) {
116- const wrapper : WrapperType < Model , Msg > = mount ( < Program
118+ const result = fun ( < Program
117119 init = { ( ) => [ model . model , Cmd . none ( ) ] }
118120 update = { ( msg , model ) => [ model , Cmd . none ( ) ] }
119121 view = { ( d , m ) => props . view ( d , m ) }
120122 subscriptions = { ( d ) => Sub . none ( ) }
121123 /> )
122- model . resolve ( [ model . model , wrapper ] ) ;
124+ model . resolve ( [ model . model , result ] ) ;
123125 return subs ;
124126 }
125127 return Sub . batch ( [ new TestableSub ( model . cmds ) , subs ] ) ;
0 commit comments