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,271 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ class TestRepository < Repository
6
+ end
7
+
8
+ class TestModel
9
+ include Vedeu::Model
10
+
11
+ attr_accessor :name
12
+
13
+ def initialize(name = nil)
14
+ @name = name
15
+ @repository = Vedeu::TestRepository.new(self.class)
16
+ end
17
+ end
18
+
19
+ describe Repository do
20
+
21
+ let(:described) { Vedeu::Repository }
22
+ let(:instance) { described.new(model, storage) }
23
+ let(:model) { Vedeu::TestModel }
24
+ let(:model_instance) { model.new(model_name) }
25
+ let(:model_name) { 'terbium' }
26
+ let(:storage) { {} }
27
+
28
+ describe '#initialize' do
29
+ subject { instance }
30
+
31
+ it { subject.must_be_instance_of(Vedeu::Repository) }
32
+ it { subject.instance_variable_get('@model').must_equal(model) }
33
+ it { subject.instance_variable_get('@storage').must_equal(storage) }
34
+ end
35
+
36
+ describe '#inspect' do
37
+ subject { instance.inspect }
38
+
39
+ it { subject.must_equal('<Vedeu::Repository (0)>') }
40
+ end
41
+
42
+ describe '#all' do
43
+ subject { instance.all }
44
+
45
+ it 'returns the whole repository' do
46
+ subject.must_equal(storage)
47
+ end
48
+ end
49
+
50
+ # describe '#current' do
51
+ # # before { Focus.stubs(:current).returns('francium') }
52
+
53
+ # subject { instance.current }
54
+
55
+ # it { Vedeu.focus.must_be_instance_of(NilClass) }
56
+
57
+ # context 'when the model exists' do
58
+ # # before { Cursor.new({ name: 'francium', state: false, x: 12, y: 4 }).store }
59
+
60
+ # # it 'has the same attributes it was stored with' do
61
+ # # subject.x.must_equal(12)
62
+ # # subject.y.must_equal(4)
63
+ # # end
64
+ # end
65
+
66
+ # context 'when the model does not exist' do
67
+ # # it 'is created, stored, and has the default attributes' do
68
+ # # subject.x.must_equal(1)
69
+ # # subject.y.must_equal(1)
70
+ # # end
71
+ # end
72
+ # end
73
+
74
+ describe '#each' do
75
+ subject { instance.each }
76
+
77
+ it { subject.must_be_instance_of(Enumerator) }
78
+ end
79
+
80
+ describe '#empty?' do
81
+ subject { instance.empty? }
82
+
83
+ context 'when the storage is empty' do
84
+ it { subject.must_equal(true) }
85
+ end
86
+
87
+ context 'when the storage is not empty' do
88
+ let(:storage) { [mock] }
89
+
90
+ it { subject.must_equal(false) }
91
+ end
92
+ end
93
+
94
+ describe '#find' do
95
+ subject { instance.find(model_name) }
96
+
97
+ context 'when the model cannot be found' do
98
+ let(:model_name) { 'not_found' }
99
+
100
+ it { proc { subject }.must_raise(ModelNotFound) }
101
+ end
102
+
103
+ context 'when the model is found' do
104
+ let(:model_instance) { model.new('terbium') }
105
+
106
+ before { instance.store(model_instance) }
107
+
108
+ it 'returns the stored model' do
109
+ subject.must_equal(model_instance)
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#find_or_create' do
115
+ let(:model_instance) { TestModel.new('niobium') }
116
+
117
+ subject { instance.find_or_create(model_name) }
118
+
119
+ it { instance.find_or_create('zinc').must_be_instance_of(Vedeu::TestModel) }
120
+
121
+ context 'when the model exists' do
122
+ let(:model_name) { 'niobium' }
123
+
124
+ before { instance.store(model_instance) }
125
+
126
+ it { subject.must_equal(model_instance) }
127
+ end
128
+
129
+ context 'when the model does not exist' do
130
+ let(:model_name) { 'zinc'}
131
+
132
+ it 'creates and stores a new instance of the model' do
133
+ subject.must_be_instance_of(Vedeu::TestModel)
134
+ end
135
+ end
136
+ end
137
+
138
+ describe '#registered' do
139
+ it 'returns an Array' do
140
+ RepositoriesTestClass.new.registered.must_be_instance_of(Array)
141
+ end
142
+
143
+ context 'when the storage is a Hash' do
144
+ it 'returns a collection of the names of all the registered entities' do
145
+ repo = RepositoriesTestClass.new
146
+ repo.add({ 'rutherfordium' => { name: 'rutherfordium' } })
147
+
148
+ repo.registered.must_equal(['rutherfordium'])
149
+ end
150
+ end
151
+
152
+ context 'when the storage is an Array' do
153
+ it 'returns the registered entities' do
154
+ repo = RepositoriesTestClass.new([])
155
+ repo.add('rutherfordium')
156
+
157
+ repo.registered.must_equal(['rutherfordium'])
158
+ end
159
+ end
160
+
161
+ context 'when the storage is a Set' do
162
+ it 'returns the registered entities' do
163
+ repo = RepositoriesTestClass.new(Set.new)
164
+ repo.add('rutherfordium')
165
+
166
+ repo.registered.must_equal(['rutherfordium'])
167
+ end
168
+ end
169
+
170
+ it 'returns an empty collection when the storage is empty' do
171
+ RepositoriesTestClass.new.registered.must_equal([])
172
+ end
173
+ end
174
+
175
+ describe '#registered?' do
176
+ it 'returns false with no name' do
177
+ RepositoriesTestClass.new.registered?('').must_equal(false)
178
+ end
179
+
180
+ it 'returns false with no name' do
181
+ RepositoriesTestClass.new.registered?(nil).must_equal(false)
182
+ end
183
+
184
+ it 'returns false when the storage is empty' do
185
+ RepositoriesTestClass.new.registered?('terbium').must_equal(false)
186
+ end
187
+
188
+ it 'returns false when the model is not registered' do
189
+ repo = RepositoriesTestClass.new
190
+ repo.add({ name: 'samarium' })
191
+
192
+ repo.registered?('terbium').must_equal(false)
193
+ end
194
+ end
195
+
196
+ describe '#remove' do
197
+ subject { instance.remove('francium') }
198
+
199
+ context 'when the storage is empty' do
200
+ before { instance.reset }
201
+
202
+ it { subject.must_be_instance_of(FalseClass) }
203
+ end
204
+
205
+ context 'when the model is not registered' do
206
+ before do
207
+ instance.reset
208
+ instance.store(Vedeu::TestModel.new('zinc'))
209
+ end
210
+
211
+ it { subject.must_be_instance_of(FalseClass) }
212
+ end
213
+
214
+ context 'when the model is registered' do
215
+ before do
216
+ instance.reset
217
+ instance.store(Vedeu::TestModel.new('gadolinium'))
218
+ instance.store(Vedeu::TestModel.new('francium'))
219
+ end
220
+
221
+ it 'returns the storage with the model removed' do
222
+ subject.size.must_equal(1)
223
+ end
224
+ end
225
+ end
226
+
227
+ describe '#reset' do
228
+ it 'returns a Hash' do
229
+ instance.reset.must_be_instance_of(Hash)
230
+ end
231
+
232
+ it 'resets the repository' do
233
+ instance.reset.must_equal({})
234
+ end
235
+ end
236
+
237
+ describe '#store' do
238
+ subject { instance.store(model_instance) }
239
+
240
+ context 'when a name attribute is empty or nil' do
241
+ before { model_instance.name = '' }
242
+
243
+ it { proc { subject }.must_raise(MissingRequired) }
244
+ end
245
+
246
+ context 'when a name attributes is provided' do
247
+ let(:model_name) { 'hydrogen' }
248
+
249
+ it { subject.must_be_instance_of(Vedeu::TestModel) }
250
+ end
251
+ end
252
+
253
+ describe '#use' do
254
+ subject { instance.use(model_name) }
255
+
256
+ context 'when the model exists' do
257
+ before { instance.store(model_instance) }
258
+
259
+ it { subject.must_equal(model_instance) }
260
+ end
261
+
262
+ context 'when the model does not exist' do
263
+ let(:model_name) { 'not_found' }
264
+
265
+ it { subject.must_be_instance_of(NilClass) }
266
+ end
267
+ end
268
+
269
+ end # Repository
270
+
271
+ end # Vedeu
@@ -9,9 +9,9 @@ module Vedeu
9
9
  let(:width) { 40 }
10
10
 
11
11
  describe '#initialize' do
12
- it { return_type_for(described, BoundingArea) }
13
- it { assigns(described, '@height', height) }
14
- it { assigns(described, '@width', width) }
12
+ it { described.must_be_instance_of(BoundingArea) }
13
+ it { described.instance_variable_get('@height').must_equal(height) }
14
+ it { described.instance_variable_get('@width').must_equal(width) }
15
15
  end
16
16
 
17
17
  describe '#height' do
@@ -2,8 +2,47 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
 
5
+ class CoercionsTestClass
6
+
7
+ include Coercions
8
+
9
+ attr_reader :attributes
10
+
11
+ def initialize(attributes = {})
12
+ @attributes = attributes
13
+ end
14
+
15
+ end # CoercionsTestClass
16
+
5
17
  describe Coercions do
6
18
 
19
+ describe '.coerce' do
20
+ let(:described) { Vedeu::Style }
21
+ let(:value) { 'bold' }
22
+
23
+ subject { described.coerce(value) }
24
+
25
+ it { subject.must_be_instance_of(described) }
26
+
27
+ context 'when the value is nil' do
28
+ let(:value) { nil }
29
+
30
+ it { subject.must_be_instance_of(described) }
31
+ end
32
+
33
+ context 'when the value is a Style already' do
34
+ let(:value) { Vedeu::Style.new('bold') }
35
+
36
+ it { subject.must_equal(value) }
37
+ end
38
+
39
+ context 'when the value is an Array' do
40
+ let(:value) { [:bold, :blink] }
41
+
42
+ it { subject.value.must_equal([:bold, :blink]) }
43
+ end
44
+ end
45
+
7
46
  describe '.coercer' do
8
47
  [nil, [], {}].each do |empty_value|
9
48
  it 'returns an empty collection when nil or empty' do
@@ -1,32 +1,47 @@
1
1
  require 'test_helper'
2
2
 
3
- class VedeuCommonClass
4
- include Vedeu::Common
5
-
6
- def defined_value_test(variable)
7
- defined_value?(variable)
8
- end
9
- end # VedeuCommonClass
10
-
11
3
  module Vedeu
12
4
 
13
5
  describe Common do
14
6
 
7
+ let(:described) { Vedeu::VedeuCommonClass.new }
8
+
15
9
  describe '#defined_value?' do
16
- it 'return true when the variable is not nil or empty' do
17
- VedeuCommonClass.new.defined_value_test('not empty').must_equal(true)
10
+ subject { described.defined_value_test(value) }
11
+
12
+ context 'when the variable is a Fixnum' do
13
+ let(:value) { 17 }
14
+
15
+ it { subject.must_equal(true) }
18
16
  end
19
17
 
20
- it 'returns false when the variable is nil or empty' do
21
- VedeuCommonClass.new.defined_value_test([]).must_equal(false)
18
+ context 'when the variable is not nil or empty' do
19
+ let(:value) { 'not empty' }
20
+
21
+ it { subject.must_equal(true) }
22
22
  end
23
23
 
24
- it 'returns false when dealing with hash keys which may not exist or ' \
25
- 'have a value' do
26
- attributes = {}
24
+ context 'when the variable is nil or empty' do
25
+ let(:value) { [] }
27
26
 
28
- VedeuCommonClass.new.defined_value_test(attributes[:misc]).must_equal(false)
27
+ it { subject.must_equal(false) }
29
28
  end
29
+
30
+ context 'when dealing with keys which may not exist or have a value' do
31
+ let(:attributes) { {} }
32
+ let(:value) { attributes[:not_found] }
33
+
34
+ it { subject.must_equal(false) }
35
+ end
36
+ end
37
+
38
+ describe '#to_sentence' do
39
+ let(:array) { %w{ hydrogen helium lithium } }
40
+
41
+ subject { described.to_sentence(array) }
42
+
43
+ it { subject.must_be_instance_of(String) }
44
+ it { subject.must_equal('hydrogen, helium and lithium') }
30
45
  end
31
46
 
32
47
  end # Common
@@ -0,0 +1,85 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Console do
6
+
7
+ let(:described) { Vedeu::Console }
8
+ let(:instance) { described.new(height, width) }
9
+ let(:height) { 24 }
10
+ let(:width) { 32 }
11
+
12
+ describe '#initialize' do
13
+ subject { instance }
14
+
15
+ it { subject.must_be_instance_of(described) }
16
+ it { subject.instance_variable_get('@height').must_equal(height) }
17
+ it { subject.instance_variable_get('@width').must_equal(width) }
18
+
19
+ context 'when the height is not given' do
20
+ let(:height) {}
21
+
22
+ it { subject.instance_variable_get('@height').must_equal(25) }
23
+ end
24
+
25
+ context 'when the width is not given' do
26
+ let(:width) {}
27
+
28
+ it { subject.instance_variable_get('@width').must_equal(80) }
29
+ end
30
+ end
31
+
32
+ describe '#input' do
33
+ let(:data) {}
34
+
35
+ subject { instance.input(data) }
36
+
37
+ it { subject.must_be_instance_of(String) }
38
+ end
39
+
40
+ describe '#output' do
41
+ let(:data) {}
42
+
43
+ subject { instance.output(data) }
44
+
45
+ it { subject.must_be_instance_of(Array) }
46
+ end
47
+
48
+ describe '#centre' do
49
+ subject { instance.centre }
50
+
51
+ it { subject.must_be_instance_of(Array) }
52
+ it { subject.must_equal([12, 16]) }
53
+ end
54
+
55
+ describe '#centre_y' do
56
+ subject { instance.centre_y }
57
+
58
+ it { subject.must_be_instance_of(Fixnum) }
59
+ it { subject.must_equal(12) }
60
+ end
61
+
62
+ describe '#centre_x' do
63
+ subject { instance.centre_x }
64
+
65
+ it { subject.must_be_instance_of(Fixnum) }
66
+ it { subject.must_equal(16) }
67
+ end
68
+
69
+ describe '#origin' do
70
+ subject { instance.origin }
71
+
72
+ it { subject.must_be_instance_of(Fixnum) }
73
+ it { subject.must_equal(1) }
74
+ end
75
+
76
+ describe '#size' do
77
+ subject { instance.size }
78
+
79
+ it { subject.must_be_instance_of(Array) }
80
+ it { subject.must_equal([24, 32]) }
81
+ end
82
+
83
+ end # Console
84
+
85
+ end # Vedeu
@@ -0,0 +1,107 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe ContentGeometry do
6
+
7
+ let(:described) { Vedeu::ContentGeometry }
8
+ let(:instance) { described.new(interface) }
9
+ let(:interface) {
10
+ Vedeu::Interface.build do
11
+ geometry do
12
+ height 3
13
+ width 5
14
+ end
15
+ name 'content_geometry'
16
+ end
17
+ }
18
+ let(:lines) { [] }
19
+
20
+ before do
21
+ Vedeu.interfaces.reset
22
+ interface.stubs(:lines).returns(lines)
23
+ end
24
+
25
+ describe '#initialize' do
26
+ subject { instance }
27
+
28
+ it { subject.must_be_instance_of(described) }
29
+ it { subject.instance_variable_get('@interface').must_equal(interface) }
30
+ end
31
+
32
+ describe '#inspect' do
33
+ subject { instance.inspect }
34
+
35
+ it { subject.must_equal('<Vedeu::ContentGeometry (y:1 x:1 yn:3 xn:5)>') }
36
+ end
37
+
38
+ describe '#yn' do
39
+ subject { instance.yn }
40
+
41
+ it { subject.must_be_instance_of(Fixnum) }
42
+
43
+ context 'when the interface has content' do
44
+ context 'when there is more lines than height' do
45
+ let(:lines) {
46
+ [
47
+ [:line_1],
48
+ [:line_2],
49
+ [:line_3],
50
+ [:line_4]
51
+ ]
52
+ }
53
+
54
+ it { subject.must_equal(4) }
55
+ end
56
+
57
+ context 'when there is less lines than height' do
58
+ it { subject.must_equal(3) }
59
+ end
60
+ end
61
+
62
+ context 'when the interface does not have content' do
63
+ it { subject.must_equal(3) }
64
+ end
65
+ end
66
+
67
+ describe '#xn' do
68
+ subject { instance.xn }
69
+
70
+ it { subject.must_be_instance_of(Fixnum) }
71
+
72
+ context 'when the interface has content' do
73
+ context 'when there are more characters than width' do
74
+ let(:lines) {
75
+ [
76
+ ['S', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't', '.'],
77
+ ['S', 'o', 'm', 'e'],
78
+ ['S', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't', '.', '.', '.'],
79
+ ['S', 'o', 'm', 'e', ' ', 't', 'e'],
80
+ ]
81
+ }
82
+
83
+ it { subject.must_equal(12) }
84
+ end
85
+
86
+ context 'when there are less characters than width' do
87
+ let(:lines) {
88
+ [
89
+ ['S', 'o', 'm', 'e'],
90
+ ['S', 'o', 'm', 'e'],
91
+ ['S', 'o', 'm', 'e'],
92
+ ['S', 'o', 'm', 'e'],
93
+ ]
94
+ }
95
+
96
+ it { subject.must_equal(5) }
97
+ end
98
+ end
99
+
100
+ context 'when the interface does not have content' do
101
+ it { subject.must_equal(5) }
102
+ end
103
+ end
104
+
105
+ end # ContentGeometry
106
+
107
+ end # Vedeu