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,85 @@
1
+ require 'test_helper'
2
+ require 'vedeu/cursor/cursor'
3
+
4
+ module Vedeu
5
+
6
+ describe Cursor do
7
+
8
+ let(:described) { Vedeu::Cursor }
9
+ let(:instance) { described.new(attributes) }
10
+ let(:attributes) {
11
+ {
12
+ name: _name,
13
+ ox: ox,
14
+ oy: oy,
15
+ repository: repository,
16
+ state: state,
17
+ x: x,
18
+ y: y,
19
+ }
20
+ }
21
+ let(:_name) { 'silver' }
22
+ let(:ox) { 3 }
23
+ let(:oy) { 2 }
24
+ let(:repository) { Vedeu.cursors }
25
+ let(:state) { :show }
26
+ let(:x) { 19 }
27
+ let(:y) { 8 }
28
+
29
+ describe '#initialize' do
30
+ it { instance.must_be_instance_of(Cursor) }
31
+
32
+ # it { instance.instance_variable_get('@attributes').must_equal() }
33
+ it { instance.instance_variable_get('@name').must_equal('silver') }
34
+ it { instance.instance_variable_get('@ox').must_equal(3) }
35
+ it { instance.instance_variable_get('@oy').must_equal(2) }
36
+ it { instance.instance_variable_get('@repository').must_equal(Vedeu.cursors) }
37
+ it { instance.instance_variable_get('@state').must_be_instance_of(Vedeu::Visible) }
38
+ it { instance.instance_variable_get('@x').must_equal(19) }
39
+ it { instance.instance_variable_get('@y').must_equal(8) }
40
+ end
41
+
42
+ describe '#inspect' do
43
+ subject { instance.inspect }
44
+
45
+ it { subject.must_equal('<Vedeu::Cursor (silver: x:19 y:8 ox:3 oy:2)>') }
46
+ end
47
+
48
+ describe '#to_s' do
49
+ let(:state) { true }
50
+
51
+ subject { instance.to_s }
52
+
53
+ it { subject.must_be_instance_of(String) }
54
+
55
+ context 'when the cursor is visible' do
56
+ it 'returns an visible cursor escape sequence with position' do
57
+ subject.must_equal("\e[8;19H\e[?25h")
58
+ end
59
+ end
60
+
61
+ context 'when the cursor is invisible' do
62
+ let(:state) { false }
63
+
64
+ it 'returns the invisible cursor escape sequence with position' do
65
+ subject.must_equal("\e[8;19H\e[?25l")
66
+ end
67
+ end
68
+
69
+ context 'when a block is given' do
70
+ subject {
71
+ instance.to_s do
72
+ # ...
73
+ end
74
+ }
75
+
76
+ it 'returns the escape sequence to position and set the visibility of ' \
77
+ 'the cursor and returns to that position after yielding the block' do
78
+ subject.must_equal("\e[8;19H\e[?25h\e[8;19H\e[?25h")
79
+ end
80
+ end
81
+ end
82
+
83
+ end # Cursor
84
+
85
+ end # Vedeu
@@ -0,0 +1,212 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe MoveCursor do
6
+
7
+ let(:described) { Vedeu::MoveCursor }
8
+ let(:instance) { described.new(cursor, interface, dy, dx) }
9
+ let(:cursor) { Cursor.new({ name: 'MoveCursor', ox: ox, oy: oy, state: :show, x: x, y: y }) }
10
+ let(:ox) { 0 }
11
+ let(:oy) { 0 }
12
+ let(:x) { 1 }
13
+ let(:y) { 1 }
14
+
15
+ let(:interface) {
16
+ Vedeu::Interface.build do
17
+ name 'magnesium'
18
+ geometry do
19
+
20
+ end
21
+ end
22
+ }
23
+ let(:interface_with_border) {
24
+ Vedeu::Interface.build do
25
+ name 'manganese'
26
+ border do
27
+ # ...
28
+ end
29
+ geometry do
30
+ height 5
31
+ width 5
32
+ x 5
33
+ y 5
34
+ end
35
+ end
36
+ }
37
+ let(:interface_without_border) {
38
+ Vedeu::Interface.build do
39
+ name 'meitnerium'
40
+ geometry do
41
+ height 5
42
+ width 5
43
+ x 5
44
+ y 5
45
+ end
46
+ end
47
+ }
48
+
49
+ let(:dy) { 0 }
50
+ let(:dx) { 0 }
51
+
52
+ before { IO.console.stubs(:winsize).returns([25, 80]) }
53
+
54
+ describe '#initialize' do
55
+ subject { instance }
56
+
57
+ it { subject.must_be_instance_of(Vedeu::MoveCursor) }
58
+ it { subject.instance_variable_get('@cursor').must_equal(cursor) }
59
+ it { subject.instance_variable_get('@interface').must_equal(interface) }
60
+ it { subject.instance_variable_get('@dy').must_equal(dy) }
61
+ it { subject.instance_variable_get('@dx').must_equal(dx) }
62
+ end
63
+
64
+ describe '.down' do
65
+ subject { MoveCursor.down(cursor, interface) }
66
+
67
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
68
+
69
+ it { subject.y.must_equal(2) }
70
+
71
+ context 'when moving, the cursor must be within the boundary of the ' \
72
+ 'interface' do
73
+ subject { MoveCursor.down(cursor, interface_without_border) }
74
+ let(:y) { 15 }
75
+
76
+ it 'does not move past the bottom of the interface' do
77
+ subject.y.must_equal(6)
78
+ end
79
+ end
80
+
81
+ context 'when moving, the cursor must be within the border of the ' \
82
+ 'interface' do
83
+ subject { MoveCursor.down(cursor, interface_with_border) }
84
+ let(:y) { 15 }
85
+
86
+ it 'does not move past the bottom border' do
87
+ subject.y.must_equal(6)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe '.left' do
93
+ subject { MoveCursor.left(cursor, interface) }
94
+
95
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
96
+
97
+ it { subject.x.must_equal(1) }
98
+
99
+ context 'when moving, the cursor must be within the boundary of the ' \
100
+ 'interface' do
101
+ subject { MoveCursor.left(cursor, interface_without_border) }
102
+ let(:x) { 3 }
103
+
104
+ it 'does not move past the left of the interface' do
105
+ subject.x.must_equal(3)
106
+ end
107
+ end
108
+
109
+ context 'when moving, the cursor must be within the border of the ' \
110
+ 'interface' do
111
+ subject { MoveCursor.left(cursor, interface_with_border) }
112
+ let(:x) { 4 }
113
+
114
+ it 'does not move past the left border' do
115
+ subject.x.must_equal(4)
116
+ end
117
+ end
118
+ end
119
+
120
+ describe '.right' do
121
+ subject { MoveCursor.right(cursor, interface) }
122
+
123
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
124
+
125
+ it { subject.x.must_equal(2) }
126
+
127
+ context 'when moving, the cursor must be within the boundary of the ' \
128
+ 'interface' do
129
+ subject { MoveCursor.right(cursor, interface_without_border) }
130
+ let(:x) { 14 }
131
+
132
+ it 'does not move past the right of the interface' do
133
+ subject.x.must_equal(6)
134
+ end
135
+ end
136
+
137
+ context 'when moving, the cursor must be within the border of the ' \
138
+ 'interface' do
139
+ subject { MoveCursor.right(cursor, interface_with_border) }
140
+
141
+ let(:x) { 14 }
142
+
143
+ it 'does not move past the right border' do
144
+ subject.x.must_equal(6)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '.up' do
150
+ subject { MoveCursor.up(cursor, interface) }
151
+
152
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
153
+
154
+ it { subject.y.must_equal(1) }
155
+
156
+ context 'when moving, the cursor must be within the boundary of the ' \
157
+ 'interface' do
158
+ subject { MoveCursor.up(cursor, interface_without_border) }
159
+
160
+ let(:y) { 3 }
161
+
162
+ it 'does not move past the top of the interface' do
163
+ subject.y.must_equal(3)
164
+ end
165
+ end
166
+
167
+ context 'when moving, the cursor must be within the border of the ' \
168
+ 'interface' do
169
+ subject { MoveCursor.up(cursor, interface_with_border) }
170
+
171
+ let(:y) { 3 }
172
+
173
+ it 'does not move past the top border' do
174
+ subject.y.must_equal(3)
175
+ end
176
+ end
177
+ end
178
+
179
+ describe '#origin' do
180
+ subject { MoveCursor.origin(cursor, interface) }
181
+
182
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
183
+
184
+ context 'within the visible area for the console' do
185
+ it { subject.x.must_equal(1) }
186
+ it { subject.y.must_equal(1) }
187
+ end
188
+
189
+ context 'within the boundary of the interface' do
190
+ subject { MoveCursor.origin(cursor, interface_without_border) }
191
+
192
+ it { subject.x.must_equal(5) }
193
+ it { subject.y.must_equal(5) }
194
+ end
195
+
196
+ context 'within the border of the interface' do
197
+ subject { MoveCursor.origin(cursor, interface_with_border) }
198
+
199
+ it { subject.x.must_equal(6) }
200
+ it { subject.y.must_equal(6) }
201
+ end
202
+ end
203
+
204
+ describe '#move' do
205
+ subject { MoveCursor.new(cursor, interface, dy, dx).move }
206
+
207
+ it { subject.must_be_instance_of(Vedeu::Cursor) }
208
+ end
209
+
210
+ end # MoveCursor
211
+
212
+ end # Vedeu
@@ -0,0 +1,63 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe ToggleCursor do
6
+
7
+ let(:described) { ToggleCursor.new(cursor) }
8
+ let(:cursor) { Cursor.new({ name: 'vanadium',
9
+ ox: 1,
10
+ oy: 1,
11
+ state: state,
12
+ x: 1,
13
+ y: 1 }) }
14
+ let(:state) { true }
15
+
16
+ describe '#initialize' do
17
+ it { described.must_be_instance_of(ToggleCursor) }
18
+ it { described.instance_variable_get('@cursor').must_equal(cursor) }
19
+ end
20
+
21
+ describe '.hide' do
22
+ subject { ToggleCursor.hide(cursor) }
23
+
24
+ it { subject.must_be_instance_of(Cursor) }
25
+
26
+ context 'when the cursor is visible' do
27
+ it 'returns a new cursor' do
28
+ subject.wont_equal(cursor)
29
+ end
30
+ end
31
+
32
+ context 'when the cursor is invisible' do
33
+ let(:state) { false }
34
+
35
+ it 'returns the cursor' do
36
+ subject.must_equal(cursor)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe '.show' do
42
+ subject { ToggleCursor.show(cursor) }
43
+
44
+ it { subject.must_be_instance_of(Cursor) }
45
+
46
+ context 'when the cursor is visible' do
47
+ it 'returns the cursor' do
48
+ subject.must_equal(cursor)
49
+ end
50
+ end
51
+
52
+ context 'when the cursor is invisible' do
53
+ let(:state) { false }
54
+
55
+ it 'returns a new cursor' do
56
+ subject.wont_equal(cursor)
57
+ end
58
+ end
59
+ end
60
+
61
+ end # ToggleCursor
62
+
63
+ end # Vedeu