package vcaml

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file test_notifier.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
open Core
open Async
open Vcaml
open Vcaml_test_helpers
module Notifier = Vcaml.Expert.Notifier
module Notification = Notifier.Notification

let get_current_channel ~client =
  let%map.Deferred.Or_error channels = Nvim.channels |> run_join [%here] client in
  List.hd_exn channels
;;

let%expect_test "Simple asynchronous notification" =
  let result =
    let result = Ivar.create () in
    with_client (fun client ->
      let open Deferred.Or_error.Let_syntax in
      let%bind channel =
        let%map channel_info = get_current_channel ~client in
        channel_info.id
      in
      let call_async_func =
        Notification.custom
          ~type_:Notification.Defun.Vim.(Integer @-> String @-> unit)
          ~function_name:"rpcnotify"
          channel
          "async_func"
      in
      register_request_async
        client
        ~name:"async_func"
        ~type_:Defun.Ocaml.Async.unit
        ~f:(fun ~client:_ -> Deferred.Or_error.return (Ivar.fill result "Called!"));
      Notifier.notify client call_async_func;
      Ivar.read result |> Deferred.ok)
  in
  let%bind result = with_timeout (Time_float.Span.of_int_sec 3) result in
  print_s [%sexp (result : [ `Result of string | `Timeout ])];
  [%expect {| (Result Called!) |}];
  return ()
;;

let%expect_test "Bad asynchronous notification" =
  let result =
    let result = Ivar.create () in
    with_client
      ~on_error:
        (`Call
           (fun error ->
              print_s [%sexp (error : Vcaml_error.t)];
              Ivar.fill result "Received asynchronous failure message"))
      (fun client ->
         Notifier.For_testing.send_raw client ~function_name:"" ~params:[];
         Ivar.read result |> Deferred.ok)
  in
  let%bind result = with_timeout (Time_float.Span.of_int_sec 3) result in
  print_s [%sexp (result : [ `Result of string | `Timeout ])];
  [%expect
    {|
    (Nvim_error_event
     (Error (error_type Exception) (message "Invalid method: <empty>")))
    (Result "Received asynchronous failure message") |}];
  return ()
;;
OCaml

Innovation. Community. Security.