@@ -46,14 +46,53 @@ async function execCmd<TMsg> (cmd?: Cmd<TMsg>): Promise<Nullable<TMsg> []> {
4646 return results ;
4747}
4848
49+ /**
50+ * Creates an update function out of an UpdateMap.
51+ * @param {UpdateMap<TProps, TModel, TMessage> } updateMap The UpdateMap.
52+ * @returns {(msg: TMessage, model: TModel, props: TProps) => UpdateReturnType<TModel, TMessage> } The created update function which can be used in tests.
53+ */
4954function getUpdateFn < TProps , TModel , TMessage extends MessageBase > ( updateMap : UpdateMap < TProps , TModel , TMessage > ) : ( msg : TMessage , model : TModel , props : TProps ) => UpdateReturnType < TModel , TMessage > {
5055 return function ( msg : TMessage , model : TModel , props : TProps ) : UpdateReturnType < TModel , TMessage > {
5156 return callUpdateMap ( updateMap , msg , model , props ) ;
5257 } ;
5358}
5459
60+ type UpdateArgsFactory < TProps , TModel , TMessage extends MessageBase > = ( msg : TMessage , modelTemplate ?: Partial < TModel > , propsTemplate ?: Partial < TProps > ) => [ TMessage , TModel , TProps ] ;
61+
62+ /**
63+ * Creates a factory function to create a message, a model, and props which can be passed to an update function in tests.
64+ * @param {() => TModel } initModel A function to create an initial model.
65+ * @param {() => TProps } initProps A function to create initial props.
66+ * @returns {UpdateArgsFactory<TProps, TModel, TMessage> } A function to create a message, a model, and props.
67+ * @example
68+ * // one time
69+ * const createUpdateArgs = createUpdateArgsFactory(() => ({ ... }), () => ({ ... }));
70+ * // in tests
71+ * const [msg, model, props] = createUpdateArgs(Msg.myMessage(), { ... }, , { ... });
72+ */
73+ function createUpdateArgsFactory < TProps , TModel , TMessage extends MessageBase > ( initModel : ( ) => TModel , initProps : ( ) => TProps ) : UpdateArgsFactory < TProps , TModel , TMessage > {
74+ return function ( msg : TMessage , modelTemplate ?: Partial < TModel > , propsTemplate ?: Partial < TProps > ) : [ TMessage , TModel , TProps ] {
75+ return [
76+ msg ,
77+ {
78+ ...initModel ( ) ,
79+ ...modelTemplate ,
80+ } ,
81+ {
82+ ...initProps ( ) ,
83+ ...propsTemplate ,
84+ } ,
85+ ] ;
86+ } ;
87+ }
88+
89+ export type {
90+ UpdateArgsFactory ,
91+ } ;
92+
5593export {
5694 getOfMsgParams ,
5795 execCmd ,
5896 getUpdateFn ,
97+ createUpdateArgsFactory ,
5998} ;
0 commit comments