vedeu 0.3.5 → 0.4.0

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/docs/events.md +0 -12
  4. data/examples/configuration_app.rb +1 -1
  5. data/lib/vedeu/all.rb +0 -1
  6. data/lib/vedeu/bindings.rb +18 -3
  7. data/lib/vedeu/buffers/display_buffer.rb +0 -22
  8. data/lib/vedeu/configuration/api.rb +8 -44
  9. data/lib/vedeu/configuration/cli.rb +6 -36
  10. data/lib/vedeu/configuration/configuration.rb +0 -4
  11. data/lib/vedeu/distributed/server.rb +4 -10
  12. data/lib/vedeu/dsl/components/keymap.rb +3 -5
  13. data/lib/vedeu/input/keymap.rb +22 -45
  14. data/lib/vedeu/main_loop.rb +2 -0
  15. data/lib/vedeu/models/focus.rb +1 -1
  16. data/lib/vedeu/models/geometry.rb +2 -2
  17. data/lib/vedeu/models/view/char.rb +1 -1
  18. data/lib/vedeu/models/view/composition.rb +1 -1
  19. data/lib/vedeu/models/view/interface.rb +4 -2
  20. data/lib/vedeu/models/view/line.rb +1 -2
  21. data/lib/vedeu/models/view/stream.rb +1 -1
  22. data/lib/vedeu/output/all.rb +8 -0
  23. data/lib/vedeu/{presentation → output}/background.rb +0 -0
  24. data/lib/vedeu/{presentation → output}/colour.rb +0 -0
  25. data/lib/vedeu/{presentation → output}/foreground.rb +1 -1
  26. data/lib/vedeu/output/html_renderer.rb +13 -30
  27. data/lib/vedeu/{presentation → output}/presentation.rb +0 -0
  28. data/lib/vedeu/{presentation → output}/style.rb +0 -0
  29. data/lib/vedeu/output/templates/html_renderer.vedeu +24 -0
  30. data/lib/vedeu/{presentation → output}/translator.rb +0 -0
  31. data/lib/vedeu/support/log.rb +1 -0
  32. data/test/integration/dsl/compositions_test.rb +0 -8
  33. data/test/integration/dsl/interfaces_test.rb +0 -68
  34. data/test/integration/dsl/keymaps_test.rb +0 -12
  35. data/test/integration/dsl/lines_test.rb +0 -42
  36. data/test/integration/dsl/streams_test.rb +0 -26
  37. data/test/integration/dsl/views_test.rb +0 -18
  38. data/test/lib/vedeu/api_test.rb +0 -97
  39. data/test/lib/vedeu/configuration/api_test.rb +3 -14
  40. data/test/lib/vedeu/configuration/cli_test.rb +0 -14
  41. data/test/lib/vedeu/cursor/cursor_test.rb +0 -2
  42. data/test/lib/vedeu/distributed/client_test.rb +0 -2
  43. data/test/lib/vedeu/distributed/test_application_test.rb +0 -1
  44. data/test/lib/vedeu/dsl/components/keymap_test.rb +1 -7
  45. data/test/lib/vedeu/dsl/components/menu_test.rb +0 -48
  46. data/test/lib/vedeu/dsl/interface_test.rb +1 -263
  47. data/test/lib/vedeu/dsl/shared/text_test.rb +0 -6
  48. data/test/lib/vedeu/dsl/stream_test.rb +0 -2
  49. data/test/lib/vedeu/events/event_test.rb +0 -1
  50. data/test/lib/vedeu/input/keymap_test.rb +8 -2
  51. data/test/lib/vedeu/input/mapper_test.rb +2 -2
  52. data/test/lib/vedeu/launcher_test.rb +0 -12
  53. data/test/lib/vedeu/main_loop_test.rb +0 -17
  54. data/test/lib/vedeu/models/focus_test.rb +59 -19
  55. data/test/lib/vedeu/models/geometry_test.rb +20 -26
  56. data/test/lib/vedeu/models/view/interface_test.rb +0 -27
  57. data/test/lib/vedeu/models/view/stream_test.rb +0 -1
  58. data/test/lib/vedeu/{presentation → output}/background_test.rb +0 -0
  59. data/test/lib/vedeu/{presentation → output}/colour_test.rb +0 -0
  60. data/test/lib/vedeu/output/compositor_test.rb +0 -5
  61. data/test/lib/vedeu/{presentation → output}/foreground_test.rb +0 -0
  62. data/test/lib/vedeu/output/html_renderer_test.rb +1 -0
  63. data/test/lib/vedeu/{presentation → output}/presentation_test.rb +0 -0
  64. data/test/lib/vedeu/{presentation → output}/style_test.rb +0 -0
  65. data/test/lib/vedeu/{presentation → output}/translator_test.rb +0 -0
  66. data/test/lib/vedeu/output/writer_test.rb +8 -21
  67. data/test/lib/vedeu/repositories/repository_test.rb +0 -24
  68. data/test/lib/vedeu/support/refresh_test.rb +0 -10
  69. data/test/support/helpers/model_test_class.rb +1 -1
  70. data/vedeu.gemspec +1 -1
  71. metadata +22 -22
  72. data/lib/vedeu/presentation/all.rb +0 -9
@@ -17,8 +17,6 @@ module Vedeu
17
17
 
18
18
  describe '.connect' do
19
19
  subject { described.connect(uri) }
20
-
21
- # it { subject.must_be_instance_of(Symbol) }
22
20
  end
23
21
 
24
22
  describe '#input' do
@@ -10,7 +10,6 @@ module Vedeu
10
10
 
11
11
  describe '#initialize' do
12
12
  it { instance.must_be_instance_of(Vedeu::TestApplication) }
13
- # it { subject.instance_variable_get('@attributes').must_equal(attributes) }
14
13
  end
15
14
 
16
15
  describe '.build' do
@@ -8,7 +8,7 @@ module Vedeu
8
8
 
9
9
  let(:described) { Vedeu::DSL::Keymap }
10
10
  let(:instance) { described.new(model) }
11
- let(:model) { Vedeu::Keymap.new('_test_') }
11
+ let(:model) { Vedeu::Keymap.new({ name: '_test_' }) }
12
12
 
13
13
  describe '#initialize' do
14
14
  it { instance.must_be_instance_of(described) }
@@ -51,12 +51,6 @@ module Vedeu
51
51
  end
52
52
 
53
53
  context 'when the key is not valid (already defined)' do
54
- # let(:key_j) { Key.new('j') { :do_something } }
55
- # let(:key_down) { Key.new(:down) { :do_something } }
56
-
57
- # before { model.stubs(:keys).returns([key_j, key_down]) }
58
-
59
- # it { subject.must_equal(false) }
60
54
  end
61
55
  end
62
56
 
@@ -18,59 +18,11 @@ module Vedeu
18
18
  let(:collection) { [:sodium, :magnesium, :aluminium, :silicon] }
19
19
  let(:menu_name) { 'elements' }
20
20
 
21
- # describe '.define' do
22
- # before { Menus.reset }
23
-
24
- # context 'when a block was not given' do
25
- # it { proc { Vedeu.menu }.must_raise(InvalidSyntax) }
26
- # end
27
-
28
- # context 'when no name was specified' do
29
- # it { proc { Vedeu.menu { } }.must_raise(MissingRequired) }
30
- # end
31
-
32
- # it 'adds the menu to the menus repository' do
33
- # Vedeu.menu do
34
- # name menu_name
35
- # items menu_items
36
- # end
37
-
38
- # Vedeu::Menus.registered.must_equal(['elements'])
39
- # end
40
- # end
41
-
42
21
  describe '#initialize' do
43
22
  it { instance.must_be_instance_of(Vedeu::DSL::Menu) }
44
23
  it { instance.instance_variable_get('@model').must_equal(model) }
45
24
  end
46
25
 
47
- # describe '.define' do
48
- # before { Menus.reset }
49
-
50
- # context 'when a block was not given' do
51
- # it { proc { Menu.define }.must_raise(InvalidSyntax) }
52
- # end
53
-
54
- # context 'when no name was specified for the menu' do
55
- # it { proc { Menu.define { } }.must_raise(MissingRequired) }
56
- # end
57
-
58
- # it 'adds the menu to the menus repository' do
59
- # Menu.define do
60
- # name 'elements'
61
- # items [:sodium, :magnesium, :aluminium, :silicon]
62
- # end
63
-
64
- # Vedeu::Menus.registered.must_equal(['elements'])
65
- # end
66
-
67
- # it 'returns the API::Menu instance' do
68
- # Menu.define do
69
- # name 'elements'
70
- # end.must_be_instance_of(Vedeu::Menu)
71
- # end
72
- # end
73
-
74
26
  describe '#item' do
75
27
  let(:value) { :platinum }
76
28
 
@@ -45,134 +45,6 @@ module Vedeu
45
45
  it { subject.must_be_instance_of(Vedeu::Border) }
46
46
  end
47
47
 
48
- # describe '#define' do
49
- # interface = Interface.new({ name: 'widget' })
50
-
51
- # it 'creates and stores a new interface' do
52
- # interface.define.must_be_instance_of(API::Interface)
53
- # end
54
-
55
- # it 'allows the setting of colours' do
56
- # Interface.build do
57
- # colour foreground: '#aadd00', background: '#222222'
58
- # end.must_equal(
59
- # {
60
- # border: {},
61
- # colour: {
62
- # foreground: '#aadd00',
63
- # background: '#222222'
64
- # },
65
- # cursor: :hide,
66
- # delay: 0.0,
67
- # geometry: {},
68
- # group: '',
69
- # lines: [],
70
- # name: '',
71
- # parent: nil,
72
- # style: '',
73
- # }
74
- # )
75
- # end
76
-
77
- # it 'allows the setting of styles' do
78
- # Interface.build do
79
- # style 'underline'
80
- # end.must_equal(
81
- # {
82
- # border: {},
83
- # colour: {},
84
- # cursor: :hide,
85
- # delay: 0.0,
86
- # geometry: {},
87
- # group: '',
88
- # lines: [],
89
- # name: '',
90
- # parent: nil,
91
- # style: "underline",
92
- # }
93
- # )
94
- # end
95
-
96
- # it 'allows the use of other interfaces for attributes like geometry' do
97
- # IO.console.stub(:winsize, [25, 40]) do
98
- # interface = Vedeu.interface 'my_interface' do
99
- # geometry do
100
- # x 5
101
- # y 5
102
- # width 5
103
- # height 5
104
- # end
105
- # end
106
- # Interface.build do
107
- # name 'my_other_interface'
108
- # y use('my_interface').south
109
- # end.must_equal({
110
- # border: {},
111
- # colour: {},
112
- # cursor: :hide,
113
- # delay: 0.0,
114
- # geometry: {
115
- # y: 11
116
- # },
117
- # group: '',
118
- # lines: [],
119
- # name: "my_other_interface",
120
- # parent: nil,
121
- # style: '',
122
- # })
123
- # end
124
- # end
125
-
126
- # it 'allows the setting of a delay for events triggered for this ' \
127
- # 'interface' do
128
- # Interface.build do
129
- # delay 1.0
130
- # end.must_equal(
131
- # {
132
- # border: {},
133
- # colour: {},
134
- # cursor: :hide,
135
- # delay: 1.0,
136
- # geometry: {},
137
- # group: '',
138
- # lines: [],
139
- # name: '',
140
- # parent: nil,
141
- # style: '',
142
- # })
143
- # end
144
-
145
- # it 'allows the interface to be part of a group- useful for creating ' \
146
- # 'separate views' do
147
- # Interface.build do
148
- # group 'my_group'
149
- # end.must_equal(
150
- # {
151
- # border: {},
152
- # colour: {},
153
- # cursor: :hide,
154
- # delay: 0.0,
155
- # geometry: {},
156
- # group: "my_group",
157
- # lines: [],
158
- # name: '',
159
- # parent: nil,
160
- # style: '',
161
- # }
162
- # )
163
- # end
164
- # end
165
-
166
- # describe '#centred' do
167
- # it 'returns false if the value is false or nil' do
168
- # DSL::Interface.new.centred(false).must_equal(false)
169
- # end
170
-
171
- # it 'returns true' do
172
- # DSL::Interface.new.centred.must_equal(true)
173
- # end
174
- # end
175
-
176
48
  describe '#cursor' do
177
49
  let(:value) {}
178
50
 
@@ -262,19 +134,6 @@ module Vedeu
262
134
  end
263
135
  end
264
136
 
265
- # context 'when multiple calls are made' do
266
- # before do
267
- # Vedeu::Focus.reset
268
- # Vedeu.interface('curium') { focus! }
269
- # Vedeu.interface('iodine') {}
270
- # Vedeu.interface('dysprosium') { focus! }
271
- # end
272
-
273
- # it 'the last call will set that interface to be current' do
274
- # Vedeu.focus.must_equal('dysprosium')
275
- # end
276
- # end
277
-
278
137
  context 'when no calls are made' do
279
138
  before do
280
139
  Vedeu::Focus.reset
@@ -318,7 +177,7 @@ module Vedeu
318
177
  end
319
178
  end
320
179
 
321
- describe '#keys' do
180
+ describe '#keymap' do
322
181
  subject {
323
182
  instance.keys do
324
183
  # ...
@@ -326,34 +185,6 @@ module Vedeu
326
185
  }
327
186
 
328
187
  it { subject.must_be_instance_of(Vedeu::Keymap) }
329
-
330
- context 'when the required block is not provided' do
331
- subject { instance.keys }
332
-
333
- it { proc { subject }.must_raise(InvalidSyntax) }
334
- end
335
-
336
- # before do
337
- # Keymaps.reset
338
-
339
- # Vedeu.interface 'iron' do
340
- # keys do
341
- # key('k') { :k_pressed }
342
- # end
343
- # end
344
- # end
345
-
346
- # it 'defines a keymap for the interface' do
347
- # Keymaps.interface_key?('k').must_equal(true)
348
- # end
349
-
350
- # it 'defines a keymap for the interface' do
351
- # Keymaps.interface_keys('iron').must_equal(['k'])
352
- # end
353
-
354
- # context 'when the block is not given' do
355
- # it { proc { Vedeu.interface('iron') { keys } }.must_raise(InvalidSyntax) }
356
- # end
357
188
  end
358
189
 
359
190
  describe '#lines' do
@@ -370,99 +201,6 @@ module Vedeu
370
201
 
371
202
  it { proc { subject }.must_raise(InvalidSyntax) }
372
203
  end
373
-
374
- # it 'adds a blank line with no arguments' do
375
- # interface = Vedeu.interface 'carbon' do
376
- # line
377
- # end
378
- # interface.must_be_instance_of(API::Interface)
379
- # interface.attributes.must_equal(
380
- # {
381
- # border: {},
382
- # colour: {},
383
- # cursor: :hide,
384
- # delay: 0.0,
385
- # geometry: {},
386
- # group: '',
387
- # lines: [
388
- # {
389
- # colour: {},
390
- # streams: {
391
- # text: ''
392
- # },
393
- # style: [],
394
- # }
395
- # ],
396
- # name: 'carbon',
397
- # parent: nil,
398
- # style: '',
399
- # }
400
- # )
401
- # end
402
-
403
- # it 'adds a line directly with a value and no block' do
404
- # interface = Vedeu.interface 'carbon' do
405
- # line 'This is some text...'
406
- # end
407
- # interface.must_be_instance_of(API::Interface)
408
- # interface.attributes.must_equal(
409
- # {
410
- # border: {},
411
- # colour: {},
412
- # cursor: :hide,
413
- # delay: 0.0,
414
- # geometry: {},
415
- # group: '',
416
- # lines: [
417
- # {
418
- # colour: {},
419
- # parent: composition,
420
- # streams: {
421
- # text: "This is some text..."
422
- # },
423
- # style: [],
424
- # }
425
- # ],
426
- # name: 'carbon',
427
- # parent: nil,
428
- # style: '',
429
- # }
430
- # )
431
- # end
432
-
433
- # it 'allows the addition of more attributes with a block' do
434
- # interface = Vedeu.interface 'silicon' do
435
- # lines do
436
- # text 'This is different text...'
437
- # end
438
- # end
439
- # interface.must_be_instance_of(API::Interface)
440
- # interface.attributes.must_equal(
441
- # {
442
- # border: {},
443
- # colour: {},
444
- # cursor: :hide,
445
- # delay: 0.0,
446
- # geometry: {},
447
- # group: '',
448
- # lines: [
449
- # {
450
- # colour: {},
451
- # parent: composition,
452
- # streams: [
453
- # {
454
- # text: "This is different text..."
455
- # }
456
- # ],
457
- # style: [],
458
- # }
459
- # ],
460
- # name: "silicon",
461
- # parent: nil,
462
- # style: '',
463
- # }
464
- # )
465
- # end
466
204
  end
467
205
 
468
206
  describe '#name' do
@@ -7,12 +7,6 @@ module Vedeu
7
7
  describe Text do
8
8
 
9
9
  describe '#text' do
10
-
11
- # it { described.must_respond_to(:align) }
12
- # it { described.must_respond_to(:center) }
13
- # it { described.must_respond_to(:centre) }
14
- # it { described.must_respond_to(:left) }
15
- # it { described.must_respond_to(:right) }
16
10
  end
17
11
 
18
12
  end # Text
@@ -20,8 +20,6 @@ module Vedeu
20
20
  describe '#stream' do
21
21
  subject { instance.stream { } }
22
22
 
23
- # it { subject.must_be_instance_of(Vedeu::Stream) }
24
-
25
23
  context 'when the block is not given' do
26
24
  subject { instance.stream }
27
25
 
@@ -20,7 +20,6 @@ module Vedeu
20
20
  it { instance.must_be_instance_of(Event) }
21
21
  it { instance.instance_variable_get('@name').must_equal(event_name) }
22
22
  it { instance.instance_variable_get('@options').must_equal(options) }
23
- # it { instance.instance_variable_get('@closure').must_equal(closure) }
24
23
  it { instance.instance_variable_get('@deadline').must_equal(0) }
25
24
  it { instance.instance_variable_get('@executed_at').must_equal(0) }
26
25
  it { instance.instance_variable_get('@now').must_equal(0) }
@@ -4,8 +4,14 @@ module Vedeu
4
4
 
5
5
  describe Keymap do
6
6
 
7
- let(:described) { Vedeu::Keymap }
8
- let(:instance) { described.new(map_name, keys) }
7
+ let(:described) { Vedeu::Keymap }
8
+ let(:instance) { described.new(attributes) }
9
+ let(:attributes) {
10
+ {
11
+ name: map_name,
12
+ keys: keys
13
+ }
14
+ }
9
15
  let(:map_name) { 'zirconium' }
10
16
  let(:keys) { [] }
11
17
  let(:key) { Vedeu::Key.new('a') { :output } }
@@ -41,7 +41,7 @@ module Vedeu
41
41
 
42
42
  context 'and the key is defined' do
43
43
  let(:key_test) { Key.new('a') { :do_something } }
44
- let(:keymap_test) { Keymap.new('test', [key_test]) }
44
+ let(:keymap_test) { Keymap.new({ name: 'test', keys: [key_test] }) }
45
45
 
46
46
  before do
47
47
  Vedeu.keymaps.reset
@@ -71,7 +71,7 @@ module Vedeu
71
71
 
72
72
  context 'and the key is defined' do
73
73
  let(:key_test) { Key.new('a') { :do_something } }
74
- let(:keymap_test) { Keymap.new('test', [key_test]) }
74
+ let(:keymap_test) { Keymap.new({ name: 'test', keys: [key_test] }) }
75
75
 
76
76
  before do
77
77
  Vedeu.keymaps.reset
@@ -40,18 +40,6 @@ module Vedeu
40
40
  it 'returns 0 for successful execution' do
41
41
  subject.must_equal(0)
42
42
  end
43
-
44
- # context 'when an exception is raised' do
45
- # before do
46
- # Application.stubs(:start).raises(StandardError)
47
- # end
48
-
49
- # it 'displays the exception' do
50
- # capture_io do
51
- # Launcher.execute!
52
- # end.must_equal(["", ""])
53
- # end
54
- # end
55
43
  end
56
44
 
57
45
  end # Launcher
@@ -8,15 +8,9 @@ module Vedeu
8
8
 
9
9
  describe '.start!' do
10
10
  before do
11
- # subject.expects(:while).yields do
12
- # String.expects(:new).returns("samantha")
13
- # end
14
11
  end
15
12
 
16
13
  subject { described.start! { } }
17
-
18
- # it { subject; described.instance_variable_get('@started').must_equal(true) }
19
- # it { subject; described.instance_variable_get('@loop').must_equal(true) }
20
14
  end
21
15
 
22
16
  describe '.stop!' do
@@ -25,17 +19,6 @@ module Vedeu
25
19
  it { subject; described.instance_variable_get('@loop').must_equal(false) }
26
20
  end
27
21
 
28
- describe '.safe_exit_point!' do
29
- subject { described.safe_exit_point! }
30
-
31
- context 'when we wish to continue' do
32
- end
33
-
34
- context 'when we wish to stop' do
35
- # it { proc { subject }.must_raise(VedeuInterrupt) }
36
- end
37
- end
38
-
39
22
  end # MainLoop
40
23
 
41
24
  end # Vedeu
@@ -6,17 +6,37 @@ module Vedeu
6
6
 
7
7
  let(:described) { Vedeu::Focus }
8
8
 
9
- before { Focus.reset }
9
+ before do
10
+ Focus.reset
11
+ Vedeu.interfaces.reset
12
+ Vedeu.interface('thallium') {}
13
+ Vedeu.interface('lead') {}
14
+ Vedeu.interface('bismuth') {}
15
+ end
10
16
 
11
17
  describe '#add' do
12
- it 'adds an interface to storage' do
13
- Focus.add('thallium').must_equal(['thallium'])
18
+ context 'adds an interface to storage' do
19
+ before do
20
+ Focus.reset
21
+ Vedeu.interfaces.reset
22
+ end
23
+
24
+ it {
25
+ Focus.add('thallium').must_equal(['thallium'])
26
+ }
14
27
  end
15
28
 
16
- it 'does not add it again if already exists' do
17
- Focus.add('thallium')
18
- Focus.add('thallium')
19
- Focus.registered.must_equal(['thallium'])
29
+ context 'does not add it again if already exists' do
30
+ before do
31
+ Focus.reset
32
+ Vedeu.interfaces.reset
33
+ Vedeu.interface('thallium') {}
34
+ end
35
+
36
+ it {
37
+ Focus.add('thallium')
38
+ Focus.registered.must_equal(['thallium'])
39
+ }
20
40
  end
21
41
 
22
42
  it 'does not add it again if already exists' do
@@ -27,16 +47,32 @@ module Vedeu
27
47
  Focus.registered.must_equal(['bismuth', 'thallium', 'lead'])
28
48
  end
29
49
 
30
- it 'adds the interface to storage focussed' do
31
- Focus.add('thallium')
32
- Focus.add('lead', true)
33
- Focus.registered.must_equal(['lead', 'thallium'])
50
+ context 'adds the interface to storage focussed' do
51
+ before do
52
+ Focus.reset
53
+ Vedeu.interfaces.reset
54
+ Vedeu.interface('thallium') {}
55
+ end
56
+
57
+ it {
58
+ Focus.add('thallium')
59
+ Focus.add('lead', true)
60
+ Focus.registered.must_equal(['lead', 'thallium'])
61
+ }
34
62
  end
35
63
 
36
- it 'adds the interface to storage unfocussed' do
37
- Focus.add('thallium')
38
- Focus.add('lead')
39
- Focus.registered.must_equal(['thallium', 'lead'])
64
+ context 'adds the interface to storage unfocussed' do
65
+ before do
66
+ Focus.reset
67
+ Vedeu.interfaces.reset
68
+ Vedeu.interface('thallium') {}
69
+ end
70
+
71
+ it {
72
+ Focus.add('thallium')
73
+ Focus.add('lead')
74
+ Focus.registered.must_equal(['thallium', 'lead'])
75
+ }
40
76
  end
41
77
  end
42
78
 
@@ -122,8 +158,10 @@ module Vedeu
122
158
  Focus.next_item.must_equal('lead')
123
159
  end
124
160
 
125
- it 'returns false if storage is empty' do
126
- Focus.next_item.must_equal(false)
161
+ context 'returns false if storage is empty' do
162
+ before { Focus.reset }
163
+
164
+ it { Focus.next_item.must_equal(false) }
127
165
  end
128
166
  end
129
167
 
@@ -135,8 +173,10 @@ module Vedeu
135
173
  Focus.prev_item.must_equal('bismuth')
136
174
  end
137
175
 
138
- it 'returns false if storage is empty' do
139
- Focus.prev_item.must_equal(false)
176
+ context 'returns false if storage is empty' do
177
+ before { Focus.reset }
178
+
179
+ it { Focus.prev_item.must_equal(false) }
140
180
  end
141
181
  end
142
182