vedeu 0.6.7 → 0.6.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/docs/dsl.md +4 -4
  4. data/lib/vedeu/all.rb +6 -18
  5. data/lib/vedeu/api.rb +14 -13
  6. data/lib/vedeu/bindings/system.rb +5 -4
  7. data/lib/vedeu/buffers/virtual_buffer.rb +13 -11
  8. data/lib/vedeu/configuration/api.rb +4 -3
  9. data/lib/vedeu/cursors/cursor.rb +23 -18
  10. data/lib/vedeu/distributed/client.rb +11 -6
  11. data/lib/vedeu/distributed/server.rb +4 -3
  12. data/lib/vedeu/dsl/keymap.rb +6 -6
  13. data/lib/vedeu/editor/all.rb +19 -0
  14. data/lib/vedeu/{input/editor → editor}/capture.rb +1 -1
  15. data/lib/vedeu/{input/editor → editor}/cropper.rb +0 -0
  16. data/lib/vedeu/{input/editor → editor}/cursor.rb +0 -0
  17. data/lib/vedeu/{input/editor → editor}/document.rb +0 -0
  18. data/lib/vedeu/{input/editor → editor}/documents.rb +0 -0
  19. data/lib/vedeu/{input/editor → editor}/editor.rb +0 -0
  20. data/lib/vedeu/{input/editor → editor}/insert.rb +0 -0
  21. data/lib/vedeu/{input/editor → editor}/line.rb +0 -0
  22. data/lib/vedeu/{input/editor → editor}/lines.rb +0 -0
  23. data/lib/vedeu/error.rb +21 -18
  24. data/lib/vedeu/esc/borders.rb +6 -4
  25. data/lib/vedeu/esc/colours.rb +13 -12
  26. data/lib/vedeu/esc/esc.rb +11 -10
  27. data/lib/vedeu/input/all.rb +15 -0
  28. data/lib/vedeu/input/input.rb +55 -52
  29. data/lib/vedeu/input/key.rb +36 -30
  30. data/lib/vedeu/input/keymap.rb +101 -92
  31. data/lib/vedeu/input/keymaps.rb +10 -6
  32. data/lib/vedeu/input/keys.rb +8 -4
  33. data/lib/vedeu/input/mapper.rb +125 -121
  34. data/lib/vedeu/input/translator.rb +159 -0
  35. data/lib/vedeu/internal_api.rb +16 -15
  36. data/lib/vedeu/logging/all.rb +13 -0
  37. data/lib/vedeu/logging/debug.rb +84 -0
  38. data/lib/vedeu/logging/lockless_log_device.rb +65 -0
  39. data/lib/vedeu/logging/log.rb +179 -0
  40. data/lib/vedeu/logging/mono_logger.rb +26 -0
  41. data/lib/vedeu/logging/timer.rb +68 -0
  42. data/lib/vedeu/menus/all.rb +12 -0
  43. data/lib/vedeu/{dsl/menu.rb → menus/dsl.rb} +19 -18
  44. data/lib/vedeu/menus/menu.rb +234 -0
  45. data/lib/vedeu/{null/menu.rb → menus/null.rb} +6 -6
  46. data/lib/vedeu/menus/repository.rb +18 -0
  47. data/lib/vedeu/models/cell.rb +62 -55
  48. data/lib/vedeu/models/escape.rb +55 -50
  49. data/lib/vedeu/models/page.rb +74 -69
  50. data/lib/vedeu/models/row.rb +55 -51
  51. data/lib/vedeu/models/views/all.rb +1 -0
  52. data/lib/vedeu/models/views/char.rb +1 -1
  53. data/lib/vedeu/models/views/html_char.rb +165 -0
  54. data/lib/vedeu/output/renderers/html.rb +5 -4
  55. data/lib/vedeu/repositories/model.rb +2 -0
  56. data/lib/vedeu/runtime/application.rb +110 -103
  57. data/lib/vedeu/runtime/bootstrap.rb +109 -103
  58. data/lib/vedeu/runtime/flags.rb +45 -41
  59. data/lib/vedeu/runtime/launcher.rb +1 -1
  60. data/lib/vedeu/runtime/main_loop.rb +51 -46
  61. data/lib/vedeu/runtime/traps.rb +20 -16
  62. data/lib/vedeu/version.rb +1 -1
  63. data/lib/vedeu.rb +2 -2
  64. data/test/lib/vedeu/buffers/virtual_buffer_test.rb +1 -1
  65. data/test/lib/vedeu/cursors/cursor_test.rb +11 -5
  66. data/test/lib/vedeu/dsl/interface_test.rb +1 -1
  67. data/test/lib/vedeu/dsl/keymap_test.rb +2 -2
  68. data/test/lib/vedeu/{input/editor → editor}/capture_test.rb +0 -0
  69. data/test/lib/vedeu/{input/editor → editor}/cropper_test.rb +0 -0
  70. data/test/lib/vedeu/{input/editor → editor}/cursor_test.rb +0 -0
  71. data/test/lib/vedeu/{input/editor → editor}/document_test.rb +0 -0
  72. data/test/lib/vedeu/{input/editor → editor}/documents_test.rb +0 -0
  73. data/test/lib/vedeu/{input/editor → editor}/editor_test.rb +0 -0
  74. data/test/lib/vedeu/{input/editor → editor}/insert_test.rb +0 -0
  75. data/test/lib/vedeu/{input/editor → editor}/line_test.rb +0 -0
  76. data/test/lib/vedeu/{input/editor → editor}/lines_test.rb +0 -0
  77. data/test/lib/vedeu/input/input_test.rb +58 -54
  78. data/test/lib/vedeu/input/key_test.rb +29 -25
  79. data/test/lib/vedeu/input/keymap_test.rb +74 -70
  80. data/test/lib/vedeu/input/keymaps_test.rb +8 -4
  81. data/test/lib/vedeu/input/keys_test.rb +12 -8
  82. data/test/lib/vedeu/input/mapper_test.rb +64 -56
  83. data/test/lib/vedeu/input/translator_test.rb +36 -0
  84. data/test/lib/vedeu/logging/debug_test.rb +39 -0
  85. data/test/lib/vedeu/logging/lockless_log_device_test.rb +42 -0
  86. data/test/lib/vedeu/logging/log_test.rb +52 -0
  87. data/test/lib/vedeu/logging/mono_logger_test.rb +43 -0
  88. data/test/lib/vedeu/logging/timer_test.rb +44 -0
  89. data/test/lib/vedeu/{dsl/menu_test.rb → menus/dsl_test.rb} +6 -6
  90. data/test/lib/vedeu/menus/menu_test.rb +305 -0
  91. data/test/lib/vedeu/{null/menu_test.rb → menus/null_test.rb} +5 -5
  92. data/test/lib/vedeu/menus/repository_test.rb +17 -0
  93. data/test/lib/vedeu/models/cell_test.rb +54 -50
  94. data/test/lib/vedeu/models/escape_test.rb +49 -45
  95. data/test/lib/vedeu/models/page_test.rb +167 -160
  96. data/test/lib/vedeu/models/row_test.rb +71 -67
  97. data/test/lib/vedeu/models/views/html_char_test.rb +110 -0
  98. data/test/lib/vedeu/output/compressor_test.rb +44 -22
  99. data/test/lib/vedeu/output/renderers_test.rb +4 -2
  100. data/test/lib/vedeu/runtime/application_test.rb +36 -32
  101. data/test/lib/vedeu/runtime/bootstrap_test.rb +31 -26
  102. data/test/lib/vedeu/runtime/flags_test.rb +33 -29
  103. data/test/lib/vedeu/runtime/launcher_test.rb +4 -2
  104. data/test/lib/vedeu/runtime/main_loop_test.rb +28 -24
  105. data/test/lib/vedeu/runtime/traps_test.rb +8 -4
  106. data/test/test_helper.rb +4 -2
  107. metadata +66 -63
  108. data/lib/vedeu/input/editor/all.rb +0 -19
  109. data/lib/vedeu/input/input_translator.rb +0 -155
  110. data/lib/vedeu/log/debug.rb +0 -79
  111. data/lib/vedeu/log/lockless_log_device.rb +0 -61
  112. data/lib/vedeu/log/log.rb +0 -172
  113. data/lib/vedeu/log/mono_logger.rb +0 -21
  114. data/lib/vedeu/log/timer.rb +0 -63
  115. data/lib/vedeu/models/menu.rb +0 -217
  116. data/lib/vedeu/models/menus.rb +0 -14
  117. data/lib/vedeu/output/html_char.rb +0 -161
  118. data/test/lib/vedeu/input/input_translator_test.rb +0 -32
  119. data/test/lib/vedeu/log/debug_test.rb +0 -35
  120. data/test/lib/vedeu/log/lockless_log_device_test.rb +0 -29
  121. data/test/lib/vedeu/log/log_test.rb +0 -48
  122. data/test/lib/vedeu/log/mono_logger_test.rb +0 -31
  123. data/test/lib/vedeu/log/timer_test.rb +0 -40
  124. data/test/lib/vedeu/models/menu_test.rb +0 -301
  125. data/test/lib/vedeu/models/menus_test.rb +0 -13
  126. data/test/lib/vedeu/output/html_char_test.rb +0 -106
@@ -1,29 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe LocklessLogDevice do
6
-
7
- let(:described) { Vedeu::LocklessLogDevice }
8
- let(:instance) { described.new(file_or_filename) }
9
- let(:file_or_filename) {}
10
-
11
- describe '#initialize' do
12
- # it { instance.must_be_instance_of(described) }
13
- # it {
14
- # instance.instance_variable_get('@file_or_filename').
15
- # must_equal(file_or_filename)
16
- # }
17
- end
18
-
19
- describe '#write' do
20
- subject { instance.write(message) }
21
- end
22
-
23
- describe '#close' do
24
- subject { instance.close }
25
- end
26
-
27
- end # LocklessLogDevice
28
-
29
- end # Vedeu
@@ -1,48 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe Log do
6
-
7
- let(:described) { Vedeu::Log }
8
- let(:_message) { 'Some message...' }
9
- let(:force) { false }
10
- let(:type) { :info }
11
-
12
- describe '.log' do
13
- subject { described.log(message: _message, force: force, type: type) }
14
-
15
- it { subject.must_equal(
16
- "\e[97m[info] \e[39m\e[39mSome message...\e[39m"
17
- ) }
18
- end
19
-
20
- describe '.log_stdout' do
21
- let(:type) { :create }
22
- let(:_message) { 'Logging to stdout...' }
23
-
24
- subject { described.log_stdout(type: type, message: _message) }
25
-
26
- it {
27
- capture_io { subject }.must_equal(
28
- ["\e[92m[create] \e[39m\e[32mLogging to stdout...\e[39m\n", ""]
29
- )
30
- }
31
- end
32
-
33
- describe '.log_stdout' do
34
- let(:type) { :debug }
35
- let(:_message) { 'Logging to stderr...' }
36
-
37
- subject { described.log_stderr(type: type, message: _message) }
38
-
39
- it {
40
- capture_io { subject }.must_equal(
41
- ["", "\e[91m[debug] \e[39m\e[31mLogging to stderr...\e[39m\n"]
42
- )
43
- }
44
- end
45
-
46
- end # Log
47
-
48
- end # Vedeu
@@ -1,31 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe MonoLogger do
6
-
7
- let(:described) { Vedeu::MonoLogger }
8
- let(:instance) { described.new(logdev) }
9
- let(:logdev) {}
10
-
11
- describe '#initialize' do
12
- it { instance.must_be_instance_of(described) }
13
- it { instance.instance_variable_get('@level').must_equal(Logger::DEBUG) }
14
- it {
15
- instance.instance_variable_get('@default_formatter').
16
- must_be_instance_of(Logger::Formatter)
17
- }
18
- it { instance.instance_variable_get('@Formatter').must_equal(nil) }
19
-
20
- context 'when a log device is given' do
21
- # it { instance.instance_variable_get('@logdev').must_be_instance_of(Vedeu::LocklessLogDevice) }
22
- end
23
-
24
- context 'when a log device is not given' do
25
- # it { instance.instance_variable_get('@logdev').must_be_instance_of(Vedeu::LocklessLogDevice) }
26
- end
27
- end
28
-
29
- end # MonoLogger
30
-
31
- end # Vedeu
@@ -1,40 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe Timer do
6
-
7
- let(:described) { Vedeu::Timer }
8
- let(:instance) { described.new(_message) }
9
- let(:_message) { 'Testing' }
10
- let(:_time) { mock('Time') }
11
- let(:started) { 1434492219.5238185 }
12
-
13
- before do
14
- Time.stubs(:now).returns(_time)
15
- _time.stubs(:to_f).returns(started)
16
- end
17
-
18
- describe '#initialize' do
19
- it { instance.must_be_instance_of(described) }
20
- it { instance.instance_variable_get('@message').must_equal(_message) }
21
- it { instance.instance_variable_get('@started').must_equal(started) }
22
- end
23
-
24
- describe '.timer' do
25
- it { described.must_respond_to(:timer) }
26
- end
27
-
28
- describe '#measure' do
29
- subject { instance.measure { } }
30
-
31
- it {
32
- Vedeu.expects(:log).with(type: :timer,
33
- message: "Testing took 0.0ms.")
34
- subject
35
- }
36
- end
37
-
38
- end # Timer
39
-
40
- end # Vedeu
@@ -1,301 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe Menu do
6
-
7
- let(:described) { Vedeu::Menu }
8
- let(:instance) { described.new(attributes) }
9
- let(:attributes) {
10
- {
11
- collection: collection,
12
- name: menu_name,
13
- current: current,
14
- selected: selected,
15
- }
16
- }
17
- let(:collection) { ['hydrogen', 'carbon', 'nitrogen', 'oxygen'] }
18
- let(:menu_name) { 'elements' }
19
- let(:current) { 0 }
20
- let(:selected) {}
21
-
22
- describe '.menu' do
23
- subject {
24
- described.menu('elements') do
25
- # ...
26
- end
27
- }
28
-
29
- it { subject.must_be_instance_of(described) }
30
-
31
- context 'when the block is not given' do
32
- subject { described.menu }
33
-
34
- it { proc { subject }.must_raise(Vedeu::Error::InvalidSyntax) }
35
- end
36
- end
37
-
38
- describe '#initialize' do
39
- it { instance.must_be_instance_of(described) }
40
- it {
41
- instance.instance_variable_get('@collection').must_equal(collection)
42
- }
43
- it { instance.instance_variable_get('@name').must_equal('elements') }
44
- it { instance.instance_variable_get('@current').must_equal(0) }
45
- it { instance.instance_variable_get('@selected').must_equal(nil) }
46
- it do
47
- instance.instance_variable_get('@repository').must_equal(Vedeu.menus)
48
- end
49
- end
50
-
51
- describe 'accessors' do
52
- it { instance.must_respond_to(:collection) }
53
- it { instance.must_respond_to(:collection=) }
54
- it { instance.must_respond_to(:current=) }
55
- it { instance.must_respond_to(:name) }
56
- it { instance.must_respond_to(:name=) }
57
- end
58
-
59
- describe '#current' do
60
- subject { instance.current }
61
-
62
- it 'returns the current index' do
63
- subject.must_equal(0)
64
- end
65
- end
66
-
67
- describe '#selected' do
68
- subject { instance.selected }
69
-
70
- it 'returns nil when no item is selected' do
71
- subject.must_equal(nil)
72
- end
73
-
74
- it 'returns the selected index when an item is selected' do
75
- instance.next_item
76
- instance.select_item
77
-
78
- subject.must_equal(1)
79
- end
80
- end
81
-
82
- describe '#selected=' do
83
- it { instance.must_respond_to(:selected=) }
84
- end
85
-
86
- describe '#current_item' do
87
- subject { instance.current_item }
88
-
89
- it 'returns the current item from the collection' do
90
- subject.must_equal('hydrogen')
91
- end
92
-
93
- it 'when the current item has changed' do
94
- instance.next_item
95
- instance.next_item
96
-
97
- subject.must_equal('nitrogen')
98
- end
99
- end
100
-
101
- describe '#selected_item' do
102
- subject { instance.selected_item }
103
-
104
- it 'returns nil when nothing is selected' do
105
- subject.must_equal(nil)
106
- end
107
-
108
- it 'returns the selected item from the collection' do
109
- instance.next_item
110
- instance.select_item
111
-
112
- subject.must_equal('carbon')
113
- end
114
- end
115
-
116
- describe '#items' do
117
- it 'returns a collection of items' do
118
- instance.items.must_equal(
119
- [
120
- [false, true, 'hydrogen'],
121
- [false, false, 'carbon'],
122
- [false, false, 'nitrogen'],
123
- [false, false, 'oxygen']
124
- ]
125
- )
126
- end
127
-
128
- it 'returns a collection of items when the current has ' \
129
- 'changed' do
130
- instance.next_item
131
- instance.items.must_equal(
132
- [
133
- [false, false, 'hydrogen'],
134
- [false, true, 'carbon'],
135
- [false, false, 'nitrogen'],
136
- [false, false, 'oxygen']
137
- ]
138
- )
139
- end
140
-
141
- it 'returns a collection of items when an item is selected' do
142
- instance.next_item
143
- instance.select_item
144
- instance.items.must_equal(
145
- [
146
- [false, false, 'hydrogen'],
147
- [true, true, 'carbon'],
148
- [false, false, 'nitrogen'],
149
- [false, false, 'oxygen']
150
- ]
151
- )
152
- end
153
-
154
- it 'returns a collection of items when the current has ' \
155
- 'changed and an item is selected' do
156
- instance.next_item
157
- instance.select_item
158
- instance.next_item
159
- instance.next_item
160
- instance.items.must_equal(
161
- [
162
- [false, false, 'hydrogen'],
163
- [true, false, 'carbon'],
164
- [false, false, 'nitrogen'],
165
- [false, true, 'oxygen']
166
- ]
167
- )
168
- end
169
- end
170
-
171
- describe '#view' do
172
- it 'returns a collection of items when the start position ' \
173
- 'has changed' do
174
- instance.top_item
175
- instance.next_item
176
- instance.view.must_equal(
177
- [
178
- [false, true, 'carbon'],
179
- [false, false, 'nitrogen'],
180
- [false, false, 'oxygen']
181
- ]
182
- )
183
- end
184
- end
185
-
186
- describe '#top_item' do
187
- it 'sets current to the index of the first item' do
188
- instance.next_item
189
- instance.top_item
190
- instance.current.must_equal(0)
191
- end
192
-
193
- it 'returns the items' do
194
- instance.top_item.must_equal(instance.items)
195
- end
196
- end
197
-
198
- describe '#bottom_item' do
199
- it 'sets current to the index of the last item' do
200
- instance.bottom_item
201
- instance.current.must_equal(3)
202
- end
203
-
204
- it 'returns the items' do
205
- instance.bottom_item.must_equal(instance.items)
206
- end
207
- end
208
-
209
- describe '#next_item' do
210
- it 'sets the current to the index of the next item' do
211
- instance.next_item
212
- instance.current.must_equal(1)
213
- end
214
-
215
- it 'returns the items' do
216
- instance.next_item.must_equal(instance.items)
217
- end
218
-
219
- it 'does not loop' do
220
- instance.next_item
221
- instance.next_item
222
- instance.next_item
223
- instance.next_item
224
- instance.next_item
225
- instance.current.must_equal(3)
226
- end
227
- end
228
-
229
- describe '#prev_item' do
230
- it 'does not loop' do
231
- instance.prev_item
232
- instance.current.must_equal(0)
233
- end
234
-
235
- it 'sets the current to the index of the previous item' do
236
- instance.next_item
237
- instance.next_item
238
- instance.prev_item
239
- instance.current.must_equal(1)
240
- end
241
-
242
- it 'returns the items' do
243
- instance.prev_item.must_equal(instance.items)
244
- end
245
-
246
- it 'does not loop' do
247
- instance.next_item
248
- instance.next_item
249
- instance.next_item
250
- instance.prev_item
251
- instance.prev_item
252
- instance.current.must_equal(1)
253
- end
254
- end
255
-
256
- describe '#select_item' do
257
- it 'sets the selected index to the current index' do
258
- instance.select_item
259
- instance.selected.must_equal(0)
260
- end
261
-
262
- it 'sets the selected index to the current index' do
263
- instance.next_item
264
- instance.select_item
265
- instance.selected.must_equal(1)
266
- end
267
-
268
- it 'returns the items' do
269
- instance.select_item.must_equal(instance.items)
270
- end
271
- end
272
-
273
- describe '#deselect_item' do
274
- it 'sets the selected index to nil' do
275
- instance.next_item
276
- instance.next_item
277
- instance.select_item
278
- instance.deselect_item
279
- instance.selected.must_equal(nil)
280
- end
281
-
282
- it 'returns the items' do
283
- instance.deselect_item.must_equal(instance.items)
284
- end
285
- end
286
-
287
- describe '#last' do
288
- it 'returns the index of the last item' do
289
- instance.last.must_equal(3)
290
- end
291
- end
292
-
293
- describe '#size' do
294
- it 'returns the collection size' do
295
- instance.size.must_equal(4)
296
- end
297
- end
298
-
299
- end # Menu
300
-
301
- end # Vedeu
@@ -1,13 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe Menus do
6
-
7
- let(:described) { Vedeu::Menus }
8
-
9
- it { described.must_respond_to(:menus) }
10
-
11
- end # Menus
12
-
13
- end # Vedeu
@@ -1,106 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe HTMLChar do
6
-
7
- let(:described) { Vedeu::HTMLChar }
8
- let(:instance) { described.new(char, options) }
9
- let(:char) { Vedeu::Views::Char.new(attributes) }
10
- let(:options) {
11
- {
12
- start_tag: '<td',
13
- end_tag: '</td>',
14
- }
15
- }
16
- let(:attributes) {
17
- {
18
- border: border,
19
- colour: colour,
20
- parent: parent,
21
- value: _value
22
- }
23
- }
24
- let(:border) {}
25
- let(:colour) {}
26
- let(:parent) { Vedeu::Views::Line.new(colour: parent_colour) }
27
- let(:parent_colour) {}
28
- let(:_value) {}
29
-
30
- describe '#initialize' do
31
- it { instance.must_be_instance_of(described) }
32
- it { instance.instance_variable_get('@char').must_equal(char) }
33
- it { instance.instance_variable_get('@options').must_equal(options) }
34
- end
35
-
36
- describe '.render' do
37
- subject { described.render(char, options) }
38
-
39
- it { subject.must_be_instance_of(String) }
40
-
41
- context 'when there is a border' do
42
- let(:border) { :top_left }
43
-
44
- context 'when there is a colour' do
45
- let(:colour) {
46
- Vedeu::Colours::Colour.new(background: '#220022',
47
- foreground: '#aadd00')
48
- }
49
-
50
- it { subject.must_equal(
51
- "<td style='" \
52
- "border:1px #220022 solid;" \
53
- "background:#220022;" \
54
- "color:#aadd00;" \
55
- "border-top:1px #aadd00 solid;" \
56
- "border-left:1px #aadd00 solid;" \
57
- "'>&nbsp;</td>"
58
- ) }
59
- end
60
-
61
- context 'when there is no colour' do
62
- context 'when there is a parent colour' do
63
- let(:parent_colour) {
64
- Vedeu::Colours::Colour.new(background: '#002222',
65
- foreground: '#dd2200')
66
- }
67
-
68
- it { subject.must_equal(
69
- "<td style='" \
70
- "border:1px #002222 solid;" \
71
- "background:#002222;" \
72
- "color:#dd2200;" \
73
- "border-top:1px #dd2200 solid;" \
74
- "border-left:1px #dd2200 solid;" \
75
- "'>&nbsp;</td>"
76
- ) }
77
- end
78
-
79
- context 'when there is no parent colour' do
80
- it { subject.must_equal("<td style=''>&nbsp;</td>") }
81
- end
82
- end
83
- end
84
-
85
- context 'when there is no border' do
86
- context 'when there is no value' do
87
- it { subject.must_equal('<td>&nbsp;</td>') }
88
- end
89
-
90
- context 'when the value is empty' do
91
- let(:_value) { '' }
92
-
93
- it { subject.must_equal('<td>&nbsp;</td>') }
94
- end
95
-
96
- context 'when there is a value' do
97
- let(:_value) { 'a' }
98
-
99
- it { subject.must_equal("<td style=''>a</td>") }
100
- end
101
- end
102
- end
103
-
104
- end # HTMLChar
105
-
106
- end # Vedeu