reflexion 0.5.3 → 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 (309) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +56 -7
  3. data/.doc/ext/reflex/capture_event.cpp +1 -1
  4. data/.doc/ext/reflex/chase_constraint.cpp +84 -0
  5. data/.doc/ext/reflex/clipboard.cpp +65 -0
  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 +135 -0
  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 +178 -0
  26. data/.doc/ext/reflex/menu.cpp +303 -0
  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 +40 -10
  31. data/.doc/ext/reflex/note_event.cpp +1 -1
  32. data/.doc/ext/reflex/pin.cpp +156 -0
  33. data/.doc/ext/reflex/pointer.cpp +3 -1
  34. data/.doc/ext/reflex/pointer_event.cpp +3 -3
  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 +606 -237
  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 +5 -5
  41. data/.doc/ext/reflex/shape.cpp +1 -1
  42. data/.doc/ext/reflex/snap_constraint.cpp +125 -0
  43. data/.doc/ext/reflex/style.cpp +1 -1
  44. data/.doc/ext/reflex/style_length.cpp +4 -3
  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 +206 -79
  50. data/.doc/ext/reflex/wheel_constraint.cpp +142 -0
  51. data/.doc/ext/reflex/wheel_event.cpp +1 -1
  52. data/.doc/ext/reflex/window.cpp +282 -31
  53. data/.github/workflows/release-gem.yml +2 -40
  54. data/.github/workflows/tag.yml +5 -28
  55. data/.github/workflows/test.yml +1 -28
  56. data/ChangeLog.md +79 -0
  57. data/Gemfile.lock +13 -8
  58. data/README.md +1 -0
  59. data/Rakefile +13 -2
  60. data/Reflex.podspec +2 -2
  61. data/VERSION +1 -1
  62. data/ext/reflex/application.cpp +62 -7
  63. data/ext/reflex/capture_event.cpp +1 -1
  64. data/ext/reflex/chase_constraint.cpp +89 -0
  65. data/ext/reflex/clipboard.cpp +69 -0
  66. data/ext/reflex/color_event.cpp +80 -0
  67. data/ext/reflex/color_picker.cpp +121 -0
  68. data/ext/reflex/constraint.cpp +146 -0
  69. data/ext/reflex/contact_event.cpp +1 -1
  70. data/ext/reflex/control_change_event.cpp +1 -1
  71. data/ext/reflex/device.cpp +1 -1
  72. data/ext/reflex/device_event.cpp +1 -1
  73. data/ext/reflex/draw_event.cpp +1 -1
  74. data/ext/reflex/ellipse_shape.cpp +1 -1
  75. data/ext/reflex/event.cpp +1 -1
  76. data/ext/reflex/extconf.rb +4 -2
  77. data/ext/reflex/file_dialog.cpp +194 -0
  78. data/ext/reflex/file_event.cpp +108 -0
  79. data/ext/reflex/filter.cpp +1 -1
  80. data/ext/reflex/focus_event.cpp +1 -1
  81. data/ext/reflex/frame_event.cpp +1 -1
  82. data/ext/reflex/gamepad.cpp +50 -0
  83. data/ext/reflex/image_view.cpp +1 -1
  84. data/ext/reflex/key_event.cpp +1 -275
  85. data/ext/reflex/line_shape.cpp +1 -1
  86. data/ext/reflex/link_constraint.cpp +194 -0
  87. data/ext/reflex/menu.cpp +331 -0
  88. data/ext/reflex/midi.cpp +11 -3
  89. data/ext/reflex/midi_event.cpp +1 -1
  90. data/ext/reflex/motion_event.cpp +1 -1
  91. data/ext/reflex/native.cpp +40 -10
  92. data/ext/reflex/note_event.cpp +1 -1
  93. data/ext/reflex/pin.cpp +165 -0
  94. data/ext/reflex/pointer.cpp +3 -1
  95. data/ext/reflex/pointer_event.cpp +3 -3
  96. data/ext/reflex/polygon_shape.cpp +1 -1
  97. data/ext/reflex/rect_shape.cpp +1 -1
  98. data/ext/reflex/reflex.cpp +608 -237
  99. data/ext/reflex/screen.cpp +31 -2
  100. data/ext/reflex/scroll_event.cpp +1 -1
  101. data/ext/reflex/selector.cpp +5 -5
  102. data/ext/reflex/selector.h +10 -10
  103. data/ext/reflex/shape.cpp +1 -1
  104. data/ext/reflex/snap_constraint.cpp +135 -0
  105. data/ext/reflex/style.cpp +1 -1
  106. data/ext/reflex/style_length.cpp +4 -3
  107. data/ext/reflex/text_event.cpp +111 -0
  108. data/ext/reflex/timer.cpp +1 -1
  109. data/ext/reflex/timer_event.cpp +1 -1
  110. data/ext/reflex/update_event.cpp +1 -1
  111. data/ext/reflex/view.cpp +236 -96
  112. data/ext/reflex/wheel_constraint.cpp +154 -0
  113. data/ext/reflex/wheel_event.cpp +1 -1
  114. data/ext/reflex/window.cpp +318 -40
  115. data/include/reflex/application.h +19 -0
  116. data/include/reflex/clipboard.h +53 -0
  117. data/include/reflex/color_picker.h +65 -0
  118. data/include/reflex/constraint.h +275 -0
  119. data/include/reflex/defs.h +204 -195
  120. data/include/reflex/event.h +180 -88
  121. data/include/reflex/file_dialog.h +73 -0
  122. data/include/reflex/gamepad.h +3 -0
  123. data/include/reflex/menu.h +120 -0
  124. data/include/reflex/midi.h +3 -0
  125. data/include/reflex/pin.h +68 -0
  126. data/include/reflex/pointer.h +4 -0
  127. data/include/reflex/reflex.h +2 -0
  128. data/include/reflex/ruby/application.h +6 -1
  129. data/include/reflex/ruby/clipboard.h +23 -0
  130. data/include/reflex/ruby/color_picker.h +89 -0
  131. data/include/reflex/ruby/constraint.h +94 -0
  132. data/include/reflex/ruby/event.h +62 -29
  133. data/include/reflex/ruby/file_dialog.h +89 -0
  134. data/include/reflex/ruby/gamepad.h +46 -0
  135. data/include/reflex/ruby/menu.h +103 -0
  136. data/include/reflex/ruby/pin.h +40 -0
  137. data/include/reflex/ruby/reflex.h +3 -0
  138. data/include/reflex/ruby/view.h +123 -39
  139. data/include/reflex/ruby/window.h +96 -19
  140. data/include/reflex/ruby.h +3 -0
  141. data/include/reflex/screen.h +11 -2
  142. data/include/reflex/view.h +66 -27
  143. data/include/reflex/window.h +57 -12
  144. data/include/reflex.h +8 -0
  145. data/lib/reflex/application.rb +5 -5
  146. data/lib/reflex/autoinit.rb +3 -1
  147. data/lib/reflex/button.rb +3 -3
  148. data/lib/reflex/chase_constraint.rb +15 -0
  149. data/lib/reflex/clipboard.rb +19 -0
  150. data/lib/reflex/color_event.rb +16 -0
  151. data/lib/reflex/color_picker.rb +45 -0
  152. data/lib/reflex/constraint.rb +29 -0
  153. data/lib/reflex/control_change_event.rb +17 -0
  154. data/lib/reflex/extension.rb +1 -1
  155. data/lib/reflex/file_dialog.rb +70 -0
  156. data/lib/reflex/file_event.rb +37 -0
  157. data/lib/reflex/helper.rb +79 -0
  158. data/lib/reflex/key_event.rb +14 -14
  159. data/lib/reflex/link_constraint.rb +31 -0
  160. data/lib/reflex/menu.rb +92 -0
  161. data/lib/reflex/model.rb +19 -19
  162. data/lib/reflex/note_event.rb +1 -1
  163. data/lib/reflex/pin.rb +39 -0
  164. data/lib/reflex/pointer.rb +30 -1
  165. data/lib/reflex/pointer_event.rb +13 -2
  166. data/lib/reflex/reflex.rb +5 -0
  167. data/lib/reflex/shape.rb +14 -14
  168. data/lib/reflex/snap_constraint.rb +28 -0
  169. data/lib/reflex/style.rb +16 -16
  170. data/lib/reflex/text_event.rb +40 -0
  171. data/lib/reflex/timer.rb +3 -3
  172. data/lib/reflex/view.rb +85 -18
  173. data/lib/reflex/wheel_constraint.rb +28 -0
  174. data/lib/reflex/wheel_event.rb +19 -1
  175. data/lib/reflex/window.rb +25 -13
  176. data/lib/reflex.rb +23 -8
  177. data/pod.rake +1 -1
  178. data/reflex.gemspec +4 -4
  179. data/samples/constraint.rb +152 -0
  180. data/samples/ime.rb +100 -0
  181. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +236 -224
  182. data/samples/menu.rb +32 -0
  183. data/samples/model.rb +3 -3
  184. data/samples/test/alert.rb +93 -0
  185. data/samples/test/always_on.rb +76 -0
  186. data/samples/test/app_background.rb +51 -0
  187. data/samples/test/boundary.rb +75 -0
  188. data/samples/test/callback_exception.rb +101 -0
  189. data/samples/test/cancel.rb +53 -0
  190. data/samples/test/color_picker.rb +63 -0
  191. data/samples/test/file_dialog.rb +102 -0
  192. data/samples/window_style.rb +156 -0
  193. data/src/application.cpp +180 -20
  194. data/src/application.h +95 -5
  195. data/src/clipboard.cpp +81 -0
  196. data/src/color_picker.cpp +113 -0
  197. data/src/color_picker.h +36 -0
  198. data/src/constraint.cpp +1662 -0
  199. data/src/constraint.h +64 -0
  200. data/src/event.cpp +416 -252
  201. data/src/event.h +13 -2
  202. data/src/file_dialog.cpp +163 -0
  203. data/src/file_dialog.h +52 -0
  204. data/src/gamepad.cpp +42 -5
  205. data/src/gamepad.h +4 -0
  206. data/src/ios/app_delegate.mm +5 -3
  207. data/src/ios/application.mm +29 -0
  208. data/src/ios/clipboard.mm +44 -0
  209. data/src/ios/color_picker.mm +19 -0
  210. data/src/ios/event.h +6 -2
  211. data/src/ios/event.mm +31 -12
  212. data/src/ios/file_dialog.mm +21 -0
  213. data/src/ios/gamepad.mm +4 -4
  214. data/src/ios/menu.mm +41 -0
  215. data/src/ios/reflex.mm +8 -0
  216. data/src/ios/screen.mm +26 -0
  217. data/src/ios/view_controller.mm +47 -42
  218. data/src/ios/window.mm +44 -9
  219. data/src/menu.cpp +387 -0
  220. data/src/menu.h +81 -0
  221. data/src/midi.cpp +61 -31
  222. data/src/osx/app_delegate.h +4 -0
  223. data/src/osx/app_delegate.mm +168 -139
  224. data/src/osx/application.mm +103 -5
  225. data/src/osx/clipboard.mm +45 -0
  226. data/src/osx/color_picker.mm +112 -0
  227. data/src/osx/event.h +10 -0
  228. data/src/osx/event.mm +114 -30
  229. data/src/osx/file_dialog.mm +168 -0
  230. data/src/osx/gamepad.mm +2 -2
  231. data/src/osx/gamepad_hid.mm +1 -1
  232. data/src/osx/menu.h +25 -0
  233. data/src/osx/menu.mm +516 -0
  234. data/src/osx/native_window.h +16 -2
  235. data/src/osx/native_window.mm +141 -57
  236. data/src/osx/opengl_view.h +2 -1
  237. data/src/osx/opengl_view.mm +229 -37
  238. data/src/osx/reflex.mm +38 -0
  239. data/src/osx/screen.mm +36 -0
  240. data/src/osx/window.mm +117 -24
  241. data/src/pin.cpp +137 -0
  242. data/src/pointer.cpp +36 -16
  243. data/src/pointer.h +10 -0
  244. data/src/rays.h +46 -0
  245. data/src/sdl/application.cpp +73 -8
  246. data/src/sdl/clipboard.cpp +39 -0
  247. data/src/sdl/color_picker.cpp +18 -0
  248. data/src/sdl/event.cpp +44 -6
  249. data/src/sdl/event.h +18 -3
  250. data/src/sdl/file_dialog.cpp +20 -0
  251. data/src/sdl/gamepad.cpp +3 -7
  252. data/src/sdl/menu.cpp +40 -0
  253. data/src/sdl/reflex.cpp +20 -0
  254. data/src/sdl/screen.cpp +36 -0
  255. data/src/sdl/window.cpp +168 -37
  256. data/src/shape.cpp +15 -10
  257. data/src/view.cpp +583 -233
  258. data/src/view.h +22 -4
  259. data/src/vk.h +416 -0
  260. data/src/win32/application.cpp +167 -12
  261. data/src/win32/application.h +20 -0
  262. data/src/win32/clipboard.cpp +210 -0
  263. data/src/win32/color_picker.cpp +82 -0
  264. data/src/win32/event.cpp +123 -11
  265. data/src/win32/event.h +22 -3
  266. data/src/win32/file_dialog.cpp +226 -0
  267. data/src/win32/gamepad.cpp +9 -2
  268. data/src/win32/menu.cpp +490 -0
  269. data/src/win32/menu.h +35 -0
  270. data/src/win32/opengl.cpp +2 -9
  271. data/src/win32/reflex.cpp +44 -3
  272. data/src/win32/screen.cpp +164 -3
  273. data/src/win32/screen.h +8 -0
  274. data/src/win32/tray.cpp +191 -0
  275. data/src/win32/tray.h +22 -0
  276. data/src/win32/vk.cpp +11 -0
  277. data/src/win32/window.cpp +858 -135
  278. data/src/win32/window.h +9 -0
  279. data/src/window.cpp +929 -183
  280. data/src/window.h +77 -33
  281. data/src/world.cpp +86 -15
  282. data/src/world.h +9 -2
  283. data/test/helper.rb +24 -0
  284. data/test/test_application.rb +101 -1
  285. data/test/test_chase_constraint.rb +122 -0
  286. data/test/test_clipboard.rb +54 -0
  287. data/test/test_color_event.rb +36 -0
  288. data/test/test_color_picker.rb +62 -0
  289. data/test/test_constraint.rb +184 -0
  290. data/test/test_event.rb +1 -1
  291. data/test/test_file_dialog.rb +48 -0
  292. data/test/test_file_event.rb +43 -0
  293. data/test/test_has_text_preedit.rb +54 -0
  294. data/test/test_key_event.rb +23 -2
  295. data/test/test_link_constraint.rb +237 -0
  296. data/test/test_menu.rb +237 -0
  297. data/test/test_pin.rb +65 -0
  298. data/test/test_pointer.rb +50 -26
  299. data/test/test_pointer_event.rb +25 -10
  300. data/test/test_reflex.rb +36 -0
  301. data/test/test_screen.rb +24 -2
  302. data/test/test_snap_constraint.rb +140 -0
  303. data/test/test_text_event.rb +54 -0
  304. data/test/test_view.rb +152 -25
  305. data/test/test_wheel_constraint.rb +125 -0
  306. data/test/test_wheel_event.rb +24 -10
  307. data/test/test_window.rb +205 -43
  308. metadata +154 -10
  309. data/.github/workflows/utils.rb +0 -127
@@ -0,0 +1,54 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestClipboard < Test::Unit::TestCase
5
+
6
+ def setup()
7
+ @saved_text = Reflex::Clipboard.text
8
+ end
9
+
10
+ def teardown()
11
+ if @saved_text
12
+ Reflex::Clipboard.text = @saved_text
13
+ else
14
+ Reflex::Clipboard.clear
15
+ end
16
+ end
17
+
18
+ def test_initialize()
19
+ assert_raise(Reflex::ReflexError) {Reflex::Clipboard.new}
20
+ end
21
+
22
+ def test_text()
23
+ Reflex::Clipboard.text = 'ABC'
24
+ assert_equal 'ABC', Reflex::Clipboard.text
25
+ end
26
+
27
+ def test_text_utf8()
28
+ Reflex::Clipboard.text = 'あいう'
29
+ assert_equal 'あいう', Reflex::Clipboard.text
30
+ assert_equal Encoding::UTF_8, Reflex::Clipboard.text.encoding
31
+ end
32
+
33
+ def test_text_multiline()
34
+ Reflex::Clipboard.text = "A\nB\nC"
35
+ assert_equal "A\nB\nC", Reflex::Clipboard.text
36
+ end
37
+
38
+ def test_universal_accessor()
39
+ Reflex::Clipboard.text 'ABC'
40
+ assert_equal 'ABC', Reflex::Clipboard.text
41
+ end
42
+
43
+ def test_clear()
44
+ Reflex::Clipboard.text = 'ABC'
45
+ Reflex::Clipboard.clear
46
+ assert_nil Reflex::Clipboard.text
47
+ end unless linux?
48
+
49
+ def test_empty_text()
50
+ Reflex::Clipboard.text = ''
51
+ assert_equal '', Reflex::Clipboard.text
52
+ end unless linux?
53
+
54
+ end# TestClipboard
@@ -0,0 +1,36 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestColorEvent < Test::Unit::TestCase
5
+
6
+ def event(*args)
7
+ Reflex::ColorEvent.new(*args)
8
+ end
9
+
10
+ def color(*args)
11
+ Reflex::Color.new(*args)
12
+ end
13
+
14
+ def test_initialize()
15
+ assert_equal color(1, 0, 0), event(color(1, 0, 0)).color
16
+ assert_equal color(0, 1, 0, 0.5), event([0, 1, 0, 0.5]).color
17
+
18
+ assert_raise(ArgumentError) {event}
19
+ assert_raise(ArgumentError) {event(nil)}
20
+ end
21
+
22
+ def test_dup()
23
+ e1 = event color(1, 0, 0)
24
+ e2 = e1.dup
25
+ e1.block
26
+ e3 = e1.dup
27
+ assert_true e1.blocked?
28
+ assert_false e2.blocked?
29
+ assert_true e3.blocked?
30
+ end
31
+
32
+ def test_inspect()
33
+ assert_equal "#<Reflex::ColorEvent color:[1.0, 0.0, 0.0, 1.0]>", event(color(1, 0, 0)).inspect
34
+ end
35
+
36
+ end# TestColorEvent
@@ -0,0 +1,62 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestColorPicker < Test::Unit::TestCase
5
+
6
+ include HasWindow
7
+
8
+ def picker(*args, &block)
9
+ Reflex::ColorPicker.new(*args, &block)
10
+ end
11
+
12
+ def event(color)
13
+ Reflex::ColorEvent.new color
14
+ end
15
+
16
+ def color(*args)
17
+ Reflex::Color.new(*args)
18
+ end
19
+
20
+ def test_initialize()
21
+ assert_nil picker .owner
22
+ assert_false picker .alpha?
23
+ assert_true picker( alpha: true) .alpha?
24
+ assert_true picker {alpha true} .alpha?
25
+ assert_true picker {self.alpha = true} .alpha?
26
+ end
27
+
28
+ def test_owner()
29
+ w = window
30
+ picker.tap do |p|
31
+ p.owner = w
32
+ assert_equal w, p.owner
33
+ p.owner = nil
34
+ assert_nil p.owner
35
+ end
36
+
37
+ assert_raise(TypeError) {picker.owner = 1}
38
+ end
39
+
40
+ def test_alpha()
41
+ picker.tap do |p|
42
+ p.alpha = true
43
+ assert_true p.alpha?
44
+ p.alpha = false
45
+ assert_false p.alpha?
46
+ end
47
+ end
48
+
49
+ def test_color_block_stays_until_close()
50
+ # the native side calls call_color_block and clear_color_block
51
+ p, got = picker, []
52
+ p.instance_variable_set :@color_block, -> e {got << e.color}
53
+ p.send :call_color_block, event(color(1, 0, 0))
54
+ p.send :call_color_block, event(color(0, 1, 0))
55
+ assert_equal [color(1, 0, 0), color(0, 1, 0)], got
56
+
57
+ p.send :clear_color_block
58
+ p.send :call_color_block, event(color(0, 0, 1))
59
+ assert_equal [color(1, 0, 0), color(0, 1, 0)], got
60
+ end
61
+
62
+ end# TestColorPicker
@@ -0,0 +1,184 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestConstraint < Test::Unit::TestCase
5
+
6
+ include HasWindow
7
+
8
+ R = Reflex
9
+
10
+ def view(x = 0, y = 0, w = 50, h = 50, **options, &block)
11
+ R::View.new(
12
+ frame: [x, y, w, h],
13
+ shape: R::RectShape.new(density: 1),
14
+ **options, &block)
15
+ end
16
+
17
+ def point(...)
18
+ R::Point.new(...)
19
+ end
20
+
21
+ def setup_views(win = window)
22
+ v1 = view 100, 100, dynamic: true
23
+ v2 = view 200, 100, static: true
24
+ win&.add v1
25
+ win&.add v2
26
+ [v1, v2, win, win&.root]
27
+ end
28
+
29
+ def test_activation()
30
+ v1, v2, = setup_views nil
31
+ w = window
32
+
33
+ c = v1.link v2; assert_false c.active?
34
+ w.add v1; assert_false c.active?
35
+ w.add v2; assert_true c.active?
36
+ w.remove v1; assert_false c.active?
37
+ w.add v1; assert_true c.active?
38
+ c = v1.link v2; assert_true c.active?
39
+
40
+ assert_in_delta 100, c.current_distance
41
+ end
42
+
43
+ def test_pins()
44
+ v1, v2, = setup_views
45
+
46
+ c = v1.pin(10, 20).snap v2.pin(30, 40)
47
+ assert_equal v1, c.pins[0].view
48
+ assert_equal_point point(10, 20), c.pins[0].pos
49
+ assert_equal v2, c.pins[1].view
50
+ assert_equal_point point(30, 40), c.pins[1].pos
51
+ assert_equal [v1, v2], c.views
52
+ assert_equal [v1, v2], c.pins.map(&:view)
53
+ end
54
+
55
+ def test_resolved_positions()
56
+ v1, v2, = setup_views
57
+
58
+ assert_equal_point point( 25, 25), v1.pin .snap(v2) .pins[0].pos
59
+ assert_equal_point point(-75, 25), v1.pin .snap(v2) .pins[1].pos
60
+ assert_equal_point point( 10, 20), v1.pin(10, 20).snap(v2) .pins[0].pos
61
+ assert_equal_point point(-90, 20), v1.pin(10, 20).snap(v2) .pins[1].pos
62
+ assert_equal_point point( 130, 40), v1.pin .snap(v2, 30, 40).pins[0].pos
63
+ assert_equal_point point( 30, 40), v1.pin .snap(v2, 30, 40).pins[1].pos
64
+ assert_equal_point point( 50, 60), v1.pin(50, 60).snap(v2, 70, 80).pins[0].pos
65
+ assert_equal_point point( 70, 80), v1.pin(50, 60).snap(v2, 70, 80).pins[1].pos
66
+ end
67
+
68
+ def test_spring()
69
+ v1, v2, = setup_views
70
+
71
+ c = v1.link v2, spring: 4, damping: 0.5
72
+ assert_in_delta 4, c.spring
73
+ assert_in_delta 0.5, c.damping
74
+
75
+ c.spring = nil; assert_nil c.spring
76
+ c.spring = 8; assert_in_delta 8, c.spring
77
+ end
78
+
79
+ def test_collide()
80
+ v1, v2, = setup_views
81
+
82
+ assert_false v1.snap(v2) .collide?
83
+ assert_false v1.snap(v2, collide: false).collide?
84
+ assert_true v1.snap(v2, collide: true) .collide?
85
+ end
86
+
87
+ def test_selector()
88
+ v1, v2, = setup_views
89
+
90
+ c = v1.link v2, name: :name1, tag: [:tag1, :tag2]
91
+ assert_equal 'name1', c.name
92
+ assert_equal ['tag1', 'tag2'], c.tags.to_a
93
+ assert_true c.tag?(:tag1)
94
+ assert_true c.tag?('tag1')
95
+ assert_true c.tag?(:tag2)
96
+ assert_false c.tag?(:tag3)
97
+
98
+ c.name = :name2
99
+ assert_equal 'name2', c.name
100
+
101
+ assert_false c.tag?(:tag9)
102
+ c.add_tag :tag9
103
+ assert_true c.tag?(:tag9)
104
+ assert_equal ['tag1', 'tag2', 'tag9'], c.tags.to_a
105
+ c.remove_tag :tag9
106
+ assert_false c.tag?(:tag9)
107
+ assert_equal ['tag1', 'tag2'], c.tags.to_a
108
+
109
+ c.clear_tags
110
+ assert_equal [], c.tags.to_a
111
+ end
112
+
113
+ def test_block()
114
+ v1, v2, = setup_views
115
+
116
+ c = v1.link v2 do
117
+ distance 80
118
+ spring 4
119
+ end
120
+ assert_equal 80, c.distance
121
+ assert_in_delta 4, c.spring
122
+ end
123
+
124
+ def test_constraints()
125
+ v1, v2, = setup_views
126
+
127
+ c1 = v1.link v2
128
+ c2 = v1.snap v2
129
+ assert_equal [c1, c2], v1.constraints.to_a
130
+ assert_equal [c1, c2], v2.constraints.to_a
131
+ assert_equal [R::LinkConstraint, R::SnapConstraint], v1.constraints.map(&:class)
132
+ end
133
+
134
+ def test_remove()
135
+ v1, v2, _, parent = setup_views
136
+
137
+ c = v1.link v2
138
+ c.remove
139
+ assert_false c.active?
140
+ assert_true c.removed?
141
+ assert_equal [], v1.constraints.to_a
142
+ assert_equal [], v2.constraints.to_a
143
+
144
+ c.remove # idempotent
145
+
146
+ parent.remove v1
147
+ parent.add v1
148
+ assert_false c.active? # never comes back
149
+
150
+ assert_nothing_raised do
151
+ c.spring = 4
152
+ c.damping = 0.5
153
+ c.distance = 50
154
+ end
155
+ assert_false c.active? # removed constraint is inert
156
+ end
157
+
158
+ def test_constrain_to_itself_error()
159
+ setup_views.tap do |v,|
160
+ assert_raise(ArgumentError) {v.snap v}
161
+ end
162
+ setup_views.tap do |v,|
163
+ assert_raise(ArgumentError) {v.chase v}
164
+ assert_equal [], v.constraints.to_a # rejected self-constraint leaves no orphan
165
+ end
166
+ end
167
+
168
+ def test_world_mismatch_error()
169
+ win = window
170
+ parent1, child1 = view(0, 0, 500, 500), view(100, 100, dynamic: true)
171
+ parent2, child2 = view(0, 0, 500, 500), view(100, 100, dynamic: true)
172
+ parent1.add child1
173
+ parent2.add child2
174
+ win.add parent1
175
+ win.add parent2
176
+ child1.meter2pixel # create parent1 world
177
+ child2.meter2pixel # create parent2 world
178
+
179
+ assert_raise(R::PhysicsError) {child1.snap child2}
180
+ assert_equal [], child1.constraints.to_a # rejected pins leave no trace
181
+ assert_equal [], child2.constraints.to_a
182
+ end
183
+
184
+ end# TestConstraint
data/test/test_event.rb CHANGED
@@ -46,7 +46,7 @@ class TestEvent < Test::Unit::TestCase
46
46
  end
47
47
 
48
48
  def test_time()
49
- assert_in_delta Time.now.to_f, event.time, 0.001
49
+ assert_in_delta Time.now.to_f, event.time, 0.1
50
50
  end
51
51
 
52
52
  end# TestEvent
@@ -0,0 +1,48 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestFileDialog < Test::Unit::TestCase
5
+
6
+ def dialog(*args, &block)
7
+ Reflex::FileDialog.new(*args, &block)
8
+ end
9
+
10
+ def test_initialize()
11
+ assert_nil dialog .owner
12
+ assert_equal '', dialog .title
13
+ assert_equal 'hoge', dialog( title: 'hoge') .title
14
+ assert_equal 'hoge', dialog {title 'hoge'} .title
15
+ assert_equal 'hoge', dialog {self.title = 'hoge'} .title
16
+ assert_equal [], dialog .extensions
17
+ assert_equal ['png'], dialog( extensions: ['png']).extensions
18
+ assert_equal ['png'], dialog {extensions ['png']}.extensions
19
+ assert_equal ['png'], dialog {self.extensions = ['png']}.extensions
20
+ end
21
+
22
+ def test_extensions()
23
+ dialog.tap do |d|
24
+ d.extensions = %w[png jpg]
25
+ assert_equal %w[png jpg], d.extensions
26
+ d.extensions = ['txt']
27
+ assert_equal ['txt'], d.extensions
28
+ end
29
+
30
+ assert_equal %w[png], dialog(extensions: 'png') .extensions
31
+ assert_equal %w[png], dialog(extensions: ['png']) .extensions
32
+ assert_equal %w[png], dialog(extensions: [:png]) .extensions
33
+ assert_equal %w[jpg], dialog(extensions: ['.jpg']) .extensions
34
+ assert_equal %w[gif], dialog(extensions: ['..gif']) .extensions
35
+ assert_equal %w[tar.gz], dialog(extensions: ['.tar.gz']).extensions
36
+
37
+ assert_raise(ArgumentError) {dialog.extensions = ['']}
38
+ assert_raise(ArgumentError) {dialog.extensions = ['.']}
39
+ assert_raise(ArgumentError) {dialog.extensions = ['png', '']}
40
+ assert_raise(ArgumentError) {dialog.extensions = ['*.png']}
41
+ assert_raise(ArgumentError) {dialog.extensions = ['p?g']}
42
+ assert_raise(ArgumentError) {dialog.extensions = ['png;jpg']}
43
+ assert_raise(ArgumentError) {dialog.extensions = ['a/b']}
44
+ assert_raise(ArgumentError) {dialog.extensions = [/png/]}
45
+ assert_raise(ArgumentError) {dialog.extensions = [1]}
46
+ end
47
+
48
+ end# TestFileDialog
@@ -0,0 +1,43 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestFileEvent < Test::Unit::TestCase
5
+
6
+ Event = Reflex::FileEvent
7
+
8
+ NONE, OPEN, SAVE = Event::ACTION_NONE, Event::OPEN, Event::SAVE
9
+
10
+ def event(*args)
11
+ Event.new(*args)
12
+ end
13
+
14
+ def test_initialize()
15
+ assert_equal :open, event(OPEN, ['/a', '/b']).action
16
+ assert_equal ['/a', '/b'], event(OPEN, ['/a', '/b']).paths
17
+ assert_equal '/a', event(OPEN, ['/a', '/b']).path
18
+ end
19
+
20
+ def test_dup()
21
+ e1 = event OPEN, ['/a']
22
+ e2 = e1.dup
23
+ e1.block
24
+ e3 = e1.dup
25
+ assert_true e1.blocked?
26
+ assert_false e2.blocked?
27
+ assert_true e3.blocked?
28
+ end
29
+
30
+ def test_action()
31
+ assert_equal :none, event(NONE, []).action
32
+ assert_equal :open, event(OPEN, []).action
33
+ assert_equal :save, event(SAVE, []).action
34
+ end
35
+
36
+ def test_open_save?()
37
+ assert_true event(OPEN, ['/a']).open?
38
+ assert_false event(OPEN, ['/a']).save?
39
+ assert_false event(SAVE, ['/a']).open?
40
+ assert_true event(SAVE, ['/a']).save?
41
+ end
42
+
43
+ end# TestFileEvent
@@ -0,0 +1,54 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative 'helper'
3
+
4
+
5
+ class TestHasTextPreedit < Test::Unit::TestCase
6
+
7
+ PREEDIT, COMMIT = Reflex::TextEvent::PREEDIT, Reflex::TextEvent::COMMIT
8
+
9
+ def view(*args)
10
+ Class.new(Reflex::View) {include Reflex::HasTextPreedit}.new(*args)
11
+ end
12
+
13
+ def event(*args)
14
+ Reflex::TextEvent.new(*args)
15
+ end
16
+
17
+ def test_initial_state()
18
+ v = view
19
+ assert_equal '', v.preedit
20
+ assert_nil v.preedit_selection
21
+ assert_false v.preedit?
22
+ end
23
+
24
+ def test_preedit()
25
+ v = view
26
+ v.on_text_preedit event(PREEDIT, 'こんにちは', 1, 2)
27
+ assert_equal 'こんにちは', v.preedit
28
+ assert_equal 1...3, v.preedit_selection
29
+ assert_true v.preedit?
30
+ end
31
+
32
+ def test_cancel()
33
+ v = view
34
+ v.on_text_preedit event(PREEDIT, 'こんにちは', 1, 2)
35
+ v.on_text_preedit event(PREEDIT, '', -1, 0)
36
+ assert_equal '', v.preedit
37
+ assert_nil v.preedit_selection
38
+ assert_false v.preedit?
39
+ end
40
+
41
+ def test_commit_clears_preedit()
42
+ v = view
43
+ v.on_text_preedit event(PREEDIT, 'こんにちは', 1, 2)
44
+ v.on_text_commit event(COMMIT, '今日は', -1, 0)
45
+ assert_equal '', v.preedit
46
+ assert_nil v.preedit_selection
47
+ assert_false v.preedit?
48
+ end
49
+
50
+ def test_include_accepts_text_input()
51
+ assert_true view.accepts_text_input?
52
+ end
53
+
54
+ end# TestHasTextPreedit
@@ -3,10 +3,12 @@ require_relative 'helper'
3
3
 
4
4
  class TestKeyEvent < Test::Unit::TestCase
5
5
 
6
- DOWN, UP = Reflex::KeyEvent::DOWN, Reflex::KeyEvent::UP
6
+ R = Reflex
7
+
8
+ DOWN, UP = R::KeyEvent::DOWN, R::KeyEvent::UP
7
9
 
8
10
  def event(*args)
9
- Reflex::KeyEvent.new(*args)
11
+ R::KeyEvent.new(*args)
10
12
  end
11
13
 
12
14
  def test_initialize()
@@ -43,4 +45,23 @@ class TestKeyEvent < Test::Unit::TestCase
43
45
  assert_nil event(DOWN, nil, 1, 2, 3).chars
44
46
  end
45
47
 
48
+ def test_key()
49
+ assert_equal :a, event(DOWN, 'a', R::KEY_A, 0, 0).key
50
+ assert_equal :f1, event(DOWN, '', R::KEY_F1, 0, 0).key
51
+ assert_equal :left, event(DOWN, '', R::KEY_LEFT, 0, 0).key
52
+ end
53
+
54
+ def test_modifiers()
55
+ e = event DOWN, 'a', 1, R::MOD_CONTROL | R::MOD_CAPS, 0
56
+ assert_equal [:control], e.modifiers
57
+ assert_equal [:control, :caps], e.modifiers(all: true)
58
+ end
59
+
60
+ def test_inspect()
61
+ hex_z = R::KEY_Z.to_s(16).upcase
62
+ assert_equal(
63
+ "#<Reflex::KeyEvent :down chars:'z' key:z code:0x#{hex_z} mod:[:control, :caps] repeat:2 captured?:false>",
64
+ event(DOWN, 'z', R::KEY_Z, R::MOD_CONTROL | R::MOD_CAPS, 2).inspect)
65
+ end
66
+
46
67
  end# TestKeyEvent