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,357 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Border do
6
+
7
+ let(:described) { Vedeu::Border }
8
+ let(:instance) { described.new(interface, attributes) }
9
+ # let(:interface) { Interface.new({ name: 'caesium' }) }
10
+ let(:interface) {
11
+ Vedeu::Interface.build do
12
+ geometry do
13
+ height 5
14
+ width 8
15
+ end
16
+ name 'caesium'
17
+ end
18
+ }
19
+ let(:attributes) { {} }
20
+
21
+ before do
22
+ interface.lines = [
23
+ Line.new([Stream.new('Beryllium')]),
24
+ Line.new([Stream.new('Magnesium')]),
25
+ Line.new([Stream.new('Plutonium')]),
26
+ Line.new([Stream.new('Potassium')]),
27
+ Line.new([Stream.new('Lanthanum')]),
28
+ Line.new([Stream.new('Stront­ium')])
29
+ ]
30
+ end
31
+
32
+ describe '.build' do
33
+ subject {
34
+ described.build(attributes) do
35
+ horizontal '~'
36
+ end
37
+ }
38
+
39
+ it { subject.must_be_instance_of(described) }
40
+ end
41
+
42
+ describe '#initialize' do
43
+ subject { instance }
44
+
45
+ it { subject.must_be_instance_of(Border) }
46
+ it { subject.instance_variable_get('@interface').must_equal(interface) }
47
+ it { subject.instance_variable_get('@attributes').must_equal(
48
+ {
49
+ enabled: false,
50
+ show_bottom: true,
51
+ show_left: true,
52
+ show_right: true,
53
+ show_top: true,
54
+ bottom_right: 'j',
55
+ top_right: 'k',
56
+ top_left: 'l',
57
+ bottom_left: 'm',
58
+ horizontal: 'q',
59
+ colour: {},
60
+ style: [],
61
+ vertical: 'x',
62
+ interface: nil,
63
+ })
64
+ }
65
+ end
66
+
67
+ describe '#width' do
68
+ subject { instance.width }
69
+
70
+ context 'when the border is not enabled' do
71
+ it 'returns the interface width' do
72
+ subject.must_equal(8)
73
+ end
74
+ end
75
+
76
+ context 'when the border is enabled' do
77
+ context 'when both left and right borders are shown' do
78
+ let(:attributes) { { enabled: true } }
79
+
80
+ it { subject.must_equal(6) }
81
+ end
82
+
83
+ context 'when either the left or right border is shown' do
84
+ let(:attributes) { { enabled: true, show_left: false } }
85
+
86
+ it { subject.must_equal(7) }
87
+ end
88
+
89
+ context 'when neither left nor right borders are shown' do
90
+ let(:attributes) { { enabled: true, show_left: false, show_right: false } }
91
+
92
+ it { subject.must_equal(8) }
93
+ end
94
+ end
95
+ end
96
+
97
+ describe '#height' do
98
+ subject { instance.height }
99
+
100
+ context 'when the border is not enabled' do
101
+ it 'returns the interface height' do
102
+ subject.must_equal(5)
103
+ end
104
+ end
105
+
106
+ context 'when the border is enabled' do
107
+ context 'when both top and bottom borders are shown' do
108
+ let(:attributes) { { enabled: true } }
109
+
110
+ it { subject.must_equal(3) }
111
+ end
112
+
113
+ context 'when either the top or bottom border is shown' do
114
+ let(:attributes) { { enabled: true, show_top: false } }
115
+
116
+ it { subject.must_equal(4) }
117
+ end
118
+
119
+ context 'when neither top nor bottom borders are shown' do
120
+ let(:attributes) { { enabled: true, show_top: false, show_bottom: false } }
121
+
122
+ it { subject.must_equal(5) }
123
+ end
124
+ end
125
+ end
126
+
127
+ describe '#colour=' do
128
+ let(:value) { { foreground: '#00ff00' } }
129
+
130
+ subject { instance.colour=(value) }
131
+
132
+ it { subject; instance.instance_variable_get("@colour").must_be_instance_of(Colour) }
133
+ end
134
+
135
+ describe '#style=' do
136
+ let(:value) { 'normal' }
137
+
138
+ subject { instance.style=(value) }
139
+
140
+ it { subject; instance.instance_variable_get("@style").must_be_instance_of(Style) }
141
+ end
142
+
143
+ describe '#enabled?' do
144
+ subject { instance.enabled? }
145
+
146
+ it { subject.must_be_instance_of(FalseClass) }
147
+
148
+ context 'when true' do
149
+ let(:attributes) { { enabled: true } }
150
+
151
+ it { subject.must_be_instance_of(TrueClass) }
152
+ end
153
+ end
154
+
155
+ describe '#bottom?' do
156
+ subject { instance.bottom? }
157
+
158
+ it { subject.must_be_instance_of(TrueClass) }
159
+
160
+ context 'when false' do
161
+ let(:attributes) { { show_bottom: false } }
162
+
163
+ it { subject.must_be_instance_of(FalseClass) }
164
+ end
165
+ end
166
+
167
+ describe '#left?' do
168
+ subject { instance.left? }
169
+
170
+ it { subject.must_be_instance_of(TrueClass) }
171
+
172
+ context 'when false' do
173
+ let(:attributes) { { show_left: false } }
174
+
175
+ it { subject.must_be_instance_of(FalseClass) }
176
+ end
177
+ end
178
+
179
+ describe '#right?' do
180
+ subject { instance.right? }
181
+
182
+ it { subject.must_be_instance_of(TrueClass) }
183
+
184
+ context 'when false' do
185
+ let(:attributes) { { show_right: false } }
186
+
187
+ it { subject.must_be_instance_of(FalseClass) }
188
+ end
189
+ end
190
+
191
+ describe '#top?' do
192
+ subject { instance.top? }
193
+
194
+ it { subject.must_be_instance_of(TrueClass) }
195
+
196
+ context 'when false' do
197
+ let(:attributes) { { show_top: false } }
198
+
199
+ it { subject.must_be_instance_of(FalseClass) }
200
+ end
201
+ end
202
+
203
+ describe '#to_s' do
204
+ subject { instance.to_s }
205
+
206
+ context 'when all borders should be shown' do
207
+ let(:attributes) {
208
+ { enabled: true }
209
+ }
210
+
211
+ it 'returns the escape sequences to draw a border' do
212
+ subject.must_equal(
213
+ "\e(0l\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0k\e(B\n" \
214
+ "\e(0x\e(BBeryll\e(0x\e(B\n" \
215
+ "\e(0x\e(BMagnes\e(0x\e(B\n" \
216
+ "\e(0x\e(BPluton\e(0x\e(B\n" \
217
+ "\e(0m\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0j\e(B"
218
+ )
219
+ end
220
+ end
221
+
222
+ context 'when no borders are shown' do
223
+ let(:attributes) {
224
+ { enabled: true,
225
+ show_bottom: false,
226
+ show_left: false,
227
+ show_right: false,
228
+ show_top: false }
229
+ }
230
+
231
+ it 'returns the escape sequences to draw a border' do
232
+ subject.must_equal(
233
+ "Berylliu\n" \
234
+ "Magnesiu\n" \
235
+ "Plutoniu\n" \
236
+ "Potassiu\n" \
237
+ "Lanthanu"
238
+ )
239
+ end
240
+ end
241
+
242
+ context 'when the left and right border is not shown' do
243
+ let(:attributes) {
244
+ { enabled: true,
245
+ show_left: false,
246
+ show_right: false }
247
+ }
248
+
249
+ it 'returns the escape sequences to draw a border' do
250
+ subject.must_equal(
251
+ "\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\n" \
252
+ "Berylliu\n" \
253
+ "Magnesiu\n" \
254
+ "Plutoniu\n" \
255
+ "\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B"
256
+ )
257
+ end
258
+ end
259
+
260
+ context 'when the top and bottom border is not shown' do
261
+ let(:attributes) {
262
+ { enabled: true,
263
+ show_bottom: false,
264
+ show_top: false }
265
+ }
266
+
267
+ it 'returns the escape sequences to draw a border' do
268
+ subject.must_equal(
269
+ "\e(0x\e(BBeryll\e(0x\e(B\n" \
270
+ "\e(0x\e(BMagnes\e(0x\e(B\n" \
271
+ "\e(0x\e(BPluton\e(0x\e(B\n" \
272
+ "\e(0x\e(BPotass\e(0x\e(B\n" \
273
+ "\e(0x\e(BLantha\e(0x\e(B"
274
+ )
275
+ end
276
+ end
277
+
278
+ context 'when the left border is shown, all others not shown' do
279
+ let(:attributes) {
280
+ { enabled: true,
281
+ show_bottom: false,
282
+ show_right: false,
283
+ show_top: false }
284
+ }
285
+
286
+ it 'returns the escape sequences to draw a border' do
287
+ subject.must_equal(
288
+ "\e(0x\e(BBerylli\n" \
289
+ "\e(0x\e(BMagnesi\n" \
290
+ "\e(0x\e(BPlutoni\n" \
291
+ "\e(0x\e(BPotassi\n" \
292
+ "\e(0x\e(BLanthan"
293
+ )
294
+ end
295
+ end
296
+
297
+ context 'when the right border is shown, all others not shown' do
298
+ let(:attributes) {
299
+ { enabled: true,
300
+ show_bottom: false,
301
+ show_left: false,
302
+ show_top: false }
303
+ }
304
+
305
+ it 'returns the escape sequences to draw a border' do
306
+ subject.must_equal(
307
+ "Berylli\e(0x\e(B\n" \
308
+ "Magnesi\e(0x\e(B\n" \
309
+ "Plutoni\e(0x\e(B\n" \
310
+ "Potassi\e(0x\e(B\n" \
311
+ "Lanthan\e(0x\e(B" \
312
+ )
313
+ end
314
+ end
315
+
316
+ context 'when the top border is shown, all others not shown' do
317
+ let(:attributes) {
318
+ { enabled: true,
319
+ show_bottom: false,
320
+ show_left: false,
321
+ show_right: false }
322
+ }
323
+
324
+ it 'returns the escape sequences to draw a border' do
325
+ subject.must_equal(
326
+ "\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\n" \
327
+ "Berylliu\n" \
328
+ "Magnesiu\n" \
329
+ "Plutoniu\n" \
330
+ "Potassiu"
331
+ )
332
+ end
333
+ end
334
+
335
+ context 'when the bottom border is shown, all others not shown' do
336
+ let(:attributes) {
337
+ { enabled: true,
338
+ show_left: false,
339
+ show_right: false,
340
+ show_top: false }
341
+ }
342
+
343
+ it 'returns the escape sequences to draw a border' do
344
+ subject.must_equal(
345
+ "Berylliu\n" \
346
+ "Magnesiu\n" \
347
+ "Plutoniu\n" \
348
+ "Potassiu\n" \
349
+ "\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B\e(0q\e(B"
350
+ )
351
+ end
352
+ end
353
+ end
354
+
355
+ end # Border
356
+
357
+ end # Vedeu
@@ -2,32 +2,78 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
 
5
+ # TODO: Leak detected. (GL 2015-01-28)
6
+
5
7
  describe Compositor do
6
8
 
7
- let(:described) { Compositor.new(interface, buffer) }
9
+ let(:described) { Vedeu::Compositor }
10
+ let(:instance) { described.new(_name) }
11
+ let(:_name) { 'compositor' }
12
+ let(:buffer) { Buffer.new(_name, interface) }
8
13
  let(:interface) {
9
- {
10
- name: 'indium'
11
- }
12
- }
13
- let(:buffer) {
14
- Buffer.new({ name: 'indium' })
14
+ Vedeu.interface(_name) do
15
+ geometry do
16
+ height 5
17
+ width 10
18
+ end
19
+ lines do
20
+ line 'Some text.'
21
+ end
22
+ end
15
23
  }
16
24
 
17
25
  before do
18
- Focus.stubs(:cursor).returns("\e[?25l")
19
- Terminal.console.stubs(:print)
26
+ IO.console.stubs(:print)
27
+
28
+ Vedeu.buffers.reset
29
+ Vedeu.interfaces.reset
30
+ Buffer.new(_name, interface).store
20
31
  end
21
32
 
22
33
  describe '#initialize' do
23
- it { return_type_for(described, Compositor) }
24
- it { assigns(described, '@interface', interface) }
25
- it { assigns(described, '@buffer', buffer) }
34
+ subject { instance }
35
+
36
+ it { subject.must_be_instance_of(Compositor) }
37
+ it { subject.instance_variable_get('@name').must_equal(_name) }
26
38
  end
27
39
 
28
- describe '#compose' do
29
- it { return_type_for(described.compose, Array) }
30
- it { return_value_for(described.compose, [{}]) }
40
+ describe '.compose' do
41
+ subject { described.compose(_name) }
42
+
43
+ # it { skip }
44
+
45
+ context 'when there is no content' do
46
+ # it { skip }
47
+ end
48
+
49
+ context 'when there is content' do
50
+ context 'when the view has redefined the geometry' do
51
+ # it { skip }
52
+ end
53
+
54
+ context 'when the view has not redefined the geometry' do
55
+ it 'returns the escape sequences and content sent to the console' do
56
+ subject.must_equal(
57
+ [
58
+ [
59
+ "\e[1;1H \e[1;1H" \
60
+ "\e[2;1H \e[2;1H" \
61
+ "\e[3;1H \e[3;1H" \
62
+ "\e[4;1H \e[4;1H" \
63
+ "\e[5;1H \e[5;1H" \
64
+ "\e[1;1HSome text." \
65
+ "\e[2;1H " \
66
+ "\e[3;1H " \
67
+ "\e[4;1H " \
68
+ "\e[5;1H ",
69
+
70
+ "\e[1;1H\e[?25l"
71
+ ]
72
+ ]
73
+ )
74
+ end
75
+ end
76
+ end
31
77
  end
32
78
 
33
79
  end # Compositor
@@ -6,103 +6,44 @@ module Vedeu
6
6
 
7
7
  let(:described) { Output.new(interface) }
8
8
  let(:interface) {
9
- Interface.new({
10
- name: 'flourine',
11
- geometry: {
12
- width: 32,
13
- height: 3,
14
- },
15
- lines: lines,
16
- colour: colour
17
- })
9
+ Interface.build do
10
+ geometry do
11
+ height 3
12
+ width 32
13
+ end
14
+ name 'flourine'
15
+ end
18
16
  }
19
17
  let(:lines) {
20
18
  [
21
- {
22
- streams: [{ text: 'this is the first' }]
23
- },
24
- {
25
- streams: [{ text: 'this is the second and it is long' }]
26
- },
27
- {
28
- streams: [{ text: 'this is the third, it is even longer and still truncated' }]
29
- },
30
- {
31
- streams: [{ text: 'this should not render' }]
32
- }
19
+ Line.new([Stream.new('this is the first')]),
20
+ Line.new([Stream.new('this is the second and it is long')]),
21
+ Line.new([Stream.new('this is the third, it is even longer and still truncated')]),
22
+ Line.new([Stream.new('this should not render')]),
33
23
  ]
34
24
  }
35
- let(:colour) { {} }
36
25
 
37
- # before do
38
- # Buffers.reset
39
- # Cursors.reset
40
- # Interfaces.reset
41
-
42
- # Terminal.console.stubs(:winsize).returns([5, 40])
43
- # Terminal.console.stubs(:print)
44
- # end
26
+ before do
27
+ interface.lines = lines
28
+ IO.console.stubs(:print)
29
+ end
45
30
 
46
31
  describe '#initialize' do
47
- it { return_type_for(described, Output) }
48
- it { assigns(described, '@interface', interface) }
32
+ it { described.must_be_instance_of(Output) }
33
+ it { described.instance_variable_get('@interface').must_equal(interface) }
49
34
  end
50
35
 
51
- # describe '.render' do
52
- # it 'returns the content for the interface' do
53
- # Output.render(interface).must_equal(
54
- # "\e[1;1H \e[1;1H" \
55
- # "\e[2;1H \e[2;1H" \
56
- # "\e[3;1H \e[3;1H" \
57
- # "\e[1;1Hthis is the first" \
58
- # "\e[2;1Hthis is the second and it is lon" \
59
- # "\e[3;1Hthis is the third, it is even lo"
60
- # )
61
- # end
36
+ describe '.render' do
37
+ subject { Output.render(interface) }
62
38
 
63
- # context 'when there are no streams of text' do
64
- # let(:lines) { [] }
39
+ it { subject.must_be_instance_of(Array) }
65
40
 
66
- # it 'returns a blank interface' do
67
- # Output.render(interface).must_equal(
68
- # "\e[1;1H \e[1;1H" \
69
- # "\e[2;1H \e[2;1H" \
70
- # "\e[3;1H \e[3;1H"
71
- # )
72
- # end
73
- # end
41
+ context 'when a border is defined for the interface' do
42
+ end
74
43
 
75
- # context 'when lines have streams which are empty' do
76
- # let(:lines) {
77
- # [
78
- # {
79
- # streams: [{ text: 'this is the first' }]
80
- # }, {
81
- # streams: { text: '' }
82
- # }, {
83
- # streams: [
84
- # { text: 'this is the third, ' },
85
- # { text: 'it is even longer ' },
86
- # { text: 'and still truncated' }
87
- # ]
88
- # }, {
89
- # streams: [{ text: 'this should not render' }]
90
- # }
91
- # ]
92
- # }
93
-
94
- # it 'skips lines' do
95
- # Output.render(interface).must_equal(
96
- # "\e[1;1H \e[1;1H" \
97
- # "\e[2;1H \e[2;1H" \
98
- # "\e[3;1H \e[3;1H" \
99
- # "\e[1;1Hthis is the first" \
100
- # "\e[2;1H" \
101
- # "\e[3;1Hthis is the third, it is even lo"
102
- # )
103
- # end
104
- # end
105
- # end
44
+ context 'when a border is not defined for the interface' do
45
+ end
46
+ end
106
47
 
107
48
  end # Output
108
49