vedeu 0.2.12 → 0.3.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 (305) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Guardfile +13 -0
  4. data/README.md +11 -9
  5. data/Rakefile +10 -1
  6. data/bin/vedeu_test +14 -0
  7. data/config/cucumber.yml +8 -0
  8. data/docs/api.md +45 -16
  9. data/docs/events.md +21 -9
  10. data/docs/getting_started.md +16 -0
  11. data/docs/views.md +158 -0
  12. data/examples/borders_app.rb +236 -110
  13. data/examples/colour_support.sh +98 -0
  14. data/examples/colours_app.rb +41 -0
  15. data/examples/configuration_app.rb +11 -6
  16. data/examples/cursor_app.rb +60 -61
  17. data/examples/focus_app.rb +72 -34
  18. data/examples/hello_world.rb +13 -8
  19. data/examples/lines_app.rb +37 -28
  20. data/features/start_stop.feature +27 -0
  21. data/features/support/env.rb +14 -0
  22. data/lib/vedeu/all.rb +29 -0
  23. data/lib/vedeu/api.rb +39 -0
  24. data/lib/vedeu/application.rb +15 -7
  25. data/lib/vedeu/bindings.rb +121 -0
  26. data/lib/vedeu/buffers/all.rb +10 -0
  27. data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
  28. data/lib/vedeu/buffers/display_buffer.rb +118 -0
  29. data/lib/vedeu/configuration/all.rb +6 -0
  30. data/lib/vedeu/configuration/api.rb +3 -1
  31. data/lib/vedeu/configuration/cli.rb +3 -1
  32. data/lib/vedeu/configuration/configuration.rb +23 -2
  33. data/lib/vedeu/cursor/all.rb +23 -0
  34. data/lib/vedeu/cursor/cursor.rb +116 -0
  35. data/lib/vedeu/cursor/move_cursor.rb +137 -0
  36. data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
  37. data/lib/vedeu/dsl/all.rb +28 -0
  38. data/lib/vedeu/dsl/components/all.rb +7 -0
  39. data/lib/vedeu/dsl/components/border.rb +104 -0
  40. data/lib/vedeu/dsl/components/geometry.rb +153 -0
  41. data/lib/vedeu/dsl/components/keymap.rb +93 -0
  42. data/lib/vedeu/dsl/components/menu.rb +82 -0
  43. data/lib/vedeu/dsl/composition.rb +72 -0
  44. data/lib/vedeu/dsl/interface.rb +210 -0
  45. data/lib/vedeu/dsl/line.rb +135 -0
  46. data/lib/vedeu/dsl/shared/all.rb +7 -0
  47. data/lib/vedeu/dsl/shared/colour.rb +85 -0
  48. data/lib/vedeu/dsl/shared/style.rb +38 -0
  49. data/lib/vedeu/dsl/shared/text.rb +102 -0
  50. data/lib/vedeu/dsl/shared/use.rb +47 -0
  51. data/lib/vedeu/dsl/stream.rb +49 -0
  52. data/lib/vedeu/dsl/view.rb +136 -0
  53. data/lib/vedeu/events/all.rb +10 -0
  54. data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
  55. data/lib/vedeu/events/trigger.rb +58 -0
  56. data/lib/vedeu/exceptions.rb +34 -0
  57. data/lib/vedeu/input/all.rb +29 -0
  58. data/lib/vedeu/input/input.rb +26 -0
  59. data/lib/vedeu/{models → input}/key.rb +21 -11
  60. data/lib/vedeu/input/keymap.rb +130 -0
  61. data/lib/vedeu/input/keys.rb +8 -0
  62. data/lib/vedeu/input/mapper.rb +112 -0
  63. data/lib/vedeu/launcher.rb +7 -4
  64. data/lib/vedeu/models/all.rb +12 -0
  65. data/lib/vedeu/models/collection.rb +71 -0
  66. data/lib/vedeu/{repositories → models}/focus.rb +63 -21
  67. data/lib/vedeu/models/geometry.rb +100 -259
  68. data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
  69. data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
  70. data/lib/vedeu/models/model.rb +51 -0
  71. data/lib/vedeu/models/view/all.rb +12 -0
  72. data/lib/vedeu/models/view/char.rb +84 -0
  73. data/lib/vedeu/models/view/chars.rb +8 -0
  74. data/lib/vedeu/models/view/composition.rb +101 -0
  75. data/lib/vedeu/models/view/interface.rb +215 -0
  76. data/lib/vedeu/models/view/interfaces.rb +8 -0
  77. data/lib/vedeu/models/view/line.rb +134 -0
  78. data/lib/vedeu/models/view/lines.rb +8 -0
  79. data/lib/vedeu/models/view/stream.rb +144 -0
  80. data/lib/vedeu/models/view/streams.rb +8 -0
  81. data/lib/vedeu/output/all.rb +8 -0
  82. data/lib/vedeu/output/border.rb +387 -0
  83. data/lib/vedeu/output/compositor.rb +41 -30
  84. data/lib/vedeu/output/output.rb +6 -13
  85. data/lib/vedeu/output/viewport.rb +78 -94
  86. data/lib/vedeu/output/writer.rb +29 -0
  87. data/lib/vedeu/presentation/all.rb +9 -0
  88. data/lib/vedeu/{colours → presentation}/background.rb +1 -9
  89. data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
  90. data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
  91. data/lib/vedeu/presentation/presentation.rb +91 -0
  92. data/lib/vedeu/presentation/style.rb +47 -0
  93. data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
  94. data/lib/vedeu/repositories/all.rb +5 -0
  95. data/lib/vedeu/repositories/menus.rb +5 -42
  96. data/lib/vedeu/{support → repositories}/repository.rb +78 -41
  97. data/lib/vedeu/support/all.rb +22 -0
  98. data/lib/vedeu/support/bounding_area.rb +2 -1
  99. data/lib/vedeu/support/coercions.rb +18 -1
  100. data/lib/vedeu/support/console.rb +73 -0
  101. data/lib/vedeu/support/content_geometry.rb +69 -0
  102. data/lib/vedeu/support/coordinate.rb +246 -0
  103. data/lib/vedeu/support/esc.rb +29 -2
  104. data/lib/vedeu/support/log.rb +36 -2
  105. data/lib/vedeu/support/node.rb +61 -0
  106. data/lib/vedeu/support/position.rb +28 -13
  107. data/lib/vedeu/support/position_validator.rb +79 -0
  108. data/lib/vedeu/support/read.rb +65 -0
  109. data/lib/vedeu/support/refresh.rb +8 -32
  110. data/lib/vedeu/support/terminal.rb +34 -4
  111. data/lib/vedeu/support/text.rb +104 -0
  112. data/lib/vedeu/support/trace.rb +11 -23
  113. data/lib/vedeu/support/visible.rb +75 -0
  114. data/lib/vedeu/support/write.rb +85 -0
  115. data/lib/vedeu/traps.rb +18 -0
  116. data/lib/vedeu.rb +41 -101
  117. data/test/integration/dsl/compositions_test.rb +27 -0
  118. data/test/integration/dsl/interfaces_test.rb +261 -0
  119. data/test/integration/dsl/keymaps_test.rb +42 -0
  120. data/test/integration/dsl/lines_test.rb +146 -0
  121. data/test/integration/dsl/menus_test.rb +59 -0
  122. data/test/integration/dsl/streams_test.rb +129 -0
  123. data/test/integration/dsl/views_test.rb +63 -0
  124. data/test/lib/vedeu/api_test.rb +163 -0
  125. data/test/lib/vedeu/application_test.rb +19 -10
  126. data/test/lib/vedeu/bindings_test.rb +54 -0
  127. data/test/lib/vedeu/buffers/all_test.rb +11 -0
  128. data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
  129. data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
  130. data/test/lib/vedeu/configuration/api_test.rb +42 -58
  131. data/test/lib/vedeu/configuration/cli_test.rb +4 -4
  132. data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
  133. data/test/lib/vedeu/cursor/all_test.rb +33 -0
  134. data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
  135. data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
  136. data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
  137. data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
  138. data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
  139. data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
  140. data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
  141. data/test/lib/vedeu/dsl/composition_test.rb +41 -0
  142. data/test/lib/vedeu/dsl/interface_test.rb +470 -0
  143. data/test/lib/vedeu/dsl/line_test.rb +60 -0
  144. data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
  145. data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
  146. data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
  147. data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
  148. data/test/lib/vedeu/dsl/stream_test.rb +26 -0
  149. data/test/lib/vedeu/dsl/view_test.rb +73 -0
  150. data/test/lib/vedeu/events/all_test.rb +11 -0
  151. data/test/lib/vedeu/events/event_test.rb +109 -0
  152. data/test/lib/vedeu/events/trigger_test.rb +60 -0
  153. data/test/lib/vedeu/input/all_test.rb +11 -0
  154. data/test/lib/vedeu/input/input_test.rb +7 -3
  155. data/test/lib/vedeu/input/key_test.rb +72 -0
  156. data/test/lib/vedeu/input/keymap_test.rb +89 -0
  157. data/test/lib/vedeu/input/mapper_test.rb +94 -0
  158. data/test/lib/vedeu/launcher_test.rb +19 -20
  159. data/test/lib/vedeu/models/collection_test.rb +114 -0
  160. data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
  161. data/test/lib/vedeu/models/geometry_test.rb +35 -39
  162. data/test/lib/vedeu/models/group_test.rb +100 -0
  163. data/test/lib/vedeu/models/menu_test.rb +288 -0
  164. data/test/lib/vedeu/models/model_test.rb +31 -0
  165. data/test/lib/vedeu/models/view/char_test.rb +166 -0
  166. data/test/lib/vedeu/models/view/chars_test.rb +18 -0
  167. data/test/lib/vedeu/models/view/composition_test.rb +41 -0
  168. data/test/lib/vedeu/models/view/interface_test.rb +128 -0
  169. data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
  170. data/test/lib/vedeu/models/view/line_test.rb +214 -0
  171. data/test/lib/vedeu/models/view/lines_test.rb +18 -0
  172. data/test/lib/vedeu/models/view/stream_test.rb +106 -0
  173. data/test/lib/vedeu/models/view/streams_test.rb +18 -0
  174. data/test/lib/vedeu/output/border_test.rb +357 -0
  175. data/test/lib/vedeu/output/compositor_test.rb +61 -15
  176. data/test/lib/vedeu/output/output_test.rb +25 -84
  177. data/test/lib/vedeu/output/viewport_test.rb +171 -45
  178. data/test/lib/vedeu/output/writer_test.rb +45 -0
  179. data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
  180. data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
  181. data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
  182. data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
  183. data/test/lib/vedeu/presentation/style_test.rb +69 -0
  184. data/test/lib/vedeu/presentation/translator_test.rb +63 -0
  185. data/test/lib/vedeu/repositories/all_test.rb +7 -0
  186. data/test/lib/vedeu/repositories/menus_test.rb +3 -156
  187. data/test/lib/vedeu/repositories/repository_test.rb +271 -0
  188. data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
  189. data/test/lib/vedeu/support/coercions_test.rb +39 -0
  190. data/test/lib/vedeu/support/common_test.rb +31 -16
  191. data/test/lib/vedeu/support/console_test.rb +85 -0
  192. data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
  193. data/test/lib/vedeu/support/coordinate_test.rb +190 -0
  194. data/test/lib/vedeu/support/esc_test.rb +18 -0
  195. data/test/lib/vedeu/support/grid_test.rb +15 -10
  196. data/test/lib/vedeu/support/log_test.rb +3 -0
  197. data/test/lib/vedeu/support/position_test.rb +22 -2
  198. data/test/lib/vedeu/support/position_validator_test.rb +11 -0
  199. data/test/lib/vedeu/support/read_test.rb +88 -0
  200. data/test/lib/vedeu/support/refresh_test.rb +44 -12
  201. data/test/lib/vedeu/support/sentence_test.rb +6 -4
  202. data/test/lib/vedeu/support/terminal_test.rb +81 -70
  203. data/test/lib/vedeu/support/text_test.rb +93 -0
  204. data/test/lib/vedeu/support/trace_test.rb +21 -9
  205. data/test/lib/vedeu/support/visible_test.rb +148 -0
  206. data/test/lib/vedeu/support/write_test.rb +136 -0
  207. data/test/lib/vedeu/traps_test.rb +11 -0
  208. data/test/lib/vedeu_test.rb +2 -0
  209. data/test/support/helpers/all.rb +7 -0
  210. data/test/support/helpers/dsl_model_test_class.rb +25 -0
  211. data/test/support/{test_classes → helpers}/helpers.rb +0 -2
  212. data/test/support/helpers/misc.rb +15 -0
  213. data/test/support/helpers/model_test_class.rb +34 -0
  214. data/test/support/{test_classes → helpers}/presentation.rb +0 -0
  215. data/test/support/{test_classes → helpers}/repositories.rb +3 -3
  216. data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
  217. data/test/test_helper.rb +19 -22
  218. data/vedeu.gemspec +11 -6
  219. metadata +322 -181
  220. data/lib/vedeu/api/api.rb +0 -239
  221. data/lib/vedeu/api/composition.rb +0 -38
  222. data/lib/vedeu/api/defined.rb +0 -52
  223. data/lib/vedeu/api/helpers.rb +0 -161
  224. data/lib/vedeu/api/interface.rb +0 -287
  225. data/lib/vedeu/api/keymap.rb +0 -75
  226. data/lib/vedeu/api/line.rb +0 -107
  227. data/lib/vedeu/api/menu.rb +0 -111
  228. data/lib/vedeu/api/stream.rb +0 -96
  229. data/lib/vedeu/models/border.rb +0 -238
  230. data/lib/vedeu/models/char.rb +0 -43
  231. data/lib/vedeu/models/composition.rb +0 -72
  232. data/lib/vedeu/models/line.rb +0 -100
  233. data/lib/vedeu/models/stream.rb +0 -130
  234. data/lib/vedeu/models/style.rb +0 -52
  235. data/lib/vedeu/repositories/buffers.rb +0 -52
  236. data/lib/vedeu/repositories/cursors.rb +0 -64
  237. data/lib/vedeu/repositories/events.rb +0 -147
  238. data/lib/vedeu/repositories/groups.rb +0 -47
  239. data/lib/vedeu/repositories/interfaces.rb +0 -78
  240. data/lib/vedeu/repositories/keymaps.rb +0 -196
  241. data/lib/vedeu/repositories/models/cursor.rb +0 -209
  242. data/lib/vedeu/repositories/models/interface.rb +0 -163
  243. data/lib/vedeu/repositories/models/keymap.rb +0 -111
  244. data/lib/vedeu/repositories/models/offset.rb +0 -91
  245. data/lib/vedeu/repositories/offsets.rb +0 -69
  246. data/lib/vedeu/support/exceptions.rb +0 -34
  247. data/lib/vedeu/support/keymap_validator.rb +0 -100
  248. data/lib/vedeu/support/model.rb +0 -14
  249. data/lib/vedeu/support/presentation.rb +0 -86
  250. data/lib/vedeu/support/registrar.rb +0 -53
  251. data/test/integration/api/api_test.rb +0 -97
  252. data/test/integration/api_dsl/dsl_api_test.rb +0 -4
  253. data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
  254. data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
  255. data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
  256. data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
  257. data/test/integration/api_dsl/dsl_keymap.rb +0 -4
  258. data/test/integration/api_dsl/dsl_line_test.rb +0 -4
  259. data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
  260. data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
  261. data/test/integration/cursors_test.rb +0 -9
  262. data/test/integration/defining_interfaces_test.rb +0 -26
  263. data/test/integration/run_once_test.rb +0 -26
  264. data/test/integration/views/basic_view_test.rb +0 -807
  265. data/test/lib/vedeu/api/api_test.rb +0 -204
  266. data/test/lib/vedeu/api/composition_test.rb +0 -31
  267. data/test/lib/vedeu/api/defined_test.rb +0 -79
  268. data/test/lib/vedeu/api/helpers_test.rb +0 -111
  269. data/test/lib/vedeu/api/interface_test.rb +0 -410
  270. data/test/lib/vedeu/api/keymap_test.rb +0 -65
  271. data/test/lib/vedeu/api/line_test.rb +0 -83
  272. data/test/lib/vedeu/api/menu_test.rb +0 -85
  273. data/test/lib/vedeu/api/stream_test.rb +0 -59
  274. data/test/lib/vedeu/colours/translator_test.rb +0 -22
  275. data/test/lib/vedeu/models/border_test.rb +0 -197
  276. data/test/lib/vedeu/models/char_test.rb +0 -52
  277. data/test/lib/vedeu/models/composition_test.rb +0 -45
  278. data/test/lib/vedeu/models/key_test.rb +0 -43
  279. data/test/lib/vedeu/models/line_test.rb +0 -123
  280. data/test/lib/vedeu/models/stream_test.rb +0 -233
  281. data/test/lib/vedeu/models/style_test.rb +0 -59
  282. data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
  283. data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
  284. data/test/lib/vedeu/repositories/events_test.rb +0 -57
  285. data/test/lib/vedeu/repositories/groups_test.rb +0 -28
  286. data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
  287. data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
  288. data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
  289. data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
  290. data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
  291. data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
  292. data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
  293. data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
  294. data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
  295. data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
  296. data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
  297. data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
  298. data/test/lib/vedeu/support/model_test.rb +0 -23
  299. data/test/lib/vedeu/support/presentation_test.rb +0 -53
  300. data/test/lib/vedeu/support/registrar_test.rb +0 -94
  301. data/test/lib/vedeu/support/repository_test.rb +0 -208
  302. data/test/support/test_classes/all.rb +0 -5
  303. data/test/support/test_classes/coercions.rb +0 -16
  304. data/test/support/test_classes/model.rb +0 -23
  305. data/test/support/test_modules/all.rb +0 -1
@@ -0,0 +1,288 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Menu do
6
+
7
+ let(:described) { Vedeu::Menu }
8
+ let(:instance) { described.new(collection, menu_name, current, selected) }
9
+ let(:collection) { ['hydrogen', 'carbon', 'nitrogen', 'oxygen'] }
10
+ let(:menu_name) { 'elements' }
11
+ let(:current) { 0 }
12
+ let(:selected) {}
13
+
14
+ before { Vedeu.menus.reset }
15
+
16
+ describe '.build' do
17
+ subject { described.build }
18
+
19
+ it { subject.must_be_instance_of(described) }
20
+ end
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(InvalidSyntax) }
35
+ end
36
+ end
37
+
38
+ describe '#initialize' do
39
+ subject { instance }
40
+
41
+ it { subject.must_be_instance_of(described) }
42
+
43
+ it { subject.instance_variable_get('@collection').must_equal(collection) }
44
+ it { subject.instance_variable_get('@name').must_equal('elements') }
45
+ it { subject.instance_variable_get('@current').must_equal(0) }
46
+ it { subject.instance_variable_get('@selected').must_equal(nil) }
47
+ it { subject.instance_variable_get('@repository').must_equal(Vedeu.menus) }
48
+ end
49
+
50
+ describe '#current' do
51
+ subject { instance.current }
52
+
53
+ it 'returns the current index' do
54
+ subject.must_equal(0)
55
+ end
56
+ end
57
+
58
+ describe '#selected' do
59
+ subject { instance.selected }
60
+
61
+ it 'returns nil when no item is selected' do
62
+ subject.must_equal(nil)
63
+ end
64
+
65
+ it 'returns the selected index when an item is selected' do
66
+ instance.next_item
67
+ instance.select_item
68
+
69
+ subject.must_equal(1)
70
+ end
71
+ end
72
+
73
+ describe '#current_item' do
74
+ subject { instance.current_item }
75
+
76
+ it 'returns the current item from the collection' do
77
+ subject.must_equal('hydrogen')
78
+ end
79
+
80
+ it 'when the current item has changed' do
81
+ instance.next_item
82
+ instance.next_item
83
+
84
+ subject.must_equal('nitrogen')
85
+ end
86
+ end
87
+
88
+ describe '#selected_item' do
89
+ subject { instance.selected_item }
90
+
91
+ it 'returns nil when nothing is selected' do
92
+ subject.must_equal(nil)
93
+ end
94
+
95
+ it 'returns the selected item from the collection' do
96
+ instance.next_item
97
+ instance.select_item
98
+
99
+ subject.must_equal('carbon')
100
+ end
101
+ end
102
+
103
+ describe '#items' do
104
+ it 'returns a collection of items' do
105
+ instance.items.must_equal(
106
+ [
107
+ [false, true, 'hydrogen'],
108
+ [false, false, 'carbon'],
109
+ [false, false, 'nitrogen'],
110
+ [false, false, 'oxygen']
111
+ ]
112
+ )
113
+ end
114
+
115
+ it 'returns a collection of items when the current has ' \
116
+ 'changed' do
117
+ instance.next_item
118
+ instance.items.must_equal(
119
+ [
120
+ [false, false, 'hydrogen'],
121
+ [false, true, 'carbon'],
122
+ [false, false, 'nitrogen'],
123
+ [false, false, 'oxygen']
124
+ ]
125
+ )
126
+ end
127
+
128
+ it 'returns a collection of items when an item is selected' do
129
+ instance.next_item
130
+ instance.select_item
131
+ instance.items.must_equal(
132
+ [
133
+ [false, false, 'hydrogen'],
134
+ [true, true, 'carbon'],
135
+ [false, false, 'nitrogen'],
136
+ [false, false, 'oxygen']
137
+ ]
138
+ )
139
+ end
140
+
141
+ it 'returns a collection of items when the current has ' \
142
+ 'changed and an item is selected' do
143
+ instance.next_item
144
+ instance.select_item
145
+ instance.next_item
146
+ instance.next_item
147
+ instance.items.must_equal(
148
+ [
149
+ [false, false, 'hydrogen'],
150
+ [true, false, 'carbon'],
151
+ [false, false, 'nitrogen'],
152
+ [false, true, 'oxygen']
153
+ ]
154
+ )
155
+ end
156
+ end
157
+
158
+ describe '#view' do
159
+ it 'returns a collection of items when the start position ' \
160
+ 'has changed' do
161
+ instance.top_item
162
+ instance.next_item
163
+ instance.view.must_equal(
164
+ [
165
+ [false, true, 'carbon'],
166
+ [false, false, 'nitrogen'],
167
+ [false, false, 'oxygen']
168
+ ]
169
+ )
170
+ end
171
+ end
172
+
173
+ describe '#top_item' do
174
+ it 'sets current to the index of the first item' do
175
+ instance.next_item
176
+ instance.top_item
177
+ instance.current.must_equal(0)
178
+ end
179
+
180
+ it 'returns the items' do
181
+ instance.top_item.must_equal(instance.items)
182
+ end
183
+ end
184
+
185
+ describe '#bottom_item' do
186
+ it 'sets current to the index of the last item' do
187
+ instance.bottom_item
188
+ instance.current.must_equal(3)
189
+ end
190
+
191
+ it 'returns the items' do
192
+ instance.bottom_item.must_equal(instance.items)
193
+ end
194
+ end
195
+
196
+ describe '#next_item' do
197
+ it 'sets the current to the index of the next item' do
198
+ instance.next_item
199
+ instance.current.must_equal(1)
200
+ end
201
+
202
+ it 'returns the items' do
203
+ instance.next_item.must_equal(instance.items)
204
+ end
205
+
206
+ it 'does not loop' do
207
+ instance.next_item
208
+ instance.next_item
209
+ instance.next_item
210
+ instance.next_item
211
+ instance.next_item
212
+ instance.current.must_equal(3)
213
+ end
214
+ end
215
+
216
+ describe '#prev_item' do
217
+ it 'does not loop' do
218
+ instance.prev_item
219
+ instance.current.must_equal(0)
220
+ end
221
+
222
+ it 'sets the current to the index of the previous item' do
223
+ instance.next_item
224
+ instance.next_item
225
+ instance.prev_item
226
+ instance.current.must_equal(1)
227
+ end
228
+
229
+ it 'returns the items' do
230
+ instance.prev_item.must_equal(instance.items)
231
+ end
232
+
233
+ it 'does not loop' do
234
+ instance.next_item
235
+ instance.next_item
236
+ instance.next_item
237
+ instance.prev_item
238
+ instance.prev_item
239
+ instance.current.must_equal(1)
240
+ end
241
+ end
242
+
243
+ describe '#select_item' do
244
+ it 'sets the selected index to the current index' do
245
+ instance.select_item
246
+ instance.selected.must_equal(0)
247
+ end
248
+
249
+ it 'sets the selected index to the current index' do
250
+ instance.next_item
251
+ instance.select_item
252
+ instance.selected.must_equal(1)
253
+ end
254
+
255
+ it 'returns the items' do
256
+ instance.select_item.must_equal(instance.items)
257
+ end
258
+ end
259
+
260
+ describe '#deselect_item' do
261
+ it 'sets the selected index to nil' do
262
+ instance.next_item
263
+ instance.next_item
264
+ instance.select_item
265
+ instance.deselect_item
266
+ instance.selected.must_equal(nil)
267
+ end
268
+
269
+ it 'returns the items' do
270
+ instance.deselect_item.must_equal(instance.items)
271
+ end
272
+ end
273
+
274
+ describe '#last' do
275
+ it 'returns the index of the last item' do
276
+ instance.last.must_equal(3)
277
+ end
278
+ end
279
+
280
+ describe '#size' do
281
+ it 'returns the collection size' do
282
+ instance.size.must_equal(4)
283
+ end
284
+ end
285
+
286
+ end # Menu
287
+
288
+ end # Vedeu
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Model do
6
+ let(:model_instance) { ModelTestClass.new(attributes) }
7
+ let(:attributes) {
8
+ {
9
+ name: 'hydrogen'
10
+ }
11
+ }
12
+
13
+ describe '#deputy' do
14
+ subject { model_instance.deputy }
15
+
16
+ it 'returns the DSL instance' do
17
+ subject.must_be_instance_of(DSL::ModelTestClass)
18
+ end
19
+ end
20
+
21
+ describe '#store' do
22
+ subject { model_instance.store }
23
+
24
+ it 'returns the model' do
25
+ subject.must_be_instance_of(ModelTestClass)
26
+ end
27
+ end
28
+
29
+ end # Model
30
+
31
+ end # Vedeu
@@ -0,0 +1,166 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Char do
6
+
7
+ let(:described) { Vedeu::Char }
8
+ let(:instance) { described.new(value, parent, colour, style, position) }
9
+ let(:value) { 'a' }
10
+ let(:parent) { Line.new([], nil, parent_colour, parent_style) }
11
+ let(:colour) { nil }
12
+ let(:style) { nil }
13
+ let(:position) { nil }
14
+ let(:parent_colour) { nil }
15
+ let(:parent_style) { nil }
16
+
17
+ describe '.coerce' do
18
+ subject { described.coerce(value, parent, colour, style, position) }
19
+
20
+ context 'when the value is already a Char' do
21
+ let(:value) { described.new('b') }
22
+
23
+ it { subject.must_equal(value) }
24
+ end
25
+
26
+ context 'when the value is an Array' do
27
+ context 'and the Array contains instances of Char' do
28
+ let(:value) { [described.new('b')] }
29
+
30
+ it { subject.must_equal(value) }
31
+ end
32
+
33
+ context 'and the Array contains instances of String' do
34
+ let(:value) { ['carbon'] }
35
+
36
+ it { subject.must_be_instance_of(Array) }
37
+ end
38
+
39
+ context 'and the Array contains instances of NilClass' do
40
+ let(:value) { [] }
41
+
42
+ it { subject.must_be_instance_of(NilClass) }
43
+ end
44
+ end
45
+
46
+ context 'when the value is not a Char or Array' do
47
+ let(:value) { {} }
48
+
49
+ it { subject.must_be_instance_of(NilClass) }
50
+ end
51
+ end
52
+
53
+ describe '#initialize' do
54
+ subject { instance }
55
+
56
+ it { subject.must_be_instance_of(Char) }
57
+ it { subject.instance_variable_get('@colour').must_equal(colour) }
58
+ it { subject.instance_variable_get('@parent').must_equal(parent) }
59
+ it { subject.instance_variable_get('@style').must_equal(style) }
60
+ it { subject.instance_variable_get('@value').must_equal(value) }
61
+ it { subject.instance_variable_get('@position').must_equal(position) }
62
+ end
63
+
64
+ describe '#inspect' do
65
+ subject { instance.inspect }
66
+
67
+ it { subject.must_equal('<Vedeu::Char (value:a)>') }
68
+ end
69
+
70
+ describe '#value' do
71
+ subject { instance.value }
72
+
73
+ context 'when the value is not set' do
74
+ let(:value) {}
75
+
76
+ it { subject.must_equal('') }
77
+ end
78
+
79
+ context 'when the value is set' do
80
+ it { subject.must_equal('a') }
81
+
82
+ context 'and the value is more than one character' do
83
+ let(:value) { 'multi' }
84
+
85
+ it { subject.must_equal('m') }
86
+ end
87
+ end
88
+ end
89
+
90
+ describe '#to_s' do
91
+ subject { instance.to_s }
92
+
93
+ it { subject.must_be_instance_of(String) }
94
+
95
+ context 'when a position is specified' do
96
+ let(:position) { Position.new(17, 2) }
97
+
98
+ it { subject.must_equal("\e[17;2Ha\e[17;2H") }
99
+ end
100
+
101
+ context 'when a position is not specified' do
102
+ let(:position) {}
103
+
104
+ it { subject.must_equal("a") }
105
+ end
106
+
107
+ context 'when a colour is specified' do
108
+ let(:colour) { Colour.new({ foreground: '#00ff00', background: '#005500' }) }
109
+
110
+ context 'when a parent colour is specified' do
111
+ let(:parent_colour) { Colour.new({ foreground: '#ff0000', background: '#550000' }) }
112
+
113
+ it { subject.must_equal("\e[38;2;0;255;0m\e[48;2;0;85;0ma\e[38;2;255;0;0m\e[48;2;85;0;0m") }
114
+ end
115
+
116
+ context 'when a parent colour is not specified' do
117
+ let(:parent_colour) {}
118
+
119
+ it { subject.must_equal("\e[38;2;0;255;0m\e[48;2;0;85;0ma") }
120
+ end
121
+ end
122
+
123
+ context 'when a colour is not specified' do
124
+ let(:colour) {}
125
+
126
+ it { subject.must_equal("a") }
127
+ end
128
+
129
+ context 'when a style is specified' do
130
+ let(:style) { Style.new('underline') }
131
+
132
+ context 'when a parent style is specified' do
133
+ let(:parent_style) { Style.new('bold') }
134
+
135
+ it { subject.must_equal("\e[4ma\e[1m") }
136
+ end
137
+
138
+ context 'when a parent style is not specified' do
139
+ let(:parent_style) {}
140
+
141
+ it { subject.must_equal("\e[4ma") }
142
+ end
143
+ end
144
+
145
+ context 'when a style is not specified' do
146
+ let(:style) {}
147
+
148
+ it { subject.must_equal("a") }
149
+ end
150
+
151
+ context 'when the value is nil' do
152
+ let(:value) {}
153
+
154
+ it { subject.must_equal("") }
155
+ end
156
+
157
+ context 'when the value is more than one character' do
158
+ let(:value) { 'multi' }
159
+
160
+ it { subject.must_equal("m") }
161
+ end
162
+ end
163
+
164
+ end # Char
165
+
166
+ end # Vedeu
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Chars do
6
+
7
+ let(:described) { Vedeu::Chars }
8
+ let(:instance) { described.new }
9
+
10
+ describe '#initialize' do
11
+ subject { instance }
12
+
13
+ it { subject.must_be_instance_of(Vedeu::Chars) }
14
+ end
15
+
16
+ end # Chars
17
+
18
+ end # Vedeu
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Composition do
6
+
7
+ let(:described) { Vedeu::Composition }
8
+ let(:instance) { described.new(interfaces) }
9
+
10
+ let(:interfaces) { [] }
11
+ let(:colour) {}
12
+ let(:style) {}
13
+
14
+ describe '.build' do
15
+ subject {
16
+ described.build({}) do
17
+ # ...
18
+ end
19
+ }
20
+
21
+ it { subject.must_be_instance_of(Composition) }
22
+ end
23
+
24
+ describe '#initialize' do
25
+ subject { instance }
26
+
27
+ it { subject.must_be_instance_of(described) }
28
+ it { subject.instance_variable_get('@interfaces').must_equal(interfaces) }
29
+ it { subject.instance_variable_get('@colour').must_equal(colour) }
30
+ it { subject.instance_variable_get('@style').must_equal(style) }
31
+ end
32
+
33
+ describe '#inspect' do
34
+ subject { instance.inspect }
35
+
36
+ it { subject.must_equal('<Vedeu::Composition (interfaces:0)>') }
37
+ end
38
+
39
+ end # Composition
40
+
41
+ end # Vedeu
@@ -0,0 +1,128 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Interface do
6
+
7
+ let(:described) { Vedeu::Interface }
8
+ let(:instance) { described.new(_name, lines, parent, colour, style) }
9
+ let(:_name) { 'hydrogen' }
10
+ let(:lines) { [] }
11
+ let(:parent) {}
12
+ let(:colour) {}
13
+ let(:style) {}
14
+
15
+ describe '#initialize' do
16
+ subject { instance }
17
+
18
+ it { subject.instance_variable_get('@name').must_equal(_name) }
19
+ it { subject.instance_variable_get('@lines').must_equal(lines) }
20
+ it { subject.instance_variable_get('@parent').must_equal(parent) }
21
+ it { subject.instance_variable_get('@colour').must_equal(colour) }
22
+ it { subject.instance_variable_get('@style').must_equal(style) }
23
+ it { subject.instance_variable_get('@border').must_equal(nil) }
24
+ it { subject.instance_variable_get('@delay').must_equal(0.0) }
25
+ it { subject.instance_variable_get('@geometry').must_equal(nil) }
26
+ it { subject.instance_variable_get('@group').must_equal('') }
27
+ it { subject.instance_variable_get('@repository').must_equal(Vedeu.interfaces) }
28
+ end
29
+
30
+ describe '#border?' do
31
+ subject { instance.border? }
32
+
33
+ context 'when the interface has a border' do
34
+ before { instance.stubs(:border).returns(mock('Border')) }
35
+
36
+ it { subject.must_equal(true) }
37
+ end
38
+
39
+ context 'when the interface does not have a border' do
40
+ it { subject.must_equal(false) }
41
+ end
42
+ end
43
+
44
+ describe '#lines?' do
45
+ subject { instance.lines? }
46
+
47
+ context 'when the interface has content' do
48
+ let(:lines) { [:line] }
49
+
50
+ it { subject.must_equal(true) }
51
+ end
52
+
53
+ context 'when the interface does not have content' do
54
+ it { subject.must_equal(false) }
55
+ end
56
+ end
57
+
58
+ describe '#cursor' do
59
+ subject { instance.cursor }
60
+
61
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
62
+ end
63
+
64
+ # TODO: when the interface does not have any geometry defined?
65
+ # describe '#render' do
66
+ # subject { instance.render }
67
+
68
+ # context 'when the interface has a border' do
69
+ # let(:border) { Vedeu::Border.new(instance, { enabled: true }) }
70
+
71
+ # before { instance.stubs(:border).returns(border) }
72
+
73
+ # it { skip }
74
+ # end
75
+
76
+ # context 'when the interface does not have a border' do
77
+ # it { skip }
78
+ # end
79
+ # end
80
+
81
+ describe '#inspect' do
82
+ subject { instance.inspect }
83
+
84
+ it { subject.must_equal('<Vedeu::Interface (lines:0)>') }
85
+ end
86
+
87
+ describe '#store' do
88
+ subject { instance.store }
89
+
90
+ context 'when the interface has no name' do
91
+ let(:_name) {}
92
+
93
+ it { proc { subject }.must_raise(MissingRequired) }
94
+ end
95
+
96
+ # context 'when the interface has a name' do
97
+ # context 'when a buffer exists' do
98
+ # it { skip }
99
+ # end
100
+
101
+ # context 'when a buffer does not exist' do
102
+ # it { skip }
103
+ # end
104
+
105
+ # context 'when a refresh event exists' do
106
+ # it { skip }
107
+ # end
108
+
109
+ # context 'when a refresh event does not exist' do
110
+ # it { skip }
111
+ # end
112
+
113
+ # context 'when the interface has a group' do
114
+ # it { skip }
115
+ # end
116
+ # end
117
+ end
118
+
119
+ # TODO: when the interface does not have any geometry defined?
120
+ describe '#viewport' do
121
+ subject { instance.viewport }
122
+
123
+ # it { skip }
124
+ end
125
+
126
+ end # Interface
127
+
128
+ end # Vedeu
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Interfaces do
6
+
7
+ let(:described) { Vedeu::Interfaces }
8
+ let(:instance) { described.new }
9
+
10
+ describe '#initialize' do
11
+ subject { instance }
12
+
13
+ it { subject.must_be_instance_of(Vedeu::Interfaces) }
14
+ end
15
+
16
+ end # Interfaces
17
+
18
+ end # Vedeu