reflexion 0.6.0 → 0.7.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 (275) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +37 -6
  3. data/.doc/ext/reflex/capture_event.cpp +1 -1
  4. data/.doc/ext/reflex/chase_constraint.cpp +1 -1
  5. data/.doc/ext/reflex/clipboard.cpp +1 -1
  6. data/.doc/ext/reflex/color_event.cpp +76 -0
  7. data/.doc/ext/reflex/color_picker.cpp +113 -0
  8. data/.doc/ext/reflex/constraint.cpp +1 -1
  9. data/.doc/ext/reflex/contact_event.cpp +1 -1
  10. data/.doc/ext/reflex/control_change_event.cpp +1 -1
  11. data/.doc/ext/reflex/device.cpp +1 -1
  12. data/.doc/ext/reflex/device_event.cpp +1 -1
  13. data/.doc/ext/reflex/draw_event.cpp +1 -1
  14. data/.doc/ext/reflex/ellipse_shape.cpp +1 -1
  15. data/.doc/ext/reflex/event.cpp +1 -1
  16. data/.doc/ext/reflex/file_dialog.cpp +181 -0
  17. data/.doc/ext/reflex/file_event.cpp +103 -0
  18. data/.doc/ext/reflex/filter.cpp +1 -1
  19. data/.doc/ext/reflex/focus_event.cpp +1 -1
  20. data/.doc/ext/reflex/frame_event.cpp +1 -1
  21. data/.doc/ext/reflex/gamepad.cpp +48 -0
  22. data/.doc/ext/reflex/image_view.cpp +1 -1
  23. data/.doc/ext/reflex/key_event.cpp +1 -274
  24. data/.doc/ext/reflex/line_shape.cpp +1 -1
  25. data/.doc/ext/reflex/link_constraint.cpp +1 -1
  26. data/.doc/ext/reflex/menu.cpp +6 -5
  27. data/.doc/ext/reflex/midi.cpp +9 -2
  28. data/.doc/ext/reflex/midi_event.cpp +1 -1
  29. data/.doc/ext/reflex/motion_event.cpp +1 -1
  30. data/.doc/ext/reflex/native.cpp +18 -6
  31. data/.doc/ext/reflex/note_event.cpp +1 -1
  32. data/.doc/ext/reflex/pin.cpp +1 -1
  33. data/.doc/ext/reflex/pointer.cpp +1 -1
  34. data/.doc/ext/reflex/pointer_event.cpp +2 -2
  35. data/.doc/ext/reflex/polygon_shape.cpp +1 -1
  36. data/.doc/ext/reflex/rect_shape.cpp +1 -1
  37. data/.doc/ext/reflex/reflex.cpp +566 -232
  38. data/.doc/ext/reflex/screen.cpp +27 -1
  39. data/.doc/ext/reflex/scroll_event.cpp +1 -1
  40. data/.doc/ext/reflex/selector.cpp +1 -1
  41. data/.doc/ext/reflex/shape.cpp +1 -1
  42. data/.doc/ext/reflex/snap_constraint.cpp +1 -1
  43. data/.doc/ext/reflex/style.cpp +1 -1
  44. data/.doc/ext/reflex/style_length.cpp +1 -1
  45. data/.doc/ext/reflex/text_event.cpp +104 -0
  46. data/.doc/ext/reflex/timer.cpp +1 -1
  47. data/.doc/ext/reflex/timer_event.cpp +1 -1
  48. data/.doc/ext/reflex/update_event.cpp +1 -1
  49. data/.doc/ext/reflex/view.cpp +110 -56
  50. data/.doc/ext/reflex/wheel_constraint.cpp +1 -1
  51. data/.doc/ext/reflex/wheel_event.cpp +1 -1
  52. data/.doc/ext/reflex/window.cpp +226 -17
  53. data/.github/workflows/release-gem.yml +2 -49
  54. data/.github/workflows/tag.yml +5 -28
  55. data/.github/workflows/test.yml +1 -37
  56. data/ChangeLog.md +54 -0
  57. data/Gemfile.lock +13 -8
  58. data/Rakefile +13 -2
  59. data/Reflex.podspec +2 -2
  60. data/VERSION +1 -1
  61. data/ext/reflex/application.cpp +41 -6
  62. data/ext/reflex/capture_event.cpp +1 -1
  63. data/ext/reflex/chase_constraint.cpp +1 -1
  64. data/ext/reflex/clipboard.cpp +1 -1
  65. data/ext/reflex/color_event.cpp +80 -0
  66. data/ext/reflex/color_picker.cpp +121 -0
  67. data/ext/reflex/constraint.cpp +1 -1
  68. data/ext/reflex/contact_event.cpp +1 -1
  69. data/ext/reflex/control_change_event.cpp +1 -1
  70. data/ext/reflex/device.cpp +1 -1
  71. data/ext/reflex/device_event.cpp +1 -1
  72. data/ext/reflex/draw_event.cpp +1 -1
  73. data/ext/reflex/ellipse_shape.cpp +1 -1
  74. data/ext/reflex/event.cpp +1 -1
  75. data/ext/reflex/extconf.rb +4 -2
  76. data/ext/reflex/file_dialog.cpp +194 -0
  77. data/ext/reflex/file_event.cpp +108 -0
  78. data/ext/reflex/filter.cpp +1 -1
  79. data/ext/reflex/focus_event.cpp +1 -1
  80. data/ext/reflex/frame_event.cpp +1 -1
  81. data/ext/reflex/gamepad.cpp +50 -0
  82. data/ext/reflex/image_view.cpp +1 -1
  83. data/ext/reflex/key_event.cpp +1 -275
  84. data/ext/reflex/line_shape.cpp +1 -1
  85. data/ext/reflex/link_constraint.cpp +1 -1
  86. data/ext/reflex/menu.cpp +8 -7
  87. data/ext/reflex/midi.cpp +11 -3
  88. data/ext/reflex/midi_event.cpp +1 -1
  89. data/ext/reflex/motion_event.cpp +1 -1
  90. data/ext/reflex/native.cpp +18 -6
  91. data/ext/reflex/note_event.cpp +1 -1
  92. data/ext/reflex/pin.cpp +1 -1
  93. data/ext/reflex/pointer.cpp +1 -1
  94. data/ext/reflex/pointer_event.cpp +2 -2
  95. data/ext/reflex/polygon_shape.cpp +1 -1
  96. data/ext/reflex/rect_shape.cpp +1 -1
  97. data/ext/reflex/reflex.cpp +568 -232
  98. data/ext/reflex/screen.cpp +31 -2
  99. data/ext/reflex/scroll_event.cpp +1 -1
  100. data/ext/reflex/selector.cpp +1 -1
  101. data/ext/reflex/selector.h +9 -9
  102. data/ext/reflex/shape.cpp +1 -1
  103. data/ext/reflex/snap_constraint.cpp +1 -1
  104. data/ext/reflex/style.cpp +1 -1
  105. data/ext/reflex/style_length.cpp +1 -1
  106. data/ext/reflex/text_event.cpp +111 -0
  107. data/ext/reflex/timer.cpp +1 -1
  108. data/ext/reflex/timer_event.cpp +1 -1
  109. data/ext/reflex/update_event.cpp +1 -1
  110. data/ext/reflex/view.cpp +121 -61
  111. data/ext/reflex/wheel_constraint.cpp +1 -1
  112. data/ext/reflex/wheel_event.cpp +1 -1
  113. data/ext/reflex/window.cpp +256 -25
  114. data/include/reflex/application.h +10 -0
  115. data/include/reflex/color_picker.h +65 -0
  116. data/include/reflex/event.h +178 -88
  117. data/include/reflex/file_dialog.h +73 -0
  118. data/include/reflex/gamepad.h +3 -0
  119. data/include/reflex/menu.h +3 -3
  120. data/include/reflex/midi.h +3 -0
  121. data/include/reflex/reflex.h +2 -0
  122. data/include/reflex/ruby/application.h +6 -1
  123. data/include/reflex/ruby/color_picker.h +89 -0
  124. data/include/reflex/ruby/event.h +62 -29
  125. data/include/reflex/ruby/file_dialog.h +89 -0
  126. data/include/reflex/ruby/gamepad.h +46 -0
  127. data/include/reflex/ruby/reflex.h +3 -0
  128. data/include/reflex/ruby/view.h +92 -44
  129. data/include/reflex/ruby/window.h +60 -1
  130. data/include/reflex/ruby.h +3 -0
  131. data/include/reflex/screen.h +11 -2
  132. data/include/reflex/view.h +28 -16
  133. data/include/reflex/window.h +40 -8
  134. data/include/reflex.h +3 -0
  135. data/lib/reflex/application.rb +5 -5
  136. data/lib/reflex/autoinit.rb +3 -1
  137. data/lib/reflex/button.rb +3 -3
  138. data/lib/reflex/color_event.rb +16 -0
  139. data/lib/reflex/color_picker.rb +45 -0
  140. data/lib/reflex/control_change_event.rb +17 -0
  141. data/lib/reflex/file_dialog.rb +70 -0
  142. data/lib/reflex/file_event.rb +37 -0
  143. data/lib/reflex/helper.rb +58 -7
  144. data/lib/reflex/key_event.rb +9 -4
  145. data/lib/reflex/menu.rb +17 -1
  146. data/lib/reflex/model.rb +19 -19
  147. data/lib/reflex/note_event.rb +1 -1
  148. data/lib/reflex/pointer.rb +14 -3
  149. data/lib/reflex/pointer_event.rb +12 -1
  150. data/lib/reflex/reflex.rb +5 -0
  151. data/lib/reflex/shape.rb +14 -14
  152. data/lib/reflex/style.rb +16 -16
  153. data/lib/reflex/text_event.rb +40 -0
  154. data/lib/reflex/timer.rb +3 -3
  155. data/lib/reflex/view.rb +29 -14
  156. data/lib/reflex/wheel_event.rb +12 -3
  157. data/lib/reflex/window.rb +25 -13
  158. data/lib/reflex.rb +8 -2
  159. data/reflex.gemspec +4 -4
  160. data/samples/ime.rb +100 -0
  161. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +236 -224
  162. data/samples/menu.rb +4 -1
  163. data/samples/model.rb +3 -3
  164. data/samples/test/alert.rb +93 -0
  165. data/samples/test/always_on.rb +76 -0
  166. data/samples/test/app_background.rb +51 -0
  167. data/samples/test/boundary.rb +75 -0
  168. data/samples/test/callback_exception.rb +101 -0
  169. data/samples/test/cancel.rb +53 -0
  170. data/samples/test/color_picker.rb +63 -0
  171. data/samples/test/file_dialog.rb +102 -0
  172. data/samples/window_style.rb +156 -0
  173. data/src/application.cpp +159 -18
  174. data/src/application.h +92 -7
  175. data/src/color_picker.cpp +113 -0
  176. data/src/color_picker.h +36 -0
  177. data/src/event.cpp +410 -252
  178. data/src/event.h +12 -0
  179. data/src/file_dialog.cpp +163 -0
  180. data/src/file_dialog.h +52 -0
  181. data/src/gamepad.cpp +42 -5
  182. data/src/gamepad.h +4 -0
  183. data/src/ios/app_delegate.mm +5 -3
  184. data/src/ios/application.mm +24 -0
  185. data/src/ios/color_picker.mm +19 -0
  186. data/src/ios/file_dialog.mm +21 -0
  187. data/src/ios/gamepad.mm +4 -4
  188. data/src/ios/menu.mm +5 -0
  189. data/src/ios/reflex.mm +8 -0
  190. data/src/ios/screen.mm +26 -0
  191. data/src/ios/view_controller.mm +2 -30
  192. data/src/ios/window.mm +38 -9
  193. data/src/menu.cpp +66 -4
  194. data/src/menu.h +17 -1
  195. data/src/midi.cpp +61 -31
  196. data/src/osx/app_delegate.h +4 -0
  197. data/src/osx/app_delegate.mm +102 -22
  198. data/src/osx/application.mm +88 -6
  199. data/src/osx/color_picker.mm +112 -0
  200. data/src/osx/event.h +10 -0
  201. data/src/osx/event.mm +84 -30
  202. data/src/osx/file_dialog.mm +168 -0
  203. data/src/osx/gamepad.mm +2 -2
  204. data/src/osx/gamepad_hid.mm +1 -1
  205. data/src/osx/menu.mm +177 -33
  206. data/src/osx/native_window.h +16 -2
  207. data/src/osx/native_window.mm +114 -57
  208. data/src/osx/opengl_view.h +2 -1
  209. data/src/osx/opengl_view.mm +184 -43
  210. data/src/osx/reflex.mm +38 -0
  211. data/src/osx/screen.mm +36 -0
  212. data/src/osx/window.mm +106 -24
  213. data/src/pointer.cpp +13 -4
  214. data/src/pointer.h +4 -0
  215. data/src/rays.h +46 -0
  216. data/src/sdl/application.cpp +68 -8
  217. data/src/sdl/color_picker.cpp +18 -0
  218. data/src/sdl/event.cpp +24 -3
  219. data/src/sdl/event.h +12 -0
  220. data/src/sdl/file_dialog.cpp +20 -0
  221. data/src/sdl/gamepad.cpp +3 -7
  222. data/src/sdl/menu.cpp +5 -0
  223. data/src/sdl/reflex.cpp +20 -0
  224. data/src/sdl/screen.cpp +36 -0
  225. data/src/sdl/window.cpp +142 -29
  226. data/src/shape.cpp +15 -10
  227. data/src/view.cpp +287 -198
  228. data/src/view.h +4 -2
  229. data/src/vk.h +416 -0
  230. data/src/win32/application.cpp +162 -12
  231. data/src/win32/application.h +20 -0
  232. data/src/win32/color_picker.cpp +82 -0
  233. data/src/win32/event.cpp +114 -12
  234. data/src/win32/event.h +21 -4
  235. data/src/win32/file_dialog.cpp +226 -0
  236. data/src/win32/gamepad.cpp +9 -2
  237. data/src/win32/menu.cpp +191 -53
  238. data/src/win32/menu.h +9 -1
  239. data/src/win32/opengl.cpp +2 -9
  240. data/src/win32/reflex.cpp +44 -3
  241. data/src/win32/screen.cpp +164 -3
  242. data/src/win32/screen.h +8 -0
  243. data/src/win32/tray.cpp +191 -0
  244. data/src/win32/tray.h +22 -0
  245. data/src/win32/vk.cpp +11 -0
  246. data/src/win32/window.cpp +809 -148
  247. data/src/win32/window.h +6 -0
  248. data/src/window.cpp +718 -185
  249. data/src/window.h +66 -33
  250. data/src/world.cpp +9 -1
  251. data/test/helper.rb +17 -0
  252. data/test/test_application.rb +90 -1
  253. data/test/test_chase_constraint.rb +1 -3
  254. data/test/test_color_event.rb +36 -0
  255. data/test/test_color_picker.rb +62 -0
  256. data/test/test_constraint.rb +2 -4
  257. data/test/test_event.rb +1 -1
  258. data/test/test_file_dialog.rb +48 -0
  259. data/test/test_file_event.rb +43 -0
  260. data/test/test_has_text_preedit.rb +54 -0
  261. data/test/test_key_event.rb +20 -5
  262. data/test/test_link_constraint.rb +1 -3
  263. data/test/test_menu.rb +40 -10
  264. data/test/test_pointer.rb +33 -23
  265. data/test/test_pointer_event.rb +24 -9
  266. data/test/test_reflex.rb +36 -0
  267. data/test/test_screen.rb +24 -2
  268. data/test/test_snap_constraint.rb +1 -3
  269. data/test/test_text_event.rb +54 -0
  270. data/test/test_view.rb +41 -4
  271. data/test/test_wheel_constraint.rb +1 -3
  272. data/test/test_wheel_event.rb +13 -5
  273. data/test/test_window.rb +196 -44
  274. metadata +80 -10
  275. data/.github/workflows/utils.rb +0 -127
data/test/test_menu.rb CHANGED
@@ -125,22 +125,52 @@ class TestMenu < Test::Unit::TestCase
125
125
  def test_shortcut()
126
126
  m = menu
127
127
  m.shortcut_key = :s
128
- assert_equal 's', m.shortcut_key
129
- assert_equal [], m.shortcut_modifiers
128
+ assert_equal :s, m.shortcut_key
129
+ assert_equal [], m.shortcut_modifiers
130
130
 
131
- m.shortcut = [:c, :command]
132
- assert_equal 'c', m.shortcut_key
133
- assert_equal [:command], m.shortcut_modifiers
131
+ m.shortcut = [:c, :control]
132
+ assert_equal :c, m.shortcut_key
133
+ assert_equal [:control], m.shortcut_modifiers
134
+ end
135
+
136
+ def test_shortcut_key_symbol_roundtrip()
137
+ m = menu
138
+ # non-character keys are representable now (were impossible as strings)
139
+ m.shortcut_key = :f1
140
+ assert_equal :f1, m.shortcut_key
141
+ m.shortcut_key = :left
142
+ assert_equal :left, m.shortcut_key
143
+
144
+ # a KeyCode constant is also accepted directly
145
+ m.shortcut_key = Reflex::KEY_A
146
+ assert_equal :a, m.shortcut_key
147
+
148
+ # nil clears it
149
+ m.shortcut_key = nil
150
+ assert_nil m.shortcut_key
151
+ end
152
+
153
+ def test_shortcut_key_unknown_symbol_raises()
154
+ assert_raise(ArgumentError) {menu.shortcut_key = :nonexistent}
134
155
  end
135
156
 
136
157
  def test_shortcut_key_keeps_modifiers()
137
158
  m = menu
138
- m.shortcut = [:c, :command, :shift]
139
- assert_equal 'c', m.shortcut_key
140
- assert_equal %i[command shift].sort, m.shortcut_modifiers.sort
159
+ m.shortcut = [:c, :control, :shift]
160
+ assert_equal :c, m.shortcut_key
161
+ assert_equal %i[control shift].sort, m.shortcut_modifiers.sort
141
162
  m.shortcut_key = :v
142
- assert_equal 'v', m.shortcut_key
143
- assert_equal %i[command shift].sort, m.shortcut_modifiers.sort
163
+ assert_equal :v, m.shortcut_key
164
+ assert_equal %i[control shift].sort, m.shortcut_modifiers.sort
165
+ end
166
+
167
+ def test_shortcut_modifiers_unsupported_on_platform_raise()
168
+ if osx?
169
+ assert_raise(ArgumentError) {menu.shortcut_modifiers = [:win]}
170
+ elsif win32?
171
+ assert_raise(ArgumentError) {menu.shortcut_modifiers = [:command]}
172
+ assert_raise(ArgumentError) {menu.shortcut_modifiers = [:win]}
173
+ end
144
174
  end
145
175
 
146
176
  def test_image()
data/test/test_pointer.rb CHANGED
@@ -3,22 +3,24 @@ require_relative 'helper'
3
3
 
4
4
  class TestPointer < Test::Unit::TestCase
5
5
 
6
- TYPE_NONE = Reflex::Pointer::TYPE_NONE
7
- MOUSE = Reflex::Pointer::MOUSE
8
- LEFT = Reflex::Pointer::MOUSE_LEFT
9
- RIGHT = Reflex::Pointer::MOUSE_RIGHT
10
- MIDDLE = Reflex::Pointer::MOUSE_MIDDLE
11
- TOUCH = Reflex::Pointer::TOUCH
12
- PEN = Reflex::Pointer::PEN
13
-
14
- ACTION_NONE = Reflex::Pointer::ACTION_NONE
15
- DOWN = Reflex::Pointer::DOWN
16
- UP = Reflex::Pointer::UP
17
- MOVE = Reflex::Pointer::MOVE
18
- CANCEL = Reflex::Pointer::CANCEL
19
- ENTER = Reflex::Pointer::ENTER
20
- LEAVE = Reflex::Pointer::LEAVE
21
- STAY = Reflex::Pointer::STAY
6
+ R = Reflex
7
+
8
+ TYPE_NONE = R::Pointer::TYPE_NONE
9
+ MOUSE = R::Pointer::MOUSE
10
+ LEFT = R::Pointer::MOUSE_LEFT
11
+ RIGHT = R::Pointer::MOUSE_RIGHT
12
+ MIDDLE = R::Pointer::MOUSE_MIDDLE
13
+ TOUCH = R::Pointer::TOUCH
14
+ PEN = R::Pointer::PEN
15
+
16
+ ACTION_NONE = R::Pointer::ACTION_NONE
17
+ DOWN = R::Pointer::DOWN
18
+ UP = R::Pointer::UP
19
+ MOVE = R::Pointer::MOVE
20
+ CANCEL = R::Pointer::CANCEL
21
+ ENTER = R::Pointer::ENTER
22
+ LEAVE = R::Pointer::LEAVE
23
+ STAY = R::Pointer::STAY
22
24
 
23
25
  T = true
24
26
  F = false
@@ -28,8 +30,7 @@ class TestPointer < Test::Unit::TestCase
28
30
  position: 0, modifiers: 0, click_count: 0, drag: false,
29
31
  time: 0)
30
32
 
31
- Reflex::Pointer.new(
32
- id, types, action, position, modifiers, click_count, drag, time)
33
+ R::Pointer.new(id, types, action, position, modifiers, click_count, drag, time)
33
34
  end
34
35
 
35
36
  def test_initialize()
@@ -142,9 +143,9 @@ class TestPointer < Test::Unit::TestCase
142
143
  end
143
144
 
144
145
  def test_modifiers()
145
- p = pointer modifiers: Reflex::MOD_SHIFT | Reflex::MOD_NUMPAD
146
- assert_equal [:shift, :numpad], p.modifiers
147
- assert_equal [:shift], p.modifiers(locks: false)
146
+ p = pointer modifiers: R::MOD_SHIFT | R::MOD_NUMPAD
147
+ assert_equal [:shift], p.modifiers
148
+ assert_equal [:shift, :numpad], p.modifiers(all: true)
148
149
  end
149
150
 
150
151
  def test_down()
@@ -156,8 +157,8 @@ class TestPointer < Test::Unit::TestCase
156
157
  assert_equal pointer, pointer
157
158
 
158
159
  assert_not_equal pointer, pointer(id: 1)
159
- assert_not_equal pointer, pointer(types: Reflex::Pointer::PEN)
160
- assert_not_equal pointer, pointer(action: Reflex::Pointer::UP)
160
+ assert_not_equal pointer, pointer(types: R::Pointer::PEN)
161
+ assert_not_equal pointer, pointer(action: R::Pointer::UP)
161
162
  assert_not_equal pointer, pointer(position: 2)
162
163
  assert_not_equal pointer, pointer(modifiers: 3)
163
164
  assert_not_equal pointer, pointer(click_count: 4)
@@ -165,4 +166,13 @@ class TestPointer < Test::Unit::TestCase
165
166
  assert_not_equal pointer, pointer(time: 5)
166
167
  end
167
168
 
169
+ def test_inspect()
170
+ assert_equal(
171
+ '#<Reflex::Pointer id:1 [:mouse, :mouse_left] :up (2.0, 3.0) mod:[:shift, :control] click:5 drag:true time:4.0>',
172
+ pointer(
173
+ id: 1, types: MOUSE | LEFT, action: UP, position: [2, 3], modifiers: 6,
174
+ click_count: 5, drag: true, time: 4
175
+ ).inspect)
176
+ end
177
+
168
178
  end# TestPointer
@@ -3,16 +3,20 @@ require_relative 'helper'
3
3
 
4
4
  class TestPointerEvent < Test::Unit::TestCase
5
5
 
6
- TYPE_NONE = Reflex::Pointer::TYPE_NONE
7
- TOUCH = Reflex::Pointer::TOUCH
8
- PEN = Reflex::Pointer::PEN
6
+ R = Reflex
9
7
 
10
- ACTION_NONE = Reflex::Pointer::ACTION_NONE
11
- DOWN = Reflex::Pointer::DOWN
12
- UP = Reflex::Pointer::UP
8
+ TYPE_NONE = R::Pointer::TYPE_NONE
9
+ MOUSE = R::Pointer::MOUSE
10
+ LEFT = R::Pointer::MOUSE_LEFT
11
+ TOUCH = R::Pointer::TOUCH
12
+ PEN = R::Pointer::PEN
13
+
14
+ ACTION_NONE = R::Pointer::ACTION_NONE
15
+ DOWN = R::Pointer::DOWN
16
+ UP = R::Pointer::UP
13
17
 
14
18
  def event(*args, **kwargs)
15
- Reflex::PointerEvent.new(*args, **kwargs)
19
+ R::PointerEvent.new(*args, **kwargs)
16
20
  end
17
21
 
18
22
  def pointer(
@@ -20,8 +24,7 @@ class TestPointerEvent < Test::Unit::TestCase
20
24
  position: 0, modifiers: 0, click_count: 0, drag: false,
21
25
  time: 0)
22
26
 
23
- Reflex::Pointer.new(
24
- id, type, action, position, modifiers, click_count, drag, time)
27
+ R::Pointer.new(id, type, action, position, modifiers, click_count, drag, time)
25
28
  end
26
29
 
27
30
  def test_initialize()
@@ -89,4 +92,16 @@ class TestPointerEvent < Test::Unit::TestCase
89
92
  assert_nil e[-4]
90
93
  end
91
94
 
95
+ def test_inspect()
96
+ assert_equal(
97
+ "#<Reflex::PointerEvent id:1 [:mouse, :mouse_left] :down (2.0, 3.0) mod:[:shift, :control] click:5 drag:true time:4.0>",
98
+ event(
99
+ pointer(
100
+ id: 1, type: MOUSE | LEFT, action: DOWN,
101
+ position: [2, 3], modifiers: 6, drag: true, click_count: 5,
102
+ time: 4),
103
+ pointer(id: 10, type: TOUCH, action: UP)
104
+ ).inspect)
105
+ end
106
+
92
107
  end# TestPointerEvent
@@ -0,0 +1,36 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestReflex < Test::Unit::TestCase
5
+
6
+ R = Reflex
7
+
8
+ def test_all_keys_have_symbol()
9
+ R::KEYS.each do |key|
10
+ assert_not_nil R.get_key_symbol!(key), "no symbol for keycode 0x%X" % key
11
+ end
12
+ end
13
+
14
+ def test_all_keys_are_on_this_platform()
15
+ R::KEYS.each do |key|
16
+ assert_operator key, :>=, 0, "keycode 0x%X is not on this platform" % key
17
+ end
18
+ end
19
+
20
+ def test_unsided_modifiers_have_symbol()
21
+ omit 'no command or option key here' unless Xot.osx? || Xot.win32?
22
+ assert_equal :command, R.get_key_symbol!(R::KEY_COMMAND)
23
+ assert_equal :option, R.get_key_symbol!(R::KEY_OPTION)
24
+ end
25
+
26
+ def test_key_symbol_representative()
27
+ # Several keycodes share one symbol; the reverse lookup returns the
28
+ # first-defined keycode (KEY_SHIFT is listed before KEY_LSHIFT/KEY_RSHIFT).
29
+ assert_equal :shift, R.get_key_symbol!(R::KEY_SHIFT)
30
+ assert_equal :shift, R.get_key_symbol!(R::KEY_LSHIFT)
31
+ assert_equal :shift, R.get_key_symbol!(R::KEY_RSHIFT)
32
+
33
+ assert_equal R::KEY_SHIFT, R::KEYS.find {:shift == R.get_key_symbol!(_1)}
34
+ end
35
+
36
+ end# TestReflex
data/test/test_screen.rb CHANGED
@@ -3,12 +3,34 @@ require_relative 'helper'
3
3
 
4
4
  class TestScreen < Test::Unit::TestCase
5
5
 
6
+ include HasWindow
7
+
8
+ R = Reflex
9
+ S = R::Screen
10
+
6
11
  def screen()
7
- Reflex::Window.new.screen
12
+ window.screen
8
13
  end
9
14
 
10
15
  def test_initialize()
11
- assert_raise(Reflex::ReflexError) {Reflex::Screen.new}
16
+ assert_raise(R::ReflexError) {S.new}
17
+ end
18
+
19
+ def test_name()
20
+ S.all.each {assert_kind_of String, _1.name}
21
+ end
22
+
23
+ def test_pixel_density()
24
+ S.all.each {assert_operator _1.pixel_density, :>=, 1}
25
+ end
26
+
27
+ def test_all()
28
+ all = S.all
29
+ assert_true all.all? {_1.is_a? S}
30
+
31
+ omit 'no screen here' if all.empty?
32
+
33
+ assert_equal [0, 0], all.first.frame.position.to_a(2)
12
34
  end
13
35
 
14
36
  end# TestScreen
@@ -3,9 +3,7 @@ require_relative 'helper'
3
3
 
4
4
  class TestSnapConstraint < Test::Unit::TestCase
5
5
 
6
- def window()
7
- Reflex::Window.new
8
- end
6
+ include HasWindow
9
7
 
10
8
  def view(x = 0, y = 0, w = 50, h = 50, **options, &block)
11
9
  Reflex::View.new(
@@ -0,0 +1,54 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative 'helper'
3
+
4
+
5
+ class TestTextEvent < Test::Unit::TestCase
6
+
7
+ PREEDIT, COMMIT = Reflex::TextEvent::PREEDIT, Reflex::TextEvent::COMMIT
8
+
9
+ def event(*args)
10
+ Reflex::TextEvent.new(*args)
11
+ end
12
+
13
+ def test_initialize()
14
+ assert_equal :preedit, event(PREEDIT, 'あ', 1, 2).action
15
+ assert_equal 'あ', event(PREEDIT, 'あ', 1, 2).text
16
+ assert_equal 1...3, event(PREEDIT, 'あ', 1, 2).selection
17
+ end
18
+
19
+ def test_dup()
20
+ assert_equal :preedit, event(PREEDIT, 'あ', 1, 2).dup.action
21
+ assert_equal 'あ', event(PREEDIT, 'あ', 1, 2).dup.text
22
+ assert_equal 1...3, event(PREEDIT, 'あ', 1, 2).dup.selection
23
+
24
+ e1 = event PREEDIT, 'あ', 1, 2
25
+ e2 = e1.dup
26
+ e1.block
27
+ e3 = e1.dup
28
+ assert_true e1.blocked?
29
+ assert_false e2.blocked?
30
+ assert_true e3.blocked?
31
+ end
32
+
33
+ def test_preedit_commit()
34
+ assert_true event(PREEDIT, 'あ', 1, 2).preedit?
35
+ assert_false event(PREEDIT, 'あ', 1, 2).commit?
36
+ assert_false event(COMMIT, 'あ', 1, 2).preedit?
37
+ assert_true event(COMMIT, 'あ', 1, 2).commit?
38
+ end
39
+
40
+ def test_text()
41
+ assert_equal '', event(PREEDIT, '', 1, 2).text
42
+ assert_equal '', event(PREEDIT, nil, 1, 2).text
43
+ assert_equal Encoding::UTF_8, event(PREEDIT, 'あいう', 1, 2).text.encoding
44
+ assert_equal 3, event(PREEDIT, 'あい😁', 1, 2).text.size
45
+ end
46
+
47
+ def test_selection()
48
+ assert_nil event(PREEDIT, 'あいうえ', -1, 0).selection
49
+ assert_equal 0...0, event(PREEDIT, 'あいうえ', 0, 0).selection
50
+ assert_equal 1...1, event(PREEDIT, 'あいうえ', 1, 0).selection
51
+ assert_equal 'いう', 'あいうえ'[event(PREEDIT, 'あいうえ', 1, 2).selection]
52
+ end
53
+
54
+ end# TestTextEvent
data/test/test_view.rb CHANGED
@@ -3,14 +3,12 @@ require_relative 'helper'
3
3
 
4
4
  class TestView < Test::Unit::TestCase
5
5
 
6
+ include HasWindow
7
+
6
8
  def view(*a, **k, &b)
7
9
  Reflex::View.new(*a, **k, &b)
8
10
  end
9
11
 
10
- def window(*a, **k, &b)
11
- Reflex::Window.new(*a, **k, &b)
12
- end
13
-
14
12
  def style(*a, **k, &b)
15
13
  Reflex::Style.new(*a, **k, &b)
16
14
  end
@@ -486,6 +484,45 @@ class TestView < Test::Unit::TestCase
486
484
  v.capture += []; assert_equal [], v.capture
487
485
  end
488
486
 
487
+ def test_accepts_text_input()
488
+ assert_false view .accepts_text_input?
489
+ assert_true view.tap {_1.text_input = true} .accepts_text_input?
490
+ assert_true view.tap {_1.text_input = true; _1.on(:text) {}}.accepts_text_input?
491
+ assert_false view.tap {_1.text_input = false} .accepts_text_input?
492
+ assert_false view.tap {_1.text_input = false; _1.on(:text) {}}.accepts_text_input?
493
+ assert_false view.tap {_1.text_input = nil} .accepts_text_input?
494
+ assert_true view.tap {_1.text_input = nil; _1.on(:text) {}}.accepts_text_input?
495
+
496
+ new_class = -> hook = nil {
497
+ Class.new(Reflex::View) {define_method(hook) {|*|} if hook}
498
+ }
499
+
500
+ assert_true new_class.call(:on_text).new .accepts_text_input?
501
+ assert_false new_class.call(:on_text).new.hide .accepts_text_input?
502
+ assert_true new_class.call(:on_text).new.hide.show.accepts_text_input?
503
+
504
+ %w[on_text on_text_preedit on_text_commit].each do |hook|
505
+ on_less = hook.sub 'on_', ''
506
+ assert_true new_class.call(hook).new .accepts_text_input?, hook
507
+ assert_true view.tap {_1.on(on_less) {|*|}}.accepts_text_input?, hook
508
+ assert_true view.tap {_1.before(hook) {|*|}}.accepts_text_input?, hook
509
+ assert_true view.tap {_1.after(hook) {|*|}}.accepts_text_input?, hook
510
+ end
511
+ end
512
+
513
+ def test_text_input()
514
+ v = view; assert_nil v.text_input
515
+ v.text_input = true; assert_true v.text_input
516
+ v.text_input = false; assert_false v.text_input
517
+ v.text_input = nil; assert_nil v.text_input
518
+ end
519
+
520
+ def test_text_input_bounds()
521
+ v = view
522
+ v.frame = [10, 20, 30, 40]
523
+ assert_equal Reflex::Bounds.new(0, 0, 30, 40), v.text_input_bounds
524
+ end
525
+
489
526
  def test_capturing()
490
527
  v, w = view, window
491
528
  w.add v
@@ -3,9 +3,7 @@ require_relative 'helper'
3
3
 
4
4
  class TestWheelConstraint < Test::Unit::TestCase
5
5
 
6
- def window()
7
- Reflex::Window.new
8
- end
6
+ include HasWindow
9
7
 
10
8
  def view(x = 0, y = 0, w = 50, h = 50, **options, &block)
11
9
  Reflex::View.new(
@@ -3,8 +3,10 @@ require_relative 'helper'
3
3
 
4
4
  class TestWheelEvent < Test::Unit::TestCase
5
5
 
6
+ R = Reflex
7
+
6
8
  def event(*args)
7
- Reflex::WheelEvent.new(*args)
9
+ R::WheelEvent.new(*args)
8
10
  end
9
11
 
10
12
  def point(*args)
@@ -19,7 +21,7 @@ class TestWheelEvent < Test::Unit::TestCase
19
21
  assert_equal 4, e.dx
20
22
  assert_equal 5, e.dy
21
23
  assert_equal 6, e.dz
22
- assert_equal [:alt, :control, :shift], e.modifiers
24
+ assert_equal [:shift, :control, :alt], e.modifiers
23
25
  assert_equal point(1, 2, 3), e. position
24
26
  assert_equal point(4, 5, 6), e.dposition
25
27
  end
@@ -35,9 +37,15 @@ class TestWheelEvent < Test::Unit::TestCase
35
37
  end
36
38
 
37
39
  def test_modifiers()
38
- e = event 0, 0, 0, 0, 0, 0, Reflex::MOD_CONTROL | Reflex::MOD_SCROLL
39
- assert_equal [:control, :scroll], e.modifiers
40
- assert_equal [:control], e.modifiers(locks: false)
40
+ e = event 0, 0, 0, 0, 0, 0, R::MOD_CONTROL | R::MOD_SCROLL
41
+ assert_equal [:control], e.modifiers
42
+ assert_equal [:control, :scroll], e.modifiers(all: true)
43
+ end
44
+
45
+ def test_inspect()
46
+ assert_equal(
47
+ "#<Reflex::WheelEvent x:1.0 y:2.0 z:3.0 dx:4.0 dy:5.0 dz:6.79 mod:[:control, :scroll]>",
48
+ event(1, 2, 3, 4, 5, 6.789, R::MOD_CONTROL | R::MOD_SCROLL).inspect)
41
49
  end
42
50
 
43
51
  end# TestWheelEvent