reflexion 0.1.14 → 0.1.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/capture_event.cpp +4 -5
  3. data/.doc/ext/reflex/contact_event.cpp +4 -7
  4. data/.doc/ext/reflex/draw_event.cpp +3 -4
  5. data/.doc/ext/reflex/frame_event.cpp +7 -8
  6. data/.doc/ext/reflex/key_event.cpp +7 -8
  7. data/.doc/ext/reflex/motion_event.cpp +3 -5
  8. data/.doc/ext/reflex/pointer_event.cpp +23 -15
  9. data/.doc/ext/reflex/reflex.cpp +3 -1
  10. data/.doc/ext/reflex/scroll_event.cpp +8 -9
  11. data/.doc/ext/reflex/update_event.cpp +4 -5
  12. data/.doc/ext/reflex/wheel_event.cpp +5 -6
  13. data/VERSION +1 -1
  14. data/ext/reflex/capture_event.cpp +3 -4
  15. data/ext/reflex/contact_event.cpp +3 -6
  16. data/ext/reflex/draw_event.cpp +2 -3
  17. data/ext/reflex/frame_event.cpp +6 -7
  18. data/ext/reflex/key_event.cpp +6 -7
  19. data/ext/reflex/motion_event.cpp +2 -4
  20. data/ext/reflex/pointer_event.cpp +22 -14
  21. data/ext/reflex/reflex.cpp +3 -1
  22. data/ext/reflex/scroll_event.cpp +8 -9
  23. data/ext/reflex/update_event.cpp +3 -4
  24. data/ext/reflex/wheel_event.cpp +4 -5
  25. data/include/reflex/defs.h +0 -2
  26. data/include/reflex/event.h +15 -15
  27. data/include/reflex/exception.h +9 -3
  28. data/include/reflex/ruby/event.h +11 -11
  29. data/include/reflex/ruby/reflex.h +1 -0
  30. data/include/reflex/style.h +30 -4
  31. data/lib/reflex.rb +2 -1
  32. data/lib/reflex/camera.rb +13 -0
  33. data/lib/reflex/pointer_event.rb +4 -0
  34. data/reflex.gemspec +4 -4
  35. data/samples/camera.rb +45 -0
  36. data/samples/shapes.rb +16 -0
  37. data/src/event.cpp +7 -7
  38. data/src/ios/view_controller.h +4 -0
  39. data/src/ios/view_controller.mm +22 -34
  40. data/src/osx/native_window.mm +10 -26
  41. data/src/shape.cpp +4 -4
  42. data/src/style.cpp +4 -4
  43. data/src/timer.cpp +3 -6
  44. data/src/view.cpp +2 -2
  45. data/src/window.cpp +27 -0
  46. data/src/window.h +2 -0
  47. data/test/test_pointer_event.rb +79 -34
  48. metadata +15 -13
@@ -47,6 +47,22 @@ Reflex::Window.new do
47
47
  translate 100, 0
48
48
  ellipse x, y, w, h, hole: 10, from: 200, to: 300
49
49
  polygon Rays::Polygon.ellipse x, y2, w, h, hole: 10, from: 200, to: 300
50
+
51
+ translate 100, 0
52
+ curve x, y, x + w, y, x + w, y + h, x, y + h
53
+ polygon Rays::Polygon.curve x, y2, x + w, y2, x + w, y2 + h, x, y2 + h
54
+
55
+ translate 100, 0
56
+ curve x, y, x + w, y, x + w, y + h, x, y + h, loop: true
57
+ polygon Rays::Polygon.curve x, y2, x + w, y2, x + w, y2 + h, x, y2 + h, loop: true
58
+
59
+ translate 100, 0
60
+ bezier x, y, x + w, y, x + w, y + h, x, y + h
61
+ polygon Rays::Polygon.bezier x, y2, x + w, y2, x + w, y2 + h, x, y2 + h
62
+
63
+ translate 100, 0
64
+ bezier x, y, x + w, y, x + w, y + h, x, y + h, loop: true
65
+ polygon Rays::Polygon.bezier x, y2, x + w, y2, x + w, y2 + h, x, y2 + h, loop: true
50
66
  end
51
67
 
52
68
  translate 0, 200
@@ -28,12 +28,6 @@ namespace Reflex
28
28
  }
29
29
 
30
30
 
31
- MotionEvent::MotionEvent (const Point& gravity)
32
- : gravity(gravity)
33
- {
34
- }
35
-
36
-
37
31
  UpdateEvent::UpdateEvent (double now, float dt)
38
32
  : now(now), dt(dt)
39
33
  {
@@ -170,7 +164,7 @@ namespace Reflex
170
164
  if (positions_)
171
165
  {
172
166
  for (size_t i = 0; i < size; ++i)
173
- positions[i] = *(Rays::Coord3*) &positions_[i];
167
+ positions[i] = *(Coord3*) &positions_[i];
174
168
  }
175
169
  }
176
170
 
@@ -302,4 +296,10 @@ namespace Reflex
302
296
  }
303
297
 
304
298
 
299
+ MotionEvent::MotionEvent (const Point& gravity)
300
+ : gravity(gravity)
301
+ {
302
+ }
303
+
304
+
305
305
  }// Reflex
@@ -13,6 +13,10 @@
13
13
 
14
14
  - (ReflexView*) createReflexView;
15
15
 
16
+ - (void) startTimer;
17
+
18
+ - (void) stopTimer;
19
+
16
20
  - (void) viewDidResize;
17
21
 
18
22
  @end// ReflexViewController
@@ -144,11 +144,15 @@ ReflexViewController_get_show_fun ()
144
144
  }
145
145
 
146
146
  - (void) dealloc
147
+ {
148
+ [self cleanup];
149
+ [super dealloc];
150
+ }
151
+
152
+ - (void) cleanup
147
153
  {
148
154
  [self cleanupReflexView];
149
155
  [self unbind];
150
-
151
- [super dealloc];
152
156
  }
153
157
 
154
158
  - (void) bind: (Reflex::Window*) window
@@ -160,7 +164,8 @@ ReflexViewController_get_show_fun ()
160
164
  if (data.view_controller)
161
165
  Reflex::invalid_state_error(__FILE__, __LINE__);
162
166
 
163
- data.view_controller = [self retain];
167
+ // ruby value references view controller weakly.
168
+ data.view_controller = self;
164
169
 
165
170
  // Reflex::Window is not constructed completely,
166
171
  // so can not call ClassWrapper::retain().
@@ -180,8 +185,6 @@ ReflexViewController_get_show_fun ()
180
185
  ptr_for_rebind->Xot::template RefCountable<>::release();
181
186
  ptr_for_rebind = NULL;
182
187
  }
183
-
184
- assert(pwindow && !ptr_for_rebind);
185
188
  }
186
189
 
187
190
  - (void) unbind
@@ -189,12 +192,7 @@ ReflexViewController_get_show_fun ()
189
192
  [self rebind];
190
193
  if (!pwindow) return;
191
194
 
192
- Reflex::WindowData& data = Window_get_data(pwindow);
193
- if (data.view_controller)
194
- {
195
- [data.view_controller release];
196
- data.view_controller = nil;
197
- }
195
+ Window_get_data(pwindow).view_controller = nil;
198
196
 
199
197
  pwindow->release();
200
198
  pwindow = NULL;
@@ -211,7 +209,7 @@ ReflexViewController_get_show_fun ()
211
209
  [super didReceiveMemoryWarning];
212
210
 
213
211
  if ([self isViewLoaded] && !self.view.window)
214
- [self cleanupReflexView];
212
+ [self cleanup];
215
213
  }
216
214
 
217
215
  - (void) viewDidLoad
@@ -262,7 +260,7 @@ ReflexViewController_get_show_fun ()
262
260
 
263
261
  EAGLContext* context = view.context;
264
262
  if (context && context == [EAGLContext currentContext])
265
- [EAGLContext setCurrentContext: nil];
263
+ [EAGLContext setCurrentContext: (EAGLContext*) Rays::get_offscreen_context()];
266
264
 
267
265
  [view removeFromSuperview];
268
266
 
@@ -272,7 +270,7 @@ ReflexViewController_get_show_fun ()
272
270
  - (void) viewDidAppear: (BOOL) animated
273
271
  {
274
272
  [super viewDidAppear: animated];
275
- [self startTimer: 60];
273
+ [self startTimer];
276
274
  }
277
275
 
278
276
  - (void) viewDidDisappear: (BOOL) animated
@@ -281,6 +279,11 @@ ReflexViewController_get_show_fun ()
281
279
  [super viewDidDisappear: animated];
282
280
  }
283
281
 
282
+ - (void) startTimer
283
+ {
284
+ [self startTimer: 60];
285
+ }
286
+
284
287
  - (void) startTimer: (int) fps
285
288
  {
286
289
  [self stopTimer];
@@ -344,22 +347,7 @@ ReflexViewController_get_show_fun ()
344
347
  win->self->prev_fps = fps;
345
348
 
346
349
  Reflex::DrawEvent e(dt, fps);
347
-
348
- e.painter = win->painter();
349
- if (!e.painter)
350
- Xot::invalid_state_error(__FILE__, __LINE__);
351
-
352
- Rays::Bounds frame = win->frame();
353
- e.bounds.reset(0, 0, frame.width, frame.height);
354
-
355
- e.painter->begin();
356
- e.painter->clear();
357
-
358
- win->on_draw(&e);
359
- if (!e.is_blocked())
360
- Reflex::View_draw_tree(win->root(), e, 0, frame.move_to(0));
361
-
362
- e.painter->end();
350
+ Window_call_draw_event(win, &e);
363
351
  }
364
352
 
365
353
  - (void) viewDidResize
@@ -399,7 +387,7 @@ ReflexViewController_get_show_fun ()
399
387
  if (!win) return;
400
388
 
401
389
  Reflex::NativePointerEvent e(
402
- touches, event, self.view, Reflex::PointerEvent::DOWN);
390
+ touches, event, self.reflexView, Reflex::PointerEvent::DOWN);
403
391
  win->on_pointer(&e);
404
392
  }
405
393
 
@@ -409,7 +397,7 @@ ReflexViewController_get_show_fun ()
409
397
  if (!win) return;
410
398
 
411
399
  Reflex::NativePointerEvent e(
412
- touches, event, self.view, Reflex::PointerEvent::UP);
400
+ touches, event, self.reflexView, Reflex::PointerEvent::UP);
413
401
  win->on_pointer(&e);
414
402
  }
415
403
 
@@ -419,7 +407,7 @@ ReflexViewController_get_show_fun ()
419
407
  if (!win) return;
420
408
 
421
409
  Reflex::NativePointerEvent e(
422
- touches, event, self.view, Reflex::PointerEvent::UP);
410
+ touches, event, self.reflexView, Reflex::PointerEvent::UP);
423
411
  win->on_pointer(&e);
424
412
  }
425
413
 
@@ -429,7 +417,7 @@ ReflexViewController_get_show_fun ()
429
417
  if (!win) return;
430
418
 
431
419
  Reflex::NativePointerEvent e(
432
- touches, event, self.view, Reflex::PointerEvent::MOVE);
420
+ touches, event, self.reflexView, Reflex::PointerEvent::MOVE);
433
421
  win->on_pointer(&e);
434
422
  }
435
423
 
@@ -43,7 +43,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
43
43
 
44
44
  [self setDelegate: self];
45
45
  [self setupContentView];
46
- [self startTimer: 60];
46
+ [self startTimer];
47
47
 
48
48
  return self;
49
49
  }
@@ -66,7 +66,8 @@ static const NSUInteger WINDOW_STYLE_MASK =
66
66
  if (data.native)
67
67
  Reflex::invalid_state_error(__FILE__, __LINE__);
68
68
 
69
- data.native = [self retain];
69
+ // ruby value references native window weakly.
70
+ data.native = self;
70
71
 
71
72
  // Reflex::Window is not constructed completely,
72
73
  // so can not call ClassWrapper::retain().
@@ -86,8 +87,6 @@ static const NSUInteger WINDOW_STYLE_MASK =
86
87
  ptr_for_rebind->Xot::template RefCountable<>::release();
87
88
  ptr_for_rebind = NULL;
88
89
  }
89
-
90
- assert(pwindow && !ptr_for_rebind);
91
90
  }
92
91
 
93
92
  - (void) unbind
@@ -95,12 +94,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
95
94
  [self rebind];
96
95
  if (!pwindow) return;
97
96
 
98
- Reflex::WindowData& data = Window_get_data(pwindow);
99
- if (data.native)
100
- {
101
- [data.native release];
102
- data.native = nil;
103
- }
97
+ Window_get_data(pwindow).native = nil;
104
98
 
105
99
  pwindow->release();
106
100
  pwindow = NULL;
@@ -120,6 +114,11 @@ static const NSUInteger WINDOW_STYLE_MASK =
120
114
  [self setContentView: view];
121
115
  }
122
116
 
117
+ - (void) startTimer
118
+ {
119
+ [self startTimer: 60];
120
+ }
121
+
123
122
  - (void) startTimer: (int) fps
124
123
  {
125
124
  [self stopTimer];
@@ -183,22 +182,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
183
182
  win->self->prev_fps = fps;
184
183
 
185
184
  Reflex::DrawEvent e(dt, fps);
186
-
187
- e.painter = win->painter();
188
- if (!e.painter)
189
- Xot::invalid_state_error(__FILE__, __LINE__);
190
-
191
- Rays::Bounds frame = win->frame();
192
- e.bounds.reset(0, 0, frame.width, frame.height);
193
-
194
- e.painter->begin();
195
- e.painter->clear();
196
-
197
- win->on_draw(&e);
198
- if (!e.is_blocked())
199
- Reflex::View_draw_tree(win->root(), e, 0, frame.move_to(0));
200
-
201
- e.painter->end();
185
+ Window_call_draw_event(win, &e);
202
186
  }
203
187
 
204
188
  - (BOOL) windowShouldClose: (id) sender
@@ -52,8 +52,8 @@ namespace Reflex
52
52
  if (!style) return NULL;
53
53
 
54
54
  return is_default_shape(shape)
55
- ? &style->background_fill()
56
- : &style->foreground_fill();
55
+ ? &style->background_fill()
56
+ : &style->foreground_fill();
57
57
  }
58
58
 
59
59
  static coord
@@ -65,8 +65,8 @@ namespace Reflex
65
65
  if (!style) return 0;
66
66
 
67
67
  return is_default_shape(shape)
68
- ? style->background_stroke_width()
69
- : style->foreground_stroke_width();
68
+ ? style->background_stroke_width()
69
+ : style->foreground_stroke_width();
70
70
  }
71
71
 
72
72
  static bool
@@ -201,7 +201,7 @@ namespace Reflex
201
201
  void
202
202
  StyleLength::reset (Type type, Value value)
203
203
  {
204
- if (type < NONE || TYPE_LAST <= type)
204
+ if (type < NONE || TYPE_MAX <= type)
205
205
  argument_error(__FILE__, __LINE__);
206
206
 
207
207
  if (type == FIT && value != 1)
@@ -225,7 +225,7 @@ namespace Reflex
225
225
 
226
226
  StyleLength::operator bool () const
227
227
  {
228
- return NONE < self->type && self->type < TYPE_LAST;
228
+ return NONE < self->type && self->type < TYPE_MAX;
229
229
  }
230
230
 
231
231
  bool
@@ -615,8 +615,8 @@ namespace Reflex
615
615
  Style::set_flow (Flow main, Flow sub)
616
616
  {
617
617
  if (
618
- main < FLOW_NONE || FLOW_LAST <= main ||
619
- sub < FLOW_NONE || FLOW_LAST <= sub ||
618
+ main < FLOW_NONE || FLOW_MAX <= main ||
619
+ sub < FLOW_NONE || FLOW_MAX <= sub ||
620
620
  (main != FLOW_NONE && (get_flow_dir(main) == get_flow_dir(sub))) ||
621
621
  (main == FLOW_NONE && sub != FLOW_NONE))
622
622
  {
@@ -162,8 +162,7 @@ namespace Reflex
162
162
  {
163
163
  assert(timer && *timer);
164
164
 
165
- List::iterator end = timers.end();
166
- for (List::iterator it = timers.begin(); it != end; ++it)
165
+ for (auto it = timers.begin(), end = timers.end(); it != end; ++it)
167
166
  {
168
167
  if (timer->self->next_time < (*it)->self->next_time)
169
168
  {
@@ -219,8 +218,7 @@ namespace Reflex
219
218
  if (!timer)
220
219
  argument_error(__FILE__, __LINE__);
221
220
 
222
- List::iterator end = timers.end();
223
- for (List::iterator it = timers.begin(); it != end; ++it)
221
+ for (auto it = timers.begin(), end = timers.end(); it != end; ++it)
224
222
  {
225
223
  if (timer->id() == (*it)->id())
226
224
  timers.erase(it);
@@ -261,8 +259,7 @@ namespace Reflex
261
259
  void
262
260
  Timers::fire (double now)
263
261
  {
264
- List::iterator end = timers.end();
265
- for (List::iterator it = timers.begin(); it != end; ++it)
262
+ for (auto it = timers.begin(), end = timers.end(); it != end; ++it)
266
263
  {
267
264
  Timer* timer = it->get();
268
265
  if (!is_time_to_fire(timer, now))
@@ -189,8 +189,8 @@ namespace Reflex
189
189
  {
190
190
  World* world = parent_world();
191
191
  Body* b = world
192
- ? new Body(world, frame.position(), angle)
193
- : Body_create_temporary();
192
+ ? new Body(world, frame.position(), angle)
193
+ : Body_create_temporary();
194
194
  assert(b);
195
195
 
196
196
  pbody.reset(b);
@@ -36,6 +36,33 @@ namespace Reflex
36
36
  }
37
37
  }
38
38
 
39
+ void
40
+ Window_call_draw_event (Window* window, DrawEvent* event)
41
+ {
42
+ if (!window || !event)
43
+ argument_error(__FILE__, __LINE__);
44
+
45
+ Painter* painter = window->painter();
46
+ if (!painter)
47
+ Xot::invalid_state_error(__FILE__, __LINE__);
48
+
49
+ Rays::Bounds frame = window->frame();
50
+
51
+ event->painter = painter;
52
+ event->bounds.reset(0, 0, frame.width, frame.height);
53
+
54
+ painter->begin();
55
+ painter->push_state();
56
+ painter->clear();
57
+
58
+ window->on_draw(event);
59
+ if (!event->is_blocked())
60
+ Reflex::View_draw_tree(window->root(), *event, 0, frame.move_to(0));
61
+
62
+ painter->pop_state();
63
+ painter->end();
64
+ }
65
+
39
66
  namespace global
40
67
  {
41
68
 
@@ -80,6 +80,8 @@ namespace Reflex
80
80
 
81
81
  void Window_set_focus (Window* window, View* view);
82
82
 
83
+ void Window_call_draw_event (Window* window, DrawEvent* event);
84
+
83
85
 
84
86
  typedef View* (*Window_CreateRootViewFun) ();
85
87
 
@@ -6,80 +6,125 @@ require_relative 'helper'
6
6
 
7
7
  class TestPointerEvent < Test::Unit::TestCase
8
8
 
9
+ E = Reflex::PointerEvent
9
10
  T = true
10
11
  F = false
11
12
 
12
- def event (*args)
13
- Reflex::PointerEvent.new *args
13
+ TYPE_NONE = E::TYPE_NONE
14
+ DOWN = E::TYPE_DOWN
15
+ UP = E::TYPE_UP
16
+ MOVE = E::TYPE_MOVE
17
+
18
+ POINTER_NONE = E::POINTER_NONE
19
+ LEFT = E::POINTER_MOUSE_LEFT
20
+ RIGHT = E::POINTER_MOUSE_RIGHT
21
+ MIDDLE = E::POINTER_MOUSE_MIDDLE
22
+ TOUCH = E::POINTER_TOUCH
23
+ PEN = E::POINTER_PEN
24
+
25
+ def event (
26
+ type = TYPE_NONE, pointer_type = POINTER_NONE,
27
+ modifiers = 0, count = 0, drag = false,
28
+ positions: [0])
29
+
30
+ Reflex::PointerEvent.new type, pointer_type, modifiers, count, drag, positions
14
31
  end
15
32
 
16
- def type (arg)
17
- event(arg).tap do |o|
18
- def o.test ()
19
- [type, down?, up?, move?]
20
- end
21
- end
33
+ def test_initialize ()
34
+ assert_nothing_raised {event positions: 10.times.to_a}
35
+ assert_raise(ArgumentError) {event positions: 11.times.to_a}
36
+ assert_raise(ArgumentError) {event positions: []}
22
37
  end
23
38
 
24
39
  def test_type ()
25
- o = type Reflex::PointerEvent::TYPE_NONE
40
+ def type (arg)
41
+ event(arg).tap do |o|
42
+ def o.test ()
43
+ [type, down?, up?, move?]
44
+ end
45
+ end
46
+ end
47
+
48
+ o = type TYPE_NONE
26
49
  assert_equal [:none, F, F, F], o.test
27
50
 
28
- o = type Reflex::PointerEvent::TYPE_DOWN
51
+ o = type DOWN
29
52
  assert_equal [:down, T, F, F], o.test
30
53
 
31
- o = type Reflex::PointerEvent::TYPE_UP
54
+ o = type UP
32
55
  assert_equal [:up, F, T, F], o.test
33
56
 
34
- o = type Reflex::PointerEvent::TYPE_MOVE
57
+ o = type MOVE
35
58
  assert_equal [:move, F, F, T], o.test
36
59
  end
37
60
 
38
- def pointer_type (arg)
39
- event(Reflex::PointerEvent::TYPE_NONE, arg).tap do |o|
40
- def o.test ()
41
- [pointer_type, left?, right?, middle?, touch?, pen?]
61
+ def test_pointer_type ()
62
+ def pointer_type (arg)
63
+ event(TYPE_NONE, arg).tap do |o|
64
+ def o.test ()
65
+ [pointer_type, left?, right?, middle?, touch?, pen?]
66
+ end
42
67
  end
43
68
  end
44
- end
45
69
 
46
- def test_pointer_type ()
47
- o = pointer_type Reflex::PointerEvent::POINTER_NONE
70
+ o = pointer_type POINTER_NONE
48
71
  assert_equal [[], F, F, F, F, F], o.test
49
72
 
50
- o = pointer_type Reflex::PointerEvent::POINTER_MOUSE_LEFT
73
+ o = pointer_type LEFT
51
74
  assert_equal [[:mouse_left], T, F, F, F, F], o.test
52
75
 
53
- o = pointer_type Reflex::PointerEvent::POINTER_MOUSE_RIGHT
76
+ o = pointer_type RIGHT
54
77
  assert_equal [[:mouse_right], F, T, F, F, F], o.test
55
78
 
56
- o = pointer_type Reflex::PointerEvent::POINTER_MOUSE_MIDDLE
79
+ o = pointer_type MIDDLE
57
80
  assert_equal [[:mouse_middle], F, F, T, F, F], o.test
58
81
 
59
- o = pointer_type Reflex::PointerEvent::POINTER_TOUCH
82
+ o = pointer_type TOUCH
60
83
  assert_equal [[:touch], F, F, F, T, F], o.test
61
84
 
62
- o = pointer_type Reflex::PointerEvent::POINTER_PEN
85
+ o = pointer_type PEN
63
86
  assert_equal [[:pen], F, F, F, F, T], o.test
64
87
 
65
- o = pointer_type Reflex::PointerEvent::POINTER_MOUSE_LEFT |
66
- Reflex::PointerEvent::POINTER_MOUSE_RIGHT
88
+ o = pointer_type LEFT | RIGHT
67
89
  types = [:mouse_left, :mouse_right]
68
90
  assert_equal [types, T, T, F, F, F], o.test
69
91
 
70
- o = pointer_type Reflex::PointerEvent::POINTER_MOUSE_LEFT |
71
- Reflex::PointerEvent::POINTER_MOUSE_RIGHT |
72
- Reflex::PointerEvent::POINTER_MOUSE_MIDDLE
92
+ o = pointer_type LEFT | RIGHT | MIDDLE
73
93
  types = [:mouse_left, :mouse_right, :mouse_middle]
74
94
  assert_equal [types, T, T, T, F, F], o.test
75
95
 
76
- o = pointer_type Reflex::PointerEvent::POINTER_MOUSE_LEFT |
77
- Reflex::PointerEvent::POINTER_MOUSE_RIGHT |
78
- Reflex::PointerEvent::POINTER_MOUSE_MIDDLE |
79
- Reflex::PointerEvent::POINTER_TOUCH |
80
- Reflex::PointerEvent::POINTER_PEN
96
+ o = pointer_type LEFT | RIGHT | MIDDLE | TOUCH | PEN
81
97
  types = [:mouse_left, :mouse_right, :mouse_middle, :touch, :pen]
82
98
  assert_equal [types, T, T, T, T, T], o.test
83
99
  end
84
100
 
101
+ def test_size ()
102
+ assert_equal 1, event(positions: [0] ).size
103
+ assert_equal 2, event(positions: [0, 1]).size
104
+ end
105
+
106
+ def test_xy ()
107
+ assert_equal 0, event(positions: [[0, 1], [2, 3]]).x
108
+ assert_equal 1, event(positions: [[0, 1], [2, 3]]).y
109
+ end
110
+
111
+ def test_position ()
112
+ assert_equal [0, 1], event(positions: [[0, 1], [2, 3]]).position.to_a
113
+ end
114
+
115
+ def test_positions ()
116
+ assert_equal [[0, 0]], event(positions: [0] ).positions.map(&:to_a)
117
+ assert_equal [[0, 0], [1, 1]], event(positions: [0, 1]).positions.map(&:to_a)
118
+
119
+ assert_equal [[0, 1]], event(positions: [[0, 1]] ).positions.map(&:to_a)
120
+ assert_equal [[0, 1], [2, 3]], event(positions: [[0, 1], [2, 3]]).positions.map(&:to_a)
121
+ end
122
+
123
+ def test_at ()
124
+ assert_equal [0, 1], event(positions: [[0, 1], [2, 3]])[0].to_a
125
+ assert_equal [2, 3], event(positions: [[0, 1], [2, 3]])[1].to_a
126
+ assert_raise(IndexError) {event(positions: [[0, 1], [2, 3]])[-1]}
127
+ assert_raise(IndexError) {event(positions: [[0, 1], [2, 3]])[2]}
128
+ end
129
+
85
130
  end# TestPointerEvent