vedeu 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/docs/events.md +6 -0
  3. data/examples/{cursor_app/cursor_app.rb → cursor_app.rb} +1 -1
  4. data/examples/{lines_app/lines_app.rb → lines_app.rb} +1 -1
  5. data/lib/vedeu.rb +48 -28
  6. data/lib/vedeu/api/api.rb +8 -95
  7. data/lib/vedeu/application.rb +6 -2
  8. data/lib/vedeu/{models → colours}/background.rb +1 -1
  9. data/lib/vedeu/{models → colours}/colour.rb +0 -0
  10. data/lib/vedeu/{models → colours}/foreground.rb +2 -2
  11. data/lib/vedeu/{support/colour_translator.rb → colours/translator.rb} +7 -7
  12. data/lib/vedeu/input/input.rb +13 -5
  13. data/lib/vedeu/models/geometry.rb +30 -2
  14. data/lib/vedeu/models/key.rb +39 -0
  15. data/lib/vedeu/output/compositor.rb +30 -76
  16. data/lib/vedeu/output/output.rb +74 -0
  17. data/lib/vedeu/output/viewport.rb +36 -44
  18. data/lib/vedeu/repositories/buffers.rb +5 -18
  19. data/lib/vedeu/repositories/cursors.rb +16 -8
  20. data/lib/vedeu/repositories/events.rb +96 -9
  21. data/lib/vedeu/repositories/focus.rb +21 -20
  22. data/lib/vedeu/repositories/groups.rb +3 -11
  23. data/lib/vedeu/repositories/interfaces.rb +6 -9
  24. data/lib/vedeu/repositories/keymaps.rb +8 -3
  25. data/lib/vedeu/repositories/menus.rb +6 -21
  26. data/lib/vedeu/{models → repositories/models}/buffer.rb +62 -28
  27. data/lib/vedeu/{models → repositories/models}/cursor.rb +8 -2
  28. data/lib/vedeu/{models → repositories/models}/event.rb +7 -0
  29. data/lib/vedeu/repositories/models/group.rb +56 -0
  30. data/lib/vedeu/{models → repositories/models}/interface.rb +6 -0
  31. data/lib/vedeu/{models → repositories/models}/keymap.rb +7 -1
  32. data/lib/vedeu/{models → repositories/models}/menu.rb +9 -0
  33. data/lib/vedeu/{models → repositories/models}/offset.rb +8 -1
  34. data/lib/vedeu/repositories/offsets.rb +17 -12
  35. data/lib/vedeu/support/bounding_area.rb +127 -0
  36. data/lib/vedeu/support/common.rb +8 -0
  37. data/lib/vedeu/support/exceptions.rb +2 -12
  38. data/lib/vedeu/support/model.rb +14 -0
  39. data/lib/vedeu/support/refresh.rb +8 -7
  40. data/lib/vedeu/support/registrar.rb +7 -1
  41. data/lib/vedeu/support/repository.rb +31 -10
  42. data/lib/vedeu/support/sentence.rb +67 -0
  43. data/lib/vedeu/support/terminal.rb +19 -0
  44. data/lib/vedeu/support/trace.rb +2 -5
  45. data/test/integration/api/api_test.rb +97 -0
  46. data/test/integration/api_dsl/dsl_api_test.rb +4 -0
  47. data/test/integration/api_dsl/dsl_composition_test.rb +4 -0
  48. data/test/integration/api_dsl/dsl_defined_test.rb +4 -0
  49. data/test/integration/api_dsl/dsl_helpers_test.rb +4 -0
  50. data/test/integration/api_dsl/dsl_interface_test.rb +4 -0
  51. data/test/integration/api_dsl/dsl_keymap.rb +4 -0
  52. data/test/integration/api_dsl/dsl_line_test.rb +4 -0
  53. data/test/integration/api_dsl/dsl_menu_test.rb +4 -0
  54. data/test/integration/api_dsl/dsl_stream_test.rb +138 -0
  55. data/test/lib/vedeu/api/api_test.rb +1 -25
  56. data/test/lib/vedeu/api/helpers_test.rb +0 -10
  57. data/test/lib/vedeu/{models → colours}/background_test.rb +0 -0
  58. data/test/lib/vedeu/{models → colours}/colour_test.rb +0 -0
  59. data/test/lib/vedeu/{models → colours}/foreground_test.rb +0 -0
  60. data/test/lib/vedeu/{support/colour_translator_test.rb → colours/translator_test.rb} +3 -3
  61. data/test/lib/vedeu/input/input_test.rb +16 -47
  62. data/test/lib/vedeu/models/geometry_test.rb +46 -0
  63. data/test/lib/vedeu/models/group_test.rb +99 -0
  64. data/test/lib/vedeu/models/key_test.rb +41 -0
  65. data/test/lib/vedeu/output/compositor_test.rb +25 -101
  66. data/test/lib/vedeu/output/output_test.rb +108 -0
  67. data/test/lib/vedeu/repositories/buffers_test.rb +0 -8
  68. data/test/lib/vedeu/repositories/cursors_test.rb +34 -0
  69. data/test/lib/vedeu/repositories/focus_test.rb +37 -28
  70. data/test/lib/vedeu/repositories/interfaces_test.rb +1 -1
  71. data/test/lib/vedeu/repositories/keymaps_test.rb +6 -20
  72. data/test/lib/vedeu/repositories/menus_test.rb +0 -6
  73. data/test/lib/vedeu/{models → repositories/models}/buffer_test.rb +24 -27
  74. data/test/lib/vedeu/{models → repositories/models}/cursor_test.rb +0 -0
  75. data/test/lib/vedeu/{models → repositories/models}/event_test.rb +0 -0
  76. data/test/lib/vedeu/{models → repositories/models}/interface_test.rb +0 -0
  77. data/test/lib/vedeu/{models → repositories/models}/keymap_test.rb +0 -0
  78. data/test/lib/vedeu/{models → repositories/models}/menu_test.rb +0 -0
  79. data/test/lib/vedeu/{models → repositories/models}/offset_test.rb +0 -0
  80. data/test/lib/vedeu/support/bounding_area_test.rb +139 -0
  81. data/test/lib/vedeu/support/coercions_test.rb +6 -17
  82. data/test/lib/vedeu/support/grid_test.rb +1 -1
  83. data/test/lib/vedeu/support/model_test.rb +23 -0
  84. data/test/lib/vedeu/support/presentation_test.rb +0 -10
  85. data/test/lib/vedeu/support/refresh_test.rb +2 -2
  86. data/test/lib/vedeu/support/repository_test.rb +63 -64
  87. data/test/lib/vedeu/support/sentence_test.rb +48 -0
  88. data/test/lib/vedeu/support/terminal_test.rb +86 -6
  89. data/test/support/test_classes/all.rb +5 -0
  90. data/test/support/test_classes/coercions.rb +16 -0
  91. data/test/support/test_classes/helpers.rb +19 -0
  92. data/test/support/test_classes/model.rb +23 -0
  93. data/test/support/test_classes/presentation.rb +16 -0
  94. data/test/support/test_classes/repositories.rb +26 -0
  95. data/test/support/test_modules/all.rb +1 -0
  96. data/test/support/test_modules/repository.rb +16 -0
  97. data/test/test_helper.rb +4 -0
  98. data/vedeu.gemspec +3 -3
  99. metadata +95 -50
  100. data/lib/vedeu/output/clear.rb +0 -88
  101. data/lib/vedeu/output/render.rb +0 -50
  102. data/lib/vedeu/repositories/positional.rb +0 -23
  103. data/test/lib/vedeu/output/clear_test.rb +0 -56
  104. data/test/lib/vedeu/output/render_test.rb +0 -100
  105. data/test/lib/vedeu/repositories/positional_test.rb +0 -50
@@ -25,13 +25,13 @@ module Vedeu
25
25
  it 'raises an exception when the group cannot be found' do
26
26
  Groups.reset
27
27
 
28
- proc { Refresh.by_group('') }.must_raise(GroupNotFound)
28
+ proc { Refresh.by_group('') }.must_raise(ModelNotFound)
29
29
  end
30
30
  end
31
31
 
32
32
  describe '.by_name' do
33
33
  it 'raises an exception when the buffer cannot be found' do
34
- proc { Refresh.by_name('') }.must_raise(BufferNotFound)
34
+ proc { Refresh.by_name('') }.must_raise(ModelNotFound)
35
35
  end
36
36
  end
37
37
 
@@ -1,76 +1,60 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module Vedeu
4
- EntityNotFound = Class.new(StandardError)
5
-
6
- class RepositoryTestClass
7
- include Repository
8
-
9
- def initialize(storage = {})
10
- @storage = storage
11
- end
12
-
13
- def add(entity)
14
- if storage.is_a?(Hash)
15
- @storage = in_memory.merge!(entity)
16
-
17
- else
18
- @storage << entity
19
-
20
- end
21
- end
22
-
23
- attr_accessor :storage
24
- alias_method :in_memory, :storage
25
-
26
- def not_found(name)
27
- fail EntityNotFound
28
- end
29
- end # RepositoryTestClass
30
4
 
31
5
  describe Repository do
32
6
 
33
7
  describe '#all' do
34
8
  it 'returns a Hash' do
35
- RepositoryTestClass.new.all.must_be_instance_of(Hash)
9
+ RepositoriesTestClass.new.all.must_be_instance_of(Hash)
36
10
  end
37
11
 
38
12
  it 'returns the whole repository' do
39
- RepositoryTestClass.new.all.must_equal({})
13
+ RepositoriesTestClass.new.all.must_equal({})
14
+ end
15
+ end
16
+
17
+ describe '#empty?' do
18
+ it 'returns true when the storage is empty' do
19
+ RepositoriesTestClass.new.empty?.must_equal(true)
20
+ end
21
+
22
+ it 'returns false when the storage is not empty' do
23
+ RepositoriesTestClass.new({ key: :value }).empty?.must_equal(false)
40
24
  end
41
25
  end
42
26
 
43
27
  describe '#find' do
44
- it 'raises an exception when the entity cannot be found' do
28
+ it 'raises an exception when the model cannot be found' do
45
29
  proc {
46
- RepositoryTestClass.new.find('terbium')
47
- }.must_raise(EntityNotFound)
30
+ RepositoriesTestClass.new.find('terbium')
31
+ }.must_raise(ModelNotFound)
48
32
  end
49
33
 
50
- context 'when the entity is found' do
51
- it 'returns the stored entity' do
52
- entity = { key: :value }
53
- repo = RepositoryTestClass.new
54
- repo.add({ 'terbium' => entity })
34
+ context 'when the model is found' do
35
+ it 'returns the stored model' do
36
+ model = { key: :value }
37
+ repo = RepositoriesTestClass.new
38
+ repo.add({ 'terbium' => model })
55
39
 
56
- repo.find('terbium').must_equal(entity)
40
+ repo.find('terbium').must_equal(model)
57
41
  end
58
42
  end
59
43
  end
60
44
 
61
45
  describe '#find_or_create' do
62
- context 'when the entity is found by name' do
63
- it 'returns the storage entity' do
46
+ context 'when the model is found by name' do
47
+ it 'returns the storage model' do
64
48
  skip
65
49
  end
66
50
  end
67
51
 
68
- context 'when the entity is not found by name' do
69
- it 'stores the newly created entity' do
52
+ context 'when the model is not found by name' do
53
+ it 'stores the newly created model' do
70
54
  skip
71
55
  end
72
56
 
73
- it 'returns the newly created entity' do
57
+ it 'returns the newly created model' do
74
58
  skip
75
59
  end
76
60
  end
@@ -78,12 +62,12 @@ module Vedeu
78
62
 
79
63
  describe '#registered' do
80
64
  it 'returns an Array' do
81
- RepositoryTestClass.new.registered.must_be_instance_of(Array)
65
+ RepositoriesTestClass.new.registered.must_be_instance_of(Array)
82
66
  end
83
67
 
84
68
  context 'when the storage is a Hash' do
85
69
  it 'returns a collection of the names of all the registered entities' do
86
- repo = RepositoryTestClass.new
70
+ repo = RepositoriesTestClass.new
87
71
  repo.add({ 'rutherfordium' => { name: 'rutherfordium' } })
88
72
 
89
73
  repo.registered.must_equal(['rutherfordium'])
@@ -92,7 +76,7 @@ module Vedeu
92
76
 
93
77
  context 'when the storage is an Array' do
94
78
  it 'returns the registered entities' do
95
- repo = RepositoryTestClass.new([])
79
+ repo = RepositoriesTestClass.new([])
96
80
  repo.add('rutherfordium')
97
81
 
98
82
  repo.registered.must_equal(['rutherfordium'])
@@ -101,7 +85,7 @@ module Vedeu
101
85
 
102
86
  context 'when the storage is a Set' do
103
87
  it 'returns the registered entities' do
104
- repo = RepositoryTestClass.new(Set.new)
88
+ repo = RepositoriesTestClass.new(Set.new)
105
89
  repo.add('rutherfordium')
106
90
 
107
91
  repo.registered.must_equal(['rutherfordium'])
@@ -109,26 +93,26 @@ module Vedeu
109
93
  end
110
94
 
111
95
  it 'returns an empty collection when the storage is empty' do
112
- RepositoryTestClass.new.registered.must_equal([])
96
+ RepositoriesTestClass.new.registered.must_equal([])
113
97
  end
114
98
  end
115
99
 
116
100
  describe '#registered?' do
117
101
  it 'returns false when the storage is empty' do
118
- RepositoryTestClass.new.registered?('terbium').must_equal(false)
102
+ RepositoriesTestClass.new.registered?('terbium').must_equal(false)
119
103
  end
120
104
 
121
- it 'returns false when the entity is not registered' do
122
- repo = RepositoryTestClass.new
105
+ it 'returns false when the model is not registered' do
106
+ repo = RepositoriesTestClass.new
123
107
  repo.add({ name: 'samarium' })
124
108
 
125
109
  repo.registered?('terbium').must_equal(false)
126
110
  end
127
111
 
128
- it 'returns true when the entity is registered' do
112
+ it 'returns true when the model is registered' do
129
113
  skip
130
114
 
131
- repo = RepositoryTestClass.new
115
+ repo = RepositoriesTestClass.new
132
116
  repo.add({ name: 'samarium' })
133
117
 
134
118
  repo.registered?('samarium').must_equal(true)
@@ -138,14 +122,14 @@ module Vedeu
138
122
  describe '#remove' do
139
123
  context 'when the storage is empty' do
140
124
  it 'returns false' do
141
- test_repo = RepositoryTestClass.new
125
+ test_repo = RepositoriesTestClass.new
142
126
  test_repo.remove('francium').must_equal(false)
143
127
  end
144
128
  end
145
129
 
146
- context 'when the entity is not registered' do
130
+ context 'when the model is not registered' do
147
131
  it 'returns false' do
148
- test_repo = RepositoryTestClass.new
132
+ test_repo = RepositoriesTestClass.new
149
133
  test_repo.add({
150
134
  'gadolinium' => 'rare-earth metal',
151
135
  'samarium' => 'a hard silvery metal'
@@ -154,9 +138,9 @@ module Vedeu
154
138
  end
155
139
  end
156
140
 
157
- context 'when the entity is registered' do
158
- it 'returns the storage with the entity removed' do
159
- test_repo = RepositoryTestClass.new
141
+ context 'when the model is registered' do
142
+ it 'returns the storage with the model removed' do
143
+ test_repo = RepositoriesTestClass.new
160
144
  test_repo.add({
161
145
  'gadolinium' => 'rare-earth metal',
162
146
  'samarium' => 'a hard silvery metal'
@@ -168,8 +152,8 @@ module Vedeu
168
152
  end
169
153
 
170
154
  context 'alias method: #destroy' do
171
- it 'returns the storage with the entity removed' do
172
- test_repo = RepositoryTestClass.new
155
+ it 'returns the storage with the model removed' do
156
+ test_repo = RepositoriesTestClass.new
173
157
  test_repo.add({
174
158
  'gadolinium' => 'rare-earth metal',
175
159
  'samarium' => 'a hard silvery metal'
@@ -181,8 +165,8 @@ module Vedeu
181
165
  end
182
166
 
183
167
  context 'alias method; #delete' do
184
- it 'returns the storage with the entity removed' do
185
- test_repo = RepositoryTestClass.new
168
+ it 'returns the storage with the model removed' do
169
+ test_repo = RepositoriesTestClass.new
186
170
  test_repo.add({
187
171
  'gadolinium' => 'rare-earth metal',
188
172
  'samarium' => 'a hard silvery metal'
@@ -196,11 +180,26 @@ module Vedeu
196
180
 
197
181
  describe '#reset' do
198
182
  it 'returns a Hash' do
199
- RepositoryTestClass.new.reset.must_be_instance_of(Hash)
183
+ RepositoriesTestClass.new.reset.must_be_instance_of(Hash)
200
184
  end
201
185
 
202
186
  it 'resets the repository' do
203
- RepositoryTestClass.new.reset.must_equal({})
187
+ RepositoriesTestClass.new.reset.must_equal({})
188
+ end
189
+ end
190
+
191
+ describe '#store' do
192
+ let(:attributes) {
193
+ {
194
+ name: 'hydrogen'
195
+ }
196
+ }
197
+ let(:model) { ModelTestClass.new(attributes) }
198
+
199
+ subject { RepositoriesTestClass.new.store(model) }
200
+
201
+ it 'returns the model' do
202
+ subject.must_be_instance_of(model.class)
204
203
  end
205
204
  end
206
205
 
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Sentence do
6
+
7
+ let(:elements) { ['Hydrogen'] }
8
+ let(:label) { 'elements' }
9
+
10
+ describe '.construct' do
11
+ subject { Sentence.construct(elements, label) }
12
+
13
+ context 'when there is one element' do
14
+ let(:elements) { ['Hydrogen'] }
15
+
16
+ it 'returns the element as a string' do
17
+ subject.must_equal('Hydrogen')
18
+ end
19
+ end
20
+
21
+ context 'when there are two elements' do
22
+ let(:elements) { %w(Hydrogen Helium) }
23
+
24
+ it "returns the elements joined with 'and'" do
25
+ subject.must_equal('Hydrogen and Helium')
26
+ end
27
+ end
28
+
29
+ context 'when there are more than two elements' do
30
+ let(:elements) { %w(Hydrogen Helium Lithium) }
31
+
32
+ it 'returns the elements as a sentence list' do
33
+ subject.must_equal('Hydrogen, Helium and Lithium')
34
+ end
35
+ end
36
+
37
+ context 'when there are no elements' do
38
+ let(:elements) { [] }
39
+
40
+ it 'returns a polite message' do
41
+ subject.must_equal('No elements have been assigned.')
42
+ end
43
+ end
44
+ end
45
+
46
+ end # Sentence
47
+
48
+ end # Vedeu
@@ -92,13 +92,19 @@ module Vedeu
92
92
  end
93
93
 
94
94
  describe '.switch_mode!' do
95
+ it 'returns a Symbol' do
96
+ Terminal.switch_mode!.must_be_instance_of(Symbol)
97
+ end
98
+
95
99
  it 'returns :cooked if previously :raw' do
96
100
  Terminal.raw_mode!
101
+
97
102
  Terminal.switch_mode!.must_equal(:cooked)
98
103
  end
99
104
 
100
105
  it 'returns :raw if previously :cooked' do
101
106
  Terminal.cooked_mode!
107
+
102
108
  Terminal.switch_mode!.must_equal(:raw)
103
109
  end
104
110
  end
@@ -110,6 +116,8 @@ module Vedeu
110
116
  end
111
117
 
112
118
  it 'returns the configured terminal mode' do
119
+ Terminal.mode.must_be_instance_of(Symbol)
120
+
113
121
  Terminal.mode.must_equal(:raw)
114
122
  end
115
123
  end
@@ -117,6 +125,8 @@ module Vedeu
117
125
  describe '.centre' do
118
126
  it 'returns the centre point on the terminal' do
119
127
  console.stub :winsize, [25, 80] do
128
+ Terminal.centre.must_be_instance_of(Array)
129
+
120
130
  Terminal.centre.must_equal([12, 40])
121
131
  end
122
132
  end
@@ -125,6 +135,8 @@ module Vedeu
125
135
  describe '.centre_y' do
126
136
  it 'returns the centre `y` point on the terminal' do
127
137
  console.stub :winsize, [25, 80] do
138
+ Terminal.centre_y.must_be_instance_of(Fixnum)
139
+
128
140
  Terminal.centre_y.must_equal(12)
129
141
  end
130
142
  end
@@ -133,23 +145,89 @@ module Vedeu
133
145
  describe '.centre_x' do
134
146
  it 'returns the centre `x` point on the terminal' do
135
147
  console.stub :winsize, [25, 80] do
148
+ Terminal.centre_x.must_be_instance_of(Fixnum)
149
+
136
150
  Terminal.centre_x.must_equal(40)
137
151
  end
138
152
  end
139
153
  end
140
154
 
141
- describe '.width' do
142
- it 'returns the width of the terminal' do
155
+ describe '.origin' do
156
+ it 'returns 1' do
143
157
  console.stub :winsize, [25, 80] do
144
- Terminal.width.must_equal(80)
158
+ Terminal.origin.must_be_instance_of(Fixnum)
159
+
160
+ Terminal.origin.must_equal(1)
161
+ end
162
+ end
163
+
164
+ context 'alias_methods' do
165
+ it 'returns 1' do
166
+ console.stub :winsize, [25, 80] do
167
+ Terminal.x.must_equal(1)
168
+ end
169
+ end
170
+
171
+ it 'returns 1' do
172
+ console.stub :winsize, [25, 80] do
173
+ Terminal.y.must_equal(1)
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ describe '.width' do
180
+ context 'via method' do
181
+ it 'returns the width of the terminal' do
182
+ console.stub :winsize, [25, 80] do
183
+ Terminal.width.must_be_instance_of(Fixnum)
184
+
185
+ Terminal.width.must_equal(80)
186
+ end
187
+ end
188
+ end
189
+
190
+ context 'via API' do
191
+ it 'returns the width of the terminal' do
192
+ console.stub :winsize, [24, 40] do
193
+ Vedeu.width.must_equal(40)
194
+ end
195
+ end
196
+ end
197
+
198
+ context 'alias_methods' do
199
+ it 'returns the xn coordinate of the terminal' do
200
+ console.stub :winsize, [25, 80] do
201
+ Terminal.xn.must_equal(80)
202
+ end
145
203
  end
146
204
  end
147
205
  end
148
206
 
149
207
  describe '.height' do
150
- it 'returns the height of the terminal' do
151
- console.stub :winsize, [25, 80] do
152
- Terminal.height.must_equal(25)
208
+ context 'via method' do
209
+ it 'returns the height of the terminal' do
210
+ console.stub :winsize, [25, 80] do
211
+ Terminal.height.must_be_instance_of(Fixnum)
212
+
213
+ Terminal.height.must_equal(25)
214
+ end
215
+ end
216
+ end
217
+
218
+ context 'via API' do
219
+ it 'returns the height of the terminal' do
220
+ console.stub :winsize, [24, 40] do
221
+ Vedeu.height.must_equal(24)
222
+ end
223
+ end
224
+ end
225
+
226
+ context 'alias_methods' do
227
+ it 'returns the yn coordinate of the terminal' do
228
+ console.stub :winsize, [25, 80] do
229
+ Terminal.yn.must_equal(25)
230
+ end
153
231
  end
154
232
  end
155
233
  end
@@ -157,6 +235,8 @@ module Vedeu
157
235
  describe '.size' do
158
236
  it 'returns the width and height of the terminal' do
159
237
  console.stub :winsize, [25, 80] do
238
+ Terminal.size.must_be_instance_of(Array)
239
+
160
240
  Terminal.size.must_equal([25, 80])
161
241
  end
162
242
  end