vedeu 0.6.3 → 0.6.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/lib/vedeu/all.rb +1 -0
- data/lib/vedeu/geometry/coordinate.rb +0 -169
- data/lib/vedeu/geometry/generic_coordinate.rb +172 -0
- data/lib/vedeu/geometry/geometry.rb +7 -2
- data/lib/vedeu/input/editor/document.rb +1 -7
- data/lib/vedeu/models/escape.rb +3 -3
- data/lib/vedeu/output/direct.rb +3 -0
- data/lib/vedeu/output/renderers/escape_sequence.rb +1 -0
- data/lib/vedeu/output/renderers/html.rb +4 -7
- data/lib/vedeu/output/style.rb +1 -4
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/application/application_view_test.rb +0 -2
- data/test/lib/vedeu/borders/border_test.rb +5 -130
- data/test/lib/vedeu/exceptions_test.rb +18 -1
- data/test/lib/vedeu/geometry/generic_coordinate_test.rb +41 -0
- data/test/lib/vedeu/input/editor/document_test.rb +9 -20
- data/test/lib/vedeu/models/toggleable_test.rb +12 -0
- data/test/lib/vedeu/null/geometry_test.rb +12 -2
- data/test/lib/vedeu/output/wordwrap_test.rb +6 -2
- data/test/lib/vedeu/terminal/content_test.rb +8 -0
- data/test/support/average_duration_reporter.rb +201 -0
- data/test/test_helper.rb +8 -4
- data/vedeu.gemspec +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db7557217b4f94e3fcfea2f541421306550f35a4
|
4
|
+
data.tar.gz: 2a8dbc1907f3c2b48b9f24ee342d974686949ef3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be86100e63189b39cbdb342ab8799e67f03a58b0b62f92fd165d4a70dcc3306da0639536cbc7cf8985dd63b699082a52d4f2021a13fa41f54658c0c1f9086b37
|
7
|
+
data.tar.gz: 3b7f9ea1aec43791928f0afbd3fac58f91f7cd2d269dca02f3d5e2f7b80bda87de406090d2a8c90c71513aa2957da88a9ab99be33e71ad8efe5fd8330dadedb9
|
data/lib/vedeu/all.rb
CHANGED
@@ -46,173 +46,4 @@ module Vedeu
|
|
46
46
|
|
47
47
|
end # Coordinate
|
48
48
|
|
49
|
-
# Crudely corrects out of range values.
|
50
|
-
#
|
51
|
-
class GenericCoordinate
|
52
|
-
|
53
|
-
# Return a new instance of Vedeu::GenericCoordinate.
|
54
|
-
#
|
55
|
-
# @param attributes [Hash]
|
56
|
-
# @option attributes name [String]
|
57
|
-
# @option attributes type [Symbol]
|
58
|
-
# @option attributes offset [Fixnum]
|
59
|
-
# @return [Vedeu::GenericCoordinate]
|
60
|
-
def initialize(attributes = {})
|
61
|
-
@attributes = defaults.merge!(attributes)
|
62
|
-
|
63
|
-
@attributes.each { |key, value| instance_variable_set("@#{key}", value) }
|
64
|
-
end
|
65
|
-
|
66
|
-
# Returns the maximum coordinate for an area.
|
67
|
-
#
|
68
|
-
# @example
|
69
|
-
# # d = 2
|
70
|
-
# # d_dn = 4
|
71
|
-
# dn # => 6
|
72
|
-
#
|
73
|
-
# @return [Fixnum]
|
74
|
-
def dn
|
75
|
-
if d_dn <= 0
|
76
|
-
0
|
77
|
-
|
78
|
-
else
|
79
|
-
d + d_dn
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
83
|
-
alias_method :xn, :dn
|
84
|
-
alias_method :yn, :dn
|
85
|
-
|
86
|
-
# Returns the coordinate for a given index.
|
87
|
-
#
|
88
|
-
# @example
|
89
|
-
# # d_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
90
|
-
# position # => 4
|
91
|
-
# position(-2) # => 4
|
92
|
-
# position(2) # => 6
|
93
|
-
# position(15) # => 13
|
94
|
-
#
|
95
|
-
# @return [Fixnum]
|
96
|
-
def position
|
97
|
-
pos = case
|
98
|
-
when offset <= 0 then d
|
99
|
-
when offset > dn_index then dn
|
100
|
-
else
|
101
|
-
d_range[offset]
|
102
|
-
end
|
103
|
-
|
104
|
-
pos = pos < bd ? bd : pos
|
105
|
-
pos = pos > bdn ? bdn : pos
|
106
|
-
pos
|
107
|
-
end
|
108
|
-
alias_method :x_position, :position
|
109
|
-
alias_method :y_position, :position
|
110
|
-
|
111
|
-
protected
|
112
|
-
|
113
|
-
# @!attribute [r] name
|
114
|
-
# @return [String]
|
115
|
-
attr_reader :name
|
116
|
-
|
117
|
-
# @!attribute [r] offset
|
118
|
-
# @return [Fixnum]
|
119
|
-
attr_reader :offset
|
120
|
-
|
121
|
-
# @!attribute [r] type
|
122
|
-
# @return [Symbol]
|
123
|
-
attr_reader :type
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
# @see Vedeu::Borders#by_name
|
128
|
-
def border
|
129
|
-
@border ||= Vedeu.borders.by_name(name)
|
130
|
-
end
|
131
|
-
|
132
|
-
# Return the :x or :y value from the border.
|
133
|
-
#
|
134
|
-
# @return [Fixnum]
|
135
|
-
def d
|
136
|
-
border.send(coordinate_type[0])
|
137
|
-
end
|
138
|
-
|
139
|
-
# Return the :bx or :by value from the border.
|
140
|
-
#
|
141
|
-
# @return [Fixnum]
|
142
|
-
def bd
|
143
|
-
border.send(coordinate_type[1])
|
144
|
-
end
|
145
|
-
|
146
|
-
# Return the :bxn or :byn value from the border.
|
147
|
-
#
|
148
|
-
# @return [Fixnum]
|
149
|
-
def bdn
|
150
|
-
border.send(coordinate_type[2])
|
151
|
-
end
|
152
|
-
|
153
|
-
# Return the :width or :height value from the border.
|
154
|
-
#
|
155
|
-
# @return [Fixnum]
|
156
|
-
def d_dn
|
157
|
-
border.send(coordinate_type[3])
|
158
|
-
end
|
159
|
-
|
160
|
-
# Ascertain the correct methods to use for determining the coordinates.
|
161
|
-
#
|
162
|
-
# @raise [Vedeu::Error::InvalidSyntax] When the coordinate type is not
|
163
|
-
# given.
|
164
|
-
# @return [Fixnum]
|
165
|
-
def coordinate_type
|
166
|
-
@_type ||= case type
|
167
|
-
when :x then [:x, :bx, :bxn, :width]
|
168
|
-
when :y then [:y, :by, :byn, :height]
|
169
|
-
else
|
170
|
-
fail Vedeu::Error::InvalidSyntax,
|
171
|
-
'Coordinate type not given, cannot continue.'
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
# Returns the maximum index for an area.
|
176
|
-
#
|
177
|
-
# @example
|
178
|
-
# # d_dn = 3
|
179
|
-
# dn_index # => 2
|
180
|
-
#
|
181
|
-
# @return [Fixnum]
|
182
|
-
def dn_index
|
183
|
-
if d_dn < 1
|
184
|
-
0
|
185
|
-
|
186
|
-
else
|
187
|
-
d_dn - 1
|
188
|
-
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
# Returns an array with all coordinates from d to dn.
|
193
|
-
#
|
194
|
-
# @example
|
195
|
-
# # d_dn = 10
|
196
|
-
# # d = 4
|
197
|
-
# # dn = 14
|
198
|
-
# d_range # => [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
199
|
-
#
|
200
|
-
# @return [Array]
|
201
|
-
def d_range
|
202
|
-
(d...dn).to_a
|
203
|
-
end
|
204
|
-
|
205
|
-
# The default values for a new instance of this class.
|
206
|
-
#
|
207
|
-
# @return [Hash]
|
208
|
-
def defaults
|
209
|
-
{
|
210
|
-
name: '',
|
211
|
-
offset: nil,
|
212
|
-
type: :x,
|
213
|
-
}
|
214
|
-
end
|
215
|
-
|
216
|
-
end # GenericCoordinate
|
217
|
-
|
218
49
|
end # Vedeu
|
@@ -0,0 +1,172 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Crudely corrects out of range values.
|
4
|
+
#
|
5
|
+
class GenericCoordinate
|
6
|
+
|
7
|
+
# Return a new instance of Vedeu::GenericCoordinate.
|
8
|
+
#
|
9
|
+
# @param attributes [Hash]
|
10
|
+
# @option attributes name [String]
|
11
|
+
# @option attributes type [Symbol]
|
12
|
+
# @option attributes offset [Fixnum]
|
13
|
+
# @return [Vedeu::GenericCoordinate]
|
14
|
+
def initialize(attributes = {})
|
15
|
+
@attributes = defaults.merge!(attributes)
|
16
|
+
|
17
|
+
@attributes.each { |key, value| instance_variable_set("@#{key}", value) }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns the maximum coordinate for an area.
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# # d = 2
|
24
|
+
# # d_dn = 4
|
25
|
+
# dn # => 6
|
26
|
+
#
|
27
|
+
# @return [Fixnum]
|
28
|
+
def dn
|
29
|
+
if d_dn <= 0
|
30
|
+
0
|
31
|
+
|
32
|
+
else
|
33
|
+
d + d_dn
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
alias_method :xn, :dn
|
38
|
+
alias_method :yn, :dn
|
39
|
+
|
40
|
+
# Returns the coordinate for a given index.
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# # d_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
44
|
+
# position # => 4
|
45
|
+
# position(-2) # => 4
|
46
|
+
# position(2) # => 6
|
47
|
+
# position(15) # => 13
|
48
|
+
#
|
49
|
+
# @return [Fixnum]
|
50
|
+
def position
|
51
|
+
pos = case
|
52
|
+
when offset <= 0 then d
|
53
|
+
when offset > dn_index then dn
|
54
|
+
else
|
55
|
+
d_range[offset]
|
56
|
+
end
|
57
|
+
|
58
|
+
pos = pos < bd ? bd : pos
|
59
|
+
pos = pos > bdn ? bdn : pos
|
60
|
+
pos
|
61
|
+
end
|
62
|
+
alias_method :x_position, :position
|
63
|
+
alias_method :y_position, :position
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
# @!attribute [r] name
|
68
|
+
# @return [String]
|
69
|
+
attr_reader :name
|
70
|
+
|
71
|
+
# @!attribute [r] offset
|
72
|
+
# @return [Fixnum]
|
73
|
+
attr_reader :offset
|
74
|
+
|
75
|
+
# @!attribute [r] type
|
76
|
+
# @return [Symbol]
|
77
|
+
attr_reader :type
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
# @see Vedeu::Borders#by_name
|
82
|
+
def border
|
83
|
+
@border ||= Vedeu.borders.by_name(name)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Return the :x or :y value from the border.
|
87
|
+
#
|
88
|
+
# @return [Fixnum]
|
89
|
+
def d
|
90
|
+
border.send(coordinate_type[0])
|
91
|
+
end
|
92
|
+
|
93
|
+
# Return the :bx or :by value from the border.
|
94
|
+
#
|
95
|
+
# @return [Fixnum]
|
96
|
+
def bd
|
97
|
+
border.send(coordinate_type[1])
|
98
|
+
end
|
99
|
+
|
100
|
+
# Return the :bxn or :byn value from the border.
|
101
|
+
#
|
102
|
+
# @return [Fixnum]
|
103
|
+
def bdn
|
104
|
+
border.send(coordinate_type[2])
|
105
|
+
end
|
106
|
+
|
107
|
+
# Return the :width or :height value from the border.
|
108
|
+
#
|
109
|
+
# @return [Fixnum]
|
110
|
+
def d_dn
|
111
|
+
border.send(coordinate_type[3])
|
112
|
+
end
|
113
|
+
|
114
|
+
# Ascertain the correct methods to use for determining the coordinates.
|
115
|
+
#
|
116
|
+
# @raise [Vedeu::Error::InvalidSyntax] When the coordinate type is not
|
117
|
+
# given.
|
118
|
+
# @return [Fixnum]
|
119
|
+
def coordinate_type
|
120
|
+
@_type ||= case type
|
121
|
+
when :x then [:x, :bx, :bxn, :width]
|
122
|
+
when :y then [:y, :by, :byn, :height]
|
123
|
+
else
|
124
|
+
fail Vedeu::Error::InvalidSyntax,
|
125
|
+
'Coordinate type not given, cannot continue.'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Returns the maximum index for an area.
|
130
|
+
#
|
131
|
+
# @example
|
132
|
+
# # d_dn = 3
|
133
|
+
# dn_index # => 2
|
134
|
+
#
|
135
|
+
# @return [Fixnum]
|
136
|
+
def dn_index
|
137
|
+
if d_dn < 1
|
138
|
+
0
|
139
|
+
|
140
|
+
else
|
141
|
+
d_dn - 1
|
142
|
+
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Returns an array with all coordinates from d to dn.
|
147
|
+
#
|
148
|
+
# @example
|
149
|
+
# # d_dn = 10
|
150
|
+
# # d = 4
|
151
|
+
# # dn = 14
|
152
|
+
# d_range # => [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
153
|
+
#
|
154
|
+
# @return [Array]
|
155
|
+
def d_range
|
156
|
+
(d...dn).to_a
|
157
|
+
end
|
158
|
+
|
159
|
+
# The default values for a new instance of this class.
|
160
|
+
#
|
161
|
+
# @return [Hash]
|
162
|
+
def defaults
|
163
|
+
{
|
164
|
+
name: '',
|
165
|
+
offset: nil,
|
166
|
+
type: :x,
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
end # GenericCoordinate
|
171
|
+
|
172
|
+
end # Vedeu
|
@@ -137,7 +137,12 @@ module Vedeu
|
|
137
137
|
|
138
138
|
# @return [Vedeu::Area]
|
139
139
|
def area
|
140
|
-
@area = Vedeu::Area.from_attributes(
|
140
|
+
@area = Vedeu::Area.from_attributes(area_attributes)
|
141
|
+
end
|
142
|
+
|
143
|
+
# @return [Hash<Symbol => Fixnum, Boolean>]
|
144
|
+
def area_attributes
|
145
|
+
{
|
141
146
|
y: _y,
|
142
147
|
yn: _yn,
|
143
148
|
y_yn: _height,
|
@@ -148,7 +153,7 @@ module Vedeu
|
|
148
153
|
x_default: Vedeu.width,
|
149
154
|
centred: centred,
|
150
155
|
maximised: maximised,
|
151
|
-
|
156
|
+
}
|
152
157
|
end
|
153
158
|
|
154
159
|
# Returns the row/line start position for the interface.
|
@@ -154,13 +154,7 @@ module Vedeu
|
|
154
154
|
#
|
155
155
|
# @return [Array<String|void>]
|
156
156
|
def lines
|
157
|
-
@lines ||=
|
158
|
-
Vedeu::Editor::Lines.coerce(data)
|
159
|
-
|
160
|
-
else
|
161
|
-
defaults[:data]
|
162
|
-
|
163
|
-
end
|
157
|
+
@lines ||= Vedeu::Editor::Lines.coerce(data)
|
164
158
|
end
|
165
159
|
|
166
160
|
# Render the document content in the terminal.
|
data/lib/vedeu/models/escape.rb
CHANGED
@@ -15,9 +15,9 @@ module Vedeu
|
|
15
15
|
# @option attributes value [String]
|
16
16
|
# @return [Vedeu::Escape]
|
17
17
|
def initialize(attributes = {})
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
defaults.merge!(attributes).each do |key, value|
|
19
|
+
instance_variable_set("@#{key}", value)
|
20
|
+
end
|
21
21
|
end
|
22
22
|
|
23
23
|
# @return [NilClass]
|
data/lib/vedeu/output/direct.rb
CHANGED
@@ -12,9 +12,12 @@ module Vedeu
|
|
12
12
|
new(value: value, x: x, y: y).write
|
13
13
|
end
|
14
14
|
|
15
|
+
# Returns a new instance of Vedeu::Direct.
|
16
|
+
#
|
15
17
|
# @param value [String]
|
16
18
|
# @param x [Fixnum]
|
17
19
|
# @param y [Fixnum]
|
20
|
+
# @return [Vedeu::Direct]
|
18
21
|
def initialize(value:, x:, y:)
|
19
22
|
@value = value || ''
|
20
23
|
@x = x || 1
|
@@ -24,18 +24,15 @@ module Vedeu
|
|
24
24
|
def render(output)
|
25
25
|
@options[:content] = output
|
26
26
|
|
27
|
-
|
28
|
-
super(Vedeu::Templating::Template.parse(self, template))
|
29
|
-
|
30
|
-
else
|
31
|
-
Vedeu::Templating::Template.parse(self, template)
|
32
|
-
|
33
|
-
end
|
27
|
+
super(Vedeu::Templating::Template.parse(self, template))
|
34
28
|
end
|
35
29
|
|
36
30
|
# @return [String]
|
37
31
|
def html_body
|
32
|
+
return '' if content.is_a?(Vedeu::Escape)
|
33
|
+
|
38
34
|
out = ''
|
35
|
+
|
39
36
|
Array(content).each do |line|
|
40
37
|
out << "#{start_row_tag}\n"
|
41
38
|
line.each do |char|
|
data/lib/vedeu/output/style.rb
CHANGED
data/lib/vedeu/version.rb
CHANGED
@@ -396,139 +396,14 @@ module Vedeu
|
|
396
396
|
end
|
397
397
|
|
398
398
|
describe '#render' do
|
399
|
-
|
400
|
-
{
|
401
|
-
bottom_left: 'C',
|
402
|
-
bottom_right: 'D',
|
403
|
-
enabled: enabled,
|
404
|
-
horizontal: 'H',
|
405
|
-
name: 'Border#render',
|
406
|
-
show_top: top,
|
407
|
-
show_bottom: bottom,
|
408
|
-
show_left: left,
|
409
|
-
show_right: right,
|
410
|
-
top_left: 'A',
|
411
|
-
top_right: 'B',
|
412
|
-
vertical: 'V'
|
413
|
-
}
|
414
|
-
}
|
415
|
-
let(:enabled) { false }
|
416
|
-
let(:top) { false }
|
417
|
-
let(:bottom) { false }
|
418
|
-
let(:left) { false }
|
419
|
-
let(:right) { false }
|
420
|
-
let(:visibility) { true }
|
421
|
-
let(:geometry) {
|
422
|
-
Vedeu::Geometry.new(name: 'Border#render', x: 1, xn: 4, y: 1, yn: 4)
|
423
|
-
}
|
424
|
-
let(:interface) { Vedeu::Interface.new(visible: visibility) }
|
425
|
-
|
426
|
-
before { Vedeu.interfaces.stubs(:by_name).returns(interface) }
|
399
|
+
before { Vedeu::RenderBorder.stubs(:with) }
|
427
400
|
|
428
401
|
subject { instance.render }
|
429
402
|
|
430
|
-
it {
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
it { subject.must_equal([]) }
|
436
|
-
end
|
437
|
-
|
438
|
-
context 'when the border is not enabled' do
|
439
|
-
it { subject.must_equal([]) }
|
440
|
-
end
|
441
|
-
|
442
|
-
context 'when the border is enabled' do
|
443
|
-
let(:enabled) { true }
|
444
|
-
|
445
|
-
context 'top' do
|
446
|
-
let(:top) { true }
|
447
|
-
|
448
|
-
it { subject.size.must_equal(4) }
|
449
|
-
end
|
450
|
-
|
451
|
-
context 'right' do
|
452
|
-
let(:right) { true }
|
453
|
-
|
454
|
-
it { subject.size.must_equal(4) }
|
455
|
-
end
|
456
|
-
|
457
|
-
context 'bottom' do
|
458
|
-
let(:bottom) { true }
|
459
|
-
|
460
|
-
it { subject.size.must_equal(4) }
|
461
|
-
end
|
462
|
-
|
463
|
-
context 'left' do
|
464
|
-
let(:left) { true }
|
465
|
-
|
466
|
-
it { subject.size.must_equal(4) }
|
467
|
-
end
|
468
|
-
|
469
|
-
context 'top and right' do
|
470
|
-
let(:top) { true }
|
471
|
-
let(:right) { true }
|
472
|
-
|
473
|
-
it { subject.size.must_equal(7) }
|
474
|
-
end
|
475
|
-
|
476
|
-
context 'top and right and bottom' do
|
477
|
-
let(:top) { true }
|
478
|
-
let(:right) { true }
|
479
|
-
let(:bottom) { true }
|
480
|
-
|
481
|
-
it { subject.size.must_equal(10) }
|
482
|
-
end
|
483
|
-
|
484
|
-
context 'top and bottom' do
|
485
|
-
let(:top) { true }
|
486
|
-
let(:bottom) { true }
|
487
|
-
|
488
|
-
it { subject.size.must_equal(8) }
|
489
|
-
end
|
490
|
-
|
491
|
-
context 'top and left' do
|
492
|
-
let(:top) { true }
|
493
|
-
let(:left) { true }
|
494
|
-
|
495
|
-
it { subject.size.must_equal(7) }
|
496
|
-
end
|
497
|
-
|
498
|
-
context 'right and bottom' do
|
499
|
-
let(:right) { true }
|
500
|
-
let(:bottom) { true }
|
501
|
-
|
502
|
-
it { subject.size.must_equal(7) }
|
503
|
-
end
|
504
|
-
|
505
|
-
context 'right and left' do
|
506
|
-
let(:right) { true }
|
507
|
-
let(:left) { true }
|
508
|
-
|
509
|
-
it { subject.size.must_equal(8) }
|
510
|
-
end
|
511
|
-
|
512
|
-
context 'bottom and left' do
|
513
|
-
let(:bottom) { true }
|
514
|
-
let(:left) { true }
|
515
|
-
|
516
|
-
it { subject.size.must_equal(7) }
|
517
|
-
end
|
518
|
-
|
519
|
-
context 'all' do
|
520
|
-
let(:top) { true }
|
521
|
-
let(:right) { true }
|
522
|
-
let(:bottom) { true }
|
523
|
-
let(:left) { true }
|
524
|
-
|
525
|
-
it { subject.size.must_equal(12) }
|
526
|
-
end
|
527
|
-
|
528
|
-
context 'none' do
|
529
|
-
it { subject.size.must_equal(0) }
|
530
|
-
end
|
531
|
-
end
|
403
|
+
it {
|
404
|
+
Vedeu::RenderBorder.expects(:with).with(instance)
|
405
|
+
subject
|
406
|
+
}
|
532
407
|
end
|
533
408
|
|
534
409
|
end # Border
|
@@ -2,4 +2,21 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
module Vedeu
|
4
4
|
|
5
|
-
|
5
|
+
module Error
|
6
|
+
|
7
|
+
describe OutOfRange do
|
8
|
+
|
9
|
+
let(:described) { Vedeu::Error::OutOfRange }
|
10
|
+
let(:instance) { described.new }
|
11
|
+
|
12
|
+
describe '#message' do
|
13
|
+
subject { instance.message }
|
14
|
+
|
15
|
+
it { subject.must_be_instance_of(String) }
|
16
|
+
end
|
17
|
+
|
18
|
+
end # OutOfRange
|
19
|
+
|
20
|
+
end # Error
|
21
|
+
|
22
|
+
end # Vedeu
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
describe GenericCoordinate do
|
6
|
+
|
7
|
+
let(:described) { Vedeu::GenericCoordinate }
|
8
|
+
let(:instance) { described.new(attributes) }
|
9
|
+
let(:attributes) {
|
10
|
+
{
|
11
|
+
name: _name,
|
12
|
+
offset: offset,
|
13
|
+
type: type,
|
14
|
+
}
|
15
|
+
}
|
16
|
+
let(:_name) {}
|
17
|
+
let(:offset) {}
|
18
|
+
let(:type) {}
|
19
|
+
|
20
|
+
describe '#initialize' do
|
21
|
+
it { instance.must_be_instance_of(described) }
|
22
|
+
it { instance.instance_variable_get('@name').must_equal(_name) }
|
23
|
+
it { instance.instance_variable_get('@offset').must_equal(offset) }
|
24
|
+
it { instance.instance_variable_get('@type').must_equal(type) }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#dn' do
|
28
|
+
subject { instance.dn }
|
29
|
+
|
30
|
+
# it { skip }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#position' do
|
34
|
+
subject { instance.position }
|
35
|
+
|
36
|
+
# it { skip }
|
37
|
+
end
|
38
|
+
|
39
|
+
end # GenericCoordinate
|
40
|
+
|
41
|
+
end # Vedeu
|
@@ -152,28 +152,17 @@ module Vedeu
|
|
152
152
|
end
|
153
153
|
|
154
154
|
describe '#lines' do
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
it { subject.must_equal(expected) }
|
164
|
-
end
|
155
|
+
let(:expected) {
|
156
|
+
Vedeu::Editor::Lines.new([
|
157
|
+
Vedeu::Editor::Line.new('Hydrogen'),
|
158
|
+
Vedeu::Editor::Line.new('Helium'),
|
159
|
+
Vedeu::Editor::Line.new('Lithium'),
|
160
|
+
])
|
161
|
+
}
|
165
162
|
|
166
|
-
|
167
|
-
let(:expected) {
|
168
|
-
Vedeu::Editor::Lines.new([
|
169
|
-
Vedeu::Editor::Line.new('Hydrogen'),
|
170
|
-
Vedeu::Editor::Line.new('Helium'),
|
171
|
-
Vedeu::Editor::Line.new('Lithium'),
|
172
|
-
])
|
173
|
-
}
|
163
|
+
subject { instance.lines }
|
174
164
|
|
175
|
-
|
176
|
-
end
|
165
|
+
it { subject.must_equal(expected) }
|
177
166
|
end
|
178
167
|
|
179
168
|
describe '#render' do
|
@@ -33,6 +33,10 @@ module Vedeu
|
|
33
33
|
subject
|
34
34
|
instance.instance_variable_get('@visible').must_equal(false)
|
35
35
|
}
|
36
|
+
|
37
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:hide_cursor) }
|
38
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:hide_group) }
|
39
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:hide_interface) }
|
36
40
|
end
|
37
41
|
|
38
42
|
describe '#show' do
|
@@ -42,11 +46,19 @@ module Vedeu
|
|
42
46
|
subject
|
43
47
|
instance.instance_variable_get('@visible').must_equal(true)
|
44
48
|
}
|
49
|
+
|
50
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:show_cursor) }
|
51
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:show_group) }
|
52
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:show_interface) }
|
45
53
|
end
|
46
54
|
|
47
55
|
describe '#toggle' do
|
48
56
|
subject { instance.toggle }
|
49
57
|
|
58
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:toggle_cursor) }
|
59
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:toggle_group) }
|
60
|
+
it { Vedeu::ToggleableTestClass.must_respond_to(:toggle_interface) }
|
61
|
+
|
50
62
|
context 'when the model is visible' do
|
51
63
|
let(:visible) { true }
|
52
64
|
|
@@ -15,8 +15,6 @@ module Vedeu
|
|
15
15
|
}
|
16
16
|
let(:_name) { 'null_geometry' }
|
17
17
|
|
18
|
-
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
19
|
-
|
20
18
|
describe '#initialize' do
|
21
19
|
it { instance.must_be_instance_of(described) }
|
22
20
|
it {
|
@@ -62,26 +60,38 @@ module Vedeu
|
|
62
60
|
end
|
63
61
|
|
64
62
|
describe '#height' do
|
63
|
+
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
64
|
+
|
65
65
|
it { instance.height.must_equal(25) }
|
66
66
|
end
|
67
67
|
|
68
68
|
describe '#width' do
|
69
|
+
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
70
|
+
|
69
71
|
it { instance.width.must_equal(40) }
|
70
72
|
end
|
71
73
|
|
72
74
|
describe '#x' do
|
75
|
+
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
76
|
+
|
73
77
|
it { instance.x.must_equal(1) }
|
74
78
|
end
|
75
79
|
|
76
80
|
describe '#xn' do
|
81
|
+
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
82
|
+
|
77
83
|
it { instance.xn.must_equal(40) }
|
78
84
|
end
|
79
85
|
|
80
86
|
describe '#y' do
|
87
|
+
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
88
|
+
|
81
89
|
it { instance.y.must_equal(1) }
|
82
90
|
end
|
83
91
|
|
84
92
|
describe '#yn' do
|
93
|
+
before { Vedeu::Terminal.stubs(:size).returns([25, 40]) }
|
94
|
+
|
85
95
|
it { instance.yn.must_equal(25) }
|
86
96
|
end
|
87
97
|
|
@@ -65,6 +65,10 @@ module Vedeu
|
|
65
65
|
it { instance.instance_variable_get('@options').must_equal(options) }
|
66
66
|
end
|
67
67
|
|
68
|
+
describe '#content' do
|
69
|
+
it { instance.must_respond_to(:content) }
|
70
|
+
end
|
71
|
+
|
68
72
|
describe '#prune' do
|
69
73
|
let(:text) { text_line }
|
70
74
|
|
@@ -184,8 +188,8 @@ module Vedeu
|
|
184
188
|
end
|
185
189
|
end
|
186
190
|
|
187
|
-
describe '
|
188
|
-
subject {
|
191
|
+
describe '.for' do
|
192
|
+
subject { described.for(text, options) }
|
189
193
|
|
190
194
|
it { subject.must_be_instance_of(Vedeu::Views::Lines) }
|
191
195
|
|
@@ -53,12 +53,16 @@ module Vedeu
|
|
53
53
|
let(:char) {}
|
54
54
|
|
55
55
|
subject { described.store(char) }
|
56
|
+
|
57
|
+
it { subject.must_equal(char) }
|
56
58
|
end
|
57
59
|
|
58
60
|
describe '#stores' do
|
59
61
|
let(:chars) {}
|
60
62
|
|
61
63
|
subject { described.stores(chars) }
|
64
|
+
|
65
|
+
it { subject.must_equal([]) }
|
62
66
|
end
|
63
67
|
|
64
68
|
describe '#write' do
|
@@ -82,7 +86,11 @@ module Vedeu
|
|
82
86
|
end
|
83
87
|
|
84
88
|
describe '#reprocess' do
|
89
|
+
before { Vedeu::Terminal.stubs(:clear) }
|
90
|
+
|
85
91
|
subject { described.reprocess }
|
92
|
+
|
93
|
+
it { subject.must_equal(['']) }
|
86
94
|
end
|
87
95
|
|
88
96
|
describe '#reset' do
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Minitest
|
4
|
+
module Reporters
|
5
|
+
|
6
|
+
class MeanTimeReporter < DefaultReporter
|
7
|
+
|
8
|
+
# @param options [Hash]
|
9
|
+
# @option previous_runs_filename [String] Contains the times for each test
|
10
|
+
# by description. Defaults to '/tmp/minitest_reporters_previous_run'.
|
11
|
+
# @option report_filename [String] Contains the parsed results for the
|
12
|
+
# last test run. Defaults to '/tmp/minitest_reporters_report'.
|
13
|
+
# @return [Minitest::Reporters::MeanTimeReporter]
|
14
|
+
def initialize(options = {})
|
15
|
+
super
|
16
|
+
|
17
|
+
@all_suite_times = []
|
18
|
+
end
|
19
|
+
|
20
|
+
# Copies the suite times from the
|
21
|
+
# {Minitest::Reporters::DefaultReporter#after_suite} method, making them
|
22
|
+
# available to this class.
|
23
|
+
#
|
24
|
+
# @return [Hash<String => Float>]
|
25
|
+
def after_suite(suite)
|
26
|
+
super
|
27
|
+
|
28
|
+
@all_suite_times = @suite_times
|
29
|
+
end
|
30
|
+
|
31
|
+
# Runs the {Minitest::Reporters::DefaultReporter#report} method and then
|
32
|
+
# enhances it by storing the results to the 'previous_runs_filename' and
|
33
|
+
# outputs the parsed results to both the 'report_filename' and the
|
34
|
+
# terminal.
|
35
|
+
#
|
36
|
+
def report
|
37
|
+
super
|
38
|
+
|
39
|
+
create_or_update_previous_runs!
|
40
|
+
|
41
|
+
create_new_report!
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
attr_accessor :all_suite_times
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# @return [Hash<String => Float>]
|
51
|
+
def current_run
|
52
|
+
Hash[all_suite_times]
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Hash] Sets default values for the filenames used by this class.
|
56
|
+
def defaults
|
57
|
+
{
|
58
|
+
previous_runs_filename: '/tmp/minitest_reporters_previous_run',
|
59
|
+
report_filename: '/tmp/minitest_reporters_report',
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
# Added to the top of the report file to be helpful.
|
64
|
+
#
|
65
|
+
# @return [String]
|
66
|
+
def report_header
|
67
|
+
"Samples: #{samples}\n\n"
|
68
|
+
end
|
69
|
+
|
70
|
+
# The report itself. Displays statistic about all runs, ideal for use with
|
71
|
+
# the Unix 'head' command. Listed in slowest average descending order.
|
72
|
+
#
|
73
|
+
# @return [String]
|
74
|
+
def report_body
|
75
|
+
previous_run.each_with_object([]) do |(description, timings), obj|
|
76
|
+
size = timings.size
|
77
|
+
sum = timings.inject { |total, x| total + x }
|
78
|
+
avg = (sum / size).round(9).to_s.ljust(12)
|
79
|
+
min = timings.min.to_s.ljust(12)
|
80
|
+
max = timings.max.to_s.ljust(12)
|
81
|
+
|
82
|
+
obj << "#{avg_label} #{avg} " \
|
83
|
+
"#{min_label} #{min} " \
|
84
|
+
"#{max_label} #{max} " \
|
85
|
+
"#{des_label} #{description}\n"
|
86
|
+
end.sort.reverse.join
|
87
|
+
end
|
88
|
+
|
89
|
+
# @return [Hash]
|
90
|
+
def options
|
91
|
+
defaults.merge!(@options)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @return [Hash<String => Array<Float>]
|
95
|
+
def previous_run
|
96
|
+
@previous_run ||= YAML.load_file(previous_runs_filename)
|
97
|
+
end
|
98
|
+
|
99
|
+
# @return [String] The path to the file which contains all the durations
|
100
|
+
# for each test run. The previous runs file is in YAML format, using the
|
101
|
+
# test name for the key and an array containing the time taken to run
|
102
|
+
# this test for values.
|
103
|
+
#
|
104
|
+
# @return [String]
|
105
|
+
def previous_runs_filename
|
106
|
+
options[:previous_runs_filename]
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns a boolean indicating whether a previous runs file exists.
|
110
|
+
#
|
111
|
+
# @return [Boolean]
|
112
|
+
def previously_ran?
|
113
|
+
File.exist?(previous_runs_filename)
|
114
|
+
end
|
115
|
+
|
116
|
+
# @return [String] The path to the file which contains the parsed test
|
117
|
+
# results. The results file contains a line for each test with the
|
118
|
+
# average time of the test, the minimum time the test took to run,
|
119
|
+
# the maximum time the test took to run and a description of the test
|
120
|
+
# (which is the test name as emitted by Minitest).
|
121
|
+
def report_filename
|
122
|
+
options[:report_filename]
|
123
|
+
end
|
124
|
+
|
125
|
+
# A barbaric way to find out how many runs are in the previous runs file;
|
126
|
+
# this method takes the first test listed, and counts its samples
|
127
|
+
# trusting (naively) all runs to be the same number of samples. This will
|
128
|
+
# produce incorrect averages when new tests are added, so it is advised
|
129
|
+
# to restart the statistics by removing the 'previous runs' file.
|
130
|
+
#
|
131
|
+
# @return [Fixnum]
|
132
|
+
def samples
|
133
|
+
return 1 unless previous_run.first[1].is_a?(Array)
|
134
|
+
|
135
|
+
previous_run.first[1].size
|
136
|
+
end
|
137
|
+
|
138
|
+
# Creates a new 'previous runs' file, or updates the existing one with
|
139
|
+
# the latest timings.
|
140
|
+
#
|
141
|
+
# @return [void]
|
142
|
+
def create_or_update_previous_runs!
|
143
|
+
if previously_ran?
|
144
|
+
current_run.each do |description, elapsed|
|
145
|
+
new_times = if previous_run["#{description}"]
|
146
|
+
Array(previous_run["#{description}"]) << elapsed
|
147
|
+
|
148
|
+
else
|
149
|
+
Array(elapsed)
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
previous_run.store("#{description}", new_times)
|
154
|
+
end
|
155
|
+
|
156
|
+
File.write(previous_runs_filename, previous_run.to_yaml)
|
157
|
+
|
158
|
+
else
|
159
|
+
|
160
|
+
File.write(previous_runs_filename, current_run.to_yaml)
|
161
|
+
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Creates a new report file in the 'report_filename'. This file contains
|
166
|
+
# a line for each test of the following example format:
|
167
|
+
#
|
168
|
+
# Avg: 0.0555555 Min: 0.0498765 Max: 0.0612345 Description: The test name
|
169
|
+
#
|
170
|
+
# Note however the timings are to 9 decimal places, and padded to 12
|
171
|
+
# characters and each label is coloured, Avg (yellow), Min (green),
|
172
|
+
# Max (red) and Description (blue). It looks pretty!
|
173
|
+
#
|
174
|
+
# @return [void]
|
175
|
+
def create_new_report!
|
176
|
+
File.write(report_filename, report_header + report_body)
|
177
|
+
end
|
178
|
+
|
179
|
+
# @return [String] A yellow 'Avg:' label.
|
180
|
+
def avg_label
|
181
|
+
"\e[33mAvg:\e[39m"
|
182
|
+
end
|
183
|
+
|
184
|
+
# @return [String] A blue 'Description:' label.
|
185
|
+
def des_label
|
186
|
+
"\e[34mDescription:\e[39m"
|
187
|
+
end
|
188
|
+
|
189
|
+
# @return [String] A red 'Max:' label.
|
190
|
+
def max_label
|
191
|
+
"\e[31mMax:\e[39m"
|
192
|
+
end
|
193
|
+
|
194
|
+
# @return [String] A green 'Min:' label.
|
195
|
+
def min_label
|
196
|
+
"\e[32mMin:\e[39m"
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -88,11 +88,15 @@ require 'vedeu'
|
|
88
88
|
require 'support/helpers/model_test_class'
|
89
89
|
|
90
90
|
# require 'minitest/reporters'
|
91
|
+
# require 'support/average_duration_reporter'
|
91
92
|
# Minitest::Reporters.use!(
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
93
|
+
# commented out by default (makes tests slower)
|
94
|
+
# Minitest::Reporters::MeanTimeReporter.new({
|
95
|
+
# previous_runs_filename: "/tmp/reports/durations",
|
96
|
+
# report_filename: "/tmp/reports/durations_results"})
|
97
|
+
# Minitest::Reporters::DefaultReporter.new({ color: true,
|
98
|
+
# slow_suite_count: 15 }),
|
99
|
+
# Minitest::Reporters::SpecReporter.new
|
96
100
|
# )
|
97
101
|
|
98
102
|
def test_configuration
|
data/vedeu.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency 'guard', '2.13.0'
|
24
24
|
spec.add_development_dependency 'guard-minitest', '2.4.4'
|
25
25
|
spec.add_development_dependency 'minitest', '5.8.0'
|
26
|
-
spec.add_development_dependency 'minitest-reporters', '1.0
|
26
|
+
spec.add_development_dependency 'minitest-reporters', '1.1.0'
|
27
27
|
spec.add_development_dependency 'mocha', '1.1.0'
|
28
28
|
spec.add_development_dependency 'pry', '0.10.1'
|
29
29
|
spec.add_development_dependency 'rubocop', '0.34.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vedeu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Laking
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0
|
61
|
+
version: 1.1.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.0
|
68
|
+
version: 1.1.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mocha
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -342,6 +342,7 @@ files:
|
|
342
342
|
- lib/vedeu/geometry/area.rb
|
343
343
|
- lib/vedeu/geometry/coordinate.rb
|
344
344
|
- lib/vedeu/geometry/dimension.rb
|
345
|
+
- lib/vedeu/geometry/generic_coordinate.rb
|
345
346
|
- lib/vedeu/geometry/geometries.rb
|
346
347
|
- lib/vedeu/geometry/geometry.rb
|
347
348
|
- lib/vedeu/geometry/grid.rb
|
@@ -521,6 +522,7 @@ files:
|
|
521
522
|
- test/lib/vedeu/geometry/area_test.rb
|
522
523
|
- test/lib/vedeu/geometry/coordinate_test.rb
|
523
524
|
- test/lib/vedeu/geometry/dimension_test.rb
|
525
|
+
- test/lib/vedeu/geometry/generic_coordinate_test.rb
|
524
526
|
- test/lib/vedeu/geometry/geometries_test.rb
|
525
527
|
- test/lib/vedeu/geometry/geometry_test.rb
|
526
528
|
- test/lib/vedeu/geometry/grid_test.rb
|
@@ -625,6 +627,7 @@ files:
|
|
625
627
|
- test/lib/vedeu/terminal/terminal_test.rb
|
626
628
|
- test/lib/vedeu_test.rb
|
627
629
|
- test/support/all_seeds.sh
|
630
|
+
- test/support/average_duration_reporter.rb
|
628
631
|
- test/support/coverage.rb
|
629
632
|
- test/support/helpers/model_test_class.rb
|
630
633
|
- test/support/stats.sh
|
@@ -727,6 +730,7 @@ test_files:
|
|
727
730
|
- test/lib/vedeu/geometry/area_test.rb
|
728
731
|
- test/lib/vedeu/geometry/coordinate_test.rb
|
729
732
|
- test/lib/vedeu/geometry/dimension_test.rb
|
733
|
+
- test/lib/vedeu/geometry/generic_coordinate_test.rb
|
730
734
|
- test/lib/vedeu/geometry/geometries_test.rb
|
731
735
|
- test/lib/vedeu/geometry/geometry_test.rb
|
732
736
|
- test/lib/vedeu/geometry/grid_test.rb
|
@@ -831,6 +835,7 @@ test_files:
|
|
831
835
|
- test/lib/vedeu/terminal/terminal_test.rb
|
832
836
|
- test/lib/vedeu_test.rb
|
833
837
|
- test/support/all_seeds.sh
|
838
|
+
- test/support/average_duration_reporter.rb
|
834
839
|
- test/support/coverage.rb
|
835
840
|
- test/support/helpers/model_test_class.rb
|
836
841
|
- test/support/stats.sh
|