vedeu 0.2.3 → 0.2.4
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/docs/api.md +2 -0
- data/docs/events.md +0 -4
- data/examples/cursor_app/cursor_app.rb +56 -44
- data/lib/vedeu/api/api.rb +4 -6
- data/lib/vedeu/api/composition.rb +3 -7
- data/lib/vedeu/api/interface.rb +2 -3
- data/lib/vedeu/api/menu.rb +5 -3
- data/lib/vedeu/api/stream.rb +34 -0
- data/lib/vedeu/application.rb +4 -7
- data/lib/vedeu/configuration/api.rb +0 -5
- data/lib/vedeu/configuration/cli.rb +0 -1
- data/lib/vedeu/configuration/configuration.rb +0 -12
- data/lib/vedeu/input/input.rb +0 -3
- data/lib/vedeu/launcher.rb +0 -1
- data/lib/vedeu/models/{attributes/background.rb → background.rb} +0 -4
- data/lib/vedeu/models/char.rb +43 -0
- data/lib/vedeu/models/colour.rb +0 -1
- data/lib/vedeu/models/composition.rb +4 -3
- data/lib/vedeu/models/cursor.rb +70 -146
- data/lib/vedeu/models/{attributes/foreground.rb → foreground.rb} +0 -4
- data/lib/vedeu/models/geometry.rb +19 -20
- data/lib/vedeu/models/interface.rb +36 -5
- data/lib/vedeu/models/keymap.rb +7 -4
- data/lib/vedeu/models/line.rb +31 -11
- data/lib/vedeu/models/offset.rb +84 -0
- data/lib/vedeu/models/stream.rb +37 -13
- data/lib/vedeu/models/style.rb +0 -1
- data/lib/vedeu/output/area.rb +284 -0
- data/lib/vedeu/output/clear.rb +2 -4
- data/lib/vedeu/output/compositor.rb +0 -4
- data/lib/vedeu/output/refresh.rb +1 -2
- data/lib/vedeu/output/render.rb +12 -163
- data/lib/vedeu/output/view.rb +0 -2
- data/lib/vedeu/output/viewport.rb +132 -0
- data/lib/vedeu/repositories/buffers.rb +11 -22
- data/lib/vedeu/repositories/cursors.rb +20 -47
- data/lib/vedeu/repositories/events.rb +2 -1
- data/lib/vedeu/repositories/focus.rb +16 -16
- data/lib/vedeu/repositories/groups.rb +1 -4
- data/lib/vedeu/repositories/interfaces.rb +10 -3
- data/lib/vedeu/repositories/keymaps.rb +0 -3
- data/lib/vedeu/repositories/menus.rb +0 -2
- data/lib/vedeu/repositories/offsets.rb +47 -0
- data/lib/vedeu/{models/attributes → support}/coercions.rb +0 -0
- data/lib/vedeu/{models/attributes → support}/colour_translator.rb +0 -16
- data/lib/vedeu/support/esc.rb +0 -22
- data/lib/vedeu/support/event.rb +1 -17
- data/lib/vedeu/support/exceptions.rb +0 -3
- data/lib/vedeu/support/grid.rb +0 -3
- data/lib/vedeu/support/log.rb +13 -14
- data/lib/vedeu/support/move.rb +50 -0
- data/lib/vedeu/support/position.rb +17 -9
- data/lib/vedeu/{models/attributes → support}/presentation.rb +1 -4
- data/lib/vedeu/support/registrar.rb +2 -2
- data/lib/vedeu/support/repository.rb +23 -2
- data/lib/vedeu/support/terminal.rb +0 -2
- data/lib/vedeu/support/trace.rb +0 -11
- data/lib/vedeu.rb +11 -5
- data/test/lib/vedeu/api/api_test.rb +14 -5
- data/test/lib/vedeu/api/composition_test.rb +9 -26
- data/test/lib/vedeu/api/keymap_test.rb +1 -1
- data/test/lib/vedeu/api/menu_test.rb +6 -0
- data/test/lib/vedeu/api/stream_test.rb +32 -0
- data/test/lib/vedeu/models/{attributes/background_test.rb → background_test.rb} +0 -0
- data/test/lib/vedeu/models/char_test.rb +46 -0
- data/test/lib/vedeu/models/composition_test.rb +7 -0
- data/test/lib/vedeu/models/cursor_test.rb +63 -80
- data/test/lib/vedeu/models/{attributes/foreground_test.rb → foreground_test.rb} +0 -0
- data/test/lib/vedeu/models/geometry_test.rb +8 -10
- data/test/lib/vedeu/models/interface_test.rb +26 -21
- data/test/lib/vedeu/models/keymap_test.rb +6 -0
- data/test/lib/vedeu/models/line_test.rb +82 -3
- data/test/lib/vedeu/models/offset_test.rb +121 -0
- data/test/lib/vedeu/models/stream_test.rb +107 -8
- data/test/lib/vedeu/output/area_test.rb +242 -0
- data/test/lib/vedeu/output/compositor_test.rb +12 -3
- data/test/lib/vedeu/output/render_test.rb +34 -39
- data/test/lib/vedeu/output/viewport_test.rb +36 -0
- data/test/lib/vedeu/repositories/cursors_test.rb +32 -9
- data/test/lib/vedeu/repositories/focus_test.rb +8 -0
- data/test/lib/vedeu/repositories/offsets_test.rb +32 -0
- data/test/lib/vedeu/{models/attributes → support}/coercions_test.rb +0 -0
- data/test/lib/vedeu/{models/attributes → support}/colour_translator_test.rb +0 -0
- data/test/lib/vedeu/support/move_test.rb +35 -0
- data/test/lib/vedeu/{models/attributes → support}/presentation_test.rb +0 -0
- data/test/lib/vedeu/support/registrar_test.rb +6 -0
- data/test/lib/vedeu_test.rb +5 -0
- data/vedeu.gemspec +1 -1
- metadata +37 -17
@@ -0,0 +1,242 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Area do
|
5
|
+
let(:area) { Area.new(attributes) }
|
6
|
+
let(:attributes) {
|
7
|
+
{
|
8
|
+
y_min: 1,
|
9
|
+
x_min: 1,
|
10
|
+
height: 3,
|
11
|
+
width: 3,
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
describe '#initialize' do
|
16
|
+
it 'returns an instance of itself' do
|
17
|
+
area.must_be_instance_of(Area)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#y_range' do
|
22
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 4, width: 3 } }
|
23
|
+
|
24
|
+
it 'returns the actual y range' do
|
25
|
+
area.y_range.must_equal([7, 8, 9, 10])
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when the height is 0' do
|
29
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 0, width: 3 } }
|
30
|
+
|
31
|
+
it 'returns an empty range' do
|
32
|
+
area.y_range.must_equal([])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#x_range' do
|
38
|
+
let(:attributes) { { y_min: 1, x_min: 4, height: 3, width: 10 } }
|
39
|
+
|
40
|
+
it 'returns the actual x range' do
|
41
|
+
area.x_range.must_equal([4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when the width is 0' do
|
45
|
+
let(:attributes) { { y_min: 1, x_min: 4, height: 3, width: 0 } }
|
46
|
+
|
47
|
+
it 'returns an empty range' do
|
48
|
+
area.x_range.must_equal([])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#y_indices' do
|
54
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 4, width: 3 } }
|
55
|
+
|
56
|
+
it 'returns the indices for y' do
|
57
|
+
area.y_indices.must_equal([0, 1, 2, 3])
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when the height is 0' do
|
61
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 0, width: 3 } }
|
62
|
+
|
63
|
+
it { area.y_indices.must_be_empty }
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when the height is less than 0' do
|
67
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: -3, width: 3 } }
|
68
|
+
|
69
|
+
it { area.y_indices.must_be_empty }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#x_indices' do
|
74
|
+
let(:attributes) { { y_min: 1, x_min: 4, height: 3, width: 10 } }
|
75
|
+
|
76
|
+
it 'returns the indices for x' do
|
77
|
+
area.x_indices.must_equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when the width is 0' do
|
81
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 3, width: 0 } }
|
82
|
+
|
83
|
+
it { area.x_indices.must_be_empty }
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when the width is less than 0' do
|
87
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 3, width: -2 } }
|
88
|
+
|
89
|
+
it { area.x_indices.must_be_empty }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#y_max' do
|
94
|
+
context 'when the height is > 0' do
|
95
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 3, width: 6 } }
|
96
|
+
|
97
|
+
it { area.y_max.must_equal(10) }
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'when the height is 0 or negative' do
|
101
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 0, width: 6 } }
|
102
|
+
|
103
|
+
it { area.y_max.must_equal(0) }
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#x_max' do
|
108
|
+
context 'when the width is > 0' do
|
109
|
+
let(:attributes) { { y_min: 9, x_min: 1, height: 3, width: 6 } }
|
110
|
+
|
111
|
+
it { area.x_max.must_equal(7) }
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'when the width is 0 or negative' do
|
115
|
+
let(:attributes) { { y_min: 9, x_min: 1, height: 3, width: 0 } }
|
116
|
+
|
117
|
+
it { area.x_max.must_equal(0) }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#y_max_index' do
|
122
|
+
context 'when the height is > 0' do
|
123
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 3, width: 6 } }
|
124
|
+
|
125
|
+
it { area.y_max_index.must_equal(2) }
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when the height is 0' do
|
129
|
+
let(:attributes) { { y_min: 7, x_min: 1, height: 0, width: 6 } }
|
130
|
+
|
131
|
+
it { area.y_max_index.must_equal(0) }
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when the height is < 0' do
|
135
|
+
let(:attributes) { { y_min: 9, x_min: 1, height: -3, width: 6 } }
|
136
|
+
|
137
|
+
it { area.y_max_index.must_equal(0) }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe '#x_max_index' do
|
142
|
+
context 'when the width is > 0' do
|
143
|
+
let(:attributes) { { y_min: 9, x_min: 1, height: 3, width: 6 } }
|
144
|
+
|
145
|
+
it { area.x_max_index.must_equal(5) }
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'when the width is 0' do
|
149
|
+
let(:attributes) { { y_min: 9, x_min: 1, height: 3, width: 0 } }
|
150
|
+
|
151
|
+
it { area.x_max_index.must_equal(0) }
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'when the width is < 0' do
|
155
|
+
let(:attributes) { { y_min: 9, x_min: 1, height: 3, width: -2 } }
|
156
|
+
|
157
|
+
it { area.x_max_index.must_equal(0) }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe '#y_index' do
|
162
|
+
let(:attributes) { { y_min: 7, x_min: 4, height: height, width: 10, x: 8, y: y } }
|
163
|
+
let(:height) { 3 }
|
164
|
+
let(:y) { 8 }
|
165
|
+
|
166
|
+
it 'returns the offset index of the cursors y position' do
|
167
|
+
area.y_index.must_equal(1)
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'when the area height is 0' do
|
171
|
+
let(:height) { 0 }
|
172
|
+
|
173
|
+
it { area.y_index.must_equal(0) }
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'when the cursor y is less than or equal to the area y_min' do
|
177
|
+
let(:y) { 6 }
|
178
|
+
|
179
|
+
it { area.y_index.must_equal(0) }
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'when the cursor y is more than or equal to the area y_max' do
|
183
|
+
let(:y) { 20 }
|
184
|
+
|
185
|
+
it 'returns the last y coordinate as an index' do
|
186
|
+
area.y_index.must_equal(2)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#x_index' do
|
192
|
+
let(:attributes) { { y_min: 7, x_min: 4, height: 3, width: width, x: x, y: 8 } }
|
193
|
+
let(:x) { 8 }
|
194
|
+
let(:width) { 10 }
|
195
|
+
|
196
|
+
it 'returns the offset index of the cursors x position' do
|
197
|
+
area.x_index.must_equal(4)
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'when the area width is 0' do
|
201
|
+
let(:width) { 0 }
|
202
|
+
|
203
|
+
it { area.x_index.must_equal(0) }
|
204
|
+
end
|
205
|
+
|
206
|
+
context 'when the cursor x is less than or equal to the area x_min' do
|
207
|
+
let(:x) { 3 }
|
208
|
+
|
209
|
+
it { area.x_index.must_equal(0) }
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'when the cursor x is more than or equal to the area x_min' do
|
213
|
+
let(:x) { 20 }
|
214
|
+
|
215
|
+
it 'returns the last x coordinate as an index' do
|
216
|
+
area.x_index.must_equal(9)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
describe '#y_position' do
|
222
|
+
context 'when the index is less than or equal to 0' do
|
223
|
+
it 'returns #y_min' do
|
224
|
+
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'when the index is greater than or equal to y_max_index' do
|
229
|
+
it 'returns #y_max' do
|
230
|
+
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context 'when the index is in range' do
|
235
|
+
it 'returns the associated real position' do
|
236
|
+
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
242
|
+
end
|
@@ -2,7 +2,10 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
module Vedeu
|
4
4
|
describe Compositor do
|
5
|
-
before
|
5
|
+
before do
|
6
|
+
Interfaces.reset
|
7
|
+
Terminal.console.stubs(:print)
|
8
|
+
end
|
6
9
|
|
7
10
|
describe '.render' do
|
8
11
|
it 'raises an exception if the buffer/interface cannot be found' do
|
@@ -18,10 +21,13 @@ module Vedeu
|
|
18
21
|
height 3
|
19
22
|
end
|
20
23
|
|
24
|
+
Vedeu.focus('xenon')
|
25
|
+
|
21
26
|
Compositor.render('xenon').must_equal([
|
22
27
|
"\e[1;1H \e[1;1H" \
|
23
28
|
"\e[2;1H \e[2;1H" \
|
24
|
-
"\e[3;1H \e[3;1H"
|
29
|
+
"\e[3;1H \e[3;1H" \
|
30
|
+
"\e[1;1H\e[?25h"
|
25
31
|
])
|
26
32
|
end
|
27
33
|
end
|
@@ -35,6 +41,8 @@ module Vedeu
|
|
35
41
|
height 3
|
36
42
|
end
|
37
43
|
|
44
|
+
Vedeu.focus('neon')
|
45
|
+
|
38
46
|
class MyCompositorView < Vedeu::View
|
39
47
|
def render
|
40
48
|
view 'neon' do
|
@@ -53,7 +61,8 @@ module Vedeu
|
|
53
61
|
"\e[3;1H \e[3;1H" \
|
54
62
|
"\e[1;1Hargon" \
|
55
63
|
"\e[2;1Hboron" \
|
56
|
-
"\e[3;1Hradon"
|
64
|
+
"\e[3;1Hradon" \
|
65
|
+
"\e[1;1H\e[?25h"
|
57
66
|
])
|
58
67
|
end
|
59
68
|
end
|
@@ -2,52 +2,48 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
module Vedeu
|
4
4
|
describe Render do
|
5
|
-
before
|
5
|
+
before do
|
6
|
+
Buffers.reset
|
7
|
+
Cursors.reset
|
8
|
+
Interfaces.reset
|
9
|
+
|
10
|
+
Vedeu.interface('fluorine') do
|
11
|
+
width 32
|
12
|
+
height 3
|
13
|
+
line 'this is the first'
|
14
|
+
line 'this is the second and it is long'
|
15
|
+
line 'this is the third, it is even longer and still truncated'
|
16
|
+
line 'this should not render'
|
17
|
+
end
|
18
|
+
end
|
6
19
|
|
7
20
|
describe '#initialize' do
|
8
21
|
it 'returns an instance of itself' do
|
9
|
-
interface =
|
22
|
+
interface = Interface.new
|
10
23
|
Render.new(interface).must_be_instance_of(Render)
|
11
24
|
end
|
12
25
|
end
|
13
26
|
|
14
27
|
describe '.call' do
|
28
|
+
let(:interface) { Vedeu.use('fluorine') }
|
29
|
+
|
30
|
+
before { interface.stubs(:in_focus?).returns(true) }
|
31
|
+
|
15
32
|
it 'returns the content for the interface' do
|
16
|
-
interface = Interface.new({
|
17
|
-
name: '.call',
|
18
|
-
geometry: {
|
19
|
-
width: 32,
|
20
|
-
height: 3,
|
21
|
-
},
|
22
|
-
lines: [
|
23
|
-
{
|
24
|
-
streams: [{ text: 'this is the first' }]
|
25
|
-
}, {
|
26
|
-
streams: { text: 'this is the second and it is long' }
|
27
|
-
}, {
|
28
|
-
streams: [
|
29
|
-
{ text: 'this is the third, ' },
|
30
|
-
{ text: 'it is even longer ' },
|
31
|
-
{ text: 'and still truncated' }
|
32
|
-
]
|
33
|
-
}, {
|
34
|
-
streams: [{ text: 'this should not render' }]
|
35
|
-
}
|
36
|
-
]
|
37
|
-
})
|
38
33
|
Render.call(interface).must_equal(
|
39
34
|
"\e[1;1H \e[1;1H" \
|
40
35
|
"\e[2;1H \e[2;1H" \
|
41
36
|
"\e[3;1H \e[3;1H" \
|
42
37
|
"\e[1;1Hthis is the first" \
|
43
38
|
"\e[2;1Hthis is the second and it is lon" \
|
44
|
-
"\e[3;1Hthis is the third, it is even lo"
|
39
|
+
"\e[3;1Hthis is the third, it is even lo" \
|
40
|
+
"\e[1;1H\e[?25h"
|
45
41
|
)
|
46
42
|
end
|
47
43
|
|
48
44
|
it 'returns a blank interface if there are no streams of text' do
|
49
45
|
interface = Interface.new({
|
50
|
-
name: '
|
46
|
+
name: 'fluorine',
|
51
47
|
geometry: {
|
52
48
|
width: 32,
|
53
49
|
height: 3,
|
@@ -58,13 +54,14 @@ module Vedeu
|
|
58
54
|
Render.call(interface).must_equal(
|
59
55
|
"\e[1;1H \e[1;1H" \
|
60
56
|
"\e[2;1H \e[2;1H" \
|
61
|
-
"\e[3;1H \e[3;1H"
|
57
|
+
"\e[3;1H \e[3;1H" \
|
58
|
+
"\e[1;1H\e[?25h"
|
62
59
|
)
|
63
60
|
end
|
64
61
|
|
65
62
|
it 'skips lines which have streams with no content' do
|
66
63
|
interface = Interface.new({
|
67
|
-
name: '
|
64
|
+
name: 'fluorine',
|
68
65
|
geometry: {
|
69
66
|
width: 32,
|
70
67
|
height: 3,
|
@@ -91,7 +88,8 @@ module Vedeu
|
|
91
88
|
"\e[3;1H \e[3;1H" \
|
92
89
|
"\e[1;1Hthis is the first" \
|
93
90
|
"\e[2;1H" \
|
94
|
-
"\e[3;1Hthis is the third, it is even lo"
|
91
|
+
"\e[3;1Hthis is the third, it is even lo" \
|
92
|
+
"\e[1;1H\e[?25h"
|
95
93
|
)
|
96
94
|
end
|
97
95
|
|
@@ -132,16 +130,13 @@ module Vedeu
|
|
132
130
|
IO.console.stub(:print, nil) do
|
133
131
|
OxygenView.render
|
134
132
|
|
135
|
-
Compositor.render('oxygen').must_equal(
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
"
|
140
|
-
|
141
|
-
|
142
|
-
"\e[38;2;0;0;255mblue\e[38;2;255;255;255m\e[48;2;0;0;0m" \
|
143
|
-
".\e[38;2;255;255;255m\e[48;2;0;0;0m"
|
144
|
-
])
|
133
|
+
Compositor.render('oxygen').must_equal(
|
134
|
+
[
|
135
|
+
"\e[1;1H \e[1;1H" \
|
136
|
+
"\e[2;1H \e[2;1H" \
|
137
|
+
"\e[1;1Ht\e[38;2;255;255;255m\e[48;2;0;0;0mh\e[38;2;255;255;255m\e[48;2;0;0;0me\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0mg\e[38;2;255;255;255m\e[48;2;0;0;0mr\e[38;2;255;255;255m\e[48;2;0;0;0ma\e[38;2;255;255;255m\e[48;2;0;0;0ms\e[38;2;255;255;255m\e[48;2;0;0;0ms\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0mi\e[38;2;255;255;255m\e[48;2;0;0;0ms\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;255;0mg\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;255;0mr\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;255;0me\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;255;0me\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;255;0mn\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0ma\e[38;2;255;255;255m\e[48;2;0;0;0mn\e[38;2;255;255;255m\e[48;2;0;0;0md\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0mt\e[38;2;255;255;255m\e[48;2;0;0;0mh\e[38;2;255;255;255m\e[48;2;0;0;0me\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0ms\e[38;2;255;255;255m\e[48;2;0;0;0mk\e[38;2;255;255;255m\e[48;2;0;0;0my\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0mi\e[38;2;255;255;255m\e[48;2;0;0;0ms\e[38;2;255;255;255m\e[48;2;0;0;0m \e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;0;255mb\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;0;255ml\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;0;255mu\e[38;2;255;255;255m\e[48;2;0;0;0m\e[38;2;0;0;255me\e[38;2;255;255;255m\e[48;2;0;0;0m.\e[38;2;255;255;255m\e[48;2;0;0;0m"
|
138
|
+
]
|
139
|
+
)
|
145
140
|
end
|
146
141
|
end
|
147
142
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
describe Viewport do
|
6
|
+
|
7
|
+
let(:interface) {
|
8
|
+
Interface.new({
|
9
|
+
name: 'fluorine',
|
10
|
+
geometry: {
|
11
|
+
width: 30,
|
12
|
+
height: 2,
|
13
|
+
},
|
14
|
+
lines: [
|
15
|
+
{ # 53
|
16
|
+
streams: [{
|
17
|
+
text: 'Something interesting ', # 22
|
18
|
+
},{
|
19
|
+
text: 'on this line ', # 13
|
20
|
+
},{
|
21
|
+
text: 'would be cool, eh?' # 18
|
22
|
+
}]
|
23
|
+
}, { # 49
|
24
|
+
streams: [{
|
25
|
+
text: 'Maybe a lyric, a little ditty ', # 30
|
26
|
+
},{
|
27
|
+
text: 'to help you unwind.', # 19
|
28
|
+
}]
|
29
|
+
}
|
30
|
+
]
|
31
|
+
})
|
32
|
+
}
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -3,23 +3,46 @@ require 'test_helper'
|
|
3
3
|
module Vedeu
|
4
4
|
describe Cursors do
|
5
5
|
|
6
|
-
before
|
6
|
+
before do
|
7
|
+
Cursors.reset
|
8
|
+
Registrar.record({ name: 'chromium' })
|
9
|
+
end
|
7
10
|
|
8
11
|
describe '#add' do
|
9
|
-
|
10
|
-
|
12
|
+
let(:attributes) { { name: 'chromium' } }
|
13
|
+
|
14
|
+
it 'returns a new Cursor after registering' do
|
15
|
+
Cursors.add(attributes).must_be_instance_of(Cursor)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns a new Cursor after updating' do
|
19
|
+
Cursors.update(attributes).must_be_instance_of(Cursor)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when the attributes do not have the :name key' do
|
23
|
+
let(:attributes) { { no_name_key: 'some_value' } }
|
11
24
|
|
12
|
-
|
25
|
+
it 'raises an exception' do
|
26
|
+
proc { Cursors.update(attributes) }.must_raise(MissingRequired)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'raises an exception' do
|
30
|
+
proc { Cursors.add(attributes) }.must_raise(MissingRequired)
|
31
|
+
end
|
13
32
|
end
|
33
|
+
end
|
14
34
|
|
15
|
-
|
16
|
-
|
35
|
+
describe '#hide' do
|
36
|
+
it 'sets the state attribute of the Cursor to :hide' do
|
37
|
+
cursor = Cursors.hide
|
38
|
+
cursor.state.must_equal(:hide)
|
17
39
|
end
|
18
40
|
end
|
19
41
|
|
20
|
-
describe '#
|
21
|
-
it '
|
22
|
-
|
42
|
+
describe '#show' do
|
43
|
+
it 'sets the state attribute of the Cursor to :show' do
|
44
|
+
cursor = Cursors.show
|
45
|
+
cursor.state.must_equal(:show)
|
23
46
|
end
|
24
47
|
end
|
25
48
|
|
@@ -79,6 +79,14 @@ module Vedeu
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
+
describe '#refresh' do
|
83
|
+
it 'triggers the event to refresh the interface current in focus' do
|
84
|
+
Focus.add({ name: 'thallium' })
|
85
|
+
|
86
|
+
Focus.refresh.must_equal([])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
82
90
|
describe '#registered' do
|
83
91
|
it 'returns all the names of the interfaces which can be focussed' do
|
84
92
|
Focus.add({ name: 'thallium' })
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Offsets do
|
5
|
+
|
6
|
+
before { Offsets.reset }
|
7
|
+
|
8
|
+
describe '#add' do
|
9
|
+
it 'raises an exception if a :name attribute is not provided' do
|
10
|
+
proc { Offsets.add({ no_name: 'no_name' }) }
|
11
|
+
.must_raise(MissingRequired)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns a new instance of Offset once stored' do
|
15
|
+
Offsets.add({ name: 'praseodymium' }).must_be_instance_of(Offset)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#move' do
|
20
|
+
before { Focus.stubs(:current).returns('praseodymium') }
|
21
|
+
|
22
|
+
it 'returns an instance of Offset' do
|
23
|
+
Offsets.move(0, 1).must_be_instance_of(Offset)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'alters the offset of the interface in focus' do
|
27
|
+
Offsets.move(0, 1).x.must_equal(1)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Move do
|
5
|
+
before do
|
6
|
+
Interfaces.reset
|
7
|
+
Registrar.record({ name: 'thorium' })
|
8
|
+
Terminal.console.stubs(:print)
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when no interfaces are defined' do
|
12
|
+
before { Interfaces.reset }
|
13
|
+
|
14
|
+
it { proc { Move.down }.must_raise(NoInterfacesDefined) }
|
15
|
+
|
16
|
+
it { proc { Move.up }.must_raise(NoInterfacesDefined) }
|
17
|
+
|
18
|
+
it { proc { Move.right }.must_raise(NoInterfacesDefined) }
|
19
|
+
|
20
|
+
it { proc { Move.left }.must_raise(NoInterfacesDefined) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when there is at least one interface defined' do
|
24
|
+
before { Focus.stubs(:current).returns('thorium') }
|
25
|
+
|
26
|
+
it { Move.down.must_be_instance_of(Array) }
|
27
|
+
|
28
|
+
it { Move.up.must_be_instance_of(Array) }
|
29
|
+
|
30
|
+
it { Move.right.must_be_instance_of(Array) }
|
31
|
+
|
32
|
+
it { Move.left.must_be_instance_of(Array) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
@@ -43,6 +43,12 @@ module Vedeu
|
|
43
43
|
Buffers.registered?('mendelevium').must_equal(true)
|
44
44
|
end
|
45
45
|
|
46
|
+
it 'sends the attributes to the Offsets repository' do
|
47
|
+
Registrar.record(attributes)
|
48
|
+
|
49
|
+
Offsets.registered?('mendelevium').must_equal(true)
|
50
|
+
end
|
51
|
+
|
46
52
|
it 'sends the attributes to the Interfaces repository' do
|
47
53
|
Registrar.record(attributes)
|
48
54
|
|
data/vedeu.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'vedeu'
|
7
|
-
spec.version = '0.2.
|
7
|
+
spec.version = '0.2.4'
|
8
8
|
spec.authors = ['Gavin Laking']
|
9
9
|
spec.email = ['gavinlaking@gmail.com']
|
10
10
|
spec.summary = %q{A terminal case of wonderland.}
|