neovim 0.0.6 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +4 -19
- data/CHANGELOG.md +9 -0
- data/README.md +2 -2
- data/Rakefile +1 -25
- data/bin/j2mp +1 -1
- data/bin/mp2j +1 -1
- data/bin/neovim-ruby-host +9 -0
- data/lib/neovim.rb +5 -7
- data/lib/neovim/async_session.rb +2 -1
- data/lib/neovim/buffer.rb +112 -0
- data/lib/neovim/client.rb +4 -2
- data/lib/neovim/current.rb +9 -1
- data/lib/neovim/event_loop.rb +8 -4
- data/lib/neovim/host.rb +3 -1
- data/lib/neovim/line_range.rb +34 -10
- data/lib/neovim/logging.rb +29 -20
- data/lib/neovim/manifest.rb +9 -3
- data/lib/neovim/plugin.rb +3 -1
- data/lib/neovim/plugin/dsl.rb +14 -0
- data/lib/neovim/plugin/handler.rb +24 -5
- data/lib/neovim/ruby_provider.rb +138 -0
- data/lib/neovim/session.rb +14 -5
- data/lib/neovim/version.rb +1 -1
- data/lib/neovim/window.rb +52 -59
- data/spec/acceptance/neovim-ruby-host_spec.rb +6 -1
- data/spec/acceptance/ruby_provider_spec.rb +76 -0
- data/spec/helper.rb +13 -19
- data/spec/neovim/async_session_spec.rb +19 -15
- data/spec/neovim/buffer_spec.rb +127 -1
- data/spec/neovim/client_spec.rb +1 -1
- data/spec/neovim/current_spec.rb +9 -1
- data/spec/neovim/event_loop_spec.rb +20 -21
- data/spec/neovim/host_spec.rb +1 -1
- data/spec/neovim/line_range_spec.rb +73 -9
- data/spec/neovim/manifest_spec.rb +26 -0
- data/spec/neovim/msgpack_stream_spec.rb +8 -8
- data/spec/neovim/plugin_spec.rb +41 -0
- data/spec/neovim/remote_object_spec.rb +3 -3
- data/spec/neovim/session_spec.rb +68 -29
- data/spec/neovim/window_spec.rb +47 -24
- data/spec/neovim_spec.rb +3 -5
- data/spec/support.rb +1 -2
- metadata +5 -3
- data/.gitmodules +0 -4
data/spec/neovim/host_spec.rb
CHANGED
@@ -30,7 +30,7 @@ module Neovim
|
|
30
30
|
it "delegates messages to the manifest" do
|
31
31
|
messages = []
|
32
32
|
manifest = instance_double(Manifest)
|
33
|
-
session = Session.child(["-n", "-u", "NONE"])
|
33
|
+
session = Session.child(["nvim", "-n", "-u", "NONE"])
|
34
34
|
|
35
35
|
host = Host.new(manifest, session)
|
36
36
|
|
@@ -2,14 +2,16 @@ require "helper"
|
|
2
2
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe LineRange do
|
5
|
-
let(:client) { Neovim.attach_child(["--headless", "-n", "-u", "NONE"]) }
|
5
|
+
let(:client) { Neovim.attach_child(["nvim", "--headless", "-n", "-u", "NONE"]) }
|
6
6
|
let(:buffer) { client.current.buffer }
|
7
|
-
let(:line_range) { LineRange.new(buffer, 0,
|
7
|
+
let(:line_range) { LineRange.new(buffer, 0, 3) }
|
8
|
+
let(:sub_range) { LineRange.new(buffer, 1, 2) }
|
8
9
|
|
9
10
|
before do
|
10
11
|
client.command("normal i1")
|
11
12
|
client.command("normal o2")
|
12
13
|
client.command("normal o3")
|
14
|
+
client.command("normal o4")
|
13
15
|
end
|
14
16
|
|
15
17
|
it "is enumerable" do
|
@@ -19,7 +21,11 @@ module Neovim
|
|
19
21
|
|
20
22
|
describe "#to_a" do
|
21
23
|
it "returns lines as an array" do
|
22
|
-
expect(line_range.to_a).to eq(["1", "2", "3"])
|
24
|
+
expect(line_range.to_a).to eq(["1", "2", "3", "4"])
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns a subset of lines as an array" do
|
28
|
+
expect(sub_range.to_a).to eq(["2", "3"])
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
@@ -28,40 +34,98 @@ module Neovim
|
|
28
34
|
expect(line_range[1]).to eq("2")
|
29
35
|
end
|
30
36
|
|
37
|
+
it "returns lines at an offset from the index" do
|
38
|
+
expect(sub_range[0]).to eq("2")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "allows indexes beyond the bounds of a sub range" do
|
42
|
+
expect(sub_range[2]).to eq("4")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns lines at an offset with a negative index" do
|
46
|
+
expect(sub_range[-1]).to eq("3")
|
47
|
+
end
|
48
|
+
|
31
49
|
it "accepts an index and length" do
|
32
50
|
expect(line_range[0, 2].to_a).to eq(["1", "2"])
|
33
51
|
end
|
34
52
|
|
53
|
+
it "returns lines at an offset from an index and length" do
|
54
|
+
expect(sub_range[0, 2].to_a).to eq(["2", "3"])
|
55
|
+
end
|
56
|
+
|
35
57
|
it "accepts a range" do
|
36
58
|
expect(line_range[0..1].to_a).to eq(["1", "2"])
|
37
59
|
expect(line_range[0...1].to_a).to eq(["1"])
|
38
60
|
end
|
61
|
+
|
62
|
+
it "accepts a range with a negative end" do
|
63
|
+
expect(line_range[0..-1].to_a).to eq(["1", "2", "3", "4"])
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns lines at an offset from a range" do
|
67
|
+
expect(sub_range[0..1].to_a).to eq(["2", "3"])
|
68
|
+
end
|
39
69
|
end
|
40
70
|
|
41
71
|
describe "#[]=" do
|
42
72
|
it "accepts a single index" do
|
43
73
|
line_range[0] = "foo"
|
44
|
-
expect(line_range.to_a).to eq(["foo", "2", "3"])
|
74
|
+
expect(line_range.to_a).to eq(["foo", "2", "3", "4"])
|
75
|
+
end
|
76
|
+
|
77
|
+
it "accepts a single index at an offset" do
|
78
|
+
sub_range[0] = "foo"
|
79
|
+
expect(buffer.lines.to_a).to eq(["1", "foo", "3", "4"])
|
45
80
|
end
|
46
81
|
|
47
82
|
it "accepts an index and length" do
|
48
83
|
line_range[0, 2] = ["foo"]
|
49
|
-
expect(line_range.to_a).to eq(["foo", "3"])
|
84
|
+
expect(line_range.to_a).to eq(["foo", "3", "4"])
|
85
|
+
end
|
86
|
+
|
87
|
+
it "accepts an index and length at an offset" do
|
88
|
+
sub_range[0, 2] = ["foo"]
|
89
|
+
expect(buffer.lines.to_a).to eq(["1", "foo", "4"])
|
50
90
|
end
|
51
91
|
|
52
92
|
it "accepts a range" do
|
53
93
|
line_range[0..1] = ["foo"]
|
54
|
-
expect(line_range.to_a).to eq(["foo", "3"])
|
94
|
+
expect(line_range.to_a).to eq(["foo", "3", "4"])
|
55
95
|
|
56
96
|
line_range[0...1] = ["bar"]
|
57
|
-
expect(line_range.to_a).to eq(["bar", "3"])
|
97
|
+
expect(line_range.to_a).to eq(["bar", "3", "4"])
|
98
|
+
end
|
99
|
+
|
100
|
+
it "accepts a range at an offset" do
|
101
|
+
sub_range[0..1] = ["foo"]
|
102
|
+
expect(buffer.lines.to_a).to eq(["1", "foo", "4"])
|
58
103
|
end
|
59
104
|
end
|
60
105
|
|
61
106
|
describe "#replace" do
|
62
107
|
it "replaces all lines" do
|
63
|
-
line_range.replace(["
|
64
|
-
expect(line_range.to_a).to eq(["
|
108
|
+
line_range.replace(["4", "5"])
|
109
|
+
expect(line_range.to_a).to eq(["4", "5"])
|
110
|
+
end
|
111
|
+
|
112
|
+
it "replaces a subset of lines" do
|
113
|
+
sub_range.replace(["5", "6"])
|
114
|
+
expect(buffer.lines.to_a).to eq(["1", "5", "6", "4"])
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#delete" do
|
119
|
+
it "deletes the line at the given index" do
|
120
|
+
expect {
|
121
|
+
line_range.delete(0)
|
122
|
+
}.to change { line_range.to_a }.to(["2", "3", "4"])
|
123
|
+
end
|
124
|
+
|
125
|
+
it "deletes the line at an offset" do
|
126
|
+
expect {
|
127
|
+
sub_range.delete(0)
|
128
|
+
}.to change { buffer.lines.to_a }.to(["1", "3", "4"])
|
65
129
|
end
|
66
130
|
end
|
67
131
|
end
|
@@ -38,6 +38,18 @@ module Neovim
|
|
38
38
|
manifest.handlers["source:command:Foo"]
|
39
39
|
}.from(nil).to(kind_of(Proc))
|
40
40
|
end
|
41
|
+
|
42
|
+
it "doesn't add top-level RPCs to specs" do
|
43
|
+
manifest = Manifest.new
|
44
|
+
|
45
|
+
plugin = Plugin.from_config_block("source") do |plug|
|
46
|
+
plug.rpc(:Foo)
|
47
|
+
end
|
48
|
+
|
49
|
+
expect {
|
50
|
+
manifest.register(plugin)
|
51
|
+
}.to change { manifest.specs }.from({}).to("source" => [])
|
52
|
+
end
|
41
53
|
end
|
42
54
|
|
43
55
|
describe "#handle" do
|
@@ -77,6 +89,20 @@ module Neovim
|
|
77
89
|
manifest.handle(message, client)
|
78
90
|
end
|
79
91
|
|
92
|
+
it "rescues plugin sync handler exceptions" do
|
93
|
+
manifest = Manifest.new
|
94
|
+
plugin = Plugin.from_config_block("source") do |plug|
|
95
|
+
plug.command(:Foo, :sync => true) { raise "BOOM" }
|
96
|
+
end
|
97
|
+
manifest.register(plugin)
|
98
|
+
|
99
|
+
message = double(:message, :method_name => "source:command:Foo", :sync? => true, :arguments => [])
|
100
|
+
client = double(:client)
|
101
|
+
|
102
|
+
expect(message).to receive(:error).with("BOOM")
|
103
|
+
manifest.handle(message, client)
|
104
|
+
end
|
105
|
+
|
80
106
|
it "calls a plugin async handler" do
|
81
107
|
manifest = Manifest.new
|
82
108
|
async_proc = Proc.new {}
|
@@ -6,26 +6,26 @@ module Neovim
|
|
6
6
|
shared_context "msgpack stream behavior" do
|
7
7
|
it "sends and receives data" do
|
8
8
|
msgpack_stream = MsgpackStream.new(event_loop)
|
9
|
-
|
9
|
+
request = nil
|
10
10
|
|
11
11
|
server_thread = Thread.new do
|
12
12
|
client = server.accept
|
13
|
-
|
13
|
+
request = client.readpartial(1024)
|
14
14
|
|
15
|
-
client.write(MessagePack.pack([
|
15
|
+
client.write(MessagePack.pack(["res"]))
|
16
16
|
client.close
|
17
17
|
server.close
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
msgpack_stream.write([
|
22
|
-
|
20
|
+
response = nil
|
21
|
+
msgpack_stream.write(["req"]).run do |message|
|
22
|
+
response = message
|
23
23
|
msgpack_stream.shutdown
|
24
24
|
end
|
25
25
|
|
26
26
|
server_thread.join
|
27
|
-
expect(
|
28
|
-
expect(
|
27
|
+
expect(request).to eq(MessagePack.pack(["req"]))
|
28
|
+
expect(response).to eq(["res"])
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
data/spec/neovim/plugin_spec.rb
CHANGED
@@ -62,6 +62,47 @@ module Neovim
|
|
62
62
|
:opts => {:range => "", :nargs => 1},
|
63
63
|
)
|
64
64
|
end
|
65
|
+
|
66
|
+
it "registers a top level RPC" do
|
67
|
+
cmd_block = Proc.new {}
|
68
|
+
|
69
|
+
plugin = Plugin.from_config_block("source") do |plug|
|
70
|
+
plug.rpc("Foo", :sync => true, &cmd_block)
|
71
|
+
end
|
72
|
+
|
73
|
+
expect(plugin.handlers.size).to be(1)
|
74
|
+
handler = plugin.handlers.first
|
75
|
+
|
76
|
+
expect(handler.block).to eq(cmd_block)
|
77
|
+
expect(handler.qualified_name).to eq("Foo")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#specs" do
|
82
|
+
it "returns specs for plugin handlers" do
|
83
|
+
plugin = Plugin.from_config_block("source") do |plug|
|
84
|
+
plug.command("Foo", :sync => true, :nargs => 2)
|
85
|
+
end
|
86
|
+
|
87
|
+
expect(plugin.specs).to eq(
|
88
|
+
[
|
89
|
+
{
|
90
|
+
:type => :command,
|
91
|
+
:name => "Foo",
|
92
|
+
:sync => true,
|
93
|
+
:opts=> {:nargs => 2}
|
94
|
+
}
|
95
|
+
]
|
96
|
+
)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "doesn't include specs for top-level RPCs" do
|
100
|
+
plugin = Plugin.from_config_block("source") do |plug|
|
101
|
+
plug.rpc("Foo", :sync => true)
|
102
|
+
end
|
103
|
+
|
104
|
+
expect(plugin.specs).to eq([])
|
105
|
+
end
|
65
106
|
end
|
66
107
|
end
|
67
108
|
end
|
@@ -3,7 +3,7 @@ require "helper"
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe RemoteObject do
|
5
5
|
context Window do
|
6
|
-
let(:window) { Neovim.attach_child(["-n", "-u", "NONE"]).current.window }
|
6
|
+
let(:window) { Neovim.attach_child(["nvim", "-n", "-u", "NONE"]).current.window }
|
7
7
|
|
8
8
|
describe "#respond_to?" do
|
9
9
|
it "returns true for Window functions" do
|
@@ -37,7 +37,7 @@ module Neovim
|
|
37
37
|
end
|
38
38
|
|
39
39
|
context Tabpage do
|
40
|
-
let(:tabpage) { Neovim.attach_child(["-n", "-u", "NONE"]).current.tabpage }
|
40
|
+
let(:tabpage) { Neovim.attach_child(["nvim", "-n", "-u", "NONE"]).current.tabpage }
|
41
41
|
|
42
42
|
describe "#respond_to?" do
|
43
43
|
it "returns true for Tabpage functions" do
|
@@ -71,7 +71,7 @@ module Neovim
|
|
71
71
|
end
|
72
72
|
|
73
73
|
context Buffer do
|
74
|
-
let(:buffer) { Neovim.attach_child(["-n", "-u", "NONE"]).current.buffer }
|
74
|
+
let(:buffer) { Neovim.attach_child(["nvim", "-n", "-u", "NONE"]).current.buffer }
|
75
75
|
|
76
76
|
describe "#respond_to?" do
|
77
77
|
it "returns true for Buffer functions" do
|
data/spec/neovim/session_spec.rb
CHANGED
@@ -1,43 +1,84 @@
|
|
1
1
|
require "helper"
|
2
2
|
require "securerandom"
|
3
|
-
require "fileutils"
|
4
3
|
|
5
4
|
module Neovim
|
6
5
|
RSpec.describe Session do
|
7
6
|
shared_context "session behavior" do
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
describe "#channel_id" do
|
8
|
+
it "returns nil when the API hasn't been discovered" do
|
9
|
+
expect(session.channel_id).to be(nil)
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
it "returns the channel_id when the API has been discovered" do
|
13
|
+
session.discover_api
|
14
|
+
expect(session.channel_id).to respond_to(:to_int)
|
15
|
+
end
|
14
16
|
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
session.request(:vim_strwidth, "
|
19
|
-
|
18
|
+
describe "#request" do
|
19
|
+
it "synchronously returns a result" do
|
20
|
+
expect(session.request(:vim_strwidth, "foobar")).to be(6)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "raises an exception when there are errors" do
|
24
|
+
expect {
|
25
|
+
session.request(:vim_strwidth, "too", "many")
|
26
|
+
}.to raise_error(/wrong number of arguments/i)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "handles large data" do
|
30
|
+
large_str = Array.new(1024 * 17) { SecureRandom.hex(1) }.join
|
31
|
+
session.request(:vim_set_current_line, large_str)
|
32
|
+
expect(session.request(:vim_get_current_line)).to eq(large_str)
|
33
|
+
end
|
20
34
|
end
|
21
35
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
36
|
+
describe "#notify" do
|
37
|
+
it "returns nil" do
|
38
|
+
expect(session.notify(:vim_input, "jk")).to be(nil)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "doesn't raise exceptions" do
|
42
|
+
expect {
|
43
|
+
session.notify(:vim_strwidth, "too", "many")
|
44
|
+
}.not_to raise_error
|
45
|
+
end
|
46
|
+
|
47
|
+
it "handles large data" do
|
48
|
+
large_str = Array.new(1024 * 17) { SecureRandom.hex(1) }.join
|
49
|
+
session.notify(:vim_set_current_line, large_str)
|
50
|
+
expect(session.request(:vim_get_current_line)).to eq(large_str)
|
51
|
+
end
|
26
52
|
end
|
27
53
|
|
28
|
-
|
29
|
-
|
30
|
-
|
54
|
+
describe "#run" do
|
55
|
+
it "enqueues messages received during blocking requests" do
|
56
|
+
session.request(:vim_subscribe, "my_event")
|
57
|
+
session.request(:vim_command, "call rpcnotify(0, 'my_event', 'foo')")
|
31
58
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
59
|
+
message = nil
|
60
|
+
session.run do |msg|
|
61
|
+
message = msg
|
62
|
+
session.shutdown
|
63
|
+
end
|
64
|
+
|
65
|
+
expect(message).to be_a(Notification)
|
66
|
+
expect(message.method_name).to eq("my_event")
|
67
|
+
expect(message.arguments).to eq(["foo"])
|
36
68
|
end
|
37
69
|
|
38
|
-
|
39
|
-
|
40
|
-
|
70
|
+
it "supports requests within callbacks" do
|
71
|
+
session.request(:vim_subscribe, "my_event")
|
72
|
+
session.request(:vim_command, "call rpcnotify(0, 'my_event', 'foo')")
|
73
|
+
|
74
|
+
result = nil
|
75
|
+
session.run do |msg|
|
76
|
+
result = session.request(:vim_strwidth, msg.arguments.first)
|
77
|
+
session.shutdown
|
78
|
+
end
|
79
|
+
|
80
|
+
expect(result).to be(3)
|
81
|
+
end
|
41
82
|
end
|
42
83
|
end
|
43
84
|
|
@@ -46,7 +87,7 @@ module Neovim
|
|
46
87
|
let!(:nvim_pid) do
|
47
88
|
pid = Process.spawn(
|
48
89
|
{"NVIM_LISTEN_ADDRESS" => "0.0.0.0:#{nvim_port}"},
|
49
|
-
"
|
90
|
+
"nvim --headless -n -u NONE",
|
50
91
|
[:out, :err] => "/dev/null"
|
51
92
|
)
|
52
93
|
|
@@ -65,7 +106,6 @@ module Neovim
|
|
65
106
|
end
|
66
107
|
|
67
108
|
let(:session) { Session.tcp("0.0.0.0", nvim_port) }
|
68
|
-
|
69
109
|
include_context "session behavior"
|
70
110
|
end
|
71
111
|
|
@@ -74,7 +114,7 @@ module Neovim
|
|
74
114
|
let!(:nvim_pid) do
|
75
115
|
pid = Process.spawn(
|
76
116
|
{"NVIM_LISTEN_ADDRESS" => socket_path},
|
77
|
-
"
|
117
|
+
"nvim --headless -n -u NONE",
|
78
118
|
[:out, :err] => "/dev/null"
|
79
119
|
)
|
80
120
|
|
@@ -93,12 +133,11 @@ module Neovim
|
|
93
133
|
end
|
94
134
|
|
95
135
|
let(:session) { Session.unix(socket_path) }
|
96
|
-
|
97
136
|
include_context "session behavior"
|
98
137
|
end
|
99
138
|
|
100
139
|
context "child" do
|
101
|
-
let(:session) { Session.child(["-n", "-u", "NONE"]) }
|
140
|
+
let(:session) { Session.child(["nvim", "-n", "-u", "NONE"]) }
|
102
141
|
include_context "session behavior"
|
103
142
|
end
|
104
143
|
end
|
data/spec/neovim/window_spec.rb
CHANGED
@@ -2,39 +2,62 @@ require "helper"
|
|
2
2
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe Window do
|
5
|
-
let(:client) { Neovim.attach_child(["--headless", "-n", "-u", "NONE"]) }
|
5
|
+
let(:client) { Neovim.attach_child(["nvim", "--headless", "-n", "-u", "NONE"]) }
|
6
6
|
let(:window) { client.current.window }
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
describe "if_ruby compatibility" do
|
9
|
+
describe "#buffer" do
|
10
|
+
it "returns the buffer displayed in the window" do
|
11
|
+
expect(window.buffer).to be_a(Buffer)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#height" do
|
16
|
+
it "returns the height of the window" do
|
17
|
+
client.set_option("lines", 5)
|
18
|
+
expect(window.height).to be(3)
|
19
|
+
end
|
20
|
+
end
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
describe "#height=" do
|
23
|
+
it "sets the height of the window" do
|
24
|
+
expect {
|
25
|
+
window.height = 5
|
26
|
+
}.to change { window.height }.to(5)
|
27
|
+
end
|
28
|
+
end
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
describe "#width" do
|
31
|
+
it "returns the width of the window" do
|
32
|
+
client.set_option("columns", 20)
|
33
|
+
expect(window.width).to be(20)
|
34
|
+
end
|
22
35
|
end
|
23
36
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
37
|
+
describe "#width=" do
|
38
|
+
it "sets the width of a vertically split window" do
|
39
|
+
client.command("vsplit")
|
40
|
+
|
41
|
+
expect {
|
42
|
+
window.width += 1
|
43
|
+
}.to change { window.width }.by(1)
|
44
|
+
end
|
45
|
+
end
|
28
46
|
|
29
|
-
|
30
|
-
|
31
|
-
|
47
|
+
describe "#cursor" do
|
48
|
+
it "returns the cursor coordinates" do
|
49
|
+
expect(window.cursor).to eq([1, 0])
|
50
|
+
end
|
32
51
|
end
|
33
52
|
|
34
|
-
|
35
|
-
|
36
|
-
window.
|
37
|
-
|
53
|
+
describe "#cursor=" do
|
54
|
+
it "sets the cursor coodinates" do
|
55
|
+
window.buffer.lines = ["one", "two"]
|
56
|
+
|
57
|
+
expect {
|
58
|
+
window.cursor = [2, 2]
|
59
|
+
}.to change { window.cursor }.to([2, 2])
|
60
|
+
end
|
38
61
|
end
|
39
62
|
end
|
40
63
|
end
|