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
@@ -4,62 +4,188 @@ module Vedeu
4
4
 
5
5
  describe Viewport do
6
6
 
7
- let(:described) { Viewport.new(interface) }
7
+ let(:described) { Vedeu::Viewport }
8
+ let(:instance) { described.new(interface) }
8
9
  let(:interface) {
9
- Interface.new({
10
- name: 'fluorine',
11
- geometry: {
12
- width: 30,
13
- height: 2,
14
- },
15
- lines: [
16
- {
17
- streams: [{
18
- text: 'Something interesting ',
19
- },{
20
- text: 'on this line ',
21
- },{
22
- text: 'would be cool, eh?'
23
- }]
24
- }, {
25
- streams: [{
26
- text: 'Maybe a lyric, a little ditty ',
27
- },{
28
- text: 'to help you unwind.',
29
- }]
30
- }
31
- ]
32
- })
10
+ Vedeu::Interface.build do
11
+ geometry do
12
+ height 3
13
+ width 3
14
+ end
15
+ lines do
16
+ line 'barium'
17
+ line 'carbon'
18
+ line 'helium'
19
+ line 'iodine'
20
+ line 'nickel'
21
+ line 'osmium'
22
+ end
23
+ name 'lithium'
24
+ end
33
25
  }
34
26
 
35
27
  describe '#initialize' do
36
- it { return_type_for(described, Viewport) }
37
- it { assigns(described, '@interface', interface) }
38
- it { assigns(described, '@top', 0) }
39
- it { assigns(described, '@left', 0) }
28
+ subject { instance }
29
+
30
+ it { subject.must_be_instance_of(Viewport) }
31
+ it { subject.instance_variable_get('@interface').must_equal(interface) }
40
32
  end
41
33
 
42
34
  describe '.show' do
43
- it { return_type_for(Viewport.show(interface), Array) }
35
+ subject { described.show(interface) }
44
36
 
45
- context 'when there is no content' do
46
- before { interface.stubs(:content).returns([]) }
37
+ it { subject.must_be_instance_of(Array) }
38
+ end
47
39
 
48
- it 'returns an empty collection' do
49
- Viewport.show(interface).must_equal([])
50
- end
40
+ describe '#show' do
41
+ let(:cursor) { Cursor.new(cursor_attributes) }
42
+ let(:cursor_attributes) {
43
+ { name: 'lithium', ox: ox, oy: oy, state: true, x: x, y: y }
44
+ }
45
+ let(:lines) { [] }
46
+ let(:ox) { 0 }
47
+ let(:oy) { 0 }
48
+ let(:x) { 1 }
49
+ let(:y) { 1 }
50
+
51
+ before do
52
+ interface.stubs(:cursor).returns(cursor)
51
53
  end
52
54
 
53
- context 'when there is content, it returns only the visible content ' \
54
- 'determined by the geometry of the interface and the current ' \
55
- 'offset stored' do
56
- it 'returns a collection of lines, each a collection of characters' do
57
- Viewport.show(interface).must_equal(
58
- [
59
- ['S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', ' ', 'i', 'n', 't', 'e', 'r', 'e', 's', 't', 'i', 'n', 'g', ' ', 'o', 'n', ' ', 't', 'h', 'i', 's', ' '],
60
- ['M', 'a', 'y', 'b', 'e', ' ', 'a', ' ', 'l', 'y', 'r', 'i', 'c', ',', ' ', 'a', ' ', 'l', 'i', 't', 't', 'l', 'e', ' ', 'd', 'i', 't', 't', 'y', ' ']
61
- ]
62
- )
55
+ subject { instance.show }
56
+
57
+ it { subject.must_be_instance_of(Array) }
58
+
59
+ # context 'when there is no content' do
60
+ # before { interface.stubs(:lines).returns([]) }
61
+
62
+ # it { subject.must_equal([]) }
63
+ # end
64
+
65
+ context 'when there is content' do
66
+ context "when the cursor's y position is outside the viewable area - negative" do
67
+ let(:ox) { -4 }
68
+ let(:oy) { -4 }
69
+
70
+ it "scrolls the content the correct position" do
71
+ subject.must_equal(
72
+ [
73
+ ["b", "a", "r"],
74
+ ["c", "a", "r"],
75
+ ["h", "e", "l"]
76
+ ]
77
+ )
78
+ end
79
+
80
+ it { instance.to_s.must_equal("bar\ncar\nhel") }
81
+ end
82
+
83
+ context "when the cursor's y position is inside the viewable area" do
84
+ context "when there is not enough content to fill the height" do
85
+ let(:ox) { 3 }
86
+ let(:oy) { 7 }
87
+
88
+ it "is padded with spaces" do
89
+ subject.must_equal(
90
+ [
91
+ ["n", "i", "c"],
92
+ ["o", "s", "m"],
93
+ [" ", " ", " "]
94
+ ]
95
+ )
96
+ end
97
+
98
+ it { instance.to_s.must_equal("nic\nosm\n ") }
99
+ end
100
+
101
+ context "when there is more content than the height" do
102
+ let(:ox) { 3 }
103
+ let(:oy) { 3 }
104
+
105
+ it "is cropped to show only that which fits" do
106
+ subject.must_equal(
107
+ [
108
+ ["b", "a", "r"],
109
+ ["c", "a", "r"],
110
+ ["h", "e", "l"]
111
+ ]
112
+ )
113
+ end
114
+
115
+ it { instance.to_s.must_equal("bar\ncar\nhel") }
116
+ end
117
+ end
118
+
119
+ context "when the cursor's x position is outside the viewable area" do
120
+ context "but inside the content" do
121
+ let(:ox) { 6 }
122
+ let(:oy) { 6 }
123
+
124
+ it "scrolls the content the correct position" do
125
+ subject.must_equal(
126
+ [
127
+ ["i", "n", "e"],
128
+ ["k", "e", "l"],
129
+ ["i", "u", "m"]
130
+ ]
131
+ )
132
+ end
133
+
134
+ it { instance.to_s.must_equal("ine\nkel\nium") }
135
+ end
136
+
137
+ context "and outside the content" do
138
+ let(:ox) { 7 }
139
+ let(:oy) { 7 }
140
+
141
+ it "scrolls the content the correct position" do
142
+ subject.must_equal(
143
+ [
144
+ ["e", "l", " "],
145
+ ["u", "m", " "],
146
+ [" ", " ", " "]
147
+ ]
148
+ )
149
+ end
150
+
151
+ it { instance.to_s.must_equal("el \num \n ") }
152
+ end
153
+ end
154
+
155
+ context "when the cursor's x position is inside the viewable area" do
156
+ context "when there is not enough content to fill the width" do
157
+ let(:ox) { 7 }
158
+ let(:oy) { 3 }
159
+
160
+ it "is padded with spaces" do
161
+ subject.must_equal(
162
+ [
163
+ ["u", "m", " "],
164
+ ["o", "n", " "],
165
+ ["u", "m", " "]
166
+ ]
167
+ )
168
+ end
169
+
170
+ it { instance.to_s.must_equal("um \non \num ") }
171
+ end
172
+
173
+ context "when there is more content than the width" do
174
+ let(:ox) { 3 }
175
+ let(:oy) { 3 }
176
+
177
+ it "is cropped to show only that which fits" do
178
+ subject.must_equal(
179
+ [
180
+ ["b", "a", "r"],
181
+ ["c", "a", "r"],
182
+ ["h", "e", "l"]
183
+ ]
184
+ )
185
+ end
186
+
187
+ it { instance.to_s.must_equal("bar\ncar\nhel") }
188
+ end
63
189
  end
64
190
  end
65
191
  end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Writer do
6
+
7
+ describe '.[]' do
8
+ it 'returns a new instance of Writer' do
9
+ Writer[:null, :file, :screen].must_be_instance_of(Writer)
10
+ end
11
+ end
12
+
13
+ describe '#initialize' do
14
+ it 'returns an instance of itself' do
15
+ writers = :null
16
+
17
+ Writer.new(writers).must_be_instance_of(Writer)
18
+ end
19
+ end
20
+
21
+ # describe '#==' do
22
+ # context 'when the two objects are the same' do
23
+ # it { skip;subject.must_equal(true) }
24
+ # end
25
+
26
+ # context 'when the two objects are not the same' do
27
+ # it { skip;subject.must_equal(false) }
28
+ # end
29
+ # end
30
+
31
+ # describe '#+' do
32
+ # it 'returns the collection of writers' do
33
+ # skip
34
+ # end
35
+ # end
36
+
37
+ # describe '.write' do
38
+ # it 'not sure if this should be here' do
39
+ # skip
40
+ # end
41
+ # end
42
+
43
+ end # Writer
44
+
45
+ end # Vedeu
@@ -13,12 +13,12 @@ module Vedeu
13
13
  }
14
14
 
15
15
  describe '#initialize' do
16
- it { return_type_for(described, Colour) }
17
- it { assigns(described, '@attributes', attributes) }
16
+ it { described.must_be_instance_of(Colour) }
17
+ it { described.instance_variable_get('@attributes').must_equal(attributes) }
18
18
  end
19
19
 
20
20
  describe '#background' do
21
- it { return_type_for(described.background, String) }
21
+ it { described.background.must_be_instance_of(String) }
22
22
 
23
23
  it 'returns an escape sequence' do
24
24
  Colour.new({
@@ -32,7 +32,7 @@ module Vedeu
32
32
  end
33
33
 
34
34
  describe '#foreground' do
35
- it { return_type_for(described.foreground, String) }
35
+ it { described.foreground.must_be_instance_of(String) }
36
36
 
37
37
  it 'returns an escape sequence' do
38
38
  Colour.new({
@@ -46,7 +46,7 @@ module Vedeu
46
46
  end
47
47
 
48
48
  describe '#to_s' do
49
- it { return_type_for(described.to_s, String) }
49
+ it { described.to_s.must_be_instance_of(String) }
50
50
 
51
51
  it 'returns an escape sequence' do
52
52
  Colour.new({
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Presentation do
6
+
7
+ let(:receiver) { PresentationTestClass.new }
8
+
9
+ describe '#colour=' do
10
+ let(:colour) { Colour.new({ foreground: '#00ff00', background: '#000000' }) }
11
+
12
+ subject { receiver.colour=(colour) }
13
+
14
+ it { subject.must_be_instance_of(Colour) }
15
+ end
16
+
17
+ describe '#style=' do
18
+ let(:style) { Style.new('normal') }
19
+
20
+ subject { receiver.style=(style) }
21
+
22
+ it { subject.must_be_instance_of(Style) }
23
+ end
24
+
25
+ describe '#to_s' do
26
+ let(:line) { Line.new(
27
+ [],
28
+ mock('Interface'),
29
+ Colour.new({ foreground: '#00ff00', background: '#000000' }),
30
+ Style.new('normal')
31
+ )
32
+ }
33
+ let(:stream) { Stream.new(stream_value, line, stream_colour, stream_style) }
34
+ let(:stream_value) { 'Some text' }
35
+ let(:stream_colour) { Colour.new({ foreground: '#ff0000', background: '#000000' }) }
36
+ let(:stream_style) { Style.new(:underline) }
37
+
38
+ it 'returns output' do
39
+ stream.to_s.must_equal(
40
+ # - stream colour
41
+ # - stream style
42
+ # - stream content
43
+ # - line style
44
+ # - line colour
45
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m" \
46
+ "\e[4m" \
47
+ "Some text" \
48
+ "\e[24m\e[22m\e[27m" \
49
+ "\e[38;2;0;255;0m\e[48;2;0;0;0m"
50
+ )
51
+ end
52
+ end
53
+
54
+ end # Presentation
55
+
56
+ end # Vedeu
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Style do
6
+
7
+ let(:described) { Style }
8
+
9
+ describe '#initialize' do
10
+ subject { described.new('bold') }
11
+
12
+ it { subject.must_be_instance_of(described) }
13
+ it { subject.instance_variable_get('@value').must_equal('bold') }
14
+ end
15
+
16
+ describe '#attributes' do
17
+ subject { described.new('bold').attributes }
18
+
19
+ it { subject.must_be_instance_of(Hash) }
20
+
21
+ it 'returns an attributes hash for this instance' do
22
+ subject.must_equal({ style: 'bold' })
23
+ end
24
+ end
25
+
26
+ describe '#to_s' do
27
+ let(:value) {}
28
+
29
+ subject { described.new(value).to_s }
30
+
31
+ it { subject.must_be_instance_of(String) }
32
+ it { subject.must_equal('') }
33
+
34
+ describe 'for a single style' do
35
+ let(:value) { 'normal' }
36
+
37
+ it 'returns an escape sequence' do
38
+ subject.must_equal("\e[24m\e[22m\e[27m")
39
+ end
40
+ end
41
+
42
+ describe 'for multiple styles' do
43
+ let(:value) { ['normal', 'underline'] }
44
+
45
+ it 'returns an escape sequence for multiple styles' do
46
+ subject.must_equal("\e[24m\e[22m\e[27m\e[4m")
47
+ end
48
+ end
49
+
50
+ describe 'for an unknown style' do
51
+ let(:value) { 'unknown' }
52
+
53
+ it 'returns an empty string for an unknown style' do
54
+ subject.must_equal('')
55
+ end
56
+ end
57
+
58
+ describe 'for an empty or nil' do
59
+ let(:value) { '' }
60
+
61
+ it 'returns an empty string for empty or nil' do
62
+ subject.must_equal('')
63
+ end
64
+ end
65
+ end
66
+
67
+ end # Style
68
+
69
+ end # Vedeu
@@ -0,0 +1,63 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Translator do
6
+
7
+ let(:described) { Vedeu::Translator }
8
+ let(:instance) { described.new(colour) }
9
+ let(:colour) { '#ff0000' }
10
+
11
+ describe '#initialize' do
12
+ subject { instance }
13
+
14
+ it { subject.must_be_instance_of(Translator) }
15
+ it { subject.instance_variable_get('@colour').must_equal(colour) }
16
+ end
17
+
18
+ describe '#escape_sequence' do
19
+ subject { instance.escape_sequence }
20
+
21
+ context 'when no colour is given' do
22
+ let(:colour) {}
23
+
24
+ it { subject.must_equal('') }
25
+ end
26
+
27
+ context 'when the colour is a terminal named colour; e.g. :red' do
28
+ let(:colour) { :red }
29
+
30
+ it 'raises an exception since the subclasses Background and ' \
31
+ 'Foreground handle this' do
32
+ proc { subject }.must_raise(NotImplemented)
33
+ end
34
+ end
35
+
36
+ context 'when the colour is a terminal numbered colour; e.g. 122' do
37
+ let(:colour) { 122 }
38
+
39
+ it 'raises an exception since the subclasses Background and ' \
40
+ 'Foreground handle this' do
41
+ proc { subject }.must_raise(NotImplemented)
42
+ end
43
+ end
44
+
45
+ context 'when the colour is a HTML/CSS colour (RGB specified)' do
46
+ let(:colour) { '#ff0000' }
47
+
48
+ it 'raises an exception since the subclasses Background and ' \
49
+ 'Foreground handle this' do
50
+ proc { subject }.must_raise(NotImplemented)
51
+ end
52
+ end
53
+
54
+ context 'when the colour is not supported' do
55
+ let(:colour) { [:not_supported] }
56
+
57
+ it { subject.must_equal('') }
58
+ end
59
+ end
60
+
61
+ end # Translator
62
+
63
+ end # Vedeu
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+
6
+
7
+ end # Vedeu
@@ -4,163 +4,10 @@ module Vedeu
4
4
 
5
5
  describe Menus do
6
6
 
7
- describe ' system events defined by Menus' do
8
- let(:collection) { [:sulphur, :gold, :tin, :helium] }
9
- let(:instance) { Vedeu::Menu.new(collection) }
7
+ describe '.menus' do
8
+ subject { Vedeu::Menus.menus }
10
9
 
11
- before do
12
- Menus.reset
13
- Menus.add({ name: 'elements',
14
- items: collection })
15
- Vedeu::Menu.stubs(:new).returns(instance)
16
- end
17
-
18
- it '_menu_current_' do
19
- Vedeu.trigger(:_menu_current_, 'elements').must_equal(:sulphur)
20
- end
21
-
22
- it '_menu_selected_ when no item is selected' do
23
- Vedeu.trigger(:_menu_selected_, 'elements').must_equal([nil])
24
- end
25
-
26
- it '_menu_selected_ when an item is selected' do
27
- Vedeu.trigger(:_menu_next_, 'elements')
28
- Vedeu.trigger(:_menu_select_, 'elements')
29
- Vedeu.trigger(:_menu_selected_, 'elements').must_equal(:gold)
30
- end
31
-
32
- it '_menu_next_' do
33
- Vedeu.trigger(:_menu_next_, 'elements').must_equal(
34
- [
35
- [false, false, :sulphur],
36
- [false, true, :gold],
37
- [false, false, :tin],
38
- [false, false, :helium]
39
- ]
40
- )
41
- end
42
-
43
- it '_menu_prev_' do
44
- Vedeu.trigger(:_menu_prev_, 'elements').must_equal(
45
- [
46
- [false, true, :sulphur],
47
- [false, false, :gold],
48
- [false, false, :tin],
49
- [false, false, :helium]
50
- ]
51
- )
52
- end
53
-
54
- it '_menu_top_' do
55
- Vedeu.trigger(:_menu_top_, 'elements').must_equal(
56
- [
57
- [false, true, :sulphur],
58
- [false, false, :gold],
59
- [false, false, :tin],
60
- [false, false, :helium]
61
- ]
62
- )
63
- end
64
-
65
- it '_menu_bottom_' do
66
- Vedeu.trigger(:_menu_bottom_, 'elements').must_equal(
67
- [
68
- [false, false, :sulphur],
69
- [false, false, :gold],
70
- [false, false, :tin],
71
- [false, true, :helium]
72
- ]
73
- )
74
- end
75
-
76
- it '_menu_select_' do
77
- 2.times { Vedeu.trigger(:_menu_next_, 'elements') }
78
-
79
- Vedeu.trigger(:_menu_select_, 'elements').must_equal(
80
- [
81
- [false, false, :sulphur],
82
- [false, false, :gold],
83
- [true, true, :tin],
84
- [false, false, :helium]
85
- ]
86
- )
87
- end
88
-
89
- it '_menu_deselect_' do
90
- Vedeu.trigger(:_menu_deselect_, 'elements').must_equal(
91
- [
92
- [false, true, :sulphur],
93
- [false, false, :gold],
94
- [false, false, :tin],
95
- [false, false, :helium]
96
- ]
97
- )
98
- end
99
-
100
- it '_menu_items_' do
101
- 2.times { Vedeu.trigger(:_menu_next_, 'elements') }
102
- Vedeu.trigger(:_menu_select_, 'elements')
103
- Vedeu.trigger(:_menu_prev_, 'elements')
104
-
105
- Vedeu.trigger(:_menu_items_, 'elements').must_equal(
106
- [
107
- [false, false, :sulphur],
108
- [false, true, :gold],
109
- [true, false, :tin],
110
- [false, false, :helium]
111
- ]
112
- )
113
- end
114
-
115
- it '_menu_view_' do
116
- Vedeu.trigger(:_menu_view_, 'elements').must_equal(
117
- [
118
- [false, true, :sulphur],
119
- [false, false, :gold],
120
- [false, false, :tin],
121
- [false, false, :helium]
122
- ]
123
- )
124
- end
125
- end
126
-
127
- describe '#add' do
128
- let(:collection) { [:hydrogen, :helium, :beryllium, :lithium] }
129
- let(:instance) { Vedeu::Menu.new(collection) }
130
-
131
- before do
132
- Menus.reset
133
- Vedeu::Menu.stubs(:new).returns(instance)
134
- end
135
-
136
- it 'raises an exception if menu name is empty' do
137
- proc { Menus.add({ name: '' }) }.must_raise(MissingRequired)
138
- end
139
-
140
- it 'adds the menu to the storage' do
141
- Menus.add({ name: 'elements', items: collection })
142
- Menus.all.must_equal(
143
- {
144
- 'elements' => { name: 'elements', items: instance }
145
- }
146
- )
147
- end
148
- end
149
-
150
- describe '#use' do
151
- let(:collection) { [:calcium, :fermium, :nitrogen, :palladium] }
152
- let(:instance) { Vedeu::Menu.new(collection) }
153
-
154
- before do
155
- Menus.reset
156
- Vedeu::Menu.stubs(:new).returns(instance)
157
- end
158
-
159
- it 'returns the Vedeu::Menu instance stored when the named menu exists' do
160
- Menus.add({ name: 'elements', items: collection })
161
-
162
- Menus.use('elements').must_equal(instance)
163
- end
10
+ it { subject.must_be_instance_of(Vedeu::Menus) }
164
11
  end
165
12
 
166
13
  end # Menus