vedeu 0.3.0 → 0.3.1

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/examples/borders_app.rb +60 -56
  3. data/lib/vedeu/buffers/all.rb +1 -0
  4. data/lib/vedeu/configuration/configuration.rb +2 -4
  5. data/lib/vedeu/cursor/all.rb +3 -6
  6. data/lib/vedeu/cursor/cursor.rb +4 -3
  7. data/lib/vedeu/cursor/move_cursor.rb +7 -4
  8. data/lib/vedeu/cursor/toggle_cursor.rb +0 -1
  9. data/lib/vedeu/dsl/components/border.rb +99 -0
  10. data/lib/vedeu/dsl/components/geometry.rb +1 -0
  11. data/lib/vedeu/dsl/components/keymap.rb +1 -1
  12. data/lib/vedeu/dsl/composition.rb +7 -12
  13. data/lib/vedeu/dsl/interface.rb +7 -8
  14. data/lib/vedeu/dsl/line.rb +1 -10
  15. data/lib/vedeu/dsl/stream.rb +0 -2
  16. data/lib/vedeu/input/key.rb +10 -6
  17. data/lib/vedeu/input/keymap.rb +10 -8
  18. data/lib/vedeu/models/menu.rb +0 -2
  19. data/lib/vedeu/models/model.rb +20 -0
  20. data/lib/vedeu/models/view/composition.rb +4 -17
  21. data/lib/vedeu/models/view/interface.rb +9 -21
  22. data/lib/vedeu/models/view/line.rb +4 -17
  23. data/lib/vedeu/models/view/stream.rb +4 -17
  24. data/lib/vedeu/output/all.rb +1 -0
  25. data/lib/vedeu/output/border.rb +2 -2
  26. data/lib/vedeu/output/compositor.rb +0 -4
  27. data/lib/vedeu/output/wordwrap.rb +146 -0
  28. data/lib/vedeu/repositories/repository.rb +3 -2
  29. data/lib/vedeu/support/console.rb +29 -6
  30. data/lib/vedeu/support/content_geometry.rb +2 -0
  31. data/lib/vedeu/support/coordinate.rb +9 -4
  32. data/lib/vedeu/support/position_validator.rb +28 -7
  33. data/lib/vedeu/support/sentence.rb +21 -1
  34. data/lib/vedeu/support/terminal.rb +0 -2
  35. data/lib/vedeu/support/trace.rb +48 -2
  36. data/lib/vedeu/support/visible.rb +2 -0
  37. data/test/lib/vedeu/cursor/all_test.rb +1 -1
  38. data/test/lib/vedeu/events/event_test.rb +7 -29
  39. data/test/lib/vedeu/input/key_test.rb +3 -3
  40. data/test/lib/vedeu/input/keymap_test.rb +3 -3
  41. data/test/lib/vedeu/output/wordwrap_test.rb +266 -0
  42. data/test/lib/vedeu/presentation/colour_test.rb +68 -33
  43. data/test/lib/vedeu/support/common_test.rb +10 -0
  44. data/test/lib/vedeu/support/console_test.rb +82 -0
  45. data/test/lib/vedeu/support/position_validator_test.rb +13 -0
  46. data/test/support/helpers/all.rb +0 -1
  47. data/vedeu.gemspec +8 -8
  48. metadata +19 -18
  49. data/test/support/helpers/misc.rb +0 -15
@@ -29,20 +29,29 @@ module Vedeu
29
29
 
30
30
  attr_accessor :x, :y
31
31
 
32
+ # @param interface [Interface]
33
+ # @param x [Fixnum]
34
+ # @param y [Fixnum]
35
+ # @return [PositionValidator]
32
36
  def self.validate(interface, x, y)
33
37
  new(interface, x, y).validate
34
38
  end
35
39
 
40
+ # @param interface [Interface]
41
+ # @param x [Fixnum]
42
+ # @param y [Fixnum]
43
+ # @return [PositionValidator]
36
44
  def initialize(interface, x, y)
37
45
  @interface = interface
38
46
  @x = x
39
47
  @y = y
40
48
  end
41
49
 
50
+ # @return [PositionValidator]
42
51
  def validate
43
52
  terminal_validation
44
53
  interface_validation
45
- border_validation
54
+ border_validation if border?
46
55
 
47
56
  self
48
57
  end
@@ -66,14 +75,26 @@ module Vedeu
66
75
  end
67
76
 
68
77
  def border_validation
69
- if border?
70
- @x = left + 1 if left? && x < (left + 1)
71
- @x = right - 2 if right? && x > (right - 1)
72
- @y = top + 1 if top? && y < (top + 1)
73
- @y = bottom - 2 if bottom? && y > (bottom - 1)
74
- end
78
+ @x = left + 1 if left? && x < (left + 1)
79
+ @x = right - 2 if right? && x > (right - 1)
80
+ @y = top + 1 if top? && y < (top + 1)
81
+ @y = bottom - 2 if bottom? && y > (bottom - 1)
75
82
  end
76
83
 
84
+ # def x
85
+ # @x = [[[[@x, tx].max, txn].min, left].max, right].min
86
+ # @x = border? && left? ? [@x, (left + 1)].max : @x
87
+ # @x = border? && right? ? [@x, (right - 2)].min : @x
88
+ # @x
89
+ # end
90
+
91
+ # def y
92
+ # @y = [[[[@y, ty].max, tyn].min, top].max, bottom].min
93
+ # @y = border? && top? ? [@y, (top + 1)].max : @y
94
+ # @y = border? && bottom? ? [@y, (bottom - 2)].min : @y
95
+ # @y
96
+ # end
97
+
77
98
  end # PositionValidator
78
99
 
79
100
  end # Vedeu
@@ -1,19 +1,32 @@
1
1
  module Vedeu
2
2
 
3
+ # Take a collection of words (elements) and form a sentence from them.
4
+ #
5
+ # @example
6
+ # elements = ['Hydrogen', 'Helium', 'Lithium']
7
+ # Vedeu::Sentence.construct(elements) # => 'Hydrogen, Helium and Lithium'
8
+ #
3
9
  class Sentence
4
10
 
5
11
  class << self
6
12
 
13
+ # @param elements [Array]
14
+ # @param label [String]
15
+ # @return [String]
7
16
  def construct(elements, label = 'elements')
8
17
  new(elements, label).construct
9
18
  end
10
19
 
11
- end # Sentence eigenclass
20
+ end
12
21
 
22
+ # @param elements [Array]
23
+ # @param label [String]
24
+ # @return [Vedeu::Sentence]
13
25
  def initialize(elements, label)
14
26
  @elements, @label = elements, label
15
27
  end
16
28
 
29
+ # @return [String]
17
30
  def construct
18
31
  if one?
19
32
  first
@@ -34,30 +47,37 @@ module Vedeu
34
47
 
35
48
  attr_reader :elements, :label
36
49
 
50
+ # @return [Boolean]
37
51
  def one?
38
52
  count == 1
39
53
  end
40
54
 
55
+ # @return [Boolean]
41
56
  def two?
42
57
  count == 2
43
58
  end
44
59
 
60
+ # @return [Boolean]
45
61
  def many?
46
62
  count > 2
47
63
  end
48
64
 
65
+ # @return [String]
49
66
  def but_last
50
67
  elements[0...-1].join(', ')
51
68
  end
52
69
 
70
+ # @return [String]
53
71
  def first
54
72
  elements.first
55
73
  end
56
74
 
75
+ # @return [String]
57
76
  def last
58
77
  elements[-1]
59
78
  end
60
79
 
80
+ # @return [Fixnum]
61
81
  def count
62
82
  elements.size
63
83
  end
@@ -1,5 +1,4 @@
1
1
  require 'vedeu/configuration/configuration'
2
- require 'vedeu/support/common'
3
2
  require 'vedeu/support/esc'
4
3
  require 'vedeu/support/log'
5
4
 
@@ -11,7 +10,6 @@ module Vedeu
11
10
  # @api private
12
11
  module Terminal
13
12
 
14
- include Vedeu::Common
15
13
  extend self
16
14
 
17
15
  # Opens a terminal screen in either `raw` or `cooked` mode. On exit,
@@ -166,40 +166,86 @@ module Vedeu
166
166
  # 'Vedeu::API',
167
167
  # 'Vedeu::Application',
168
168
  # 'Vedeu::Background',
169
+ # 'Vedeu::Bindings',
170
+ # 'Vedeu::Border',
171
+ # 'Vedeu::BoundingArea',
172
+ # 'Vedeu::Buffer',
173
+ # 'Vedeu::Char',
174
+ # 'Vedeu::Chars',
169
175
  'Vedeu::Coercions',
170
176
  'Vedeu::Colour',
171
- 'Vedeu::Translator',
172
177
  'Vedeu::Common',
173
178
  # 'Vedeu::Composition',
174
179
  # 'Vedeu::Compositor',
180
+ # 'Vedeu::Config::API',
181
+ # 'Vedeu::Config::CLI',
175
182
  'Vedeu::Configuration',
183
+ # 'Vedeu::Console',
184
+ # 'Vedeu::ContentGeometry',
185
+ # 'Vedeu::Coordinate',
176
186
  # 'Vedeu::Cursor',
177
- # 'Vedeu::Cursors',
187
+ # 'Vedeu::DisplayBuffer',
188
+ # 'Vedeu::DSL::Border',
189
+ # 'Vedeu::DSL::Colour',
190
+ # 'Vedeu::DSL::Composition',
191
+ # 'Vedeu::DSL::Geometry',
192
+ # 'Vedeu::DSL::Interface',
193
+ # 'Vedeu::DSL::Keymap',
194
+ # 'Vedeu::DSL::Line',
195
+ # 'Vedeu::DSL::Menu',
196
+ # 'Vedeu::DSL::Stream',
197
+ # 'Vedeu::DSL::Style',
198
+ # 'Vedeu::DSL::Text',
199
+ # 'Vedeu::DSL::Use',
200
+ # 'Vedeu::DSL::View',
178
201
  'Vedeu::Esc',
179
202
  'Vedeu::Event',
180
203
  # 'Vedeu::Focus',
181
204
  # 'Vedeu::Foreground',
182
205
  'Vedeu::Geometry',
183
206
  # 'Vedeu::Grid',
207
+ # 'Vedeu::Group',
184
208
  # 'Vedeu::Input',
185
209
  # 'Vedeu::Interface',
210
+ # 'Vedeu::Interfaces',
186
211
  # 'Vedeu::Keymap',
212
+ # 'Vedeu::Keys',
213
+ # 'Vedeu::Key',
187
214
  # 'Vedeu::Launcher',
188
215
  # 'Vedeu::Line',
216
+ # 'Vedeu::Lines',
189
217
  'Vedeu::Log',
218
+ # 'Vedeu::Mapper',
190
219
  # 'Vedeu::Menu',
191
220
  # 'Vedeu::Menus',
221
+ # 'Vedeu::Model',
222
+ # 'Vedeu::Model::Collection',
223
+ # 'Vedeu::MoveCursor',
224
+ # 'Vedeu::Node',
225
+ # 'Vedeu::Output',
192
226
  'Vedeu::Position',
227
+ # 'Vedeu::PositionValidator',
193
228
  'Vedeu::Presentation',
229
+ # 'Vedeu::Read',
194
230
  # 'Vedeu::Refresh',
195
231
  # 'Vedeu::Render',
196
232
  'Vedeu::Repository',
233
+ # 'Vedeu::Sentence',
197
234
  'Vedeu::Stream',
235
+ # 'Vedeu::Streams',
198
236
  'Vedeu::Style',
199
237
  'Vedeu::Terminal',
238
+ # 'Vedeu::Text',
239
+ # 'Vedeu::ToggleCursor',
200
240
  'Vedeu::Trace',
241
+ 'Vedeu::Translator',
242
+ # 'Vedeu::Traps',
243
+ # 'Vedeu::Trigger',
201
244
  # 'Vedeu::View',
202
245
  # 'Vedeu::Viewport',
246
+ # 'Vedeu::Visible',
247
+ # 'Vedeu::Write',
248
+ # 'Vedeu::Writer',
203
249
  ]
204
250
  end
205
251
 
@@ -47,10 +47,12 @@ module Vedeu
47
47
  end
48
48
  end
49
49
 
50
+ # @return [Boolean]
50
51
  def visible?
51
52
  @visible
52
53
  end
53
54
 
55
+ # @return [Boolean]
54
56
  def invisible?
55
57
  !@visible
56
58
  end
@@ -27,7 +27,7 @@ module Vedeu
27
27
  describe '.cursors' do
28
28
  subject { Vedeu.cursors }
29
29
 
30
- it { subject.must_be_instance_of(Vedeu::Cursors) }
30
+ it { subject.must_be_instance_of(Vedeu::Repository) }
31
31
  end
32
32
 
33
33
  end # Vedeu
@@ -16,26 +16,6 @@ module Vedeu
16
16
  it { subject.must_be_instance_of(TrueClass) }
17
17
  end
18
18
 
19
- # describe '.unbind' do
20
- # let(:event_name) { :chlorine }
21
-
22
- # before do
23
- # Vedeu.bind(:chlorine) { :some_event }
24
- # end
25
-
26
- # subject { instance.unbind(event_name) }
27
-
28
- # context 'when the event exists' do
29
- # it { subject.must_be_instance_of(TrueClass) }
30
- # end
31
-
32
- # context 'when the event does not exist' do
33
- # let(:event_name) { :does_not_exist }
34
-
35
- # it { subject.must_be_instance_of(FalseClass) }
36
- # end
37
- # end
38
-
39
19
  describe '#initialize' do
40
20
  subject { instance }
41
21
 
@@ -67,20 +47,20 @@ module Vedeu
67
47
  it 'returns the result of calling the closure when debouncing' do
68
48
  event = Event.new(event_name, { debounce: 0.0025 }, closure)
69
49
  event.trigger.must_equal(nil)
70
- sleep 0.0015
50
+ sleep 0.001
71
51
  event.trigger.must_equal(nil)
72
- sleep 0.0015
52
+ sleep 0.001
73
53
  event.trigger.must_equal(:event_triggered)
74
- sleep 0.0015
54
+ sleep 0.001
75
55
  event.trigger.must_equal(nil)
76
56
  end
77
57
 
78
58
  it 'returns the result of calling the closure when throttling' do
79
- event = Event.new(event_name, { delay: 0.0025 }, closure)
59
+ event = Event.new(event_name, { delay: 0.002 }, closure)
80
60
  event.trigger.must_equal(:event_triggered)
81
- sleep 0.0015
61
+ sleep 0.001
82
62
  event.trigger.must_equal(nil)
83
- sleep 0.0015
63
+ sleep 0.001
84
64
  event.trigger.must_equal(:event_triggered)
85
65
  end
86
66
 
@@ -92,9 +72,7 @@ module Vedeu
92
72
 
93
73
  describe '#unbind' do
94
74
  context 'when the event exists' do
95
- before do
96
- Vedeu.bind(:gallium) { :some_action }
97
- end
75
+ before { Vedeu.bind(:gallium) { :some_action } }
98
76
 
99
77
  it { Vedeu.unbind(:gallium).must_equal(true) }
100
78
  end
@@ -8,13 +8,13 @@ module Vedeu
8
8
  let(:instance) { described.new(input) { :output } }
9
9
  let(:input) { 'a' }
10
10
 
11
- describe '.define' do
12
- subject { described.define(input) { :output } }
11
+ describe '.build' do
12
+ subject { described.build(input) { :output } }
13
13
 
14
14
  it { subject.must_be_instance_of(Key) }
15
15
 
16
16
  context 'when the required block is not given' do
17
- subject { described.define(input) }
17
+ subject { described.build(input) }
18
18
 
19
19
  it { proc { subject }.must_raise(InvalidSyntax) }
20
20
  end
@@ -15,7 +15,7 @@ module Vedeu
15
15
 
16
16
  it { subject.must_be_instance_of(Keymap) }
17
17
  it { subject.instance_variable_get('@name').must_equal(map_name) }
18
- it { subject.instance_variable_get('@keys').must_be_instance_of(Vedeu::Model::Collection) }
18
+ it { subject.instance_variable_get('@keys').must_be_instance_of(Array) }
19
19
  it { subject.instance_variable_get('@repository').must_equal(Vedeu.keymaps) }
20
20
  end
21
21
 
@@ -32,7 +32,7 @@ module Vedeu
32
32
  end
33
33
 
34
34
  context 'when the key is not already defined' do
35
- it { subject.must_be_instance_of(Vedeu::Model::Collection) }
35
+ it { subject.must_be_instance_of(Vedeu::Keys) }
36
36
  end
37
37
  end
38
38
 
@@ -75,7 +75,7 @@ module Vedeu
75
75
  describe '#keys' do
76
76
  subject { instance.keys }
77
77
 
78
- it { subject.must_be_instance_of(Vedeu::Model::Collection) }
78
+ it { subject.must_be_instance_of(Vedeu::Keys) }
79
79
  end
80
80
 
81
81
  describe '#name' do
@@ -0,0 +1,266 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Wordwrap do
6
+
7
+ let(:described) { Vedeu::Wordwrap }
8
+ let(:instance) { described.new(text, options) }
9
+ let(:text) { '' }
10
+ let(:options) {
11
+ {
12
+ ellipsis: '...',
13
+ width: width,
14
+ }
15
+ }
16
+ let(:width) { 30 }
17
+
18
+ let(:text_line) {
19
+ "Krypton (from Greek: κρυπτός kryptos 'the hidden one')."
20
+ }
21
+ let(:text_block) {
22
+ "Krypton (from Greek: κρυπτός kryptos 'the hidden one') is a chemical " \
23
+ "element with symbol Kr and atomic number 36. It is a member of group " \
24
+ "18 (noble gases) elements."
25
+ }
26
+ let(:text_newlines) {
27
+ "Krypton is a colorless, odorless, tasteless noble gas.\n" \
28
+ "It occurs in trace amounts in the atmosphere.\n" \
29
+ "It is isolated by fractionally distilling liquefied air.\n" \
30
+ "Krypton is often used with other rare gases in fluorescent lamps.\n"
31
+ }
32
+ let(:text_blanklines) {
33
+ "Krypton (from Greek: κρυπτός kryptos 'the hidden one').\n\n" \
34
+ "It is a chemical element with symbol Kr and atomic number 36.\n" \
35
+ "It is a member of group 18 (noble gases) elements.\n\n" \
36
+ "-- Wikipedia"
37
+ }
38
+ let(:text_line_objects) {
39
+ [
40
+ Vedeu::Line.new("Krypton is a colorless, odorless, tasteless noble gas."),
41
+ Vedeu::Line.new("It occurs in trace amounts in the atmosphere."),
42
+ Vedeu::Line.new("It is isolated by fractionally distilling liquefied air."),
43
+ Vedeu::Line.new("Krypton is often used with other rare gases in fluorescent lamps.")
44
+ ]
45
+ }
46
+
47
+ describe '#initialize' do
48
+ subject { instance }
49
+
50
+ it { subject.must_be_instance_of(described) }
51
+ it { subject.instance_variable_get('@text').must_equal(text) }
52
+ it { subject.instance_variable_get('@options').must_equal(options) }
53
+ end
54
+
55
+ describe '#prune' do
56
+ let(:text) { text_line }
57
+
58
+ subject { instance.prune }
59
+
60
+ context 'when the text is <= the pruning width' do
61
+ let(:width) { 80 }
62
+
63
+ it { subject.must_be_instance_of(String) }
64
+
65
+ it { subject.must_equal(
66
+ "Krypton (from Greek: κρυπτός kryptos 'the hidden one')."
67
+ ) }
68
+ end
69
+
70
+ context 'when the text is > the pruning width' do
71
+ context 'with a single line of text' do
72
+ it { subject.must_equal("Krypton (from Greek: κρυπτός...") }
73
+ end
74
+
75
+ context 'with a text block' do
76
+ let(:text) { text_block }
77
+
78
+ it { subject.must_equal("Krypton (from Greek: κρυπτός...") }
79
+ end
80
+
81
+ context 'with a text block containing newlines' do
82
+ let(:text) { text_newlines }
83
+
84
+ it { subject.must_equal([
85
+ "Krypton is a colorless, odor...",
86
+ "It occurs in trace amounts i...",
87
+ "It is isolated by fractional...",
88
+ "Krypton is often used with o..."
89
+ ])
90
+ }
91
+ end
92
+
93
+ context 'with a text block containing newlines and blank lines' do
94
+ let(:text) { text_blanklines }
95
+
96
+ it { subject.must_equal([
97
+ "Krypton (from Greek: κρυπτός...",
98
+ "",
99
+ "It is a chemical element wit...",
100
+ "It is a member of group 18 (...",
101
+ "",
102
+ "-- Wikipedia..."
103
+ ])
104
+ }
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#wrap' do
110
+ subject { instance.wrap }
111
+
112
+ context 'with a single line of text' do
113
+ let(:text) { text_line }
114
+
115
+ it { subject.must_equal([
116
+ "Krypton (from Greek: κρυπτός",
117
+ "kryptos 'the hidden one')."
118
+ ])
119
+ }
120
+ end
121
+
122
+ context 'with a text block' do
123
+ let(:text) { text_block }
124
+
125
+ it { subject.must_equal([
126
+ "Krypton (from Greek: κρυπτός",
127
+ "kryptos 'the hidden one') is",
128
+ "a chemical element with",
129
+ "symbol Kr and atomic number",
130
+ "36. It is a member of group",
131
+ "18 (noble gases) elements."
132
+ ])
133
+ }
134
+ end
135
+
136
+ context 'with a text block containing newlines' do
137
+ let(:text) { text_newlines }
138
+
139
+ it { subject.must_equal([
140
+ "Krypton is a colorless,",
141
+ "odorless, tasteless noble",
142
+ "gas.",
143
+ "It occurs in trace amounts",
144
+ "in the atmosphere.",
145
+ "It is isolated by",
146
+ "fractionally distilling",
147
+ "liquefied air.",
148
+ "Krypton is often used with",
149
+ "other rare gases in",
150
+ "fluorescent lamps."
151
+ ])
152
+ }
153
+ end
154
+
155
+ context 'with a text block containing newlines and blank lines' do
156
+ let(:text) { text_blanklines }
157
+
158
+ it { subject.must_equal([
159
+ "Krypton (from Greek: κρυπτός",
160
+ "kryptos 'the hidden one').",
161
+ "",
162
+ "It is a chemical element",
163
+ "with symbol Kr and atomic",
164
+ "number 36.",
165
+ "It is a member of group 18",
166
+ "(noble gases) elements.",
167
+ "",
168
+ "-- Wikipedia"
169
+ ])
170
+ }
171
+ end
172
+ end
173
+
174
+ describe '#as_lines' do
175
+ subject { instance.as_lines }
176
+
177
+ it { subject.must_be_instance_of(Vedeu::Lines) }
178
+
179
+ context 'with a single line of text' do
180
+ let(:text) { text_line }
181
+
182
+ it { subject.size.must_equal(1) }
183
+ end
184
+
185
+ context 'with a text block' do
186
+ let(:text) { text_block }
187
+
188
+ it { subject.size.must_equal(1) }
189
+ end
190
+
191
+ context 'with a text block containing newlines' do
192
+ let(:text) { text_newlines }
193
+
194
+ it { subject.size.must_equal(4) }
195
+ end
196
+
197
+ context 'with a text block containing newlines and blank lines' do
198
+ let(:text) { text_blanklines }
199
+
200
+ it { subject.size.must_equal(6) }
201
+ end
202
+
203
+ context 'alias method #prune_as_lines' do
204
+ subject { instance.prune_as_lines }
205
+
206
+ it { subject.must_be_instance_of(Vedeu::Lines) }
207
+
208
+ context 'with a single line of text' do
209
+ let(:text) { text_line }
210
+
211
+ it { subject.size.must_equal(1) }
212
+ end
213
+
214
+ context 'with a text block' do
215
+ let(:text) { text_block }
216
+
217
+ it { subject.size.must_equal(1) }
218
+ end
219
+
220
+ context 'with a text block containing newlines' do
221
+ let(:text) { text_newlines }
222
+
223
+ it { subject.size.must_equal(4) }
224
+ end
225
+
226
+ context 'with a text block containing newlines and blank lines' do
227
+ let(:text) { text_blanklines }
228
+
229
+ it { subject.size.must_equal(6) }
230
+ end
231
+ end
232
+
233
+ context 'alias method #wrap_as_lines' do
234
+ subject { instance.wrap_as_lines }
235
+
236
+ it { subject.must_be_instance_of(Vedeu::Lines) }
237
+
238
+ context 'with a single line of text' do
239
+ let(:text) { text_line }
240
+
241
+ it { subject.size.must_equal(2) }
242
+ end
243
+
244
+ context 'with a text block' do
245
+ let(:text) { text_block }
246
+
247
+ it { subject.size.must_equal(6) }
248
+ end
249
+
250
+ context 'with a text block containing newlines' do
251
+ let(:text) { text_newlines }
252
+
253
+ it { subject.size.must_equal(11) }
254
+ end
255
+
256
+ context 'with a text block containing newlines and blank lines' do
257
+ let(:text) { text_blanklines }
258
+
259
+ it { subject.size.must_equal(10) }
260
+ end
261
+ end
262
+ end
263
+
264
+ end # Wordwrap
265
+
266
+ end # Vedeu