vedeu 0.2.2 → 0.2.3

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/docs/api.md +1 -1
  3. data/docs/events.md +11 -8
  4. data/lib/vedeu/api/api.rb +19 -43
  5. data/lib/vedeu/api/composition.rb +13 -8
  6. data/lib/vedeu/api/defined.rb +14 -4
  7. data/lib/vedeu/api/helpers.rb +8 -5
  8. data/lib/vedeu/api/interface.rb +15 -21
  9. data/lib/vedeu/api/keymap.rb +11 -5
  10. data/lib/vedeu/api/line.rb +6 -7
  11. data/lib/vedeu/api/menu.rb +9 -17
  12. data/lib/vedeu/api/stream.rb +8 -6
  13. data/lib/vedeu/application.rb +14 -12
  14. data/lib/vedeu/configuration/api.rb +33 -3
  15. data/lib/vedeu/configuration/cli.rb +23 -3
  16. data/lib/vedeu/configuration/configuration.rb +3 -2
  17. data/lib/vedeu/input/input.rb +6 -2
  18. data/lib/vedeu/launcher.rb +5 -2
  19. data/lib/vedeu/models/attributes/background.rb +3 -2
  20. data/lib/vedeu/models/attributes/coercions.rb +3 -2
  21. data/lib/vedeu/models/attributes/colour_translator.rb +11 -4
  22. data/lib/vedeu/models/attributes/foreground.rb +3 -2
  23. data/lib/vedeu/models/attributes/presentation.rb +3 -2
  24. data/lib/vedeu/models/colour.rb +3 -2
  25. data/lib/vedeu/models/composition.rb +5 -2
  26. data/lib/vedeu/models/cursor.rb +3 -2
  27. data/lib/vedeu/models/geometry.rb +48 -6
  28. data/lib/vedeu/models/interface.rb +12 -2
  29. data/lib/vedeu/models/keymap.rb +4 -2
  30. data/lib/vedeu/models/line.rb +5 -2
  31. data/lib/vedeu/models/stream.rb +12 -2
  32. data/lib/vedeu/models/style.rb +3 -2
  33. data/lib/vedeu/output/clear.rb +5 -2
  34. data/lib/vedeu/output/compositor.rb +4 -2
  35. data/lib/vedeu/output/refresh.rb +4 -6
  36. data/lib/vedeu/output/render.rb +17 -14
  37. data/lib/vedeu/output/view.rb +5 -2
  38. data/lib/vedeu/repositories/buffers.rb +16 -47
  39. data/lib/vedeu/repositories/cursors.rb +26 -28
  40. data/lib/vedeu/repositories/events.rb +33 -48
  41. data/lib/vedeu/repositories/focus.rb +24 -20
  42. data/lib/vedeu/repositories/groups.rb +17 -52
  43. data/lib/vedeu/repositories/interfaces.rb +21 -42
  44. data/lib/vedeu/repositories/keymaps.rb +9 -57
  45. data/lib/vedeu/repositories/menus.rb +15 -55
  46. data/lib/vedeu/support/common.rb +2 -2
  47. data/lib/vedeu/support/esc.rb +35 -2
  48. data/lib/vedeu/support/event.rb +7 -8
  49. data/lib/vedeu/support/exceptions.rb +47 -0
  50. data/lib/vedeu/support/grid.rb +11 -4
  51. data/lib/vedeu/support/keymap_validator.rb +9 -14
  52. data/lib/vedeu/support/log.rb +13 -3
  53. data/lib/vedeu/support/menu.rb +3 -2
  54. data/lib/vedeu/support/position.rb +3 -2
  55. data/lib/vedeu/support/registrar.rb +2 -23
  56. data/lib/vedeu/support/repository.rb +77 -0
  57. data/lib/vedeu/support/terminal.rb +12 -2
  58. data/lib/vedeu/support/trace.rb +127 -20
  59. data/lib/vedeu.rb +11 -46
  60. data/test/lib/vedeu/api/api_test.rb +14 -18
  61. data/test/lib/vedeu/api/defined_test.rb +16 -6
  62. data/test/lib/vedeu/api/interface_test.rb +5 -20
  63. data/test/lib/vedeu/api/menu_test.rb +1 -1
  64. data/test/lib/vedeu/models/geometry_test.rb +41 -0
  65. data/test/lib/vedeu/models/interface_test.rb +14 -0
  66. data/test/lib/vedeu/repositories/buffers_test.rb +6 -32
  67. data/test/lib/vedeu/repositories/cursors_test.rb +14 -0
  68. data/test/lib/vedeu/repositories/events_test.rb +18 -47
  69. data/test/lib/vedeu/repositories/focus_test.rb +18 -5
  70. data/test/lib/vedeu/repositories/groups_test.rb +3 -62
  71. data/test/lib/vedeu/repositories/interfaces_test.rb +13 -49
  72. data/test/lib/vedeu/repositories/keymaps_test.rb +0 -23
  73. data/test/lib/vedeu/repositories/menus_test.rb +3 -62
  74. data/test/lib/vedeu/support/esc_test.rb +24 -0
  75. data/test/lib/vedeu/support/keymap_validator_test.rb +19 -38
  76. data/test/lib/vedeu/support/repository_test.rb +70 -0
  77. data/test/test_helper.rb +2 -0
  78. data/vedeu.gemspec +3 -3
  79. metadata +10 -6
@@ -10,6 +10,12 @@ module Vedeu
10
10
  Buffers.add({ name: 'molybdenum' }).must_equal('molybdenum')
11
11
  end
12
12
 
13
+ it 'raises an exception if the attributes does not have a :name key' do
14
+ attributes = { no_name_key: '' }
15
+
16
+ proc { Buffers.add(attributes) }.must_raise(MissingRequired)
17
+ end
18
+
13
19
  context 'when the buffer is already registered' do
14
20
  it 'retrieves the buffer in storage, and adds the attributes to the ' \
15
21
  'back buffer, preserving the front which may already have content' do
@@ -25,20 +31,6 @@ module Vedeu
25
31
  end
26
32
  end
27
33
 
28
- describe '.find' do
29
- context 'when the buffer does not exist by this name' do
30
- it '' do
31
- skip
32
- end
33
- end
34
-
35
- context 'when the buffer can be found by name' do
36
- it '' do
37
- skip
38
- end
39
- end
40
- end
41
-
42
34
  describe '.latest' do
43
35
  context 'when the buffer does not exist by this name' do
44
36
  it '' do
@@ -53,23 +45,5 @@ module Vedeu
53
45
  end
54
46
  end
55
47
 
56
- describe '.registered' do
57
- it '' do
58
- skip
59
- end
60
- end
61
-
62
- describe '.registered>' do
63
- it '' do
64
- skip
65
- end
66
- end
67
-
68
- describe '.reset' do
69
- it '' do
70
- skip
71
- end
72
- end
73
-
74
48
  end
75
49
  end
@@ -3,7 +3,21 @@ require 'test_helper'
3
3
  module Vedeu
4
4
  describe Cursors do
5
5
 
6
+ before { Cursors.reset }
7
+
6
8
  describe '#add' do
9
+ it 'raises an exception if the attributes does not have a :name key' do
10
+ attributes = { no_name_key: '' }
11
+
12
+ proc { Cursors.add(attributes) }.must_raise(MissingRequired)
13
+ end
14
+
15
+ it 'returns something' do
16
+ skip
17
+ end
18
+ end
19
+
20
+ describe '#use' do
7
21
  it 'returns something' do
8
22
  skip
9
23
  end
@@ -2,68 +2,39 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Events do
5
- describe '#event' do
6
- it 'adds the event block to the handlers' do
7
- events = Events.new
8
- events.event(:sulphur) { proc { |x| x } }
9
- events.registered.must_equal([:sulphur])
5
+ describe '#add' do
6
+ it 'adds the event' do
7
+ Events.add(:sulphur) { proc { |x| x } }
8
+ Events.registered.must_include(:sulphur)
10
9
  end
11
10
  end
12
11
 
13
- describe '#unevent' do
12
+ describe '#remove' do
14
13
  it 'removes the event by name' do
15
- events = Events.new
16
- events.event(:chlorine) { proc { |x| x } }
17
- events.event(:argon) { proc { |y| y } }
18
- events.unevent(:chlorine)
19
- events.registered.must_equal([:argon])
14
+ Events.add(:chlorine) { proc { |x| x } }
15
+ Events.add(:argon) { proc { |y| y } }
16
+ Events.remove(:chlorine)
17
+ Events.registered.wont_include(:chlorine)
20
18
  end
21
19
 
22
20
  it 'removes the event by name only if the name exists' do
23
- events = Events.new
24
- events.event(:chlorine) { proc { |x| x } }
25
- events.event(:argon) { proc { |y| y } }
26
- events.unevent(:potassium)
27
- events.registered.must_equal([:chlorine, :argon])
21
+ Events.add(:chlorine) { proc { |x| x } }
22
+ Events.add(:argon) { proc { |y| y } }
23
+ Events.remove(:potassium).must_equal(false)
28
24
  end
29
25
  end
30
26
 
31
- describe '#registered' do
32
- it 'returns all the registered events by name' do
33
- events = Events.new do
34
- event(:some_event) { proc { |x| x } }
35
- end
36
- events.registered.must_equal([:some_event])
37
- end
38
- end
27
+ describe '#trigger' do
28
+ it 'returns the result of triggering the event' do
29
+ NastyException = Class.new(StandardError)
39
30
 
40
- describe '#registered?' do
41
- it '' do
42
- skip
43
- end
44
- end
31
+ Events.add(:_nasty_exception_) { fail NastyException }
45
32
 
46
- describe '#trigger' do
47
- it 'returns a collection containing the event when the event is ' \
48
- 'pre-registered' do
49
- events = Events.new do
50
- event(:_exit_) { fail StopIteration }
51
- end
52
- proc { events.trigger(:_exit_) }.must_raise(StopIteration)
33
+ proc { Events.use(:_nasty_exception_) }.must_raise(NastyException)
53
34
  end
54
35
 
55
36
  it 'returns an empty collection when the event has not been registered' do
56
- events = Events.new
57
- events.trigger(:_not_found_).must_be_empty
58
- end
59
- end
60
-
61
- describe '#reset' do
62
- it 'removes all events registered' do
63
- events = Events.new do
64
- event(:potassium) { proc { |x| x } }
65
- end
66
- events.reset.must_equal({})
37
+ Events.use(:_not_found_).must_be_empty
67
38
  end
68
39
  end
69
40
  end
@@ -15,6 +15,12 @@ module Vedeu
15
15
  Focus.add({ name: 'thallium' })
16
16
  Focus.registered.must_equal(['thallium'])
17
17
  end
18
+
19
+ it 'raises an exception if the attributes does not have a :name key' do
20
+ attributes = { no_name_key: '' }
21
+
22
+ proc { Focus.add(attributes) }.must_raise(MissingRequired)
23
+ end
18
24
  end
19
25
 
20
26
  describe '#by_name' do
@@ -43,6 +49,18 @@ module Vedeu
43
49
  end
44
50
  end
45
51
 
52
+ describe '#current?' do
53
+ before { Focus.stubs(:current).returns('lead') }
54
+
55
+ context 'when the interface is currently in focus' do
56
+ it { Focus.current?('lead').must_equal(true) }
57
+ end
58
+
59
+ context 'when the interface is not currently in focus' do
60
+ it { Focus.current?('bismuth').must_equal(false) }
61
+ end
62
+ end
63
+
46
64
  describe '#next_item' do
47
65
  it 'the next interface is focussed when the method is called' do
48
66
  Focus.add({ name: 'thallium' })
@@ -87,10 +105,5 @@ module Vedeu
87
105
  end
88
106
  end
89
107
 
90
- describe '.reset' do
91
- it 'returns an empty collection with no focussed interfaces stored' do
92
- Focus.reset.must_equal([])
93
- end
94
- end
95
108
  end
96
109
  end
@@ -13,72 +13,13 @@ module Vedeu
13
13
  Groups.add({ group: 'elements', name: 'germanium', delay: 0.0 })
14
14
  Groups.all.must_equal({ 'elements' => Set['germanium'] })
15
15
  end
16
- end
17
-
18
- describe '#all' do
19
- before do
20
- Groups.reset
21
- Groups.add({ group: 'elements', name: 'cobalt', delay: 0.0 })
22
- Groups.add({ group: 'elements', name: 'nickel', delay: 0.0 })
23
- Groups.add({ group: 'elements', name: 'copper', delay: 0.0 })
24
- end
25
-
26
- it 'returns all the groups from storage' do
27
- Groups.all.must_equal({
28
- "elements" => Set["cobalt", "nickel", "copper"]
29
- })
30
- end
31
- end
32
-
33
- describe '#find' do
34
- before do
35
- Groups.reset
36
- Groups.add({ group: 'elements', name: 'zinc', delay: 0.0 })
37
- end
38
-
39
- it 'raises an exception if the group cannot be found' do
40
- proc { Groups.find('not_found') }.must_raise(GroupNotFound)
41
- end
42
-
43
- it 'returns a collection of interface names belonging to the group' do
44
- Groups.find('elements').must_equal(Set['zinc'])
45
- end
46
- end
47
-
48
- describe '#registered' do
49
- before do
50
- Groups.reset
51
- Groups.add({ group: 'elements', name: 'cobalt', delay: 0.0 })
52
- Groups.add({ group: 'minerals', name: 'ruby', delay: 0.0 })
53
- Groups.add({ group: 'elements', name: 'copper', delay: 0.0 })
54
- Groups.add({ group: 'minerals', name: 'diamond', delay: 0.0 })
55
- end
56
-
57
- it 'returns all the groups from storage' do
58
- Groups.registered.must_equal(['elements', 'minerals'])
59
- end
60
- end
61
16
 
62
- describe '#registered?' do
63
- it 'returns true when the group is registered' do
64
- Groups.add({ group: 'registered' })
17
+ it 'raises an exception if the attributes does not have a :name key' do
18
+ attributes = { no_name_key: '' }
65
19
 
66
- Groups.registered?('registered').must_equal(true)
67
- end
68
-
69
- it 'returns false when the group is not registered' do
70
- Groups.registered?('not_registered').must_equal(false)
20
+ proc { Groups.add(attributes) }.must_raise(MissingRequired)
71
21
  end
72
22
  end
73
23
 
74
- describe '#reset' do
75
- before { Groups.reset }
76
-
77
- it 'removes all known groups from the storage' do
78
- Groups.add({ group: 'elements', name: 'bromine', delay: 0.0 })
79
- Groups.all.must_equal({ 'elements' => Set['bromine'] })
80
- Groups.reset.must_be_empty
81
- end
82
- end
83
24
  end
84
25
  end
@@ -6,68 +6,32 @@ module Vedeu
6
6
  describe '#add' do
7
7
  before { Interfaces.reset }
8
8
 
9
- it 'returns false if the interface name is empty' do
10
- Interfaces.add({ name: '' }).must_equal(false)
11
- end
12
-
13
9
  it 'adds the interface to the storage' do
14
10
  Interfaces.add({ name: 'germanium' })
15
11
  Interfaces.all.must_equal({ 'germanium' => { name: 'germanium' } })
16
12
  end
17
- end
18
-
19
- describe '#all' do
20
- before do
21
- Interfaces.reset
22
- Interfaces.add({ name: 'cobalt' })
23
- Interfaces.add({ name: 'nickel' })
24
- Interfaces.add({ name: 'copper' })
25
- end
26
-
27
- it 'returns the storage' do
28
- Interfaces.all.must_equal(
29
- {
30
- 'cobalt' => { name: 'cobalt' },
31
- 'nickel' => { name: 'nickel' },
32
- 'copper' => { name: 'copper' }
33
- }
34
- )
35
- end
36
- end
37
-
38
- describe '#find' do
39
- before { Interfaces.add({ name: 'zinc' }) }
40
13
 
41
- it 'raises an exception if the interface cannot be found' do
42
- proc { Interfaces.find('not_found') }.must_raise(InterfaceNotFound)
43
- end
14
+ it 'raises an exception if the attributes does not have a :name key' do
15
+ attributes = { no_name_key: '' }
44
16
 
45
- it 'returns the attributes of the named interface' do
46
- Interfaces.find('zinc').must_equal({ name: 'zinc' })
17
+ proc { Interfaces.add(attributes) }.must_raise(MissingRequired)
47
18
  end
48
19
  end
49
20
 
50
- describe '#registered' do
51
- before do
52
- Interfaces.reset
53
- Interfaces.add({ name: 'cobalt' })
54
- Interfaces.add({ name: 'ruby' })
55
- end
56
-
57
- it 'returns all the registered interfaces from storage' do
58
- Interfaces.registered.must_equal(['cobalt', 'ruby'])
59
- end
60
- end
21
+ describe '#build' do
22
+ let(:attributes) { { name: 'rhenium' } }
61
23
 
62
- describe '#registered?' do
63
- it 'returns true when the interface is registered' do
64
- Interfaces.add({ name: 'registered' })
24
+ before { Interfaces.add(attributes) }
25
+ after { Interfaces.reset }
65
26
 
66
- Interfaces.registered?('registered').must_equal(true)
27
+ it 'returns a new instance of Interface based on the stored attributes' do
28
+ Interfaces.build('rhenium').must_be_instance_of(Interface)
67
29
  end
68
30
 
69
- it 'returns false when the interface is not registered' do
70
- Interfaces.registered?('not_registered').must_equal(false)
31
+ context 'when the interface cannot be found' do
32
+ it 'raises an exception' do
33
+ proc { Interfaces.build('manganese') }.must_raise(InterfaceNotFound)
34
+ end
71
35
  end
72
36
  end
73
37
 
@@ -19,14 +19,6 @@ module Vedeu
19
19
  end
20
20
  end
21
21
 
22
- describe '#all' do
23
- before { Keymaps.reset }
24
-
25
- it 'returns all stored keymaps' do
26
- Keymaps.all.must_equal({ '_global_keymap_' => {} })
27
- end
28
- end
29
-
30
22
  describe '#find' do
31
23
  let(:attributes) {
32
24
  {
@@ -157,15 +149,6 @@ module Vedeu
157
149
  end
158
150
  end
159
151
 
160
- describe '#registered' do
161
- before { Keymaps.reset }
162
-
163
- it 'returns a collection of the interface names of all registered ' \
164
- 'keymaps' do
165
- Keymaps.registered.must_equal(['_global_keymap_'])
166
- end
167
- end
168
-
169
152
  describe '#registered?' do
170
153
  it 'returns false when the named keymap is not registered' do
171
154
  Keymaps.registered?('vanadium').must_equal(false)
@@ -176,12 +159,6 @@ module Vedeu
176
159
  end
177
160
  end
178
161
 
179
- describe '#reset' do
180
- it 'removes all stored keymaps' do
181
- Keymaps.reset.must_equal({ '_global_keymap_' => {} })
182
- end
183
- end
184
-
185
162
  describe '#system_key?' do
186
163
  it 'returns false when the key is not registered as a system key' do
187
164
  Keymaps.system_key?('r').must_equal(false)
@@ -4,7 +4,7 @@ module Vedeu
4
4
 
5
5
  describe Menus do
6
6
 
7
- describe 'System events defined by Menus' do
7
+ describe ' system events defined by Menus' do
8
8
  let(:collection) { [:sulphur, :gold, :tin, :helium] }
9
9
  let(:instance) { Vedeu::Menu.new(collection) }
10
10
 
@@ -139,8 +139,8 @@ module Vedeu
139
139
  Vedeu::Menu.stubs(:new).returns(instance)
140
140
  end
141
141
 
142
- it 'returns false if the menu name is empty' do
143
- Menus.add({ name: '' }).must_equal(false)
142
+ it 'raises an exception if menu name is empty' do
143
+ proc { Menus.add({ name: '' }) }.must_raise(MissingRequired)
144
144
  end
145
145
 
146
146
  it 'adds the menu to the storage' do
@@ -153,55 +153,6 @@ module Vedeu
153
153
  end
154
154
  end
155
155
 
156
- describe '#all' do
157
- before do
158
- Menus.reset
159
- Menus.add({ name: 'barium' })
160
- Menus.add({ name: 'lanthanum' })
161
- Menus.add({ name: 'cerium' })
162
- end
163
-
164
- it 'returns the storage' do
165
- Menus.all.keys.must_equal(['barium', 'lanthanum', 'cerium'])
166
- end
167
- end
168
-
169
- describe '#find' do
170
- before { Menus.add({ name: 'erbium' }) }
171
-
172
- it 'raises an exception if the menu cannot be found' do
173
- proc { Menus.find('not_found') }.must_raise(MenuNotFound)
174
- end
175
-
176
- it 'returns the attributes of the named menu' do
177
- Menus.find('erbium').must_be_instance_of(Hash)
178
- end
179
- end
180
-
181
- describe '#registered' do
182
- before do
183
- Menus.reset
184
- Menus.add({ name: 'barium' })
185
- Menus.add({ name: 'caesium' })
186
- end
187
-
188
- it 'returns all the registered menus from storage' do
189
- Menus.registered.must_equal(['barium', 'caesium'])
190
- end
191
- end
192
-
193
- describe '#registered?' do
194
- it 'returns true when the menu is registered' do
195
- Menus.add({ name: 'registered' })
196
-
197
- Menus.registered?('registered').must_equal(true)
198
- end
199
-
200
- it 'returns false when the menu is not registered' do
201
- Menus.registered?('not_registered').must_equal(false)
202
- end
203
- end
204
-
205
156
  describe '#remove' do
206
157
  it 'returns false when the menu is not registered' do
207
158
  Menus.remove('not_registered').must_equal(false)
@@ -221,16 +172,6 @@ module Vedeu
221
172
  end
222
173
  end
223
174
 
224
- describe '#reset' do
225
- before { Menus.reset }
226
-
227
- it 'removes all known menus from the storage' do
228
- Menus.add({ name: 'uranium' })
229
- Menus.all.wont_be_empty
230
- Menus.reset.must_be_empty
231
- end
232
- end
233
-
234
175
  describe '#use' do
235
176
  let(:collection) { [:calcium, :fermium, :nitrogen, :palladium] }
236
177
  let(:instance) { Vedeu::Menu.new(collection) }
@@ -2,6 +2,30 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Esc do
5
+ describe 'colours defined via define_method' do
6
+ it 'returns an escape sequence for the foreground colour' do
7
+ Esc.magenta.must_equal("\e[35m")
8
+ end
9
+
10
+ it 'returns an escape sequence for the foreground colour and resets ' \
11
+ 'after calling the block' do
12
+ Esc.cyan do
13
+ 'ununpentium'
14
+ end.must_equal("\e[36mununpentium\e[39m")
15
+ end
16
+
17
+ it 'returns an escape sequence for the background colour' do
18
+ Esc.on_yellow.must_equal("\e[43m")
19
+ end
20
+
21
+ it 'returns an escape sequence for the background colour and resets ' \
22
+ 'after calling the block' do
23
+ Esc.on_red do
24
+ 'livermorium'
25
+ end.must_equal("\e[41mlivermorium\e[49m")
26
+ end
27
+ end
28
+
5
29
  describe '.string' do
6
30
  it 'returns an empty string when the style is not provided' do
7
31
  Esc.string.must_equal('')
@@ -16,53 +16,34 @@ module Vedeu
16
16
  let(:interface) { 'dubnium' }
17
17
 
18
18
  describe '.check' do
19
- context 'when already in use as a system key' do
20
- it 'returns false with a message' do
21
- result = KeymapValidator.check(storage, :shift_tab, interface)
22
- result.must_include(false)
23
- result.last.must_match(/by the system/)
24
- end
19
+ it 'raises an exception when already in use as a system key' do
20
+ proc {
21
+ KeymapValidator.check(storage, :shift_tab, interface)
22
+ }.must_raise(KeyInUse)
25
23
  end
26
24
 
27
- context 'when already in use as a global key' do
28
- it 'returns false with a message' do
29
- result = KeymapValidator.check(storage, 'g', interface)
30
- result.must_include(false)
31
- result.last.must_match(/as a global key/)
32
- end
25
+ it 'raises an exception when already in use as a global key' do
26
+ proc {
27
+ KeymapValidator.check(storage, 'g', interface)
28
+ }.must_raise(KeyInUse)
33
29
  end
34
30
 
35
- context 'when already in use by the interface' do
36
- it 'returns false with a message' do
37
- result = KeymapValidator.check(storage, 'a', interface)
38
- result.must_include(false)
39
- result.last.must_match(/by this interface/)
40
- end
31
+ it 'raises an exception when already in use by the interface' do
32
+ proc {
33
+ KeymapValidator.check(storage, 'a', interface)
34
+ }.must_raise(KeyInUse)
41
35
  end
42
36
 
43
- context 'when attempting to register a global key which is already in ' \
44
- 'use by an interface' do
45
- it 'returns false with a message' do
46
- result = KeymapValidator.check(storage, 'a', '')
47
- result.must_include(false)
48
- result.last.must_match(/therefore cannot be global/)
49
- end
37
+ it 'raises an exception when already in use' do
38
+ proc { KeymapValidator.check(storage, 'a', '') }.must_raise(KeyInUse)
50
39
  end
51
40
 
52
- context 'when valid as a global key' do
53
- it 'returns true with a message' do
54
- result = KeymapValidator.check(storage, 'h', '')
55
- result.must_include(true)
56
- result.last.must_match(/can be registered/)
57
- end
41
+ it 'returns true when valid as a global key' do
42
+ KeymapValidator.check(storage, 'h', '').must_equal(true)
58
43
  end
59
44
 
60
- context 'when valid as an interface key' do
61
- it 'returns true with a message' do
62
- result = KeymapValidator.check(storage, 'b', 'dubnium')
63
- result.must_include(true)
64
- result.last.must_match(/can be registered/)
65
- end
45
+ it 'returns true when valid as an interface key' do
46
+ KeymapValidator.check(storage, 'b', 'dubnium').must_equal(true)
66
47
  end
67
48
  end
68
49
 
@@ -73,7 +54,7 @@ module Vedeu
73
54
  interface = ''
74
55
 
75
56
  KeymapValidator.new(storage, key, interface)
76
- .must_be_instance_of(KeymapValidator)
57
+ .must_be_instance_of(KeymapValidator)
77
58
  end
78
59
  end
79
60
 
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+ EntityNotFound = Class.new(StandardError)
5
+
6
+ class RepositoryTestClass
7
+ include Repository
8
+
9
+ def in_memory
10
+ {}
11
+ end
12
+ alias_method :storage, :in_memory
13
+
14
+ def not_found(name)
15
+ fail EntityNotFound
16
+ end
17
+ end
18
+
19
+ describe Repository do
20
+
21
+ describe '#all' do
22
+ it 'returns a Hash' do
23
+ RepositoryTestClass.new.all.must_be_instance_of(Hash)
24
+ end
25
+
26
+ it 'returns the whole repository' do
27
+ RepositoryTestClass.new.all.must_equal({})
28
+ end
29
+ end
30
+
31
+ describe '#find' do
32
+ it 'raises an exception when the entity cannot be found' do
33
+ proc { RepositoryTestClass.new.find('terbium') }
34
+ .must_raise(EntityNotFound)
35
+ end
36
+ end
37
+
38
+ describe '#registered' do
39
+ it 'returns an Array' do
40
+ RepositoryTestClass.new.registered.must_be_instance_of(Array)
41
+ end
42
+
43
+ it 'returns a collection of the names of all the registered entities' do
44
+ RepositoryTestClass.new.registered.must_equal([])
45
+ end
46
+ end
47
+
48
+ describe '#registered?' do
49
+ it 'returns a FalseClass' do
50
+ RepositoryTestClass.new.registered?('terbium')
51
+ .must_be_instance_of(FalseClass)
52
+ end
53
+
54
+ it 'returns false when the entity is not registered' do
55
+ RepositoryTestClass.new.registered?('terbium').must_equal(false)
56
+ end
57
+ end
58
+
59
+ describe '#reset' do
60
+ it 'returns a Hash' do
61
+ RepositoryTestClass.new.reset.must_be_instance_of(Hash)
62
+ end
63
+
64
+ it 'resets the repository' do
65
+ RepositoryTestClass.new.reset.must_equal({})
66
+ end
67
+ end
68
+
69
+ end
70
+ end