vedeu 0.0.30 → 0.0.31
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/Rakefile +4 -4
- data/lib/vedeu/configuration.rb +2 -2
- data/lib/vedeu/launcher.rb +2 -2
- data/lib/vedeu/models/command.rb +1 -1
- data/lib/vedeu/models/interface.rb +4 -0
- data/lib/vedeu/output/interface_renderer.rb +1 -1
- data/lib/vedeu/output/template.rb +23 -0
- data/lib/vedeu/output/text_adaptor.rb +1 -1
- data/lib/vedeu/process/process.rb +5 -1
- data/lib/vedeu/repository/command_repository.rb +3 -5
- data/lib/vedeu/repository/event_repository.rb +27 -0
- data/lib/vedeu/repository/interface_repository.rb +8 -6
- data/lib/vedeu/repository/storage.rb +2 -0
- data/lib/vedeu/support/esc.rb +2 -1
- data/lib/vedeu/support/geometry.rb +11 -23
- data/lib/vedeu/support/parser.rb +1 -1
- data/lib/vedeu/support/queue.rb +3 -1
- data/lib/vedeu.rb +18 -1
- data/test/example_app/bin/app +9 -0
- data/test/example_app/lib/app.rb +63 -0
- data/test/lib/vedeu/application_test.rb +6 -36
- data/test/lib/vedeu/configuration_test.rb +5 -31
- data/test/lib/vedeu/input/input_test.rb +4 -16
- data/test/lib/vedeu/launcher_test.rb +6 -15
- data/test/lib/vedeu/models/background_test.rb +5 -21
- data/test/lib/vedeu/models/colour_test.rb +18 -49
- data/test/lib/vedeu/models/command_test.rb +19 -83
- data/test/lib/vedeu/models/composition_test.rb +78 -175
- data/test/lib/vedeu/models/foreground_test.rb +4 -21
- data/test/lib/vedeu/models/interface_collection_test.rb +13 -45
- data/test/lib/vedeu/models/interface_test.rb +71 -195
- data/test/lib/vedeu/models/line_collection_test.rb +13 -52
- data/test/lib/vedeu/models/line_test.rb +17 -61
- data/test/lib/vedeu/models/presentation_test.rb +6 -19
- data/test/lib/vedeu/models/stream_collection_test.rb +10 -42
- data/test/lib/vedeu/models/stream_test.rb +16 -54
- data/test/lib/vedeu/models/style_collection_test.rb +1 -10
- data/test/lib/vedeu/output/interface_renderer_test.rb +7 -38
- data/test/lib/vedeu/output/output_test.rb +1 -18
- data/test/lib/vedeu/output/template.rb +20 -0
- data/test/lib/vedeu/output/text_adaptor_test.rb +9 -46
- data/test/lib/vedeu/process/process_test.rb +36 -38
- data/test/lib/vedeu/repository/command_repository_test.rb +16 -45
- data/test/lib/vedeu/repository/interface_repository_test.rb +36 -74
- data/test/lib/vedeu/repository/repository_test.rb +9 -33
- data/test/lib/vedeu/repository/storage_test.rb +7 -42
- data/test/lib/vedeu/support/esc_test.rb +46 -130
- data/test/lib/vedeu/support/event_repository_test.rb +31 -0
- data/test/lib/vedeu/support/exit_test.rb +1 -9
- data/test/lib/vedeu/support/geometry_test.rb +81 -105
- data/test/lib/vedeu/support/parser_test.rb +10 -54
- data/test/lib/vedeu/support/parsing/hash_parser_test.rb +18 -33
- data/test/lib/vedeu/support/parsing/json_parser_test.rb +4 -23
- data/test/lib/vedeu/support/queue_test.rb +33 -57
- data/test/lib/vedeu/support/terminal_test.rb +21 -52
- data/test/lib/vedeu/support/translator_test.rb +16 -33
- data/test/lib/vedeu/support/wordwrap_test.rb +29 -46
- data/test/lib/vedeu_test.rb +3 -5
- data/test/support/template.erb +3 -0
- data/test/test_helper.rb +1 -12
- data/vedeu.gemspec +8 -10
- metadata +26 -38
- data/lib/vedeu/support/events.rb +0 -21
- data/lib/vedeu/version.rb +0 -3
- data/test/lib/vedeu/support/events_test.rb +0 -45
- data/test/lib/vedeu/version_test.rb +0 -12
- data/test/support/output_1.json +0 -9
- data/test/support/output_1.rb +0 -14
|
@@ -17,66 +17,42 @@ module Vedeu
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
describe Repository do
|
|
20
|
-
let(:described_class) { DummyRepository }
|
|
21
|
-
|
|
22
|
-
before do
|
|
23
|
-
@dummy = DummyRepository.create(Dummy.new)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
after do
|
|
27
|
-
DummyRepository.reset
|
|
28
|
-
end
|
|
29
|
-
|
|
30
20
|
describe '#adaptor' do
|
|
31
|
-
let(:subject) { described_class.adaptor }
|
|
32
|
-
|
|
33
21
|
it 'returns a Storage' do
|
|
34
|
-
|
|
22
|
+
DummyRepository.adaptor.must_be_instance_of(Storage)
|
|
35
23
|
end
|
|
36
24
|
end
|
|
37
25
|
|
|
38
26
|
describe '#find' do
|
|
39
|
-
let(:subject) { described_class.find(record_name) }
|
|
40
|
-
let(:record_name) { @dummy.name }
|
|
41
|
-
|
|
42
27
|
it 'returns a Dummy' do
|
|
43
|
-
|
|
28
|
+
dummy = DummyRepository.create(Dummy.new)
|
|
29
|
+
DummyRepository.find(dummy.name).must_be_instance_of(Dummy)
|
|
44
30
|
end
|
|
45
31
|
end
|
|
46
32
|
|
|
47
33
|
describe '#all' do
|
|
48
|
-
let(:subject) { described_class.all }
|
|
49
|
-
|
|
50
34
|
it 'returns all the stored items' do
|
|
51
|
-
|
|
35
|
+
DummyRepository.all.must_be_instance_of(Array)
|
|
52
36
|
end
|
|
53
37
|
end
|
|
54
38
|
|
|
55
39
|
describe '#query' do
|
|
56
|
-
let(:subject) { described_class.query(entity, attribute, value) }
|
|
57
|
-
let(:entity) { Dummy }
|
|
58
|
-
let(:attribute) { :name }
|
|
59
|
-
let(:value) { 'dummy' }
|
|
60
|
-
|
|
61
40
|
it 'returns a Dummy' do
|
|
62
|
-
|
|
41
|
+
dummy = DummyRepository.create(Dummy.new)
|
|
42
|
+
DummyRepository.query(Dummy, :name, 'dummy').must_be_instance_of(Dummy)
|
|
63
43
|
end
|
|
64
44
|
end
|
|
65
45
|
|
|
66
46
|
describe '#create' do
|
|
67
|
-
let(:subject) { described_class.create(model) }
|
|
68
|
-
let(:model) { @dummy }
|
|
69
|
-
|
|
70
47
|
it 'returns a Dummy' do
|
|
71
|
-
|
|
48
|
+
dummy = DummyRepository.create(Dummy.new)
|
|
49
|
+
DummyRepository.create(dummy).must_be_instance_of(Dummy)
|
|
72
50
|
end
|
|
73
51
|
end
|
|
74
52
|
|
|
75
53
|
describe '#reset' do
|
|
76
|
-
let(:subject) { described_class.reset }
|
|
77
|
-
|
|
78
54
|
it 'returns an Array' do
|
|
79
|
-
|
|
55
|
+
DummyRepository.reset.must_be_instance_of(Array)
|
|
80
56
|
end
|
|
81
57
|
end
|
|
82
58
|
end
|
|
@@ -2,76 +2,41 @@ require_relative '../../../test_helper'
|
|
|
2
2
|
require_relative '../../../support/dummy_command'
|
|
3
3
|
require_relative '../../../../lib/vedeu/repository/storage'
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
module Vedeu
|
|
7
6
|
describe Storage do
|
|
8
|
-
let(:described_class) { Storage }
|
|
9
|
-
let(:subject) { described_class.new }
|
|
10
|
-
let(:record) { DummyCommand.new }
|
|
11
|
-
let(:entity) {}
|
|
12
|
-
|
|
13
|
-
describe '#initialize' do
|
|
14
|
-
let(:subject) { described_class.new }
|
|
15
|
-
|
|
16
|
-
it 'returns a Storage instance' do
|
|
17
|
-
subject.must_be_instance_of(Storage)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it 'sets an instance variable' do
|
|
21
|
-
subject.instance_variable_get('@map').must_equal({})
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
7
|
describe '#create' do
|
|
26
|
-
let(:subject) { described_class.new.create(record) }
|
|
27
|
-
|
|
28
8
|
it 'returns the stored record' do
|
|
29
|
-
|
|
9
|
+
Storage.new.create(DummyCommand.new).must_be_instance_of(DummyCommand)
|
|
30
10
|
end
|
|
31
11
|
end
|
|
32
12
|
|
|
33
13
|
describe '#delete' do
|
|
34
|
-
let(:subject) { described_class.new.delete(record) }
|
|
35
|
-
|
|
36
14
|
it 'returns a NilClass' do
|
|
37
|
-
|
|
15
|
+
Storage.new.delete(DummyCommand.new).must_be_instance_of(NilClass)
|
|
38
16
|
end
|
|
39
17
|
end
|
|
40
18
|
|
|
41
19
|
describe '#reset' do
|
|
42
|
-
let(:subject) { described_class.new.reset(entity) }
|
|
43
|
-
|
|
44
20
|
it 'returns an Array' do
|
|
45
|
-
|
|
21
|
+
Storage.new.reset(nil).must_be_instance_of(Array)
|
|
46
22
|
end
|
|
47
23
|
end
|
|
48
24
|
|
|
49
25
|
describe '#find' do
|
|
50
|
-
let(:subject) { described_class.new.find(entity, record_name) }
|
|
51
|
-
let(:record_name) { 'dummy' }
|
|
52
|
-
|
|
53
26
|
it 'returns a NilClass' do
|
|
54
|
-
|
|
27
|
+
Storage.new.find(nil, 'dummy').must_be_instance_of(NilClass)
|
|
55
28
|
end
|
|
56
29
|
end
|
|
57
30
|
|
|
58
31
|
describe '#all' do
|
|
59
|
-
let(:subject) { described_class.new.all(entity) }
|
|
60
|
-
|
|
61
32
|
it 'returns an Array' do
|
|
62
|
-
|
|
33
|
+
Storage.new.all(nil).must_be_instance_of(Array)
|
|
63
34
|
end
|
|
64
35
|
end
|
|
65
36
|
|
|
66
37
|
describe '#query' do
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
let(:value) {}
|
|
70
|
-
|
|
71
|
-
context 'when the item cannot be found' do
|
|
72
|
-
it 'returns a NilClass' do
|
|
73
|
-
subject.must_be_instance_of(NilClass)
|
|
74
|
-
end
|
|
38
|
+
it 'returns a FalseClass when the item cannot be found' do
|
|
39
|
+
Storage.new.query(nil, nil, nil).must_be_instance_of(FalseClass)
|
|
75
40
|
end
|
|
76
41
|
end
|
|
77
42
|
end
|
|
@@ -3,189 +3,105 @@ require_relative '../../../../lib/vedeu/support/esc'
|
|
|
3
3
|
|
|
4
4
|
module Vedeu
|
|
5
5
|
describe Esc do
|
|
6
|
-
let(:described_class) { Esc }
|
|
7
|
-
|
|
8
6
|
describe '.background_colour' do
|
|
9
|
-
let(:subject) { described_class.background_colour }
|
|
10
|
-
|
|
11
|
-
it 'returns a String' do
|
|
12
|
-
subject.must_be_instance_of(String)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
7
|
it 'returns an escape sequence' do
|
|
16
|
-
|
|
8
|
+
Esc.background_colour.must_equal("\e[48;5;16m")
|
|
17
9
|
end
|
|
18
10
|
end
|
|
19
11
|
|
|
20
12
|
describe '.clear_line' do
|
|
21
|
-
let(:subject) { described_class.clear_line }
|
|
22
|
-
|
|
23
|
-
it 'returns a String' do
|
|
24
|
-
subject.must_be_instance_of(String)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
13
|
it 'returns an escape sequence' do
|
|
28
|
-
|
|
14
|
+
Esc.clear_line.must_equal("\e[2K")
|
|
29
15
|
end
|
|
30
16
|
end
|
|
31
17
|
|
|
32
|
-
describe '.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
describe '.clear_last_line' do
|
|
19
|
+
it 'returns an escape sequence to clear the last line' do
|
|
20
|
+
IO.console.stub :winsize, [25, 25] do
|
|
21
|
+
Esc.clear_last_line.must_equal("\e[24;1H\e[2K")
|
|
22
|
+
end
|
|
37
23
|
end
|
|
24
|
+
end
|
|
38
25
|
|
|
26
|
+
describe '.foreground_colour' do
|
|
39
27
|
it 'returns an escape sequence' do
|
|
40
|
-
|
|
28
|
+
Esc.foreground_colour.must_equal("\e[38;5;231m")
|
|
41
29
|
end
|
|
42
30
|
end
|
|
43
31
|
|
|
44
32
|
describe '.set_position' do
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let(:x) {}
|
|
48
|
-
|
|
49
|
-
context 'when no coordinates are provided' do
|
|
50
|
-
it 'returns a position escape sequence' do
|
|
51
|
-
subject.must_equal("\e[1;1H")
|
|
52
|
-
end
|
|
33
|
+
it 'returns a position escape sequence when no coordinates are provided' do
|
|
34
|
+
Esc.set_position.must_equal("\e[1;1H")
|
|
53
35
|
end
|
|
54
36
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
let(:x) { 19 }
|
|
58
|
-
|
|
59
|
-
it 'returns a position escape sequence' do
|
|
60
|
-
subject.must_equal("\e[12;19H")
|
|
61
|
-
end
|
|
37
|
+
it 'returns a position escape sequence when coordinates are provided' do
|
|
38
|
+
Esc.set_position(12, 19).must_equal("\e[12;19H")
|
|
62
39
|
end
|
|
63
40
|
end
|
|
64
41
|
|
|
65
42
|
describe '.string' do
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
it 'returns a String' do
|
|
70
|
-
subject.must_be_instance_of(String)
|
|
43
|
+
it 'returns an empty string when the style is not provided' do
|
|
44
|
+
Esc.string.must_equal('')
|
|
71
45
|
end
|
|
72
46
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
subject.must_equal('')
|
|
76
|
-
end
|
|
47
|
+
it 'returns an escape sequence when the style is blink' do
|
|
48
|
+
Esc.string('blink').must_equal("\e[5m")
|
|
77
49
|
end
|
|
78
50
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
it 'returns an escape sequence' do
|
|
83
|
-
subject.must_equal("\e[5m")
|
|
84
|
-
end
|
|
51
|
+
it 'returns an escape sequence when the style is blink off' do
|
|
52
|
+
Esc.string('blink_off').must_equal("\e[25m")
|
|
85
53
|
end
|
|
86
54
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
it 'returns an escape sequence' do
|
|
91
|
-
subject.must_equal("\e[25m")
|
|
92
|
-
end
|
|
55
|
+
it 'returns an escape sequence when the style is bold' do
|
|
56
|
+
Esc.string('bold').must_equal("\e[1m")
|
|
93
57
|
end
|
|
94
58
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
it 'returns an escape sequence' do
|
|
99
|
-
subject.must_equal("\e[1m")
|
|
100
|
-
end
|
|
59
|
+
it 'returns an escape sequence when the style is bold off' do
|
|
60
|
+
Esc.string('bold_off').must_equal("\e[21m")
|
|
101
61
|
end
|
|
102
62
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
it 'returns an escape sequence' do
|
|
107
|
-
subject.must_equal("\e[21m")
|
|
108
|
-
end
|
|
63
|
+
it 'returns an escape sequence when the style is clear' do
|
|
64
|
+
Esc.string('clear').must_equal("\e[2J")
|
|
109
65
|
end
|
|
110
66
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
it 'returns an escape sequence' do
|
|
115
|
-
subject.must_equal("\e[2J")
|
|
116
|
-
end
|
|
67
|
+
it 'returns an escape sequence when the style is colour_reset' do
|
|
68
|
+
Esc.string('colour_reset').must_equal("\e[38;2;39m\e[48;2;49m")
|
|
117
69
|
end
|
|
118
70
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
it 'returns an escape sequence' do
|
|
123
|
-
subject.must_equal("\e[?25l")
|
|
124
|
-
end
|
|
71
|
+
it 'returns an escape sequence when the style is hide_cursor' do
|
|
72
|
+
Esc.string('hide_cursor').must_equal("\e[?25l")
|
|
125
73
|
end
|
|
126
74
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
it 'returns an escape sequence' do
|
|
131
|
-
subject.must_equal("\e[7m")
|
|
132
|
-
end
|
|
75
|
+
it 'returns an escape sequence when the style is negative' do
|
|
76
|
+
Esc.string('negative').must_equal("\e[7m")
|
|
133
77
|
end
|
|
134
78
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
it 'returns an escape sequence' do
|
|
139
|
-
subject.must_equal("\e[27m")
|
|
140
|
-
end
|
|
79
|
+
it 'returns an escape sequence when the style is positive' do
|
|
80
|
+
Esc.string('positive').must_equal("\e[27m")
|
|
141
81
|
end
|
|
142
82
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
it 'returns an escape sequence' do
|
|
147
|
-
subject.must_equal("\e[0m")
|
|
148
|
-
end
|
|
83
|
+
it 'returns an escape sequence when the style is reset' do
|
|
84
|
+
Esc.string('reset').must_equal("\e[0m")
|
|
149
85
|
end
|
|
150
86
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
it 'returns an escape sequence' do
|
|
155
|
-
subject.must_equal("\e[24m\e[21m\e[27m")
|
|
156
|
-
end
|
|
87
|
+
it 'returns an escape sequence when the style is normal' do
|
|
88
|
+
Esc.string('normal').must_equal("\e[24m\e[21m\e[27m")
|
|
157
89
|
end
|
|
158
90
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
it 'returns an escape sequence' do
|
|
163
|
-
subject.must_equal("\e[2m")
|
|
164
|
-
end
|
|
91
|
+
it 'returns an escape sequence when the style is dim' do
|
|
92
|
+
Esc.string('dim').must_equal("\e[2m")
|
|
165
93
|
end
|
|
166
94
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
it 'returns an escape sequence' do
|
|
171
|
-
subject.must_equal("\e[?25h")
|
|
172
|
-
end
|
|
95
|
+
it 'returns an escape sequence when the style is show_cursor' do
|
|
96
|
+
Esc.string('show_cursor').must_equal("\e[?25h")
|
|
173
97
|
end
|
|
174
98
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
it 'returns an escape sequence' do
|
|
179
|
-
subject.must_equal("\e[4m")
|
|
180
|
-
end
|
|
99
|
+
it 'returns an escape sequence when the style is underline' do
|
|
100
|
+
Esc.string('underline').must_equal("\e[4m")
|
|
181
101
|
end
|
|
182
102
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
it 'returns an escape sequence' do
|
|
187
|
-
subject.must_equal("\e[24m")
|
|
188
|
-
end
|
|
103
|
+
it 'returns an escape sequence when the style is underline off' do
|
|
104
|
+
Esc.string('underline_off').must_equal("\e[24m")
|
|
189
105
|
end
|
|
190
106
|
end
|
|
191
107
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require_relative '../../../test_helper'
|
|
2
|
+
require_relative '../../../../lib/vedeu/repository/event_repository'
|
|
3
|
+
|
|
4
|
+
module Vedeu
|
|
5
|
+
describe EventRepository do
|
|
6
|
+
describe '#handlers' do
|
|
7
|
+
it 'returns a Hash' do
|
|
8
|
+
EventRepository.handlers.must_be_instance_of(Hash)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe '#register' do
|
|
13
|
+
it 'returns an Array' do
|
|
14
|
+
EventRepository.register(:some_event) { proc { |x| x } }
|
|
15
|
+
.must_be_instance_of(Array)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe '#trigger' do
|
|
20
|
+
it 'returns a collection containing the event when the event is pre-registered' do
|
|
21
|
+
EventRepository.register(:some_event) { proc { |x| x } }
|
|
22
|
+
EventRepository.trigger(:_exit_, []).first.call
|
|
23
|
+
.must_equal(:exit)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'returns an empty collection when the event has not been registered' do
|
|
27
|
+
EventRepository.trigger(:_not_found_, []).must_be_empty
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -3,17 +3,9 @@ require_relative '../../../../lib/vedeu/support/exit'
|
|
|
3
3
|
|
|
4
4
|
module Vedeu
|
|
5
5
|
describe Exit do
|
|
6
|
-
let(:described_class) { Exit }
|
|
7
|
-
|
|
8
6
|
describe '.dispatch' do
|
|
9
|
-
let(:subject) { described_class.dispatch }
|
|
10
|
-
|
|
11
|
-
it 'returns a Symbol' do
|
|
12
|
-
subject.must_be_instance_of(Symbol)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
7
|
it 'returns the symbol :stop' do
|
|
16
|
-
|
|
8
|
+
Exit.dispatch.must_equal(:stop)
|
|
17
9
|
end
|
|
18
10
|
end
|
|
19
11
|
end
|
|
@@ -4,127 +4,103 @@ require_relative '../../../../lib/vedeu/models/interface'
|
|
|
4
4
|
|
|
5
5
|
module Vedeu
|
|
6
6
|
describe Geometry do
|
|
7
|
-
let(:described_class) { Geometry }
|
|
8
|
-
let(:described_instance) { described_class.new(interface, index) }
|
|
9
|
-
let(:interface) { Interface.new(attributes) }
|
|
10
|
-
let(:attributes) {
|
|
11
|
-
{
|
|
12
|
-
name: 'dummy',
|
|
13
|
-
lines: [],
|
|
14
|
-
colour: {
|
|
15
|
-
foreground: '#ff0000',
|
|
16
|
-
background: '#000000'
|
|
17
|
-
},
|
|
18
|
-
width: 7,
|
|
19
|
-
height: 3
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
let(:index) { 0 }
|
|
23
|
-
|
|
24
|
-
before do
|
|
25
|
-
Terminal.stubs(:width).returns(40)
|
|
26
|
-
Terminal.stubs(:height).returns(25)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
7
|
describe '#origin' do
|
|
30
|
-
it 'returns a String' do
|
|
31
|
-
described_instance.origin.must_be_instance_of(String)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
8
|
it 'returns the origin for the interface' do
|
|
35
|
-
|
|
9
|
+
interface = Interface.new({
|
|
10
|
+
name: 'dummy',
|
|
11
|
+
width: 5,
|
|
12
|
+
height: 5,
|
|
13
|
+
x: 1,
|
|
14
|
+
y: 1,
|
|
15
|
+
z: 1
|
|
16
|
+
})
|
|
17
|
+
Geometry.new(interface).origin.must_equal("\e[1;1H")
|
|
36
18
|
end
|
|
37
19
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
20
|
+
it 'returns the line position relative to the origin' do
|
|
21
|
+
interface = Interface.new({
|
|
22
|
+
name: 'dummy',
|
|
23
|
+
width: 5,
|
|
24
|
+
height: 5,
|
|
25
|
+
x: 1,
|
|
26
|
+
y: 1,
|
|
27
|
+
z: 1
|
|
28
|
+
})
|
|
29
|
+
Geometry.new(interface).origin(3).must_equal("\e[4;1H")
|
|
44
30
|
end
|
|
45
31
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
it 'returns the line position relative to the origin' do
|
|
57
|
-
described_instance.origin.must_equal("\e[9;3H")
|
|
58
|
-
end
|
|
59
|
-
end
|
|
32
|
+
it 'returns the origin for the interface when the interface is at a custom position' do
|
|
33
|
+
interface = Interface.new({
|
|
34
|
+
name: 'dummy',
|
|
35
|
+
width: 5,
|
|
36
|
+
height: 5,
|
|
37
|
+
x: 3,
|
|
38
|
+
y: 6,
|
|
39
|
+
z: 1
|
|
40
|
+
})
|
|
41
|
+
Geometry.new(interface).origin.must_equal("\e[6;3H")
|
|
60
42
|
end
|
|
61
|
-
end
|
|
62
43
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
44
|
+
it 'returns the line position relative to the origin when the interface is at a custom position' do
|
|
45
|
+
interface = Interface.new({
|
|
46
|
+
name: 'dummy',
|
|
47
|
+
width: 5,
|
|
48
|
+
height: 5,
|
|
49
|
+
x: 3,
|
|
50
|
+
y: 6,
|
|
51
|
+
z: 1
|
|
52
|
+
})
|
|
53
|
+
Geometry.new(interface).origin(3).must_equal("\e[9;3H")
|
|
68
54
|
end
|
|
69
55
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
56
|
+
it 'clips the maximum height to the terminal height when the height is more than the terminal height' do
|
|
57
|
+
skip
|
|
58
|
+
interface = Interface.new({
|
|
59
|
+
name: 'dummy',
|
|
60
|
+
width: 5,
|
|
61
|
+
height: 6,
|
|
62
|
+
x: 1,
|
|
63
|
+
y: 20,
|
|
64
|
+
z: 1
|
|
65
|
+
})
|
|
66
|
+
Geometry.new(interface).origin.must_equal("\e[1;1H")
|
|
74
67
|
end
|
|
75
68
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
69
|
+
it 'returns the value when the height is less than the terminal height' do
|
|
70
|
+
skip
|
|
71
|
+
interface = Interface.new({
|
|
72
|
+
name: 'dummy',
|
|
73
|
+
width: 5,
|
|
74
|
+
height: 2,
|
|
75
|
+
x: 1,
|
|
76
|
+
y: 20,
|
|
77
|
+
z: 1
|
|
78
|
+
})
|
|
79
|
+
Geometry.new(interface).origin.must_equal("\e[1;1H")
|
|
82
80
|
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
describe '#max_x' do
|
|
86
|
-
let(:subject) { described_instance.max_x }
|
|
87
|
-
|
|
88
|
-
it 'returns a Fixnum' do
|
|
89
|
-
subject.must_be_instance_of(Fixnum)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
context 'when the value is greater than the available terminal size' do
|
|
93
|
-
it 'clips the value to the terminal size' do
|
|
94
|
-
subject.must_equal(8)
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
context 'when the value is less than the available size' do
|
|
99
|
-
let(:attributes) { { x: 17, width: 21 } }
|
|
100
|
-
|
|
101
|
-
it 'returns the value' do
|
|
102
|
-
subject.must_equal(38)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
describe '#virtual_x' do
|
|
108
|
-
let(:subject) { described_instance.virtual_x }
|
|
109
|
-
|
|
110
|
-
it 'returns a Fixnum' do
|
|
111
|
-
subject.must_be_instance_of(Fixnum)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
it 'returns the value' do
|
|
115
|
-
subject.must_equal(1)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
describe '#virtual_y' do
|
|
120
|
-
let(:subject) { described_instance.virtual_y }
|
|
121
81
|
|
|
122
|
-
it '
|
|
123
|
-
|
|
82
|
+
it 'clips the maximum width to the terminal width when the width is more than the terminal width' do
|
|
83
|
+
interface = Interface.new({
|
|
84
|
+
name: 'dummy',
|
|
85
|
+
width: 20,
|
|
86
|
+
height: 5,
|
|
87
|
+
x: 30,
|
|
88
|
+
y: 1,
|
|
89
|
+
z: 1
|
|
90
|
+
})
|
|
91
|
+
Geometry.new(interface).origin.must_equal("\e[1;30H")
|
|
124
92
|
end
|
|
125
93
|
|
|
126
|
-
it 'returns the value' do
|
|
127
|
-
|
|
94
|
+
it 'returns the value when the width is less than the terminal width' do
|
|
95
|
+
interface = Interface.new({
|
|
96
|
+
name: 'dummy',
|
|
97
|
+
width: 20,
|
|
98
|
+
height: 5,
|
|
99
|
+
x: 15,
|
|
100
|
+
y: 1,
|
|
101
|
+
z: 1
|
|
102
|
+
})
|
|
103
|
+
Geometry.new(interface).origin.must_equal("\e[1;15H")
|
|
128
104
|
end
|
|
129
105
|
end
|
|
130
106
|
end
|