Module Bonsai_web_test.Handle

include module type of struct include Bonsai_test.Handle end
type ('result, 'incoming) t
val show : ?simulate_diff_patch:('result -> unit) -> ('result, _) t -> unit

show runs recompute_view, then prints the result of the computation as specified by the Result_spec that was passed into Handle.create.

simulate_diff_patch runs between recomputing the view and triggering lifecycles.

val show_into_string : ?simulate_diff_patch:('result -> unit) -> ('result, _) t -> string

show_into_string is the same as show, except it returns the view of the component as a string instead of printing it.

simulate_diff_patch runs between recomputing the view and triggering lifecycles.

val show_diff : ?location_style:Patdiff_kernel.Format.Location_style.t -> ?diff_context:int -> ?simulate_diff_patch:('result -> unit) -> ('result, _) t -> unit

show_diff will print the diff of the view between now and the last time that show or show_diff was called.

diff_context can be used to adjust the number of unchanged lines before and after the diffed content. Defaults to 16.

simulate_diff_patch runs between recomputing the view and triggering lifecycles.

val recompute_view : ?simulate_diff_patch:('result -> unit) -> ('result, _) t -> unit

recompute_view simulates running one frame of a Bonsai app. In particular, it will

  • flush the time source
  • flush the action queue, stabilizing between each action
  • do an additional stabilization
  • trigger lifecycles

The resulting view will not be printed, or stored for show_diff. If you want to print the resulting view, use show instead.

simulate_diff_patch runs between recomputing the view and triggering lifecycles.

val recompute_view_until_stable : ?max_computes:int -> ?simulate_diff_patch:('result -> unit) -> ('result, _) t -> unit

This function calls recompute_view until either max_computes is reached (defaults to 100), or there are no more after-display lifecycle events for processing.

This can be useful when using e.g. Bonsai.Edge.on_change, which might otherwise delay their effects until the next frame.

simulate_diff_patch runs between recomputing the view and triggering lifecycles.

val store_view : (_, _) t -> unit

store_view is like show except that instead of printing the view to stdout, it only stores the current view for use with show_diff. This can be useful if you want to print the diff of "before->after" without being required to print the entirety of "before".

val last_result : ('result, _) t -> 'result
val do_actions : (_, 'incoming) t -> 'incoming list -> unit
val time_source : (_, _) t -> Bonsai.Time_source.t
val advance_clock_by : (_, _) t -> Core.Time_ns.Span.t -> unit
val advance_clock : to_:Core.Time_ns.t -> (_, _) t -> unit
val show_model : (_, _) t -> unit
  • alert rampantly_nondeterministic This function exposes Bonsai internals that may change without warning
val result_incr : ('r, 'i) t -> 'r Ui_incr.t
val lifecycle_incr : (_, _) t -> Ui_incr.Packed.t
val action_input_incr : (_, _) t -> Ui_incr.Packed.t
val has_after_display_events : ('result, 'incoming) t -> bool
val print_actions : (_, _) t -> unit
val print_stabilizations : (_, _) t -> unit
val print_stabilization_tracker_stats : (_, _) t -> unit
val print_computation_structure : (_, _) t -> unit
val create : (module Bonsai_web_test__.Proc.Result_spec.S with type incoming = 'b and type t = 'a) -> ?rpc_implementations: Async_rpc_kernel.Rpc.Connection.t Async_rpc_kernel.Rpc.Implementation.t list -> ?connectors: (Bonsai_web.Rpc_effect.Where_to_connect.t -> Bonsai_web.Rpc_effect.Connector.t) -> ?start_time:Core.Time_ns.t -> ?optimize:bool -> (Bonsai_web.Bonsai.graph @ local -> 'a Bonsai_web.Bonsai.t) -> ('a, 'b) t
val flush_async_and_bonsai : ?max_iterations:int -> ?silence_between_frames:bool -> ('a, 'b) t -> unit Async_kernel.Deferred.t
Runs [recompute_view] and [Async_kernel_scheduler.yield_until_no_jobs_remain]
     in a loop until nothing remains to be done. This is a good sledgehammer
     function to use if you want to wait until all the effects of a user-action
     have completed.

     By default, this function prints "------ between bonsai frame ------" in between
     each iteration to demonstrate when side-effects occur, and how long it took for a
     stable state to be reached. This line is just extra documentation; it is not
     necessarily a sign that something is wrong (unless, of course, the behavior of the
     thing you're trying to test shouldn't result in an extra frame). These lines can be
     removed by passing [~silence_between_frames:true] in case your tests take a
     non-deterministic number of iterations to stabilize.

     [max_iterations] controls how many loop iterations are allowed before the
     function aborts with an exception, in case the default of 100 is too low.
     However, you should rarely, if ever need this parameter.
val lint_vdom : ?min_severity:Virtual_dom_test_helpers.Node_helpers.Linter.Severity.t -> ?expected_failures:Virtual_dom_test_helpers.Node_helpers.Linter.Rule.t list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> unit

min_severity defaults to High.

Vdom Controls

val click_on : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ?shift_key_down:bool -> ?alt_key_down:bool -> ?ctrl_key_down:bool -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val mousedown : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ?shift_key_down:bool -> ?alt_key_down:bool -> ?ctrl_key_down:bool -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val submit_form : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val set_checkbox : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ?shift_key_down:bool -> ?alt_key_down:bool -> ?ctrl_key_down:bool -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> checked:bool -> unit
val input_text : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> text:string -> unit
val input_files : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> files:Js_of_ocaml.File.file Js_of_ocaml.Js.t list -> unit
val keydown : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ?shift_key_down:bool -> ?alt_key_down:bool -> ?ctrl_key_down:bool -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> key:Js_of_ocaml.Dom_html.Keyboard_code.t -> unit
val global_keydown : ?shift_key_down:bool -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> key:Js_of_ocaml.Dom_html.Keyboard_code.t -> selector:string -> unit

Notably, global_keydown must be given a selector for the node where the global listener attr was attached, because Bonsai_web_test does not simulate event propagation.

val change : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> value:string -> unit
val focus : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val blur : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ?related_target:string -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val mousemove : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val mouseenter : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> unit
val wheel : ?extra_event_fields:(string * Js_of_ocaml.Js.Unsafe.any) list -> ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> delta_y:float -> unit
val trigger_hook : ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> name:string -> ('c -> unit Bonsai_web.Vdom.Effect.t) Core.Type_equal.Id.t -> 'c -> unit
val trigger_hook_via : ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> name:string -> 't Core.Type_equal.Id.t -> f:('t -> 'c -> unit Bonsai_web.Vdom.Effect.t) -> 'c -> unit
val get_hook_value : ('a, 'b) t -> get_vdom:('a -> Bonsai_web.Vdom.Node.t) -> selector:string -> name:string -> 'c Core.Type_equal.Id.t -> 'c