vedeu 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -49,7 +49,6 @@ module Vedeu
|
|
49
49
|
# the styles) and once returned, attempts to set the colours back to the
|
50
50
|
# those of the receiver's parent.
|
51
51
|
#
|
52
|
-
# @api private
|
53
52
|
# @return [String]
|
54
53
|
def render_colour(&block)
|
55
54
|
[ colour.to_s, yield, parent_colour ].join
|
@@ -59,7 +58,6 @@ module Vedeu
|
|
59
58
|
# next model, or finally, the content) and once returned, attempts to set
|
60
59
|
# the colours back to those of the receiver's parent.
|
61
60
|
#
|
62
|
-
# @api private
|
63
61
|
# @return [String]
|
64
62
|
def render_style(&block)
|
65
63
|
[ style.to_s, yield, parent_style ].join
|
@@ -67,7 +65,6 @@ module Vedeu
|
|
67
65
|
|
68
66
|
# Returns the parent colour as an escape sequence if set.
|
69
67
|
#
|
70
|
-
# @api private
|
71
68
|
# @return [String]
|
72
69
|
def parent_colour
|
73
70
|
return '' if parent.nil?
|
@@ -76,7 +73,7 @@ module Vedeu
|
|
76
73
|
end
|
77
74
|
|
78
75
|
# Returns the parent style as an escape sequence if set.
|
79
|
-
#
|
76
|
+
#
|
80
77
|
# @return [String]
|
81
78
|
def parent_style
|
82
79
|
return '' if parent.nil?
|
@@ -6,8 +6,6 @@ module Vedeu
|
|
6
6
|
# @api private
|
7
7
|
class Registrar
|
8
8
|
|
9
|
-
include Common
|
10
|
-
|
11
9
|
# @param attributes [Hash]
|
12
10
|
# @return [TrueClass|]
|
13
11
|
def self.record(attributes = {})
|
@@ -26,6 +24,8 @@ module Vedeu
|
|
26
24
|
def record
|
27
25
|
Vedeu::Buffers.add(attributes)
|
28
26
|
|
27
|
+
Vedeu::Offsets.add(attributes)
|
28
|
+
|
29
29
|
Vedeu::Interfaces.add(attributes)
|
30
30
|
|
31
31
|
Vedeu::Cursors.add(attributes)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
+
# @api private
|
3
4
|
module Repository
|
4
5
|
|
5
6
|
# Return the whole repository.
|
@@ -17,6 +18,20 @@ module Vedeu
|
|
17
18
|
storage.fetch(name) { not_found(name) }
|
18
19
|
end
|
19
20
|
|
21
|
+
# Find entity by named interface, registers an entity by interface name if
|
22
|
+
# not found.
|
23
|
+
#
|
24
|
+
# @param name [String]
|
25
|
+
# @return [Cursor|Offset]
|
26
|
+
def find_or_create(name)
|
27
|
+
storage.fetch(name) do
|
28
|
+
Vedeu.log("Entity (#{entity.to_s}) not found, " \
|
29
|
+
"registering new for: '#{name}'")
|
30
|
+
|
31
|
+
storage.store(name, entity.new({ name: name }))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
20
35
|
# Returns a collection of the names of all the registered entities.
|
21
36
|
#
|
22
37
|
# @return [Array]
|
@@ -41,9 +56,16 @@ module Vedeu
|
|
41
56
|
|
42
57
|
private
|
43
58
|
|
59
|
+
# @param method [Symbol]
|
60
|
+
# @return [String]
|
61
|
+
def action(method)
|
62
|
+
return 'Registering' if method == :add
|
63
|
+
|
64
|
+
'Updating'
|
65
|
+
end
|
66
|
+
|
44
67
|
# Access to the storage for this repository.
|
45
68
|
#
|
46
|
-
# @api private
|
47
69
|
# @return [Hash]
|
48
70
|
def storage
|
49
71
|
@_storage ||= in_memory
|
@@ -52,7 +74,6 @@ module Vedeu
|
|
52
74
|
# At present, validates that attributes has a `:name` key that is not nil or
|
53
75
|
# empty.
|
54
76
|
#
|
55
|
-
# @api private
|
56
77
|
# @param attributes [Hash]
|
57
78
|
# @return [TrueClass|MissingRequired]
|
58
79
|
def validate_attributes!(attributes)
|
@@ -37,7 +37,6 @@ module Vedeu
|
|
37
37
|
# the F-Keys etc, by capturing the entire sequence.
|
38
38
|
#
|
39
39
|
# @return [String]
|
40
|
-
# :nocov:
|
41
40
|
def input
|
42
41
|
if raw_mode?
|
43
42
|
keys = console.getch
|
@@ -52,7 +51,6 @@ module Vedeu
|
|
52
51
|
|
53
52
|
end
|
54
53
|
end
|
55
|
-
# :nocov:
|
56
54
|
|
57
55
|
# Prints the streams to the screen and returns the streams.
|
58
56
|
#
|
data/lib/vedeu/support/trace.rb
CHANGED
@@ -8,7 +8,6 @@ module Vedeu
|
|
8
8
|
# @api private
|
9
9
|
class Trace
|
10
10
|
|
11
|
-
# :nocov:
|
12
11
|
# @param options [Hash]
|
13
12
|
# @return []
|
14
13
|
def self.call(options = {})
|
@@ -52,7 +51,6 @@ module Vedeu
|
|
52
51
|
|
53
52
|
# Writes the message to the log file.
|
54
53
|
#
|
55
|
-
# @api private
|
56
54
|
# @param message [String]
|
57
55
|
# @return [Boolean]
|
58
56
|
def log_this(message)
|
@@ -63,7 +61,6 @@ module Vedeu
|
|
63
61
|
# traced. Makes the log file extremely noisy, but very useful for hunting
|
64
62
|
# down bugs.
|
65
63
|
#
|
66
|
-
# @api private
|
67
64
|
# @param binding [Class]
|
68
65
|
# @return [String]
|
69
66
|
def variables(binding)
|
@@ -84,25 +81,21 @@ module Vedeu
|
|
84
81
|
entries.join("\n")
|
85
82
|
end
|
86
83
|
|
87
|
-
# @api private
|
88
84
|
# @return [String]
|
89
85
|
def watched
|
90
86
|
options[:event]
|
91
87
|
end
|
92
88
|
|
93
|
-
# @api private
|
94
89
|
# @return [Boolean]
|
95
90
|
def trace?
|
96
91
|
options[:trace]
|
97
92
|
end
|
98
93
|
|
99
|
-
# @api private
|
100
94
|
# @return [Hash]
|
101
95
|
def options
|
102
96
|
defaults.merge!(@options)
|
103
97
|
end
|
104
98
|
|
105
|
-
# @api private
|
106
99
|
# @return [Hash]
|
107
100
|
def defaults
|
108
101
|
{
|
@@ -132,7 +125,6 @@ module Vedeu
|
|
132
125
|
|
133
126
|
# Returns the classes to be traced, without exceptions or ignored classes.
|
134
127
|
#
|
135
|
-
# @api private
|
136
128
|
# @return [Set]
|
137
129
|
def classes
|
138
130
|
@_classes ||= vedeu_classes - vedeu_exceptions - ignored_classes
|
@@ -155,7 +147,6 @@ module Vedeu
|
|
155
147
|
def vedeu_exceptions
|
156
148
|
Set.new [
|
157
149
|
'Vedeu::BufferNotFound',
|
158
|
-
'Vedeu::CursorNotFound',
|
159
150
|
'Vedeu::GroupNotFound',
|
160
151
|
'Vedeu::InterfaceNotFound',
|
161
152
|
'Vedeu::InvalidSyntax',
|
@@ -228,8 +219,6 @@ module Vedeu
|
|
228
219
|
]
|
229
220
|
end
|
230
221
|
|
231
|
-
# :nocov:
|
232
|
-
|
233
222
|
end # Trace
|
234
223
|
|
235
224
|
end # Vedeu
|
data/lib/vedeu.rb
CHANGED
@@ -38,11 +38,11 @@ require 'vedeu/support/trace'
|
|
38
38
|
|
39
39
|
require 'vedeu/api/api'
|
40
40
|
|
41
|
-
require 'vedeu/
|
42
|
-
require 'vedeu/
|
43
|
-
require 'vedeu/models/
|
44
|
-
require 'vedeu/models/
|
45
|
-
require 'vedeu/
|
41
|
+
require 'vedeu/support/coercions'
|
42
|
+
require 'vedeu/support/colour_translator'
|
43
|
+
require 'vedeu/models/background'
|
44
|
+
require 'vedeu/models/foreground'
|
45
|
+
require 'vedeu/support/presentation'
|
46
46
|
require 'vedeu/models/composition'
|
47
47
|
|
48
48
|
require 'vedeu/support/repository'
|
@@ -57,8 +57,10 @@ require 'vedeu/models/style'
|
|
57
57
|
require 'vedeu/models/interface'
|
58
58
|
require 'vedeu/models/cursor'
|
59
59
|
require 'vedeu/models/keymap'
|
60
|
+
require 'vedeu/models/char'
|
60
61
|
require 'vedeu/models/line'
|
61
62
|
require 'vedeu/models/stream'
|
63
|
+
require 'vedeu/models/offset'
|
62
64
|
|
63
65
|
require 'vedeu/repositories/events'
|
64
66
|
|
@@ -72,6 +74,7 @@ require 'vedeu/api/menu'
|
|
72
74
|
require 'vedeu/api/stream'
|
73
75
|
|
74
76
|
require 'vedeu/support/keymap_validator'
|
77
|
+
require 'vedeu/repositories/offsets'
|
75
78
|
require 'vedeu/repositories/menus'
|
76
79
|
require 'vedeu/repositories/keymaps'
|
77
80
|
require 'vedeu/repositories/interfaces'
|
@@ -83,14 +86,17 @@ require 'vedeu/repositories/cursors'
|
|
83
86
|
|
84
87
|
require 'vedeu/support/registrar'
|
85
88
|
|
89
|
+
require 'vedeu/output/area'
|
86
90
|
require 'vedeu/output/clear'
|
87
91
|
require 'vedeu/output/compositor'
|
88
92
|
require 'vedeu/output/refresh'
|
89
93
|
require 'vedeu/output/render'
|
90
94
|
require 'vedeu/output/view'
|
95
|
+
require 'vedeu/output/viewport'
|
91
96
|
|
92
97
|
require 'vedeu/support/grid'
|
93
98
|
require 'vedeu/support/menu'
|
99
|
+
require 'vedeu/support/move'
|
94
100
|
|
95
101
|
require 'vedeu/input/input'
|
96
102
|
|
@@ -106,7 +106,7 @@ module Vedeu
|
|
106
106
|
end
|
107
107
|
|
108
108
|
describe '.resize' do
|
109
|
-
it 'triggers the :_clear_,
|
109
|
+
it 'triggers the :_clear_, and :_refresh_ events' do
|
110
110
|
skip
|
111
111
|
end
|
112
112
|
end
|
@@ -164,11 +164,20 @@ module Vedeu
|
|
164
164
|
end
|
165
165
|
|
166
166
|
describe '.views' do
|
167
|
-
it '
|
168
|
-
'interfaces)' do
|
167
|
+
it 'allows multiple views to be defined at once' do
|
169
168
|
attrs = Vedeu.views do
|
170
|
-
view '
|
171
|
-
|
169
|
+
view 'view_1' do
|
170
|
+
line do
|
171
|
+
text '1. A line of text in view 1.'
|
172
|
+
text '2. Another line of text in view 1.'
|
173
|
+
end
|
174
|
+
end
|
175
|
+
view 'view_2' do
|
176
|
+
line do
|
177
|
+
text '1. A line of text in view 2.'
|
178
|
+
text '2. Another line of text in view 2.'
|
179
|
+
end
|
180
|
+
end
|
172
181
|
end
|
173
182
|
attrs[:interfaces].size.must_equal(2)
|
174
183
|
end
|
@@ -3,42 +3,25 @@ require 'test_helper'
|
|
3
3
|
module Vedeu
|
4
4
|
module API
|
5
5
|
describe Composition do
|
6
|
+
|
6
7
|
describe '.render' do
|
7
|
-
it '
|
8
|
-
|
8
|
+
it 'raises an exception when a block is not given' do
|
9
|
+
proc { Vedeu.render }.must_raise(InvalidSyntax)
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
13
|
describe '#view' do
|
14
|
+
it 'returns a Hash' do
|
15
|
+
Vedeu.view('thulium') do
|
16
|
+
# ...
|
17
|
+
end.must_be_instance_of(Hash)
|
18
|
+
end
|
19
|
+
|
14
20
|
it 'allows a single view to be defined' do
|
15
21
|
skip
|
16
22
|
end
|
17
23
|
end
|
18
24
|
|
19
|
-
describe '#views' do
|
20
|
-
it 'allows multiple views to be defined at once' do
|
21
|
-
attrs = Vedeu.views do
|
22
|
-
view 'view_1' do
|
23
|
-
line do
|
24
|
-
text '1. A line of text in view 1.'
|
25
|
-
text '2. Another line of text in view 1.'
|
26
|
-
end
|
27
|
-
end
|
28
|
-
view 'view_2' do
|
29
|
-
line do
|
30
|
-
text '1. A line of text in view 2.'
|
31
|
-
text '2. Another line of text in view 2.'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
attrs[:interfaces].size.must_equal(2)
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'raises an exception when a block is not given' do
|
39
|
-
proc { Vedeu.views }.must_raise(InvalidSyntax)
|
40
|
-
end
|
41
|
-
end
|
42
25
|
end
|
43
26
|
end
|
44
27
|
end
|
@@ -4,6 +4,10 @@ module Vedeu
|
|
4
4
|
module API
|
5
5
|
describe Stream do
|
6
6
|
describe '#align' do
|
7
|
+
it 'returns a Symbol' do
|
8
|
+
Stream.new.align(:left).must_be_instance_of(Symbol)
|
9
|
+
end
|
10
|
+
|
7
11
|
it 'returns the value assigned' do
|
8
12
|
Stream.new.align(:left).must_equal(:left)
|
9
13
|
end
|
@@ -17,6 +21,34 @@ module Vedeu
|
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
24
|
+
describe '#background' do
|
25
|
+
it 'returns a Hash' do
|
26
|
+
Stream.new.background('#00ff00').must_be_instance_of(Hash)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns the value assigned' do
|
30
|
+
Stream.new.background('#00ff00').must_equal({ background: '#00ff00' })
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'raises an exception if the value is not defined' do
|
34
|
+
proc { Stream.new.background('') }.must_raise(InvalidSyntax)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#foreground' do
|
39
|
+
it 'returns a Hash' do
|
40
|
+
Stream.new.foreground('#00ff00').must_be_instance_of(Hash)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns the value assigned' do
|
44
|
+
Stream.new.foreground('#00ff00').must_equal({ foreground: '#00ff00' })
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'raises an exception if the value is not defined' do
|
48
|
+
proc { Stream.new.foreground('') }.must_raise(InvalidSyntax)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
20
52
|
describe '#left' do
|
21
53
|
it 'returns a Symbol' do
|
22
54
|
Stream.new.left.must_equal(:left)
|
File without changes
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Char do
|
5
|
+
let(:instance) { Char.new(attributes) }
|
6
|
+
let(:attributes) {
|
7
|
+
{
|
8
|
+
colour: { foreground: '#ffff00', background: '#0000ff' },
|
9
|
+
parent: {
|
10
|
+
colour: {
|
11
|
+
foreground: '#00ff00',
|
12
|
+
background: '#ff00ff'
|
13
|
+
},
|
14
|
+
style: []
|
15
|
+
},
|
16
|
+
style: [],
|
17
|
+
value: value,
|
18
|
+
}
|
19
|
+
}
|
20
|
+
let(:value) { 'a' }
|
21
|
+
|
22
|
+
describe '#initialize' do
|
23
|
+
it 'returns a new instance of Char' do
|
24
|
+
instance.must_be_instance_of(Char)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#to_s' do
|
29
|
+
it 'returns a String' do
|
30
|
+
instance.to_s.must_be_instance_of(String)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns the escape sequences and content' do
|
34
|
+
# - char colours and style as set in Stream#chars.
|
35
|
+
# - the value.
|
36
|
+
# - the colours and style of the line which the Char belongs to.
|
37
|
+
instance.to_s.must_equal(
|
38
|
+
"\e[38;2;255;255;0m\e[48;2;0;0;255m" \
|
39
|
+
"a" \
|
40
|
+
"\e[38;2;0;255;0m\e[48;2;255;0;255m"
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -4,6 +4,7 @@ require 'json'
|
|
4
4
|
|
5
5
|
module Vedeu
|
6
6
|
describe Composition do
|
7
|
+
|
7
8
|
before { Buffers.reset }
|
8
9
|
|
9
10
|
describe '#initialize' do
|
@@ -33,5 +34,11 @@ module Vedeu
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
describe '#method_missing' do
|
38
|
+
it 'returns nil' do
|
39
|
+
Composition.new.some_missing_method(:test).must_equal(nil)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
36
43
|
end
|
37
44
|
end
|
@@ -4,21 +4,22 @@ module Vedeu
|
|
4
4
|
describe Cursor do
|
5
5
|
let(:attributes) {
|
6
6
|
{
|
7
|
-
name:
|
8
|
-
state:
|
9
|
-
x:
|
10
|
-
y:
|
7
|
+
name: 'silver',
|
8
|
+
state: :show,
|
9
|
+
x: 19,
|
10
|
+
y: 8
|
11
11
|
}
|
12
12
|
}
|
13
13
|
|
14
14
|
before do
|
15
15
|
Interfaces.reset
|
16
16
|
Vedeu.interface 'silver' do
|
17
|
-
|
17
|
+
y 5
|
18
18
|
height 4
|
19
19
|
x 12
|
20
|
-
|
20
|
+
width 10
|
21
21
|
end
|
22
|
+
Terminal.console.stubs(:print)
|
22
23
|
end
|
23
24
|
|
24
25
|
describe '#initialize' do
|
@@ -30,82 +31,78 @@ module Vedeu
|
|
30
31
|
describe '#attributes' do
|
31
32
|
it 'returns a hash containing the attributes of the instance' do
|
32
33
|
Cursor.new(attributes).attributes.must_equal(
|
33
|
-
{ name: 'silver', state: :show, x:
|
34
|
+
{ name: 'silver', state: :show, x: 19, y: 8 }
|
34
35
|
)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
38
|
-
describe '#
|
39
|
-
it '
|
40
|
-
|
41
|
-
cursor.move_up
|
42
|
-
cursor.attributes.must_equal(
|
43
|
-
{ name: 'silver', state: :show, x: 12, y: 5 }
|
44
|
-
)
|
39
|
+
describe '#x' do
|
40
|
+
it 'returns a Fixnum' do
|
41
|
+
Cursor.new(attributes).x.must_be_instance_of(Fixnum)
|
45
42
|
end
|
46
43
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
cursor
|
51
|
-
|
52
|
-
|
53
|
-
|
44
|
+
context 'when the cursors position is outside the interface' do
|
45
|
+
let(:attributes) { { name: 'silver', state: :show, x: 10, y: 8 } }
|
46
|
+
|
47
|
+
it 'repositions the cursor at the start of the line' do
|
48
|
+
Cursor.new(attributes).attributes.must_equal(
|
49
|
+
{ name: 'silver', state: :show, x: 12, y: 8 }
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when the cursors position is outside the interface' do
|
55
|
+
let(:attributes) { { name: 'silver', state: :show, x: 25, y: 8 } }
|
56
|
+
|
57
|
+
it 'repositions the cursor at the end of the line' do
|
58
|
+
Cursor.new(attributes).attributes.must_equal(
|
59
|
+
{ name: 'silver', state: :show, x: 21, y: 8 }
|
60
|
+
)
|
61
|
+
end
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
|
-
describe '#
|
58
|
-
it '
|
59
|
-
|
60
|
-
cursor.move_down
|
61
|
-
cursor.attributes.must_equal(
|
62
|
-
{ name: 'silver', state: :show, x: 12, y: 6 }
|
63
|
-
)
|
65
|
+
describe '#y' do
|
66
|
+
it 'returns a Fixnum' do
|
67
|
+
Cursor.new(attributes).y.must_be_instance_of(Fixnum)
|
64
68
|
end
|
65
69
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
cursor
|
70
|
-
|
71
|
-
|
70
|
+
context 'when the cursors position is outside the interface' do
|
71
|
+
let(:attributes) { { name: 'silver', state: :show, x: 19, y: 3 } }
|
72
|
+
|
73
|
+
it 'repositions the cursor at the start of the line' do
|
74
|
+
Cursor.new(attributes).attributes.must_equal(
|
75
|
+
{ name: 'silver', state: :show, x: 19, y: 5 }
|
76
|
+
)
|
77
|
+
end
|
72
78
|
end
|
73
|
-
end
|
74
79
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
cursor
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
context 'when the cursors position is outside the interface' do
|
81
|
+
let(:attributes) { { name: 'silver', state: :show, x: 19, y: 12 } }
|
82
|
+
|
83
|
+
it 'repositions the cursor at the end of the line' do
|
84
|
+
Cursor.new(attributes).attributes.must_equal(
|
85
|
+
{ name: 'silver', state: :show, x: 19, y: 8 }
|
86
|
+
)
|
87
|
+
end
|
82
88
|
end
|
89
|
+
end
|
83
90
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
cursor.attributes.must_equal(
|
89
|
-
{ name: 'silver', state: :show, x: 14, y: 5 }
|
91
|
+
describe '#refresh' do
|
92
|
+
it 'returns a hash containing the attributes of the instance' do
|
93
|
+
Cursor.new(attributes).refresh.must_equal(
|
94
|
+
{ name: 'silver', state: :show, x: 19, y: 8 }
|
90
95
|
)
|
91
96
|
end
|
92
97
|
end
|
93
98
|
|
94
|
-
describe '#
|
95
|
-
it '
|
96
|
-
|
97
|
-
11.times { cursor.move_right }
|
98
|
-
cursor.attributes.must_equal(
|
99
|
-
{ name: 'silver', state: :show, x: 21, y: 5 }
|
100
|
-
)
|
99
|
+
describe '#visible?' do
|
100
|
+
it 'returns false when the cursor is not visible' do
|
101
|
+
Cursor.new({ state: :hide }).visible?.must_equal(false)
|
101
102
|
end
|
102
103
|
|
103
|
-
it '
|
104
|
-
|
105
|
-
cursor.move_right
|
106
|
-
cursor.attributes.must_equal(
|
107
|
-
{ name: 'silver', state: :show, x: 13, y: 5 }
|
108
|
-
)
|
104
|
+
it 'returns true when the cursor is visible' do
|
105
|
+
Cursor.new({ state: :show }).visible?.must_equal(true)
|
109
106
|
end
|
110
107
|
end
|
111
108
|
|
@@ -114,11 +111,11 @@ module Vedeu
|
|
114
111
|
cursor = Cursor.new(attributes)
|
115
112
|
cursor.hide
|
116
113
|
cursor.attributes.must_equal(
|
117
|
-
{ name: 'silver', state: :hide, x:
|
114
|
+
{ name: 'silver', state: :hide, x: 19, y: 8 }
|
118
115
|
)
|
119
116
|
cursor.show
|
120
117
|
cursor.attributes.must_equal(
|
121
|
-
{ name: 'silver', state: :show, x:
|
118
|
+
{ name: 'silver', state: :show, x: 19, y: 8 }
|
122
119
|
)
|
123
120
|
end
|
124
121
|
end
|
@@ -128,21 +125,7 @@ module Vedeu
|
|
128
125
|
cursor = Cursor.new(attributes)
|
129
126
|
cursor.hide
|
130
127
|
cursor.attributes.must_equal(
|
131
|
-
{ name: 'silver', state: :hide, x:
|
132
|
-
)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe '#toggle' do
|
137
|
-
it 'sets the visibility to the opposite of its current state' do
|
138
|
-
cursor = Cursor.new(attributes)
|
139
|
-
cursor.toggle
|
140
|
-
cursor.attributes.must_equal(
|
141
|
-
{ name: 'silver', state: :hide, x: 12, y: 5 }
|
142
|
-
)
|
143
|
-
cursor.toggle
|
144
|
-
cursor.attributes.must_equal(
|
145
|
-
{ name: 'silver', state: :show, x: 12, y: 5 }
|
128
|
+
{ name: 'silver', state: :hide, x: 19, y: 8 }
|
146
129
|
)
|
147
130
|
end
|
148
131
|
end
|
@@ -150,14 +133,14 @@ module Vedeu
|
|
150
133
|
describe '#to_s' do
|
151
134
|
it 'returns the escape sequence to position and set the visibility of ' \
|
152
135
|
'the cursor' do
|
153
|
-
Cursor.new(attributes).to_s.must_equal("\e[
|
136
|
+
Cursor.new(attributes).to_s.must_equal("\e[8;19H\e[?25h")
|
154
137
|
end
|
155
138
|
|
156
139
|
it 'returns the escape sequence to position and set the visibility of ' \
|
157
140
|
'the cursor and returns to that position after yielding the block' do
|
158
141
|
Cursor.new(attributes).to_s do
|
159
142
|
# ...
|
160
|
-
end.must_equal("\e[
|
143
|
+
end.must_equal("\e[8;19H\e[?25h\e[8;19H\e[?25h")
|
161
144
|
end
|
162
145
|
end
|
163
146
|
end
|