File: event_loop_spec.rb

package info (click to toggle)
ruby-neovim 0.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 548 kB
  • sloc: ruby: 4,178; sh: 23; makefile: 4
file content (83 lines) | stat: -rw-r--r-- 2,205 bytes parent folder | download
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
require "helper"

module Neovim
  RSpec.describe EventLoop do
    let!(:push_pipe) { IO.pipe }
    let!(:pull_pipe) { IO.pipe }

    let(:client_rd) { push_pipe[0] }
    let(:client_wr) { pull_pipe[1] }
    let(:server_rd) { pull_pipe[0] }
    let(:server_wr) { push_pipe[1] }

    let(:connection) { Connection.new(client_rd, client_wr) }
    let(:event_loop) { EventLoop.new(connection) }

    describe "#request" do
      it "writes a msgpack request" do
        event_loop.request(1, :method, 1, 2)
        connection.flush
        message = server_rd.readpartial(1024)

        expect(message).to eq(MessagePack.pack([0, 1, "method", [1, 2]]))
      end
    end

    describe "#respond" do
      it "writes a msgpack response" do
        event_loop.respond(2, "value", "error")
        connection.flush
        message = server_rd.readpartial(1024)

        expect(message).to eq(MessagePack.pack([1, 2, "error", "value"]))
      end
    end

    describe "#notify" do
      it "writes a msgpack notification" do
        event_loop.notify(:method, 1, 2)
        connection.flush
        message = server_rd.readpartial(1024)

        expect(message).to eq(MessagePack.pack([2, "method", [1, 2]]))
      end
    end

    describe "#run" do
      it "yields received messages to the block" do
        server_wr.write(MessagePack.pack([0, 1, :foo_method, []]))
        server_wr.flush

        message = nil
        event_loop.run do |req|
          message = req
          event_loop.stop
        end

        expect(message.sync?).to eq(true)
        expect(message.method_name).to eq("foo_method")
      end

      it "returns the last message received" do
        server_wr.write(MessagePack.pack([0, 1, :foo_method, []]))
        server_wr.flush

        message = event_loop.run { |req| event_loop.stop; req }

        expect(message.sync?).to eq(true)
        expect(message.method_name).to eq("foo_method")
      end

      it "shuts down after receiving EOFError" do
        run_thread = Thread.new do
          event_loop.run
        end

        server_wr.close
        run_thread.join
        expect(client_rd).to be_closed
        expect(client_wr).to be_closed
      end
    end
  end
end