vigilem-evdev 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/ext/Rakefile +31 -0
  4. data/ext/rake_helper.rb +10 -0
  5. data/lib/vigilem/_evdev.rb +24 -0
  6. data/lib/vigilem/evdev.rb +14 -0
  7. data/lib/vigilem/evdev/at_exit.rb +8 -0
  8. data/lib/vigilem/evdev/context_filter.rb +92 -0
  9. data/lib/vigilem/evdev/demultiplexer.rb +26 -0
  10. data/lib/vigilem/evdev/device.rb +182 -0
  11. data/lib/vigilem/evdev/device_capabilities.rb +53 -0
  12. data/lib/vigilem/evdev/dom.rb +8 -0
  13. data/lib/vigilem/evdev/dom/adapter.rb +87 -0
  14. data/lib/vigilem/evdev/dom/code_values_tables.rb +172 -0
  15. data/lib/vigilem/evdev/dom/input_event_converter.rb +329 -0
  16. data/lib/vigilem/evdev/dom/input_event_utils.rb +48 -0
  17. data/lib/vigilem/evdev/dom/key_values_tables.rb +248 -0
  18. data/lib/vigilem/evdev/dom/kp_table.rb +52 -0
  19. data/lib/vigilem/evdev/focus_context_filter.rb +124 -0
  20. data/lib/vigilem/evdev/input_system_handler.rb +69 -0
  21. data/lib/vigilem/evdev/key_map_cache.rb +64 -0
  22. data/lib/vigilem/evdev/multiplexer.rb +73 -0
  23. data/lib/vigilem/evdev/system.rb +17 -0
  24. data/lib/vigilem/evdev/system/input.rb +1053 -0
  25. data/lib/vigilem/evdev/system/input/event.rb +4 -0
  26. data/lib/vigilem/evdev/system/input/input_event.rb +33 -0
  27. data/lib/vigilem/evdev/system/int.rb +9 -0
  28. data/lib/vigilem/evdev/system/ioctl.rb +143 -0
  29. data/lib/vigilem/evdev/system/keymap_loaders.rb +89 -0
  30. data/lib/vigilem/evdev/system/keymap_loaders/dumpkeys_loader.rb +98 -0
  31. data/lib/vigilem/evdev/system/keymap_loaders/kmap_loader.rb +74 -0
  32. data/lib/vigilem/evdev/system/posix_types.rb +5 -0
  33. data/lib/vigilem/evdev/system/time.rb +21 -0
  34. data/lib/vigilem/evdev/transfer_agent.rb +40 -0
  35. data/lib/vigilem/evdev/version.rb +5 -0
  36. data/lib/vigilem/evdev/vty_context_filter.rb +216 -0
  37. data/spec/after_each_example_group.rb +29 -0
  38. data/spec/delete_test_cache_after_group.rb +26 -0
  39. data/spec/spec_helper.rb +30 -0
  40. data/spec/vigilem/_evdev_spec.rb +11 -0
  41. data/spec/vigilem/evdev/context_filter_spec.rb +114 -0
  42. data/spec/vigilem/evdev/demultiplexer_spec.rb +44 -0
  43. data/spec/vigilem/evdev/device_capabilities_spec.rb +0 -0
  44. data/spec/vigilem/evdev/device_spec.rb +97 -0
  45. data/spec/vigilem/evdev/dom/adapter_spec.rb +5 -0
  46. data/spec/vigilem/evdev/dom/input_event_converter_spec.rb +253 -0
  47. data/spec/vigilem/evdev/dom/input_event_utils_spec.rb +23 -0
  48. data/spec/vigilem/evdev/focus_context_filter_spec.rb +112 -0
  49. data/spec/vigilem/evdev/input_system_handler_spec.rb +146 -0
  50. data/spec/vigilem/evdev/key_map_cache_spec.rb +65 -0
  51. data/spec/vigilem/evdev/multiplexer_spec.rb +55 -0
  52. data/spec/vigilem/evdev/system/input/input_event_spec.rb +33 -0
  53. data/spec/vigilem/evdev/system/input_spec.rb +274 -0
  54. data/spec/vigilem/evdev/system/int_spec.rb +30 -0
  55. data/spec/vigilem/evdev/system/ioctl_spec.rb +206 -0
  56. data/spec/vigilem/evdev/system/keymap_loaders/dumpkeys_loader_spec.rb +5 -0
  57. data/spec/vigilem/evdev/system/keymap_loaders/kmap_loader_spec.rb +24 -0
  58. data/spec/vigilem/evdev/system/keymap_loaders_spec.rb +22 -0
  59. data/spec/vigilem/evdev/system/posix_types_spec.rb +15 -0
  60. data/spec/vigilem/evdev/system/time_spec.rb +18 -0
  61. data/spec/vigilem/evdev/transfer_agent_spec.rb +57 -0
  62. data/spec/vigilem/evdev/vty_context_filter_spec.rb +282 -0
  63. metadata +286 -0
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/evdev/input_system_handler'
4
+
5
+ require 'timeout'
6
+
7
+ # @todo allow(inst).to receive(:filtered?) { true }
8
+ describe Vigilem::Evdev::InputSystemHandler, :clean_up_test_cache do
9
+
10
+ after(:each) do
11
+ [(v = ::Vigilem)::Evdev::TransferAgent, v::Evdev::Demultiplexer,
12
+ described_class, v::Evdev::Multiplexer].each do |klass|
13
+ (klass.instance_variables).each {|ivar| klass.send(:remove_instance_variable, ivar) }
14
+ end
15
+ end
16
+
17
+ let(:pipes1) { IO.pipe }
18
+
19
+ let(:pipes2) { IO.pipe }
20
+
21
+ let(:pipes3) { IO.pipe }
22
+
23
+ let(:input_event) { Vigilem::Evdev::System::Input::InputEvent }
24
+
25
+ let(:read_pipes) { [pipes1, pipes2, pipes3].map(&:first) }
26
+
27
+ let(:write_pipes) { [pipes1, pipes2, pipes3].map(&:last) }
28
+
29
+ describe '#initialize' do
30
+ it 'sets up the transfer_agent' do
31
+ sys = described_class.new([])
32
+ expect(sys.instance_variable_get(:@transfer_agent)).not_to be_nil
33
+ end
34
+ end
35
+
36
+ context 'post init' do
37
+
38
+ subject do
39
+ inst = described_class.new(*read_pipes)
40
+ inst.context_filters.replace([])
41
+ inst
42
+ end
43
+
44
+ let(:written_events) { [input_event[[7, 8], 1, 30, 1], input_event[[12, 13], 1, 30, 0]].sort {|a, b| a.time.to_f <=> b.time.to_f} }
45
+
46
+ let(:one) { written_events[0] }
47
+
48
+ let(:one_bytes) { one.bytes }
49
+
50
+ let(:two) { written_events[1] }
51
+
52
+ let(:two_bytes) { two.bytes }
53
+
54
+ describe '#read_many_nonblock' do
55
+
56
+ it 'reads messages without blocking from the source' do
57
+ expect do
58
+ Timeout.timeout(5) do
59
+ subject.read_many_nonblock
60
+ end
61
+ end.not_to raise_error
62
+ end
63
+
64
+ it 'defaults to one message' do
65
+ write_pipes[0] << one_bytes
66
+ write_pipes[2] << two_bytes
67
+ expect(subject.read_many_nonblock.map(&:bytes).join).to eql(one_bytes)
68
+ end
69
+
70
+ it %q<will read as many of the `max_number_of_events' as available> do
71
+ write_pipes[0] << one_bytes
72
+ write_pipes[2] << two_bytes
73
+ expect(subject.read_many_nonblock(4).map(&:bytes)).to eql([one_bytes, two_bytes])
74
+ end
75
+
76
+ end
77
+
78
+ describe '#read_one_nonblock' do
79
+ it 'attempts to reads one message without blocking from the source' do
80
+ expect do
81
+ Timeout.timeout(7) do
82
+ subject.read_one_nonblock
83
+ end
84
+ end.not_to raise_error
85
+ end
86
+
87
+ it 'reads one message' do
88
+ write_pipes[0] << one_bytes
89
+ write_pipes[2] << two_bytes
90
+ expect(subject.read_one_nonblock.bytes).to eql(one_bytes)
91
+ end
92
+
93
+ it %q<will read one of the available messages> do
94
+ write_pipes[0] << one_bytes
95
+ write_pipes[2] << two_bytes
96
+ expect(subject.read_one_nonblock.bytes).to eql(one_bytes)
97
+ end
98
+ end
99
+
100
+ describe '#read_many' do
101
+
102
+ it 'reads messages blocking if source is empty' do
103
+ expect do
104
+ Timeout.timeout(3) do
105
+ subject.read_many
106
+ end
107
+ end.to raise_error(Timeout::Error)
108
+ end
109
+
110
+ it 'defaults to one message' do
111
+ write_pipes[0] << one_bytes
112
+ write_pipes[2] << two_bytes
113
+ expect(Timeout.timeout(6) { subject.read_many.first.bytes }).to eql(one_bytes)
114
+ end
115
+
116
+ it %q<will read the number of messages equal to parameter passed in> do
117
+ write_pipes[0] << one_bytes
118
+ write_pipes[2] << two_bytes
119
+ expect(Timeout.timeout(6) { subject.read_many(2).map(&:bytes) }).to eql([one_bytes, two_bytes])
120
+ end
121
+ end
122
+
123
+ describe '#read_one' do
124
+ it 'reads a single message, blocking if source is empty' do
125
+ expect do
126
+ Timeout.timeout(6) do
127
+ subject.read_one
128
+ end
129
+ end.to raise_error(Timeout::Error)
130
+ end
131
+
132
+ it 'defaults to one message' do
133
+ write_pipes[0] << one_bytes
134
+ write_pipes[2] << two_bytes
135
+ expect(Timeout.timeout(6) { subject.read_one.bytes }).to eql(one_bytes)
136
+ end
137
+
138
+ it %q<will read the number of messages equal to parameter passed in> do
139
+ write_pipes[0] << one_bytes
140
+ write_pipes[2] << two_bytes
141
+ expect(Timeout.timeout(6) { subject.read_one.bytes }).to eql(one_bytes)
142
+ end
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/evdev/key_map_cache'
4
+
5
+ describe Vigilem::Evdev::KeyMapCache do
6
+
7
+ context 'unaugmented filename' do
8
+
9
+ describe '::default_filename' do
10
+ it %q<returns the default filename> do
11
+ expect(described_class.default_filename).to eql('key_map_cache')
12
+ end
13
+ end
14
+
15
+ describe '::default_path' do
16
+
17
+ let(:filepath) { File.join(Bundler.root, 'data', described_class.default_filename) }
18
+
19
+ it %q<returns the default path> do
20
+ expect(described_class.default_path).to eql(filepath)
21
+ end
22
+ end
23
+ end
24
+
25
+ context 'augmented filename for test', :clean_up_test_cache do
26
+
27
+ let(:test_filename) { 'key_map_cache_test' }
28
+
29
+ let(:test_cache_path) { File.join(Bundler.root, 'data', test_filename) }
30
+
31
+ describe '::exists?' do
32
+
33
+ it %q<returns false when the file doesn't exist> do
34
+ expect(described_class.exists?).to eql(false)
35
+ end
36
+
37
+ context 'testfile block' do
38
+ it %q<returns true when the file does exist> do
39
+ FileUtils.touch(test_cache_path)
40
+ expect(described_class.exists?).to eql(true)
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ let(:key_map) { Vigilem::Support::KeyMap.new("keycode1"=>"Escape") }
47
+
48
+ describe '::dump' do
49
+
50
+ it 'marshals the key_map and stores it in the #default_path' do
51
+ described_class.dump(key_map, test_cache_path)
52
+ expect(File.binread(test_cache_path)).to eql(Marshal.dump(key_map))
53
+ end
54
+ end
55
+
56
+ describe '::restore' do
57
+
58
+ it 'marshals the key_map and stores it in the #default_path' do
59
+ described_class.dump(key_map, test_cache_path)
60
+ expect(described_class.restore(test_cache_path)).to eql(key_map)
61
+ end
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,55 @@
1
+ require 'vigilem/evdev/multiplexer'
2
+
3
+ describe Vigilem::Evdev::Multiplexer do
4
+
5
+ let(:input_event) { Vigilem::Evdev::System::Input::InputEvent }
6
+
7
+ let(:out) { [] }
8
+
9
+ let(:pipes1) { IO.pipe }
10
+
11
+ let(:pipes2) { IO.pipe }
12
+
13
+ let(:pipes3) { IO.pipe }
14
+
15
+ subject { described_class.acquire([pipes1, pipes2, pipes3].map(&:first)) }
16
+
17
+ describe '#sweep' do
18
+ it %q<checks the io's and returns sorted InputEvents> do
19
+ written_events = [input_event[[7, 8], 9, 10, 11], input_event[[12, 13], 14, 15, 16]]
20
+ pipes1.last << written_events[0].bytes
21
+ pipes2.last << written_events[1].bytes
22
+ expect(subject.sweep(1).map(&:bytes)).to eql(written_events.sort {|a,b| a.time.to_f <=> b.time.to_f }.map(&:bytes))
23
+ end
24
+ end
25
+
26
+ describe '::acquire' do
27
+
28
+ let(:singleton_var_name) { :@multiplexer }
29
+
30
+ context 'none exists' do
31
+ before(:all) { described_class.send(:remove_instance_variable, :@multiplexer) }
32
+
33
+ it 'the class instance variable will be nil' do
34
+ expect(described_class.instance_variable_get(singleton_var_name)).to be_nil
35
+ end
36
+
37
+ it 'creates a new one' do
38
+ expect(described_class.acquire()).to be_a described_class
39
+ end
40
+
41
+ it 'the class instance variable will be set' do
42
+ expect(described_class.instance_variable_get(singleton_var_name)).not_to be_nil
43
+ end
44
+ end
45
+
46
+ context 'one exists' do
47
+
48
+ it 'grabs the existing one' do
49
+ described_class.acquire
50
+ expect(described_class.acquire()).to eql(described_class.instance_variable_get(singleton_var_name))
51
+ end
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/evdev/system/input/input_event'
4
+
5
+ describe Vigilem::Evdev::System::Input do
6
+ describe described_class::InputEvent do
7
+ describe 'structure' do
8
+ it 'will respond_to #time' do
9
+ expect(subject).to respond_to(:time)
10
+ end
11
+
12
+ it 'will respond_to #type' do
13
+ expect(subject).to respond_to(:type)
14
+ end
15
+
16
+ it 'will respond_to #code' do
17
+ expect(subject).to respond_to(:code)
18
+ end
19
+
20
+ it 'will respond_to #value' do
21
+ expect(subject).to respond_to(:value)
22
+ end
23
+
24
+ end
25
+
26
+ describe '#time' do
27
+ it 'will return with a Timeval' do
28
+ expect(subject.time).to be_a Vigilem::Evdev::Time::Timeval
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,274 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/evdev/system/input'
4
+
5
+ describe Vigilem::Evdev::System::Input do
6
+
7
+ class EVIOC
8
+ inline do |builder|
9
+ builder.include '<stdio.h>'
10
+ builder.include '<sys/ioctl.h>'
11
+ builder.include '<linux/input.h>'
12
+ builder.include '<fcntl.h>'
13
+ builder.include '<stddef.h>'
14
+ %w(EVIOCGVERSION EVIOCGID EVIOCGREP EVIOCSREP EVIOCGKEYCODE EVIOCGKEYCODE_V2
15
+ EVIOCSKEYCODE EVIOCSKEYCODE_V2
16
+ EVIOCSFF EVIOCRMFF EVIOCGEFFECTS EVIOCGRAB).map do |mac|
17
+ builder.c "
18
+ long #{mac.gsub(/EVIOC/, '').downcase}() {
19
+ return #{mac};
20
+ }
21
+ "
22
+ end
23
+ %w(EVIOCGNAME EVIOCGPHYS EVIOCGUNIQ EVIOCGPROP EVIOCGKEY EVIOCGLED
24
+ EVIOCGSND EVIOCGSW).map do |mac|
25
+ builder.c "
26
+ long #{mac.gsub(/EVIOC/, '').downcase}(int len) {
27
+ return #{mac}(len);
28
+ }
29
+ "
30
+ end
31
+ if $major >= 3 and $minor >= 4
32
+ builder.c "
33
+ long gmtslots(int len) {
34
+ return EVIOCGMTSLOTS(len);
35
+ }
36
+ "
37
+ builder.c "
38
+ long sclockid() {
39
+ return EVIOCSCLOCKID;
40
+ }
41
+ "
42
+ $gmtslots_sclockid = true
43
+ else
44
+ warn 'EVIOCGMTSLOTS and EVIOCSCLOCKID untestable'
45
+ $gmtslots_sclockid = false
46
+ end
47
+
48
+ if $major >= 3 and $minor >= 12
49
+ builder.c "
50
+ long _revoke() {
51
+ return EVIOCREVOKE;
52
+ }
53
+ "
54
+ $revoke = true
55
+ else
56
+ warn 'EVIOCREVOKE untestable'
57
+ $revoke = false
58
+ end
59
+
60
+ builder.c "
61
+ long gbit(int evtype, int len) {
62
+ return EVIOCGBIT(evtype, len);
63
+ }
64
+ "
65
+ builder.c "
66
+ long gabs(int abs) {
67
+ return EVIOCGABS(abs);
68
+ }
69
+ "
70
+ builder.c "
71
+ long sabs(int abs) {
72
+ return EVIOCSABS(abs);
73
+ }
74
+ "
75
+
76
+ builder.c '
77
+ long size_of_input_keymap_entry() {
78
+ return sizeof(struct input_keymap_entry);
79
+ }
80
+ '
81
+
82
+ builder.c '
83
+ long size_of_ff_effect() {
84
+ return sizeof(struct ff_effect);
85
+ }
86
+ '
87
+
88
+ end
89
+ end
90
+
91
+ let(:evioc) { EVIOC.new }
92
+
93
+ describe 'input_keymap_entry' do
94
+ it 'sizeof(input_keymap_entry) will eql it\'s linux counterpart' do
95
+ expect(Vigilem::Support::Sys.sizeof(described_class.input_keymap_entry)).to eql(evioc.size_of_input_keymap_entry)
96
+ end
97
+ end
98
+
99
+ describe 'ff_effect' do
100
+ it 'sizeof(ff_effect) will eql it\'s linux counterpart' do
101
+ expect(described_class::FFEffect.size).to eql(evioc.size_of_ff_effect)
102
+ end
103
+ end
104
+
105
+ describe '::EVIOCGVERSION' do
106
+ it 'will not be zero' do
107
+ expect(described_class.EVIOCGVERSION).not_to eql(0)
108
+ end
109
+
110
+ it 'will equal the macro specified in input.h' do
111
+ expect(described_class.EVIOCGVERSION).to eql(evioc.gversion)
112
+ end
113
+ end
114
+
115
+ describe '::EVIOCGID' do
116
+ it 'will equal the macro specified in input.h' do
117
+ expect(described_class.EVIOCGID).to eql(evioc.gid)
118
+ end
119
+ end
120
+
121
+ describe '::EVIOCGREP' do
122
+ it 'will equal the macro specified in input.h' do
123
+ expect(described_class.EVIOCGREP).to eql(evioc.grep)
124
+ end
125
+ end
126
+
127
+ describe '::EVIOCSREP' do
128
+ it 'will equal the macro specified in input.h' do
129
+ expect(described_class.EVIOCSREP).to eql(evioc.srep)
130
+ end
131
+ end
132
+
133
+ if $gmtslots_sclockid
134
+ describe '::EVIOCGMTSLOTS' do
135
+ it 'will equal the macro specified in input.h' do
136
+ expect(described_class.EVIOCGMTSLOTS(3)).to eql(evioc.gmtslots(3))
137
+ end
138
+ end
139
+ end
140
+
141
+ describe '::EVIOCGKEYCODE' do
142
+ it 'will equal the macro specified in input.h' do
143
+ expect(described_class.EVIOCGKEYCODE).to eql(evioc.gkeycode)
144
+ end
145
+ end
146
+
147
+ let(:ioc_r) { described_class::_IOC_READ }
148
+
149
+ describe '::EVIOCGKEYCODE_V2' do
150
+ it 'will equal the macro specified in input.h' do
151
+ expect(described_class.EVIOCGKEYCODE_V2).to eql(evioc.gkeycode_v2)
152
+ end
153
+ end
154
+
155
+ describe '::EVIOCSKEYCODE' do
156
+ it 'will equal the macro specified in input.h' do
157
+ expect(described_class.EVIOCSKEYCODE).to eql(evioc.skeycode)
158
+ end
159
+ end
160
+
161
+ describe '::EVIOCSKEYCODE_V2' do
162
+ it 'will equal the macro specified in input.h' do
163
+ expect(described_class.EVIOCSKEYCODE_V2).to eql(evioc.skeycode_v2)
164
+ end
165
+ end
166
+
167
+ describe '::EVIOCGNAME' do
168
+ it 'will equal the macro specified in input.h' do
169
+ expect(described_class.EVIOCGNAME(255)).to eql(evioc.gname(255))
170
+ end
171
+ end
172
+
173
+ describe '::EVIOCGPHYS' do
174
+ it 'will equal the macro specified in input.h' do
175
+ expect(described_class.EVIOCGPHYS(255)).to eql(evioc.gphys(255))
176
+ end
177
+ end
178
+
179
+ describe '::EVIOCGUNIQ' do
180
+ it 'will equal the macro specified in input.h' do
181
+ expect(described_class.EVIOCGUNIQ(255)).to eql(evioc.guniq(255))
182
+ end
183
+ end
184
+
185
+ describe '::EVIOCGPROP' do
186
+ it 'will equal the macro specified in input.h' do
187
+ expect(described_class.EVIOCGPROP(255)).to eql(evioc.gprop(255))
188
+ end
189
+ end
190
+
191
+ describe '::EVIOCGKEY' do
192
+ it 'will equal the macro specified in input.h' do
193
+ expect(described_class.EVIOCGKEY(255)).to eql(evioc.gkey(255))
194
+ end
195
+ end
196
+
197
+ describe '::EVIOCGLED' do
198
+ it 'will equal the macro specified in input.h' do
199
+ expect(described_class.EVIOCGLED(255)).to eql(evioc.gled(255))
200
+ end
201
+ end
202
+
203
+ describe '::EVIOCGSND' do
204
+ it 'will equal the macro specified in input.h' do
205
+ expect(described_class.EVIOCGSND(255)).to eql(evioc.gsnd(255))
206
+ end
207
+ end
208
+
209
+ describe '::EVIOCGSW' do
210
+ it 'will equal the macro specified in input.h' do
211
+ expect(described_class::EVIOCGSW(255)).to eql(evioc.gsw(255))
212
+ end
213
+ end
214
+ =begin # @todo
215
+ describe '::EVIOCGBIT' do
216
+ it 'will equal the macro specified in input.h' do
217
+ expect(described_class::EVIOCGBIT(evtype, len)).to eql(evioc.gbit(evtype, len))
218
+ end
219
+ end
220
+
221
+ describe '::EVIOCGABS' do
222
+ it 'will equal the macro specified in input.h' do
223
+ expect(described_class::EVIOCGABS(abs)).to eql(evioc.gabs(abs))
224
+ end
225
+ end
226
+
227
+ describe '::EVIOCSABS' do
228
+ it 'will equal the macro specified in input.h' do
229
+ expect(described_class::EVIOCSABS(abs)).to eql(evioc.sabs(abs))
230
+ end
231
+ end
232
+ =end
233
+ describe '::EVIOCSFF' do
234
+ it 'will equal the macro specified in input.h' do
235
+ expect(described_class.EVIOCSFF).to eql(evioc.sff)
236
+ end
237
+ end
238
+
239
+ describe '::EVIOCRMFF' do
240
+ it 'will equal the macro specified in input.h' do
241
+ expect(described_class.EVIOCRMFF()).to eql(evioc.rmff)
242
+ end
243
+ end
244
+
245
+ describe '::EVIOCGEFFECTS' do
246
+ it 'will equal the macro specified in input.h' do
247
+ expect(described_class.EVIOCGEFFECTS()).to eql(evioc.geffects)
248
+ end
249
+ end
250
+
251
+ describe '::EVIOCGRAB' do
252
+ it 'will equal the macro specified in input.h' do
253
+ expect(described_class.EVIOCGRAB()).to eql(evioc.grab)
254
+ end
255
+ end
256
+
257
+ # @todo switch to optinos flag >=3.4
258
+ if $revoke
259
+ describe '::EVIOCREVOKE', '>=v4.3' do
260
+ it 'will equal the macro specified in input.h' do
261
+ expect(described_class.EVIOCREVOKE()).to eql(evioc._revoke)
262
+ end
263
+ end
264
+ end
265
+
266
+ if $gmtslots_sclockid
267
+ describe '::EVIOCSCLOCKID' do
268
+ it 'will equal the macro specified in input.h' do
269
+ expect(described_class.EVIOCSCLOCKID()).to eql(evioc.sclockid)
270
+ end
271
+ end
272
+ end
273
+
274
+ end