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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Guardfile +13 -0
- data/README.md +11 -9
- data/Rakefile +10 -1
- data/bin/vedeu_test +14 -0
- data/config/cucumber.yml +8 -0
- data/docs/api.md +45 -16
- data/docs/events.md +21 -9
- data/docs/getting_started.md +16 -0
- data/docs/views.md +158 -0
- data/examples/borders_app.rb +236 -110
- data/examples/colour_support.sh +98 -0
- data/examples/colours_app.rb +41 -0
- data/examples/configuration_app.rb +11 -6
- data/examples/cursor_app.rb +60 -61
- data/examples/focus_app.rb +72 -34
- data/examples/hello_world.rb +13 -8
- data/examples/lines_app.rb +37 -28
- data/features/start_stop.feature +27 -0
- data/features/support/env.rb +14 -0
- data/lib/vedeu/all.rb +29 -0
- data/lib/vedeu/api.rb +39 -0
- data/lib/vedeu/application.rb +15 -7
- data/lib/vedeu/bindings.rb +121 -0
- data/lib/vedeu/buffers/all.rb +10 -0
- data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
- data/lib/vedeu/buffers/display_buffer.rb +118 -0
- data/lib/vedeu/configuration/all.rb +6 -0
- data/lib/vedeu/configuration/api.rb +3 -1
- data/lib/vedeu/configuration/cli.rb +3 -1
- data/lib/vedeu/configuration/configuration.rb +23 -2
- data/lib/vedeu/cursor/all.rb +23 -0
- data/lib/vedeu/cursor/cursor.rb +116 -0
- data/lib/vedeu/cursor/move_cursor.rb +137 -0
- data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
- data/lib/vedeu/dsl/all.rb +28 -0
- data/lib/vedeu/dsl/components/all.rb +7 -0
- data/lib/vedeu/dsl/components/border.rb +104 -0
- data/lib/vedeu/dsl/components/geometry.rb +153 -0
- data/lib/vedeu/dsl/components/keymap.rb +93 -0
- data/lib/vedeu/dsl/components/menu.rb +82 -0
- data/lib/vedeu/dsl/composition.rb +72 -0
- data/lib/vedeu/dsl/interface.rb +210 -0
- data/lib/vedeu/dsl/line.rb +135 -0
- data/lib/vedeu/dsl/shared/all.rb +7 -0
- data/lib/vedeu/dsl/shared/colour.rb +85 -0
- data/lib/vedeu/dsl/shared/style.rb +38 -0
- data/lib/vedeu/dsl/shared/text.rb +102 -0
- data/lib/vedeu/dsl/shared/use.rb +47 -0
- data/lib/vedeu/dsl/stream.rb +49 -0
- data/lib/vedeu/dsl/view.rb +136 -0
- data/lib/vedeu/events/all.rb +10 -0
- data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
- data/lib/vedeu/events/trigger.rb +58 -0
- data/lib/vedeu/exceptions.rb +34 -0
- data/lib/vedeu/input/all.rb +29 -0
- data/lib/vedeu/input/input.rb +26 -0
- data/lib/vedeu/{models → input}/key.rb +21 -11
- data/lib/vedeu/input/keymap.rb +130 -0
- data/lib/vedeu/input/keys.rb +8 -0
- data/lib/vedeu/input/mapper.rb +112 -0
- data/lib/vedeu/launcher.rb +7 -4
- data/lib/vedeu/models/all.rb +12 -0
- data/lib/vedeu/models/collection.rb +71 -0
- data/lib/vedeu/{repositories → models}/focus.rb +63 -21
- data/lib/vedeu/models/geometry.rb +100 -259
- data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
- data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
- data/lib/vedeu/models/model.rb +51 -0
- data/lib/vedeu/models/view/all.rb +12 -0
- data/lib/vedeu/models/view/char.rb +84 -0
- data/lib/vedeu/models/view/chars.rb +8 -0
- data/lib/vedeu/models/view/composition.rb +101 -0
- data/lib/vedeu/models/view/interface.rb +215 -0
- data/lib/vedeu/models/view/interfaces.rb +8 -0
- data/lib/vedeu/models/view/line.rb +134 -0
- data/lib/vedeu/models/view/lines.rb +8 -0
- data/lib/vedeu/models/view/stream.rb +144 -0
- data/lib/vedeu/models/view/streams.rb +8 -0
- data/lib/vedeu/output/all.rb +8 -0
- data/lib/vedeu/output/border.rb +387 -0
- data/lib/vedeu/output/compositor.rb +41 -30
- data/lib/vedeu/output/output.rb +6 -13
- data/lib/vedeu/output/viewport.rb +78 -94
- data/lib/vedeu/output/writer.rb +29 -0
- data/lib/vedeu/presentation/all.rb +9 -0
- data/lib/vedeu/{colours → presentation}/background.rb +1 -9
- data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
- data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
- data/lib/vedeu/presentation/presentation.rb +91 -0
- data/lib/vedeu/presentation/style.rb +47 -0
- data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
- data/lib/vedeu/repositories/all.rb +5 -0
- data/lib/vedeu/repositories/menus.rb +5 -42
- data/lib/vedeu/{support → repositories}/repository.rb +78 -41
- data/lib/vedeu/support/all.rb +22 -0
- data/lib/vedeu/support/bounding_area.rb +2 -1
- data/lib/vedeu/support/coercions.rb +18 -1
- data/lib/vedeu/support/console.rb +73 -0
- data/lib/vedeu/support/content_geometry.rb +69 -0
- data/lib/vedeu/support/coordinate.rb +246 -0
- data/lib/vedeu/support/esc.rb +29 -2
- data/lib/vedeu/support/log.rb +36 -2
- data/lib/vedeu/support/node.rb +61 -0
- data/lib/vedeu/support/position.rb +28 -13
- data/lib/vedeu/support/position_validator.rb +79 -0
- data/lib/vedeu/support/read.rb +65 -0
- data/lib/vedeu/support/refresh.rb +8 -32
- data/lib/vedeu/support/terminal.rb +34 -4
- data/lib/vedeu/support/text.rb +104 -0
- data/lib/vedeu/support/trace.rb +11 -23
- data/lib/vedeu/support/visible.rb +75 -0
- data/lib/vedeu/support/write.rb +85 -0
- data/lib/vedeu/traps.rb +18 -0
- data/lib/vedeu.rb +41 -101
- data/test/integration/dsl/compositions_test.rb +27 -0
- data/test/integration/dsl/interfaces_test.rb +261 -0
- data/test/integration/dsl/keymaps_test.rb +42 -0
- data/test/integration/dsl/lines_test.rb +146 -0
- data/test/integration/dsl/menus_test.rb +59 -0
- data/test/integration/dsl/streams_test.rb +129 -0
- data/test/integration/dsl/views_test.rb +63 -0
- data/test/lib/vedeu/api_test.rb +163 -0
- data/test/lib/vedeu/application_test.rb +19 -10
- data/test/lib/vedeu/bindings_test.rb +54 -0
- data/test/lib/vedeu/buffers/all_test.rb +11 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
- data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
- data/test/lib/vedeu/configuration/api_test.rb +42 -58
- data/test/lib/vedeu/configuration/cli_test.rb +4 -4
- data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
- data/test/lib/vedeu/cursor/all_test.rb +33 -0
- data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
- data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
- data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
- data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
- data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
- data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
- data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
- data/test/lib/vedeu/dsl/composition_test.rb +41 -0
- data/test/lib/vedeu/dsl/interface_test.rb +470 -0
- data/test/lib/vedeu/dsl/line_test.rb +60 -0
- data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
- data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
- data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
- data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
- data/test/lib/vedeu/dsl/stream_test.rb +26 -0
- data/test/lib/vedeu/dsl/view_test.rb +73 -0
- data/test/lib/vedeu/events/all_test.rb +11 -0
- data/test/lib/vedeu/events/event_test.rb +109 -0
- data/test/lib/vedeu/events/trigger_test.rb +60 -0
- data/test/lib/vedeu/input/all_test.rb +11 -0
- data/test/lib/vedeu/input/input_test.rb +7 -3
- data/test/lib/vedeu/input/key_test.rb +72 -0
- data/test/lib/vedeu/input/keymap_test.rb +89 -0
- data/test/lib/vedeu/input/mapper_test.rb +94 -0
- data/test/lib/vedeu/launcher_test.rb +19 -20
- data/test/lib/vedeu/models/collection_test.rb +114 -0
- data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
- data/test/lib/vedeu/models/geometry_test.rb +35 -39
- data/test/lib/vedeu/models/group_test.rb +100 -0
- data/test/lib/vedeu/models/menu_test.rb +288 -0
- data/test/lib/vedeu/models/model_test.rb +31 -0
- data/test/lib/vedeu/models/view/char_test.rb +166 -0
- data/test/lib/vedeu/models/view/chars_test.rb +18 -0
- data/test/lib/vedeu/models/view/composition_test.rb +41 -0
- data/test/lib/vedeu/models/view/interface_test.rb +128 -0
- data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
- data/test/lib/vedeu/models/view/line_test.rb +214 -0
- data/test/lib/vedeu/models/view/lines_test.rb +18 -0
- data/test/lib/vedeu/models/view/stream_test.rb +106 -0
- data/test/lib/vedeu/models/view/streams_test.rb +18 -0
- data/test/lib/vedeu/output/border_test.rb +357 -0
- data/test/lib/vedeu/output/compositor_test.rb +61 -15
- data/test/lib/vedeu/output/output_test.rb +25 -84
- data/test/lib/vedeu/output/viewport_test.rb +171 -45
- data/test/lib/vedeu/output/writer_test.rb +45 -0
- data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
- data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
- data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
- data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
- data/test/lib/vedeu/presentation/style_test.rb +69 -0
- data/test/lib/vedeu/presentation/translator_test.rb +63 -0
- data/test/lib/vedeu/repositories/all_test.rb +7 -0
- data/test/lib/vedeu/repositories/menus_test.rb +3 -156
- data/test/lib/vedeu/repositories/repository_test.rb +271 -0
- data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
- data/test/lib/vedeu/support/coercions_test.rb +39 -0
- data/test/lib/vedeu/support/common_test.rb +31 -16
- data/test/lib/vedeu/support/console_test.rb +85 -0
- data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
- data/test/lib/vedeu/support/coordinate_test.rb +190 -0
- data/test/lib/vedeu/support/esc_test.rb +18 -0
- data/test/lib/vedeu/support/grid_test.rb +15 -10
- data/test/lib/vedeu/support/log_test.rb +3 -0
- data/test/lib/vedeu/support/position_test.rb +22 -2
- data/test/lib/vedeu/support/position_validator_test.rb +11 -0
- data/test/lib/vedeu/support/read_test.rb +88 -0
- data/test/lib/vedeu/support/refresh_test.rb +44 -12
- data/test/lib/vedeu/support/sentence_test.rb +6 -4
- data/test/lib/vedeu/support/terminal_test.rb +81 -70
- data/test/lib/vedeu/support/text_test.rb +93 -0
- data/test/lib/vedeu/support/trace_test.rb +21 -9
- data/test/lib/vedeu/support/visible_test.rb +148 -0
- data/test/lib/vedeu/support/write_test.rb +136 -0
- data/test/lib/vedeu/traps_test.rb +11 -0
- data/test/lib/vedeu_test.rb +2 -0
- data/test/support/helpers/all.rb +7 -0
- data/test/support/helpers/dsl_model_test_class.rb +25 -0
- data/test/support/{test_classes → helpers}/helpers.rb +0 -2
- data/test/support/helpers/misc.rb +15 -0
- data/test/support/helpers/model_test_class.rb +34 -0
- data/test/support/{test_classes → helpers}/presentation.rb +0 -0
- data/test/support/{test_classes → helpers}/repositories.rb +3 -3
- data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
- data/test/test_helper.rb +19 -22
- data/vedeu.gemspec +11 -6
- metadata +322 -181
- data/lib/vedeu/api/api.rb +0 -239
- data/lib/vedeu/api/composition.rb +0 -38
- data/lib/vedeu/api/defined.rb +0 -52
- data/lib/vedeu/api/helpers.rb +0 -161
- data/lib/vedeu/api/interface.rb +0 -287
- data/lib/vedeu/api/keymap.rb +0 -75
- data/lib/vedeu/api/line.rb +0 -107
- data/lib/vedeu/api/menu.rb +0 -111
- data/lib/vedeu/api/stream.rb +0 -96
- data/lib/vedeu/models/border.rb +0 -238
- data/lib/vedeu/models/char.rb +0 -43
- data/lib/vedeu/models/composition.rb +0 -72
- data/lib/vedeu/models/line.rb +0 -100
- data/lib/vedeu/models/stream.rb +0 -130
- data/lib/vedeu/models/style.rb +0 -52
- data/lib/vedeu/repositories/buffers.rb +0 -52
- data/lib/vedeu/repositories/cursors.rb +0 -64
- data/lib/vedeu/repositories/events.rb +0 -147
- data/lib/vedeu/repositories/groups.rb +0 -47
- data/lib/vedeu/repositories/interfaces.rb +0 -78
- data/lib/vedeu/repositories/keymaps.rb +0 -196
- data/lib/vedeu/repositories/models/cursor.rb +0 -209
- data/lib/vedeu/repositories/models/interface.rb +0 -163
- data/lib/vedeu/repositories/models/keymap.rb +0 -111
- data/lib/vedeu/repositories/models/offset.rb +0 -91
- data/lib/vedeu/repositories/offsets.rb +0 -69
- data/lib/vedeu/support/exceptions.rb +0 -34
- data/lib/vedeu/support/keymap_validator.rb +0 -100
- data/lib/vedeu/support/model.rb +0 -14
- data/lib/vedeu/support/presentation.rb +0 -86
- data/lib/vedeu/support/registrar.rb +0 -53
- data/test/integration/api/api_test.rb +0 -97
- data/test/integration/api_dsl/dsl_api_test.rb +0 -4
- data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
- data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
- data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
- data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
- data/test/integration/api_dsl/dsl_keymap.rb +0 -4
- data/test/integration/api_dsl/dsl_line_test.rb +0 -4
- data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
- data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
- data/test/integration/cursors_test.rb +0 -9
- data/test/integration/defining_interfaces_test.rb +0 -26
- data/test/integration/run_once_test.rb +0 -26
- data/test/integration/views/basic_view_test.rb +0 -807
- data/test/lib/vedeu/api/api_test.rb +0 -204
- data/test/lib/vedeu/api/composition_test.rb +0 -31
- data/test/lib/vedeu/api/defined_test.rb +0 -79
- data/test/lib/vedeu/api/helpers_test.rb +0 -111
- data/test/lib/vedeu/api/interface_test.rb +0 -410
- data/test/lib/vedeu/api/keymap_test.rb +0 -65
- data/test/lib/vedeu/api/line_test.rb +0 -83
- data/test/lib/vedeu/api/menu_test.rb +0 -85
- data/test/lib/vedeu/api/stream_test.rb +0 -59
- data/test/lib/vedeu/colours/translator_test.rb +0 -22
- data/test/lib/vedeu/models/border_test.rb +0 -197
- data/test/lib/vedeu/models/char_test.rb +0 -52
- data/test/lib/vedeu/models/composition_test.rb +0 -45
- data/test/lib/vedeu/models/key_test.rb +0 -43
- data/test/lib/vedeu/models/line_test.rb +0 -123
- data/test/lib/vedeu/models/stream_test.rb +0 -233
- data/test/lib/vedeu/models/style_test.rb +0 -59
- data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
- data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
- data/test/lib/vedeu/repositories/events_test.rb +0 -57
- data/test/lib/vedeu/repositories/groups_test.rb +0 -28
- data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
- data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
- data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
- data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
- data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
- data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
- data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
- data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
- data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
- data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
- data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
- data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
- data/test/lib/vedeu/support/model_test.rb +0 -23
- data/test/lib/vedeu/support/presentation_test.rb +0 -53
- data/test/lib/vedeu/support/registrar_test.rb +0 -94
- data/test/lib/vedeu/support/repository_test.rb +0 -208
- data/test/support/test_classes/all.rb +0 -5
- data/test/support/test_classes/coercions.rb +0 -16
- data/test/support/test_classes/model.rb +0 -23
- data/test/support/test_modules/all.rb +0 -1
@@ -1,223 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
describe Keymaps do
|
6
|
-
|
7
|
-
before { Keymaps.reset }
|
8
|
-
|
9
|
-
describe '#add' do
|
10
|
-
it 'returns false when there are no keys defined' do
|
11
|
-
attributes = {}
|
12
|
-
|
13
|
-
Keymaps.add(attributes).must_equal(false)
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'returns true when the key was registered with keymap storage' do
|
17
|
-
attributes = { interfaces: ['gold'], keys: [{ 'a' => proc { :gold } }] }
|
18
|
-
|
19
|
-
Keymaps.add(attributes).must_equal(true)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe '#find' do
|
24
|
-
let(:attributes) {
|
25
|
-
{
|
26
|
-
interfaces: ['flerovium'],
|
27
|
-
keys: [{ key: 'u', action: proc { :some_action } }]
|
28
|
-
}
|
29
|
-
}
|
30
|
-
|
31
|
-
before { Keymaps.add(attributes) }
|
32
|
-
|
33
|
-
it 'returns false when the named keymap cannot be found' do
|
34
|
-
Keymaps.find('vanadium').must_equal({})
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'returns the keymap when the named keymap was found' do
|
38
|
-
Keymaps.find('flerovium').wont_be_empty
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe '#global_key?' do
|
43
|
-
before { Keymaps.stubs(:global_keys).returns(['i', 'j']) }
|
44
|
-
|
45
|
-
it 'returns false when the key is not registered as a global key' do
|
46
|
-
Keymaps.global_key?('h').must_equal(false)
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'returns true when the key is registered as a global key' do
|
50
|
-
Keymaps.global_key?('j').must_equal(true)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe '#global_keys' do
|
55
|
-
let(:attributes) {
|
56
|
-
{
|
57
|
-
keys: [
|
58
|
-
{
|
59
|
-
key: 'a', action: proc { :action_a }
|
60
|
-
},{
|
61
|
-
key: 'b', action: proc { :action_b }
|
62
|
-
},{
|
63
|
-
key: 'c', action: proc { :action_c }
|
64
|
-
}
|
65
|
-
]
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
before { Keymaps.add(attributes) }
|
70
|
-
|
71
|
-
it 'returns the defined global keys' do
|
72
|
-
Keymaps.global_keys.must_equal(['a', 'b', 'c'])
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe '#interface_key?' do
|
77
|
-
before { Keymaps.stubs(:interface_keys).returns(['g', 'h']) }
|
78
|
-
|
79
|
-
it 'returns false when the key is not registered with an interface' do
|
80
|
-
Keymaps.interface_key?('f').must_equal(false)
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'returns true when the key is registered with an interface' do
|
84
|
-
Keymaps.interface_key?('g').must_equal(true)
|
85
|
-
end
|
86
|
-
|
87
|
-
context 'when the interface argument is provided' do
|
88
|
-
before do
|
89
|
-
Keymaps.stubs(:find).returns({ 'j' => proc { :some_action } })
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'return false when the key is not registered with the specified ' \
|
93
|
-
'interface' do
|
94
|
-
Keymaps.interface_key?('k', 'cadmium').must_equal(false)
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'return true when the key is registered with the specified ' \
|
98
|
-
'interface' do
|
99
|
-
Keymaps.interface_key?('j', 'cadmium').must_equal(true)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe '#interface_keys' do
|
105
|
-
let(:rhodium_attributes) {
|
106
|
-
{
|
107
|
-
interfaces: ['rhodium'],
|
108
|
-
keys: [
|
109
|
-
{
|
110
|
-
key: 'd', action: proc { :action_d }
|
111
|
-
},{
|
112
|
-
key: 'e', action: proc { :action_e }
|
113
|
-
}
|
114
|
-
]
|
115
|
-
}
|
116
|
-
}
|
117
|
-
let(:magnesium_attributes) {
|
118
|
-
{
|
119
|
-
interfaces: ['magnesium'],
|
120
|
-
keys: [
|
121
|
-
{
|
122
|
-
key: 'e', action: proc { :action_e }
|
123
|
-
},{
|
124
|
-
key: 'f', action: proc { :action_g }
|
125
|
-
}
|
126
|
-
]
|
127
|
-
}
|
128
|
-
}
|
129
|
-
|
130
|
-
before do
|
131
|
-
Keymaps.add(rhodium_attributes)
|
132
|
-
Keymaps.add(magnesium_attributes)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'returns the defined keys for all interfaces' do
|
136
|
-
Keymaps.interface_keys.must_equal(['d', 'e', 'f'])
|
137
|
-
end
|
138
|
-
|
139
|
-
it 'returns the defined keys for the specified interface' do
|
140
|
-
Keymaps.interface_keys('magnesium').must_equal(['e', 'f'])
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
describe '#registered?' do
|
145
|
-
it 'returns false when the named keymap is not registered' do
|
146
|
-
Keymaps.registered?('vanadium').must_equal(false)
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'returns true when the named keymap is registered' do
|
150
|
-
Keymaps.registered?('_global_keymap_').must_equal(true)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
describe '#system_key?' do
|
155
|
-
it 'returns false when the key is not registered as a system key' do
|
156
|
-
Keymaps.system_key?('r').must_equal(false)
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'returns true when the key is registered as a system key' do
|
160
|
-
Keymaps.system_key?('q').must_equal(true)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
describe '#system_keys' do
|
165
|
-
it 'returns the defined system keys' do
|
166
|
-
Keymaps.system_keys.must_equal(['q', :tab, :shift_tab, :escape])
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
describe '#use' do
|
171
|
-
let(:meitnerium_attributes) {
|
172
|
-
{
|
173
|
-
interfaces: ['meitnerium'],
|
174
|
-
keys: [{
|
175
|
-
key: 'm', action: proc { :key_m_pressed }
|
176
|
-
}]
|
177
|
-
}
|
178
|
-
}
|
179
|
-
let(:global_attributes) {
|
180
|
-
{
|
181
|
-
keys: [{
|
182
|
-
key: 'o', action: proc { :key_o_pressed }
|
183
|
-
}]
|
184
|
-
}
|
185
|
-
}
|
186
|
-
|
187
|
-
before do
|
188
|
-
Keymaps.add(meitnerium_attributes)
|
189
|
-
Keymaps.add(global_attributes)
|
190
|
-
Vedeu::Focus.stubs(:current).returns('meitnerium')
|
191
|
-
Vedeu::Configuration.stubs(:system_keys).returns({ :key_p_pressed => 'p' })
|
192
|
-
Vedeu.stubs(:trigger).returns(:system_key_p_pressed)
|
193
|
-
end
|
194
|
-
|
195
|
-
context 'when not registered' do
|
196
|
-
it 'returns false' do
|
197
|
-
Keymaps.use('l').must_equal(false)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
context 'when registered as an interface key and the interface is in ' \
|
202
|
-
'focus' do
|
203
|
-
it 'returns the result of the keypress' do
|
204
|
-
Keymaps.use('m').must_equal(:key_m_pressed)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
context 'when registered as a global key' do
|
209
|
-
it 'returns the result of the keypress' do
|
210
|
-
Keymaps.use('o').must_equal(:key_o_pressed)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
context 'when registered as a system key' do
|
215
|
-
it 'returns the result of the keypress' do
|
216
|
-
Keymaps.use('p').must_equal(:system_key_p_pressed)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
end # Keymaps
|
222
|
-
|
223
|
-
end # Vedeu
|
@@ -1,174 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
describe Buffer do
|
6
|
-
|
7
|
-
let(:described) { Buffer.new(attributes) }
|
8
|
-
let(:attributes) {
|
9
|
-
{
|
10
|
-
name: '',
|
11
|
-
back: back,
|
12
|
-
front: front,
|
13
|
-
previous: previous,
|
14
|
-
}
|
15
|
-
}
|
16
|
-
let(:back) { {} }
|
17
|
-
let(:front) { {} }
|
18
|
-
let(:previous) { {} }
|
19
|
-
|
20
|
-
describe '#initialize' do
|
21
|
-
it { return_type_for(described, Buffer) }
|
22
|
-
it { assigns(described, '@name', '') }
|
23
|
-
it { assigns(described, '@back', {}) }
|
24
|
-
it { assigns(described, '@front', {}) }
|
25
|
-
it { assigns(described, '@previous', {}) }
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#back' do
|
29
|
-
it { return_type_for(described.back, Hash) }
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '#front' do
|
33
|
-
it { return_type_for(described.front, Hash) }
|
34
|
-
|
35
|
-
context 'alias method: #current' do
|
36
|
-
it { return_type_for(described.current, Hash) }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe '#name' do
|
41
|
-
it { return_type_for(described.name, String) }
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#previous' do
|
45
|
-
it { return_type_for(described.previous, Hash) }
|
46
|
-
end
|
47
|
-
|
48
|
-
describe '#content' do
|
49
|
-
it { return_type_for(described.content, Array) }
|
50
|
-
|
51
|
-
subject { Buffer.new(attributes).content }
|
52
|
-
|
53
|
-
context 'when there is content on the back buffer' do
|
54
|
-
let(:back) { { lines: [{ streams: [{ text: 'back' }] }] } }
|
55
|
-
let(:buffer) { :back }
|
56
|
-
|
57
|
-
it { subject.must_equal([{}, back]) }
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'when there is no content on the back buffer' do
|
61
|
-
let(:buffer) { :back }
|
62
|
-
|
63
|
-
it { subject.must_equal([{}]) }
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'when there is no content on the back buffer' do
|
67
|
-
let(:back) { { lines: [] } }
|
68
|
-
let(:buffer) { :back }
|
69
|
-
|
70
|
-
it { subject.must_equal([{}]) }
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'when there is content on the front buffer' do
|
74
|
-
let(:buffer) { :front }
|
75
|
-
let(:front) { { lines: [{ streams: [{ text: 'front' }] }] } }
|
76
|
-
|
77
|
-
it { subject.must_equal([front]) }
|
78
|
-
end
|
79
|
-
|
80
|
-
context 'when there is no content on the front buffer' do
|
81
|
-
let(:buffer) { :front }
|
82
|
-
|
83
|
-
it { subject.must_equal([{}]) }
|
84
|
-
end
|
85
|
-
|
86
|
-
context 'when there is no content on the front buffer' do
|
87
|
-
let(:buffer) { :front }
|
88
|
-
|
89
|
-
let(:front) { { lines: [] } }
|
90
|
-
|
91
|
-
it { subject.must_equal([{}]) }
|
92
|
-
end
|
93
|
-
|
94
|
-
context 'when there is content on the previous buffer' do
|
95
|
-
let(:buffer) { :previous }
|
96
|
-
let(:previous) { { lines: [{ streams: [{ text: 'previous' }] }] } }
|
97
|
-
|
98
|
-
it { subject.must_equal([previous]) }
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'when there is no content on the previous buffer' do
|
102
|
-
let(:buffer) { :previous }
|
103
|
-
|
104
|
-
it { subject.must_equal([{}]) }
|
105
|
-
end
|
106
|
-
|
107
|
-
context 'when there is no content on the previous buffer' do
|
108
|
-
let(:buffer) { :previous }
|
109
|
-
let(:previous) { { lines: [] } }
|
110
|
-
|
111
|
-
it { subject.must_equal([{}]) }
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
describe '#add' do
|
116
|
-
let(:attributes) {
|
117
|
-
{
|
118
|
-
back: { lines: [{ streams: [{ text: 'old_back' }] }] }
|
119
|
-
}
|
120
|
-
}
|
121
|
-
let(:buffer) { Buffer.new(attributes) }
|
122
|
-
let(:content) { { lines: [{ streams: [{ text: 'new_back' }] }] } }
|
123
|
-
|
124
|
-
subject { buffer.add(content) }
|
125
|
-
|
126
|
-
it { subject.must_equal(true) }
|
127
|
-
|
128
|
-
it 'replaces the back buffer with the content' do
|
129
|
-
buffer.back.must_equal({ lines: [{ streams: [{ text: 'old_back' }] }] })
|
130
|
-
|
131
|
-
subject
|
132
|
-
|
133
|
-
buffer.back.must_equal({ lines: [{ streams: [{ text: 'new_back' }] }] })
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#swap' do
|
138
|
-
let(:buffer) { Buffer.new(attributes) }
|
139
|
-
|
140
|
-
subject { buffer.swap }
|
141
|
-
|
142
|
-
context 'when there is new content on the back buffer' do
|
143
|
-
let(:back) { { lines: [{ streams: [{ text: 'back' }] }] } }
|
144
|
-
let(:front) { { lines: [{ streams: [{ text: 'front' }] }] } }
|
145
|
-
let(:previous) { { lines: [{ streams: [{ text: 'previous' }] }] } }
|
146
|
-
|
147
|
-
context 'when the buffer was updated successfully' do
|
148
|
-
it { subject.must_equal(true) }
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'replaces the previous buffer with the front buffer' do
|
152
|
-
subject
|
153
|
-
buffer.previous.must_equal(front)
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'replaces the front buffer with the back buffer' do
|
157
|
-
subject
|
158
|
-
buffer.front.must_equal(back)
|
159
|
-
end
|
160
|
-
|
161
|
-
it 'replaces the back buffer with an empty buffer' do
|
162
|
-
subject
|
163
|
-
buffer.back.must_equal({})
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
context 'when there is no new content on the back buffer' do
|
168
|
-
it { subject.must_equal(false) }
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
end # Buffer
|
173
|
-
|
174
|
-
end # Vedeu
|
@@ -1,158 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
describe Cursor do
|
6
|
-
|
7
|
-
let(:described) { Cursor.new(attributes) }
|
8
|
-
let(:attributes) {
|
9
|
-
{
|
10
|
-
name: 'silver',
|
11
|
-
state: :show,
|
12
|
-
x: 19,
|
13
|
-
y: 8
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
before do
|
18
|
-
Interfaces.reset
|
19
|
-
Vedeu.interface 'silver' do
|
20
|
-
y 5
|
21
|
-
height 4
|
22
|
-
x 12
|
23
|
-
width 10
|
24
|
-
end
|
25
|
-
Terminal.console.stubs(:print)
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#initialize' do
|
29
|
-
it { return_type_for(described, Cursor) }
|
30
|
-
it { assigns(described, '@attributes', attributes) }
|
31
|
-
it { assigns(described, '@name', 'silver') }
|
32
|
-
it { assigns(described, '@state', :show) }
|
33
|
-
it { assigns(described, '@x', 19) }
|
34
|
-
it { assigns(described, '@y', 8) }
|
35
|
-
end
|
36
|
-
|
37
|
-
describe '#attributes' do
|
38
|
-
it 'returns a hash containing the attributes of the instance' do
|
39
|
-
described.attributes.must_equal(
|
40
|
-
{ name: 'silver', state: :show, x: 19, y: 8 }
|
41
|
-
)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#x' do
|
46
|
-
it { return_type_for(described.x, Fixnum) }
|
47
|
-
|
48
|
-
context 'when the cursors position is outside the interface' do
|
49
|
-
let(:attributes) { { name: 'silver', state: :show, x: 10, y: 8 } }
|
50
|
-
|
51
|
-
it 'repositions the cursor at the start of the line' do
|
52
|
-
Cursor.new(attributes).attributes.must_equal(
|
53
|
-
{ name: 'silver', state: :show, x: 12, y: 8 }
|
54
|
-
)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'when the cursors position is outside the interface' do
|
59
|
-
let(:attributes) { { name: 'silver', state: :show, x: 25, y: 8 } }
|
60
|
-
|
61
|
-
it 'repositions the cursor at the end of the line' do
|
62
|
-
Cursor.new(attributes).attributes.must_equal(
|
63
|
-
{ name: 'silver', state: :show, x: 22, y: 8 }
|
64
|
-
)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe '#y' do
|
70
|
-
it { return_type_for(described.y, Fixnum) }
|
71
|
-
|
72
|
-
context 'when the cursors position is outside the interface' do
|
73
|
-
let(:attributes) { { name: 'silver', state: :show, x: 19, y: 3 } }
|
74
|
-
|
75
|
-
it 'repositions the cursor at the start of the line' do
|
76
|
-
described.attributes.must_equal(
|
77
|
-
{ name: 'silver', state: :show, x: 19, y: 5 }
|
78
|
-
)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
context 'when the cursors position is outside the interface' do
|
83
|
-
let(:attributes) { { name: 'silver', state: :show, x: 19, y: 12 } }
|
84
|
-
|
85
|
-
it 'repositions the cursor at the end of the line' do
|
86
|
-
described.attributes.must_equal(
|
87
|
-
{ name: 'silver', state: :show, x: 19, y: 9 }
|
88
|
-
)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe '#refresh' do
|
94
|
-
it 'returns a hash containing the attributes of the instance' do
|
95
|
-
described.refresh.must_equal(
|
96
|
-
{ name: 'silver', state: :show, x: 19, y: 8 }
|
97
|
-
)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe '#show' do
|
102
|
-
it 'sets the state attribute to :show' do
|
103
|
-
cursor = described
|
104
|
-
cursor.hide
|
105
|
-
cursor.attributes.must_equal(
|
106
|
-
{ name: 'silver', state: :hide, x: 19, y: 8 }
|
107
|
-
)
|
108
|
-
cursor.show
|
109
|
-
cursor.attributes.must_equal(
|
110
|
-
{ name: 'silver', state: :show, x: 19, y: 8 }
|
111
|
-
)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
describe '#hide' do
|
116
|
-
it 'sets the state attribute to :hide' do
|
117
|
-
cursor = described
|
118
|
-
cursor.hide
|
119
|
-
cursor.attributes.must_equal(
|
120
|
-
{ name: 'silver', state: :hide, x: 19, y: 8 }
|
121
|
-
)
|
122
|
-
cursor.to_s.must_equal("\e[8;19H\e[?25l")
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe '#to_s' do
|
127
|
-
context 'when the cursor state is :show' do
|
128
|
-
it 'returns an escape sequence for showing the cursor (and position)' do
|
129
|
-
cursor = described
|
130
|
-
cursor.show
|
131
|
-
cursor.to_s.must_equal("\e[8;19H\e[?25h")
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
context 'when the cursor state is :hide' do
|
136
|
-
it 'returns an escape sequence for hiding the cursor (and position)' do
|
137
|
-
cursor = described
|
138
|
-
cursor.hide
|
139
|
-
cursor.to_s.must_equal("\e[8;19H\e[?25l")
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'returns the escape sequence to position and set the visibility of ' \
|
144
|
-
'the cursor' do
|
145
|
-
described.to_s.must_equal("\e[8;19H\e[?25h")
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'returns the escape sequence to position and set the visibility of ' \
|
149
|
-
'the cursor and returns to that position after yielding the block' do
|
150
|
-
described.to_s do
|
151
|
-
# ...
|
152
|
-
end.must_equal("\e[8;19H\e[?25h\e[8;19H\e[?25h")
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
end # Cursor
|
157
|
-
|
158
|
-
end # Vedeu
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
describe Event do
|
6
|
-
|
7
|
-
let(:described) { Event.new(event_name, options, closure) }
|
8
|
-
let(:event_name) { :some_event }
|
9
|
-
let(:options) { {} }
|
10
|
-
let(:closure) { proc { :event_triggered } }
|
11
|
-
|
12
|
-
describe '#initialize' do
|
13
|
-
it { return_type_for(described, Event) }
|
14
|
-
it { assigns(described, '@name', :some_event) }
|
15
|
-
it { assigns(described, '@options', options) }
|
16
|
-
|
17
|
-
it { skip; assigns(described, '@closure', closure) }
|
18
|
-
|
19
|
-
it { assigns(described, '@deadline', 0) }
|
20
|
-
it { assigns(described, '@executed_at', 0) }
|
21
|
-
it { assigns(described, '@now', 0) }
|
22
|
-
end
|
23
|
-
|
24
|
-
describe '#trigger' do
|
25
|
-
it 'returns the result of calling the closure when debouncing' do
|
26
|
-
event = Event.new(event_name, { debounce: 0.0025 }, closure)
|
27
|
-
event.trigger.must_equal(nil)
|
28
|
-
sleep 0.0015
|
29
|
-
event.trigger.must_equal(nil)
|
30
|
-
sleep 0.0015
|
31
|
-
event.trigger.must_equal(:event_triggered)
|
32
|
-
sleep 0.0015
|
33
|
-
event.trigger.must_equal(nil)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'returns the result of calling the closure when throttling' do
|
37
|
-
event = Event.new(event_name, { delay: 0.0025 }, closure)
|
38
|
-
event.trigger.must_equal(:event_triggered)
|
39
|
-
sleep 0.0015
|
40
|
-
event.trigger.must_equal(nil)
|
41
|
-
sleep 0.0015
|
42
|
-
event.trigger.must_equal(:event_triggered)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'returns the result of calling the closure with its arguments' do
|
46
|
-
event = Event.new(event_name, options, closure)
|
47
|
-
event.trigger.must_equal(:event_triggered)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
end # Event
|
52
|
-
|
53
|
-
end # Vedeu
|
@@ -1,98 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
describe Group do
|
6
|
-
|
7
|
-
let(:described) { Group.new('organics', *members) }
|
8
|
-
let(:members) { ['carbon', 'nitrogen', 'oxygen'] }
|
9
|
-
|
10
|
-
describe '#initialize' do
|
11
|
-
it { return_type_for(described, Group) }
|
12
|
-
it { assigns(described, '@members', members.to_set) }
|
13
|
-
it { assigns(described, '@name', 'organics') }
|
14
|
-
end
|
15
|
-
|
16
|
-
describe '#add' do
|
17
|
-
it 'returns a Group' do
|
18
|
-
Group.new('organics', 'carbon', 'nitrogen').add('oxygen').must_be_instance_of(Group)
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'when the member already exists' do
|
22
|
-
it 'does not add the member again but returns a new Group' do
|
23
|
-
group = Group.new('organics', 'nitrogen', 'carbon')
|
24
|
-
new_group = group.add('nitrogen')
|
25
|
-
new_group.members.must_equal(['nitrogen', 'carbon'])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'when the member does not exist' do
|
30
|
-
it 'adds the member and returns a new Group' do
|
31
|
-
group = Group.new('organics', 'carbon')
|
32
|
-
new_group = group.add('nitrogen')
|
33
|
-
new_group.members.must_equal(['carbon', 'nitrogen'])
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#members' do
|
39
|
-
it { return_type_for(described.members, Array) }
|
40
|
-
|
41
|
-
context 'when the group has no members' do
|
42
|
-
it 'returns an empty Set' do
|
43
|
-
group = Group.new('organics')
|
44
|
-
group.members.must_be_empty
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when the group has members' do
|
49
|
-
it 'returns a set of members' do
|
50
|
-
group = Group.new('organics', 'nitrogen', 'carbon')
|
51
|
-
group.members.wont_be_empty
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe '#name' do
|
57
|
-
it 'returns the specified name for the group' do
|
58
|
-
Group.new('organics').name.must_equal('organics')
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe '#remove' do
|
63
|
-
it 'returns a Group' do
|
64
|
-
group = Group.new('organics')
|
65
|
-
group.members.must_be_empty
|
66
|
-
group.remove('nitrogen').must_be_instance_of(Group)
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'when the member exists' do
|
70
|
-
it 'removes the member and returns a new Group' do
|
71
|
-
group = Group.new('organics', 'nitrogen', 'carbon')
|
72
|
-
new_group = group.remove('nitrogen')
|
73
|
-
new_group.members.wont_include('nitrogen')
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
context 'when the member does not exist' do
|
78
|
-
it 'returns a new Group' do
|
79
|
-
group = Group.new('organics', 'nitrogen', 'carbon')
|
80
|
-
new_group = group.remove('oxygen')
|
81
|
-
new_group.members.must_equal(['nitrogen', 'carbon'])
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe '#reset' do
|
87
|
-
it { return_type_for(described.reset, Group) }
|
88
|
-
|
89
|
-
it 'returns a Group with no members' do
|
90
|
-
group = Group.new('organics', 'nitrogen', 'carbon')
|
91
|
-
new_group = group.reset
|
92
|
-
new_group.members.must_be_empty
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
end # Group
|
97
|
-
|
98
|
-
end # Vedeu
|