vedeu 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/docs/events.md +6 -0
  3. data/examples/{cursor_app/cursor_app.rb → cursor_app.rb} +1 -1
  4. data/examples/{lines_app/lines_app.rb → lines_app.rb} +1 -1
  5. data/lib/vedeu.rb +48 -28
  6. data/lib/vedeu/api/api.rb +8 -95
  7. data/lib/vedeu/application.rb +6 -2
  8. data/lib/vedeu/{models → colours}/background.rb +1 -1
  9. data/lib/vedeu/{models → colours}/colour.rb +0 -0
  10. data/lib/vedeu/{models → colours}/foreground.rb +2 -2
  11. data/lib/vedeu/{support/colour_translator.rb → colours/translator.rb} +7 -7
  12. data/lib/vedeu/input/input.rb +13 -5
  13. data/lib/vedeu/models/geometry.rb +30 -2
  14. data/lib/vedeu/models/key.rb +39 -0
  15. data/lib/vedeu/output/compositor.rb +30 -76
  16. data/lib/vedeu/output/output.rb +74 -0
  17. data/lib/vedeu/output/viewport.rb +36 -44
  18. data/lib/vedeu/repositories/buffers.rb +5 -18
  19. data/lib/vedeu/repositories/cursors.rb +16 -8
  20. data/lib/vedeu/repositories/events.rb +96 -9
  21. data/lib/vedeu/repositories/focus.rb +21 -20
  22. data/lib/vedeu/repositories/groups.rb +3 -11
  23. data/lib/vedeu/repositories/interfaces.rb +6 -9
  24. data/lib/vedeu/repositories/keymaps.rb +8 -3
  25. data/lib/vedeu/repositories/menus.rb +6 -21
  26. data/lib/vedeu/{models → repositories/models}/buffer.rb +62 -28
  27. data/lib/vedeu/{models → repositories/models}/cursor.rb +8 -2
  28. data/lib/vedeu/{models → repositories/models}/event.rb +7 -0
  29. data/lib/vedeu/repositories/models/group.rb +56 -0
  30. data/lib/vedeu/{models → repositories/models}/interface.rb +6 -0
  31. data/lib/vedeu/{models → repositories/models}/keymap.rb +7 -1
  32. data/lib/vedeu/{models → repositories/models}/menu.rb +9 -0
  33. data/lib/vedeu/{models → repositories/models}/offset.rb +8 -1
  34. data/lib/vedeu/repositories/offsets.rb +17 -12
  35. data/lib/vedeu/support/bounding_area.rb +127 -0
  36. data/lib/vedeu/support/common.rb +8 -0
  37. data/lib/vedeu/support/exceptions.rb +2 -12
  38. data/lib/vedeu/support/model.rb +14 -0
  39. data/lib/vedeu/support/refresh.rb +8 -7
  40. data/lib/vedeu/support/registrar.rb +7 -1
  41. data/lib/vedeu/support/repository.rb +31 -10
  42. data/lib/vedeu/support/sentence.rb +67 -0
  43. data/lib/vedeu/support/terminal.rb +19 -0
  44. data/lib/vedeu/support/trace.rb +2 -5
  45. data/test/integration/api/api_test.rb +97 -0
  46. data/test/integration/api_dsl/dsl_api_test.rb +4 -0
  47. data/test/integration/api_dsl/dsl_composition_test.rb +4 -0
  48. data/test/integration/api_dsl/dsl_defined_test.rb +4 -0
  49. data/test/integration/api_dsl/dsl_helpers_test.rb +4 -0
  50. data/test/integration/api_dsl/dsl_interface_test.rb +4 -0
  51. data/test/integration/api_dsl/dsl_keymap.rb +4 -0
  52. data/test/integration/api_dsl/dsl_line_test.rb +4 -0
  53. data/test/integration/api_dsl/dsl_menu_test.rb +4 -0
  54. data/test/integration/api_dsl/dsl_stream_test.rb +138 -0
  55. data/test/lib/vedeu/api/api_test.rb +1 -25
  56. data/test/lib/vedeu/api/helpers_test.rb +0 -10
  57. data/test/lib/vedeu/{models → colours}/background_test.rb +0 -0
  58. data/test/lib/vedeu/{models → colours}/colour_test.rb +0 -0
  59. data/test/lib/vedeu/{models → colours}/foreground_test.rb +0 -0
  60. data/test/lib/vedeu/{support/colour_translator_test.rb → colours/translator_test.rb} +3 -3
  61. data/test/lib/vedeu/input/input_test.rb +16 -47
  62. data/test/lib/vedeu/models/geometry_test.rb +46 -0
  63. data/test/lib/vedeu/models/group_test.rb +99 -0
  64. data/test/lib/vedeu/models/key_test.rb +41 -0
  65. data/test/lib/vedeu/output/compositor_test.rb +25 -101
  66. data/test/lib/vedeu/output/output_test.rb +108 -0
  67. data/test/lib/vedeu/repositories/buffers_test.rb +0 -8
  68. data/test/lib/vedeu/repositories/cursors_test.rb +34 -0
  69. data/test/lib/vedeu/repositories/focus_test.rb +37 -28
  70. data/test/lib/vedeu/repositories/interfaces_test.rb +1 -1
  71. data/test/lib/vedeu/repositories/keymaps_test.rb +6 -20
  72. data/test/lib/vedeu/repositories/menus_test.rb +0 -6
  73. data/test/lib/vedeu/{models → repositories/models}/buffer_test.rb +24 -27
  74. data/test/lib/vedeu/{models → repositories/models}/cursor_test.rb +0 -0
  75. data/test/lib/vedeu/{models → repositories/models}/event_test.rb +0 -0
  76. data/test/lib/vedeu/{models → repositories/models}/interface_test.rb +0 -0
  77. data/test/lib/vedeu/{models → repositories/models}/keymap_test.rb +0 -0
  78. data/test/lib/vedeu/{models → repositories/models}/menu_test.rb +0 -0
  79. data/test/lib/vedeu/{models → repositories/models}/offset_test.rb +0 -0
  80. data/test/lib/vedeu/support/bounding_area_test.rb +139 -0
  81. data/test/lib/vedeu/support/coercions_test.rb +6 -17
  82. data/test/lib/vedeu/support/grid_test.rb +1 -1
  83. data/test/lib/vedeu/support/model_test.rb +23 -0
  84. data/test/lib/vedeu/support/presentation_test.rb +0 -10
  85. data/test/lib/vedeu/support/refresh_test.rb +2 -2
  86. data/test/lib/vedeu/support/repository_test.rb +63 -64
  87. data/test/lib/vedeu/support/sentence_test.rb +48 -0
  88. data/test/lib/vedeu/support/terminal_test.rb +86 -6
  89. data/test/support/test_classes/all.rb +5 -0
  90. data/test/support/test_classes/coercions.rb +16 -0
  91. data/test/support/test_classes/helpers.rb +19 -0
  92. data/test/support/test_classes/model.rb +23 -0
  93. data/test/support/test_classes/presentation.rb +16 -0
  94. data/test/support/test_classes/repositories.rb +26 -0
  95. data/test/support/test_modules/all.rb +1 -0
  96. data/test/support/test_modules/repository.rb +16 -0
  97. data/test/test_helper.rb +4 -0
  98. data/vedeu.gemspec +3 -3
  99. metadata +95 -50
  100. data/lib/vedeu/output/clear.rb +0 -88
  101. data/lib/vedeu/output/render.rb +0 -50
  102. data/lib/vedeu/repositories/positional.rb +0 -23
  103. data/test/lib/vedeu/output/clear_test.rb +0 -56
  104. data/test/lib/vedeu/output/render_test.rb +0 -100
  105. data/test/lib/vedeu/repositories/positional_test.rb +0 -50
@@ -0,0 +1,138 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Stream tests' do
4
+
5
+ # describe '#align' do
6
+ # it ':left' do
7
+ # Vedeu.view 'test' do
8
+ # line do
9
+ # stream do
10
+ # align :left
11
+ # end
12
+ # end
13
+ # end.must_equal({})
14
+ # end
15
+
16
+ # it ':right' do
17
+ # Vedeu.view 'test' do
18
+ # line do
19
+ # stream do
20
+ # align :right
21
+ # end
22
+ # end
23
+ # end.must_equal({})
24
+ # end
25
+
26
+ # it ':centre' do
27
+ # Vedeu.view 'test' do
28
+ # line do
29
+ # stream do
30
+ # align :centre
31
+ # end
32
+ # end
33
+ # end.must_equal({})
34
+ # end
35
+
36
+ # it ':invalid' do
37
+ # proc { Vedeu.view 'test' do
38
+ # line do
39
+ # stream do
40
+ # align :invalid
41
+ # end
42
+ # end
43
+ # end }.must_raise(Vedeu::InvalidSyntax)
44
+ # end
45
+
46
+ # it ':right overriding :centre' do
47
+ # Vedeu.view 'test' do
48
+ # line do
49
+ # stream do
50
+ # align :centre
51
+ # align :right
52
+ # end
53
+ # end
54
+ # end.must_equal({})
55
+ # end
56
+ # end
57
+
58
+ # describe '#centre' do
59
+ # it 'centre' do
60
+ # Vedeu.view 'test' do
61
+ # line do
62
+ # stream do
63
+ # align centre
64
+ # end
65
+ # end
66
+ # end.must_equal({})
67
+ # end
68
+ # end
69
+
70
+ # describe '#left' do
71
+ # it 'left' do
72
+ # Vedeu.view 'test' do
73
+ # line do
74
+ # stream do
75
+ # align left
76
+ # end
77
+ # end
78
+ # end.must_equal({})
79
+ # end
80
+ # end
81
+
82
+ # describe '#right' do
83
+ # it 'right' do
84
+ # Vedeu.view 'test' do
85
+ # line do
86
+ # stream do
87
+ # align right
88
+ # end
89
+ # end
90
+ # end.must_equal({})
91
+ # end
92
+ # end
93
+
94
+ # describe '#text' do
95
+ # it 'text' do
96
+ # Vedeu.view 'test' do
97
+ # line do
98
+ # stream do
99
+ # text 'Some text...'
100
+ # end
101
+ # end
102
+ # end.must_equal({})
103
+ # end
104
+
105
+ # it 'invalid' do
106
+ # proc { Vedeu.view 'test' do
107
+ # line do
108
+ # stream do
109
+ # text
110
+ # end
111
+ # end
112
+ # end }.must_raise(ArgumentError)
113
+ # end
114
+ # end
115
+
116
+ # describe '#width' do
117
+ # it 'width' do
118
+ # Vedeu.view 'test' do
119
+ # line do
120
+ # stream do
121
+ # width 35
122
+ # end
123
+ # end
124
+ # end.must_equal({})
125
+ # end
126
+
127
+ # it 'invalid' do
128
+ # proc { Vedeu.view 'test' do
129
+ # line do
130
+ # stream do
131
+ # width
132
+ # end
133
+ # end
134
+ # end }.must_raise(ArgumentError)
135
+ # end
136
+ # end
137
+
138
+ end
@@ -20,14 +20,6 @@ module Vedeu
20
20
  end
21
21
  end
22
22
 
23
- describe '.event' do
24
- it 'delegates to the Events repository' do
25
- Events.expects(:add)
26
-
27
- Vedeu.event(:some_event)
28
- end
29
- end
30
-
31
23
  describe '.focus' do
32
24
  it 'sets the named interface to be focussed' do
33
25
  Vedeu.expects(:trigger).with(:_focus_by_name_, 'plutonium')
@@ -36,14 +28,6 @@ module Vedeu
36
28
  end
37
29
  end
38
30
 
39
- describe '.height' do
40
- it 'returns the terminal height' do
41
- IO.console.stub(:winsize, [24, 40]) do
42
- Vedeu.height.must_equal(24)
43
- end
44
- end
45
- end
46
-
47
31
  describe '.interface' do
48
32
  it 'creates and stores a new interface' do
49
33
  Vedeu::Buffers.reset
@@ -158,7 +142,7 @@ module Vedeu
158
142
 
159
143
  it 'raises an exception if the interface has not been defined' do
160
144
  proc { Vedeu.use('unknown') }
161
- .must_raise(Vedeu::InterfaceNotFound)
145
+ .must_raise(ModelNotFound)
162
146
  end
163
147
 
164
148
  it 'returns an instance of the named interface' do
@@ -214,14 +198,6 @@ module Vedeu
214
198
  end
215
199
  end
216
200
 
217
- describe '.width' do
218
- it 'returns the terminal width' do
219
- IO.console.stub(:winsize, [24, 40]) do
220
- Vedeu.width.must_equal(40)
221
- end
222
- end
223
- end
224
-
225
201
  end # API
226
202
 
227
203
  end # Vedeu
@@ -4,16 +4,6 @@ module Vedeu
4
4
 
5
5
  module API
6
6
 
7
- class HelpersTestClass
8
- include Helpers
9
-
10
- attr_accessor :attributes
11
-
12
- def initialize
13
- @attributes = { colour: {}, streams: [], style: [] }
14
- end
15
- end # HelpersTestClass
16
-
17
7
  describe Helpers do
18
8
 
19
9
  describe '#background' do
File without changes
@@ -2,16 +2,16 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
 
5
- describe ColourTranslator do
5
+ describe Translator do
6
6
 
7
7
  describe '#initialize' do
8
8
  it 'returns an instance of itself' do
9
9
  colour = ''
10
10
 
11
- ColourTranslator.new(colour).must_be_instance_of(ColourTranslator)
11
+ Translator.new(colour).must_be_instance_of(Translator)
12
12
  end
13
13
  end
14
14
 
15
- end # ColourTranslator
15
+ end # Translator
16
16
 
17
17
  end # Vedeu
@@ -3,64 +3,33 @@ require 'test_helper'
3
3
  module Vedeu
4
4
 
5
5
  describe Input do
6
+ let(:reader) { mock }
7
+ let(:keypress) { 'a' }
8
+
9
+ before { reader.stubs(:read).returns(keypress) }
6
10
 
7
11
  describe '#initialize' do
8
12
  it 'returns an instance of itself' do
9
- Input.new.must_be_instance_of(Input)
13
+ Input.new(reader).must_be_instance_of(Input)
10
14
  end
11
15
  end
12
16
 
13
17
  describe '.capture' do
14
- keypresses = {
15
- "\r" => :enter,
16
- "\t" => :tab,
17
- # "\e" => :escape, # handled below in separate test
18
- "\e[A" => :up,
19
- "\e[B" => :down,
20
- "\e[C" => :right,
21
- "\e[D" => :left,
22
- "\e[5~" => :page_up,
23
- "\e[6~" => :page_down,
24
- "\e[H" => :home,
25
- "\e[3~" => :delete,
26
- "\e[F" => :end,
27
- "\e[Z" => :shift_tab,
28
- "\eOP" => :f1,
29
- "\eOQ" => :f2,
30
- "\eOR" => :f3,
31
- "\eOS" => :f4,
32
- "\e[15~" => :f5,
33
- "\e[17~" => :f6,
34
- "\e[18~" => :f7,
35
- "\e[19~" => :f8,
36
- "\e[20~" => :f9,
37
- "\e[21~" => :f10,
38
- "\e[23~" => :f11,
39
- "\e[24~" => :f12,
40
- "\e[1;2P" => :print_screen,
41
- "\e[1;2Q" => :scroll_lock,
42
- "\e[1;2R" => :pause_break,
43
- "\u007F" => :backspace,
44
- "k" => "k"
45
- }
18
+ context 'when the key is not special' do
19
+ before { Vedeu.stubs(:trigger).returns([false]) }
46
20
 
47
- keypresses.each do |keypress, value|
48
- it 'triggers a :key event with the key pressed' do
49
- Terminal.stub :input, keypress do
50
- Vedeu.stub :trigger, value do
51
- Input.capture.must_equal(value)
52
- end
53
- end
21
+ it 'triggers an event associated with the key pressed' do
22
+ Input.capture(reader).must_equal([false])
54
23
  end
55
24
  end
56
25
 
57
- it 'switches the terminal mode when escape is pressed' do
58
- skip "Fix this; it intermittently fails because the event isn't " \
59
- "registered some of the time."
60
- Terminal.stub :input, "\e" do
61
- Vedeu.stub :log, nil do
62
- proc { Input.capture }.must_raise(ModeSwitch)
63
- end
26
+ context 'when the key is special' do
27
+ let(:keypress) { "\e" }
28
+
29
+ before { Vedeu.stubs(:trigger).raises(ModeSwitch) }
30
+
31
+ it 'switches the terminal mode when escape is pressed' do
32
+ proc { Input.capture(reader) }.must_raise(ModeSwitch)
64
33
  end
65
34
  end
66
35
  end
@@ -18,6 +18,29 @@ module Vedeu
18
18
  geometry.y.must_equal(17)
19
19
  end
20
20
  end
21
+
22
+ it 'returns the value of y when just an attribute' do
23
+ IO.console.stub(:winsize, [25, 80]) do
24
+ geometry = Geometry.new({ y: 19 })
25
+ geometry.y.must_equal(19)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '#yn' do
31
+ it 'returns the value of yn when it is a proc' do
32
+ IO.console.stub(:winsize, [25, 80]) do
33
+ geometry = Geometry.new({ yn: proc { 17 } })
34
+ geometry.yn.must_equal(17)
35
+ end
36
+ end
37
+
38
+ it 'returns the value of yn when just an attribute' do
39
+ IO.console.stub(:winsize, [25, 80]) do
40
+ geometry = Geometry.new({ yn: 19 })
41
+ geometry.yn.must_equal(19)
42
+ end
43
+ end
21
44
  end
22
45
 
23
46
  describe '#x' do
@@ -27,6 +50,29 @@ module Vedeu
27
50
  geometry.x.must_equal(58)
28
51
  end
29
52
  end
53
+
54
+ it 'returns the value of x when just an attribute' do
55
+ IO.console.stub(:winsize, [25, 80]) do
56
+ geometry = Geometry.new({ x: 64 })
57
+ geometry.x.must_equal(64)
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#xn' do
63
+ it 'returns the value of xn when it is a proc' do
64
+ IO.console.stub(:winsize, [25, 80]) do
65
+ geometry = Geometry.new({ xn: proc { 58 } })
66
+ geometry.xn.must_equal(58)
67
+ end
68
+ end
69
+
70
+ it 'returns the value of xn when just an attribute' do
71
+ IO.console.stub(:winsize, [25, 80]) do
72
+ geometry = Geometry.new({ xn: 64 })
73
+ geometry.xn.must_equal(64)
74
+ end
75
+ end
30
76
  end
31
77
 
32
78
  describe '#width' do
@@ -0,0 +1,99 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ describe Group do
6
+
7
+ describe '#initialize' do
8
+ it 'returns a Group' do
9
+ Group.new('organics').must_be_instance_of(Group)
10
+ end
11
+ end
12
+
13
+ describe '#add' do
14
+ it 'returns a Group' do
15
+ Group.new('organics', 'carbon', 'nitrogen').add('oxygen').must_be_instance_of(Group)
16
+ end
17
+
18
+ context 'when the member already exists' do
19
+ it 'does not add the member again but returns a new Group' do
20
+ group = Group.new('organics', 'nitrogen', 'carbon')
21
+ new_group = group.add('nitrogen')
22
+ new_group.members.must_equal(['nitrogen', 'carbon'])
23
+ end
24
+ end
25
+
26
+ context 'when the member does not exist' do
27
+ it 'adds the member and returns a new Group' do
28
+ group = Group.new('organics', 'carbon')
29
+ new_group = group.add('nitrogen')
30
+ new_group.members.must_equal(['carbon', 'nitrogen'])
31
+ end
32
+ end
33
+ end
34
+
35
+ describe '#members' do
36
+ it 'returns an instance of Array' do
37
+ Group.new('organics').members.must_be_instance_of(Array)
38
+ end
39
+
40
+ context 'when the group has no members' do
41
+ it 'returns an empty Set' do
42
+ group = Group.new('organics')
43
+ group.members.must_be_empty
44
+ end
45
+ end
46
+
47
+ context 'when the group has members' do
48
+ it 'returns a set of members' do
49
+ group = Group.new('organics', 'nitrogen', 'carbon')
50
+ group.members.wont_be_empty
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#name' do
56
+ it 'returns the specified name for the group' do
57
+ Group.new('organics').name.must_equal('organics')
58
+ end
59
+ end
60
+
61
+ describe '#remove' do
62
+ it 'returns a Group' do
63
+ group = Group.new('organics')
64
+ group.members.must_be_empty
65
+ group.remove('nitrogen').must_be_instance_of(Group)
66
+ end
67
+
68
+ context 'when the member exists' do
69
+ it 'removes the member and returns a new Group' do
70
+ group = Group.new('organics', 'nitrogen', 'carbon')
71
+ new_group = group.remove('nitrogen')
72
+ new_group.members.wont_include('nitrogen')
73
+ end
74
+ end
75
+
76
+ context 'when the member does not exist' do
77
+ it 'returns a new Group' do
78
+ group = Group.new('organics', 'nitrogen', 'carbon')
79
+ new_group = group.remove('oxygen')
80
+ new_group.members.must_equal(['nitrogen', 'carbon'])
81
+ end
82
+ end
83
+ end
84
+
85
+ describe '#reset' do
86
+ it 'returns a Group' do
87
+ Group.new('organics').reset.must_be_instance_of(Group)
88
+ end
89
+
90
+ it 'returns a Group with no members' do
91
+ group = Group.new('organics', 'nitrogen', 'carbon')
92
+ new_group = group.reset
93
+ new_group.members.must_be_empty
94
+ end
95
+ end
96
+
97
+ end # Group
98
+
99
+ end # Vedeu