fusuma 2.4.1 → 2.5.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -0
  3. data/fusuma.gemspec +17 -18
  4. data/lib/fusuma/config/index.rb +17 -17
  5. data/lib/fusuma/config/searcher.rb +1 -1
  6. data/lib/fusuma/config/yaml_duplication_checker.rb +7 -7
  7. data/lib/fusuma/config.rb +17 -13
  8. data/lib/fusuma/device.rb +12 -12
  9. data/lib/fusuma/environment.rb +10 -10
  10. data/lib/fusuma/hash_support.rb +1 -1
  11. data/lib/fusuma/libinput_command.rb +18 -19
  12. data/lib/fusuma/multi_logger.rb +4 -4
  13. data/lib/fusuma/plugin/base.rb +6 -6
  14. data/lib/fusuma/plugin/buffers/buffer.rb +5 -4
  15. data/lib/fusuma/plugin/buffers/gesture_buffer.rb +6 -6
  16. data/lib/fusuma/plugin/buffers/timer_buffer.rb +2 -2
  17. data/lib/fusuma/plugin/detectors/detector.rb +5 -5
  18. data/lib/fusuma/plugin/detectors/hold_detector.rb +29 -29
  19. data/lib/fusuma/plugin/detectors/pinch_detector.rb +47 -47
  20. data/lib/fusuma/plugin/detectors/rotate_detector.rb +40 -40
  21. data/lib/fusuma/plugin/detectors/swipe_detector.rb +43 -43
  22. data/lib/fusuma/plugin/events/event.rb +11 -11
  23. data/lib/fusuma/plugin/events/records/gesture_record.rb +5 -5
  24. data/lib/fusuma/plugin/events/records/index_record.rb +5 -5
  25. data/lib/fusuma/plugin/events/records/record.rb +2 -2
  26. data/lib/fusuma/plugin/events/records/text_record.rb +1 -1
  27. data/lib/fusuma/plugin/executors/command_executor.rb +4 -4
  28. data/lib/fusuma/plugin/executors/executor.rb +3 -3
  29. data/lib/fusuma/plugin/filters/filter.rb +3 -3
  30. data/lib/fusuma/plugin/filters/libinput_device_filter.rb +12 -12
  31. data/lib/fusuma/plugin/inputs/input.rb +8 -8
  32. data/lib/fusuma/plugin/inputs/libinput_command_input.rb +13 -13
  33. data/lib/fusuma/plugin/inputs/timer_input.rb +3 -3
  34. data/lib/fusuma/plugin/manager.rb +27 -21
  35. data/lib/fusuma/plugin/parsers/libinput_gesture_parser.rb +10 -10
  36. data/lib/fusuma/plugin/parsers/parser.rb +3 -3
  37. data/lib/fusuma/string_support.rb +3 -3
  38. data/lib/fusuma/version.rb +1 -1
  39. data/lib/fusuma.rb +10 -10
  40. metadata +3 -79
  41. data/spec/helpers/config_helper.rb +0 -20
  42. data/spec/lib/config/searcher_spec.rb +0 -179
  43. data/spec/lib/config_spec.rb +0 -104
  44. data/spec/lib/custom_process_spec.rb +0 -29
  45. data/spec/lib/device_spec.rb +0 -96
  46. data/spec/lib/dummy_config.yml +0 -31
  47. data/spec/lib/fusuma_spec.rb +0 -103
  48. data/spec/lib/libinput-list-devices_iberianpig-XPS-9360.txt +0 -181
  49. data/spec/lib/libinput-list-devices_magic_trackpad.txt +0 -51
  50. data/spec/lib/libinput-list-devices_razer_razer_blade.txt +0 -252
  51. data/spec/lib/libinput-list-devices_thejinx0r.txt +0 -361
  52. data/spec/lib/libinput-list-devices_unavailable.txt +0 -36
  53. data/spec/lib/libinput_command_spec.rb +0 -164
  54. data/spec/lib/plugin/base_spec.rb +0 -74
  55. data/spec/lib/plugin/buffers/buffer_spec.rb +0 -80
  56. data/spec/lib/plugin/buffers/dummy_buffer.rb +0 -20
  57. data/spec/lib/plugin/buffers/gesture_buffer_spec.rb +0 -192
  58. data/spec/lib/plugin/detectors/detector_spec.rb +0 -43
  59. data/spec/lib/plugin/detectors/dummy_detector.rb +0 -24
  60. data/spec/lib/plugin/detectors/hold_detector_spec.rb +0 -145
  61. data/spec/lib/plugin/detectors/pinch_detector_spec.rb +0 -119
  62. data/spec/lib/plugin/detectors/rotate_detector_spec.rb +0 -125
  63. data/spec/lib/plugin/detectors/swipe_detector_spec.rb +0 -118
  64. data/spec/lib/plugin/events/event_spec.rb +0 -30
  65. data/spec/lib/plugin/events/records/gesture_record_spec.rb +0 -22
  66. data/spec/lib/plugin/events/records/record_spec.rb +0 -31
  67. data/spec/lib/plugin/events/records/text_record_spec.rb +0 -26
  68. data/spec/lib/plugin/executors/command_executor_spec.rb +0 -57
  69. data/spec/lib/plugin/executors/executor_spec.rb +0 -164
  70. data/spec/lib/plugin/filters/filter_spec.rb +0 -92
  71. data/spec/lib/plugin/filters/libinput_filter_spec.rb +0 -120
  72. data/spec/lib/plugin/inputs/input_spec.rb +0 -70
  73. data/spec/lib/plugin/inputs/libinput_command_input_spec.rb +0 -121
  74. data/spec/lib/plugin/inputs/timer_input_spec.rb +0 -40
  75. data/spec/lib/plugin/manager_spec.rb +0 -27
  76. data/spec/lib/plugin/parsers/libinput_gesture_parser_spec.rb +0 -76
  77. data/spec/lib/plugin/parsers/parser_spec.rb +0 -45
  78. data/spec/spec_helper.rb +0 -23
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require './lib/fusuma/plugin/buffers/buffer'
4
-
5
- module Fusuma
6
- module Plugin
7
- module Buffers
8
- class DummyBuffer < Buffer
9
- DEFAULT_SOURCE = 'dummy'
10
-
11
- def config_param_types
12
- {
13
- source: String,
14
- dummy: String
15
- }
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,192 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'rspec-parameterized'
5
-
6
- require './lib/fusuma/plugin/events/event'
7
- require './lib/fusuma/plugin/events/records/gesture_record'
8
- require './lib/fusuma/plugin/buffers/gesture_buffer'
9
-
10
- module Fusuma
11
- module Plugin
12
- module Buffers
13
- RSpec.describe GestureBuffer do
14
- before do
15
- @buffer = GestureBuffer.new
16
- delta = Events::Records::GestureRecord::Delta.new(-1, 0, 0, 0, 0, 0)
17
- @event_generator = lambda { |time = nil, status = 'update'|
18
- Events::Event.new(time: time,
19
- tag: 'libinput_gesture_parser',
20
- record: Events::Records::GestureRecord.new(
21
- status: status,
22
- gesture: 'SWIPE',
23
- finger: 3,
24
- delta: delta
25
- ))
26
- }
27
- end
28
-
29
- describe '#type' do
30
- it { expect(@buffer.type).to eq 'gesture' }
31
- end
32
-
33
- describe '#buffer' do
34
- it 'should buffer gesture event' do
35
- event = @event_generator.call
36
- @buffer.buffer(event)
37
- expect(@buffer.events).to eq [event]
38
- end
39
-
40
- it 'should NOT buffer other event' do
41
- event = Events::Event.new(tag: 'SHOULD NOT BUFFER', record: 'dummy record')
42
- @buffer.buffer(event)
43
- expect(@buffer.events).to eq []
44
- end
45
-
46
- it 'should buffer begin/end' do
47
- begin_event = @event_generator.call(nil, 'begin')
48
- @buffer.buffer(begin_event)
49
- expect(@buffer.events).to eq [begin_event]
50
- end_event = @event_generator.call(nil, 'end')
51
- @buffer.buffer(end_event)
52
- expect(@buffer.events).to eq [begin_event, end_event]
53
- end
54
- end
55
-
56
- describe '#clear_expired' do
57
- context 'default' do
58
- before do
59
- @time = Time.now
60
- event1 = @event_generator.call(@time)
61
- @buffer.buffer(event1)
62
- @event2 = @event_generator.call(@time + 100)
63
- @event3 = @event_generator.call(@time + 100)
64
- @buffer.buffer(@event2)
65
- @buffer.buffer(@event3)
66
- end
67
- it 'should keep only events generated within 30 seconds' do
68
- @buffer.clear_expired(current_time: @time + 100.1)
69
- expect(@buffer.events).to eq [@event2, @event3]
70
- end
71
- context 'with cancelled or ended' do
72
- where(:last_state, :want) do
73
- [
74
- ['end', []],
75
- ['cancelled', []]
76
- ]
77
- end
78
-
79
- with_them do
80
- it 'should clear events' do
81
- event4 = @event_generator.call(@time + 100, last_state)
82
- @buffer.buffer(event4)
83
-
84
- @buffer.clear_expired(current_time: @time + 100.1)
85
- expect(@buffer.events).to eq want
86
- end
87
- end
88
- end
89
- end
90
- context 'change seconds to keep' do
91
- around do |example|
92
- ConfigHelper.load_config_yml = <<~CONFIG
93
- plugin:
94
- buffers:
95
- gesture_buffer:
96
- seconds_to_keep: 0.3
97
- CONFIG
98
-
99
- example.run
100
-
101
- Config.custom_path = nil
102
- end
103
-
104
- it 'should keep only events generated within 0.3 seconds' do
105
- expect(@buffer.config_params).to eq(seconds_to_keep: 0.3)
106
- time = Time.now
107
- event1 = @event_generator.call(time)
108
- @buffer.buffer(event1)
109
- event2 = @event_generator.call(time + 0.1)
110
- @buffer.buffer(event2)
111
- event3 = @event_generator.call(time + 0.2)
112
- @buffer.buffer(event3)
113
- @buffer.clear_expired(current_time: time + 0.29)
114
- expect(@buffer.events).to eq [event1, event2, event3]
115
-
116
- @buffer.clear_expired(current_time: time + 0.3)
117
- expect(@buffer.events).to eq [event2, event3]
118
- end
119
- end
120
- end
121
-
122
- describe '#source' do
123
- it { expect(@buffer.source).to eq GestureBuffer::DEFAULT_SOURCE }
124
-
125
- context 'with config' do
126
- around do |example|
127
- @source = 'custom_event'
128
-
129
- ConfigHelper.load_config_yml = <<~CONFIG
130
- plugin:
131
- buffers:
132
- gesture_buffer:
133
- source: #{@source}
134
- CONFIG
135
-
136
- example.run
137
-
138
- Config.custom_path = nil
139
- end
140
-
141
- it { expect(@buffer.source).to eq @source }
142
- end
143
- end
144
-
145
- describe '#sum_attrs' do
146
- it 'should calculate the sum of each attribute'
147
- end
148
-
149
- describe '#avg_attrs' do
150
- it 'should calculate the average of each attribute'
151
- end
152
-
153
- describe '#finger' do
154
- it 'should return number of fingers in gestures'
155
- end
156
-
157
- describe '#gesture' do
158
- it 'should return string of gesture type'
159
- end
160
-
161
- describe '#empty?' do
162
- context 'no gestures in buffer' do
163
- before { @buffer.clear }
164
- it { expect(@buffer.empty?).to be true }
165
- end
166
-
167
- context 'buffered some gestures' do
168
- before { @buffer.buffer(@event_generator.call) }
169
- it { expect(@buffer.empty?).to be false }
170
- end
171
- end
172
-
173
- describe '#slect_by_events' do
174
- context 'without block' do
175
- it { expect(@buffer.select_by_events).to be_a Enumerator }
176
- end
177
-
178
- context 'with block' do
179
- before do
180
- @e1 = @event_generator.call(nil, 'hoge')
181
- @e2 = @event_generator.call(nil, 'hoge')
182
- @e3 = @event_generator.call(nil, 'fuga')
183
- [@e1, @e2, @e3].each { |event| @buffer.buffer(event) }
184
- end
185
- it { expect(@buffer.select_by_events { |e| e.record.status == 'hoge' }).to be_a GestureBuffer }
186
- it { expect(@buffer.select_by_events { |e| e.record.status == 'hoge' }.events).to eq [@e1, @e2] }
187
- end
188
- end
189
- end
190
- end
191
- end
192
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- require './lib/fusuma/plugin/events/event'
6
- require './lib/fusuma/plugin/detectors/detector'
7
- require './lib/fusuma/config'
8
- require_relative '../buffers/dummy_buffer'
9
- require_relative './dummy_detector'
10
-
11
- module Fusuma
12
- module Plugin
13
- module Detectors
14
- RSpec.describe DummyDetector do
15
- before do
16
- @detector = DummyDetector.new
17
- @buffer = Buffers::DummyBuffer.new
18
- end
19
-
20
- around do |example|
21
- ConfigHelper.load_config_yml = <<~CONFIG
22
- plugin:
23
- detectors:
24
- dummy_detector:
25
- dummy: dummy
26
- CONFIG
27
-
28
- example.run
29
-
30
- ConfigHelper.clear_config_yml
31
- end
32
-
33
- describe '#detect' do
34
- it { expect(@detector.detect([@buffer])).to be_a(Events::Event) }
35
- end
36
-
37
- describe '#config_params' do
38
- it { expect(@detector.config_params).to eq(dummy: 'dummy') }
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require './lib/fusuma/plugin/detectors/detector'
4
- require './lib/fusuma/plugin/buffers/buffer'
5
- require './lib/fusuma/plugin/events/records/index_record'
6
-
7
- module Fusuma
8
- module Plugin
9
- module Detectors
10
- class DummyDetector < Detector
11
- # @param buffers [Array<Buffers::Buffer>]
12
- # @return [Event]
13
- def detect(buffers)
14
- buffers.each do |buffer|
15
- next unless buffer.type == 'dummy'
16
-
17
- record = Events::Records::IndexRecord.new(index: Config::Index.new(%w[dummy index]))
18
- return create_event(record: record)
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,145 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- require './lib/fusuma/plugin/detectors/hold_detector'
6
- require './lib/fusuma/plugin/buffers/gesture_buffer'
7
- require './lib/fusuma/plugin/events/records/gesture_record'
8
- require './lib/fusuma/config'
9
-
10
- module Fusuma
11
- module Plugin
12
- module Detectors
13
- RSpec.describe HoldDetector do
14
- before do
15
- @detector = HoldDetector.new
16
- @buffer = Buffers::GestureBuffer.new
17
- @timer_buffer = Buffers::TimerBuffer.new
18
- end
19
-
20
- around do |example|
21
- ConfigHelper.load_config_yml = <<~CONFIG
22
- threshold:
23
- hold: 1
24
- CONFIG
25
-
26
- example.run
27
-
28
- Config.custom_path = nil
29
- end
30
-
31
- describe '#detect' do
32
- context 'with no hold event in buffer' do
33
- before do
34
- @buffer.clear
35
- end
36
- it { expect(@detector.detect([@buffer, @timer_buffer])).to eq nil }
37
- end
38
-
39
- context 'with only hold begin event' do
40
- before do
41
- events = create_hold_events(statuses: ['begin'])
42
- events.each { |event| @buffer.buffer(event) }
43
- end
44
- it { expect(@detector.detect([@buffer, @timer_buffer])).to be_a Events::Event }
45
- it { expect(@detector.detect([@buffer, @timer_buffer]).record).to be_a Events::Records::IndexRecord }
46
- it { expect(@detector.detect([@buffer, @timer_buffer]).record.index).to be_a Config::Index }
47
- it 'should detect 3 fingers hold' do
48
- event = @detector.detect([@buffer, @timer_buffer])
49
- expect(event.record.index.keys.map(&:symbol)).to eq([:hold, 3, :begin])
50
- end
51
- end
52
-
53
- context 'with hold events(begin,cancelled)' do
54
- before do
55
- events = create_hold_events(statuses: %w[begin cancelled])
56
- events.each { |event| @buffer.buffer(event) }
57
- end
58
- it { expect(@detector.detect([@buffer, @timer_buffer])).to be_a Events::Event }
59
- it { expect(@detector.detect([@buffer, @timer_buffer]).record).to be_a Events::Records::IndexRecord }
60
- it { expect(@detector.detect([@buffer, @timer_buffer]).record.index).to be_a Config::Index }
61
- it 'should detect 3 fingers hold canclled' do
62
- event = @detector.detect([@buffer, @timer_buffer])
63
- expect(event.record.index.keys.map(&:symbol)).to eq([:hold, 3, :cancelled])
64
- end
65
- end
66
-
67
- context 'with hold events(begin,end)' do
68
- before do
69
- events = create_hold_events(statuses: %w[begin end])
70
- events.each { |event| @buffer.buffer(event) }
71
- end
72
- it { expect(@detector.detect([@buffer, @timer_buffer])).to be_a Events::Event }
73
- it { expect(@detector.detect([@buffer, @timer_buffer]).record).to be_a Events::Records::IndexRecord }
74
- it { expect(@detector.detect([@buffer, @timer_buffer]).record.index).to be_a Config::Index }
75
- it 'should detect 3 fingers hold' do
76
- events = @detector.detect([@buffer, @timer_buffer])
77
- expect(events.record.index.keys.map(&:symbol)).to eq([:hold, 3, :end])
78
- end
79
- end
80
-
81
- context 'with hold events and timer events' do
82
- context 'with begin event and timer events' do
83
- before do
84
- events = create_hold_events(statuses: %w[begin])
85
- events.each { |event| @buffer.buffer(event) }
86
- @time = events.last.time
87
- @timer_buffer.buffer(create_timer_event(time: @time + HoldDetector::BASE_THERESHOLD))
88
- end
89
- it { expect(@detector.detect([@buffer, @timer_buffer])).to eq nil }
90
-
91
- context 'with enough holding time' do
92
- before do
93
- @timer_buffer.clear
94
- @timer_buffer.buffer(create_timer_event(time: @time + HoldDetector::BASE_THERESHOLD + 0.01))
95
- end
96
- it { expect(@detector.detect([@buffer, @timer_buffer])).to be_a Events::Event }
97
- it { expect(@detector.detect([@buffer, @timer_buffer]).record).to be_a Events::Records::IndexRecord }
98
- it { expect(@detector.detect([@buffer, @timer_buffer]).record.index).to be_a Config::Index }
99
- it 'should detect 3 fingers hold' do
100
- events = @detector.detect([@buffer, @timer_buffer])
101
- expect(events.record.index.keys.map(&:symbol)).to eq([:hold, 3])
102
- end
103
- end
104
- context 'with changing threshold' do
105
- around do |example|
106
- ConfigHelper.load_config_yml = <<~CONFIG
107
- threshold:
108
- hold: 0.9
109
- CONFIG
110
-
111
- example.run
112
-
113
- Config.custom_path = nil
114
- end
115
-
116
- it { expect(@detector.detect([@buffer, @timer_buffer])).not_to eq nil }
117
- it 'should detect 3 fingers hold' do
118
- events = @detector.detect([@buffer, @timer_buffer])
119
- expect(events.record.index.keys.map(&:symbol)).to eq([:hold, 3])
120
- end
121
- end
122
- end
123
- end
124
- end
125
-
126
- private
127
-
128
- def create_hold_events(statuses:)
129
- record_type = HoldDetector::GESTURE_RECORD_TYPE
130
- statuses.map do |status|
131
- gesture_record = Events::Records::GestureRecord.new(status: status,
132
- gesture: record_type,
133
- finger: 3,
134
- delta: nil)
135
- Events::Event.new(tag: 'libinput_gesture_parser', record: gesture_record)
136
- end
137
- end
138
-
139
- def create_timer_event(time: Time.now)
140
- Events::Event.new(time: time, tag: 'timer_input', record: Events::Records::TextRecord.new('timer'))
141
- end
142
- end
143
- end
144
- end
145
- end
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- require './lib/fusuma/plugin/detectors/pinch_detector'
6
- require './lib/fusuma/plugin/buffers/gesture_buffer'
7
- require './lib/fusuma/plugin/events/event'
8
- require './lib/fusuma/config'
9
-
10
- module Fusuma
11
- module Plugin
12
- module Detectors
13
- RSpec.describe PinchDetector do
14
- before do
15
- @detector = PinchDetector.new
16
- @buffer = Buffers::GestureBuffer.new
17
- end
18
-
19
- around do |example|
20
- ConfigHelper.load_config_yml = <<~CONFIG
21
- threshold:
22
- rotate: 1
23
- CONFIG
24
-
25
- example.run
26
-
27
- Config.custom_path = nil
28
- end
29
-
30
- describe '#detect' do
31
- context 'with no pinch event in buffer' do
32
- before do
33
- @buffer.clear
34
- end
35
- it { expect(@detector.detect([@buffer])).to eq nil }
36
- end
37
-
38
- context 'with not enough pinch events in buffer' do
39
- before do
40
- deltas = [
41
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1, 0),
42
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.1, 0)
43
- ]
44
- events = create_events(deltas: deltas)
45
-
46
- events.each { |event| @buffer.buffer(event) }
47
- end
48
- it 'should have repeat record' do
49
- expect(@detector.detect([@buffer]).record.trigger).to eq :repeat
50
- end
51
- end
52
-
53
- context 'with enough pinch IN event' do
54
- before do
55
- deltas = [
56
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.0, 0),
57
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.0, 0),
58
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 2.0, 0)
59
- ]
60
- events = create_events(deltas: deltas)
61
-
62
- events.each { |event| @buffer.buffer(event) }
63
- end
64
- it { expect(@detector.detect([@buffer])).to all be_a Events::Event }
65
- it { expect(@detector.detect([@buffer]).map(&:record)).to all be_a Events::Records::IndexRecord }
66
- it { expect(@detector.detect([@buffer]).map(&:record).map(&:index)).to all be_a Config::Index }
67
-
68
- it 'should detect 3 fingers pinch-in (oneshot/repeat)' do
69
- events = @detector.detect([@buffer])
70
- expect(events[0].record.index.keys.map(&:symbol))
71
- .to eq([:pinch, 3, :in])
72
- expect(events[1].record.index.keys.map(&:symbol))
73
- .to eq([:pinch, 3, :in, :update])
74
- end
75
- end
76
-
77
- context 'with enough pinch OUT event' do
78
- before do
79
- deltas = [
80
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.0, 0),
81
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0.6, 0),
82
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0.3, 0)
83
- ]
84
- events = create_events(deltas: deltas)
85
-
86
- events.each { |event| @buffer.buffer(event) }
87
- end
88
- it 'should detect 3 fingers pinch-out (oneshot/repeat)' do
89
- events = @detector.detect([@buffer])
90
- expect(events[0].record.index.keys.map(&:symbol))
91
- .to eq([:pinch, 3, :out])
92
- expect(events[1].record.index.keys.map(&:symbol))
93
- .to eq([:pinch, 3, :out, :update])
94
- end
95
- end
96
- end
97
-
98
- private
99
-
100
- def create_events(deltas: [])
101
- record_type = PinchDetector::GESTURE_RECORD_TYPE
102
- deltas.map do |delta|
103
- status = if deltas[0].equal? delta
104
- 'begin'
105
- else
106
- 'update'
107
- end
108
-
109
- gesture_record = Events::Records::GestureRecord.new(status: status,
110
- gesture: record_type,
111
- finger: 3,
112
- delta: delta)
113
- Events::Event.new(tag: 'libinput_gesture_parser', record: gesture_record)
114
- end
115
- end
116
- end
117
- end
118
- end
119
- end
@@ -1,125 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- require './lib/fusuma/plugin/detectors/rotate_detector'
6
- require './lib/fusuma/plugin/buffers/gesture_buffer'
7
- require './lib/fusuma/plugin/events/event'
8
- require './lib/fusuma/config'
9
-
10
- module Fusuma
11
- module Plugin
12
- module Detectors
13
- RSpec.describe RotateDetector do
14
- before do
15
- @detector = RotateDetector.new
16
- @buffer = Buffers::GestureBuffer.new
17
- end
18
-
19
- around do |example|
20
- ConfigHelper.load_config_yml = <<~CONFIG
21
- threshold:
22
- rotate: 1
23
- CONFIG
24
-
25
- example.run
26
-
27
- Config.custom_path = nil
28
- end
29
-
30
- describe '#detect' do
31
- context 'with no rotate event in buffer' do
32
- before do
33
- @buffer.clear
34
- end
35
- it { expect(@detector.detect([@buffer])).to eq nil }
36
- end
37
-
38
- context 'with not enough rotate events in buffer' do
39
- before do
40
- deltas = [
41
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.4),
42
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.5)
43
- ]
44
- events = create_events(deltas: deltas)
45
-
46
- events.each { |event| @buffer.buffer(event) }
47
- end
48
- it 'should have repeat record' do
49
- expect(@detector.detect([@buffer]).record.trigger).to eq :repeat
50
- end
51
- end
52
-
53
- context 'with enough rotate IN event' do
54
- before do
55
- deltas = [
56
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.5),
57
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.6),
58
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.6)
59
- ]
60
- events = create_events(deltas: deltas)
61
-
62
- events.each { |event| @buffer.buffer(event) }
63
- end
64
- it { expect(@detector.detect([@buffer])).to all be_a Events::Event }
65
- it {
66
- expect(@detector.detect([@buffer]).map(&:record)).to all be_a Events::Records::IndexRecord
67
- }
68
- it {
69
- expect(@detector.detect([@buffer]).map(&:record).map(&:index)).to all be_a Config::Index
70
- }
71
- it 'should detect 3 fingers rotate-clockwise (oneshot/repeat)' do
72
- events = @detector.detect([@buffer])
73
- expect(events[0].record.index.keys.map(&:symbol))
74
- .to eq([:rotate, 3, :clockwise])
75
- expect(events[1].record.index.keys.map(&:symbol))
76
- .to eq([:rotate, 3, :clockwise, :update])
77
- end
78
- end
79
-
80
- context 'with enough rotate OUT event' do
81
- before do
82
- deltas = [
83
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, -0.5),
84
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, -0.6),
85
- Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, -0.6)
86
- ]
87
- events = create_events(deltas: deltas)
88
-
89
- events.each { |event| @buffer.buffer(event) }
90
- end
91
- it 'should detect 3 fingers rotate-counterclockwise' do
92
- events = @detector.detect([@buffer])
93
- indexes = events.map { |e| e.record.index.keys.map(&:symbol) }
94
- expect(indexes).to eq(
95
- [
96
- [:rotate, 3, :counterclockwise],
97
- [:rotate, 3, :counterclockwise, :update]
98
- ]
99
- )
100
- end
101
- end
102
- end
103
-
104
- private
105
-
106
- def create_events(deltas: [])
107
- record_type = RotateDetector::GESTURE_RECORD_TYPE
108
- deltas.map do |delta|
109
- status = if deltas[0].equal? delta
110
- 'begin'
111
- else
112
- 'update'
113
- end
114
-
115
- gesture_record = Events::Records::GestureRecord.new(status: status,
116
- gesture: record_type,
117
- finger: 3,
118
- delta: delta)
119
- Events::Event.new(tag: 'libinput_gesture_parser', record: gesture_record)
120
- end
121
- end
122
- end
123
- end
124
- end
125
- end