MINT-core 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. data/Gemfile +22 -3
  2. data/Gemfile.lock +98 -22
  3. data/History.txt +262 -0
  4. data/LICENSE +30 -0
  5. data/MINT-core.gemspec +25 -80
  6. data/Manifest.txt +145 -30
  7. data/README.rdoc +6 -163
  8. data/Rakefile +16 -17
  9. data/bin/mint-aui +3 -3
  10. data/bin/mint-cui-gfx +3 -2
  11. data/bin/mint-juggernaut.sh +0 -0
  12. data/bin/mint-tuplespace +0 -0
  13. data/lib/MINT-core.rb +53 -15
  14. data/lib/MINT-core/agent/agent.rb +1 -1
  15. data/lib/MINT-core/agent/aui.rb +0 -14
  16. data/lib/MINT-core/agent/auicontrol.rb +91 -38
  17. data/lib/MINT-core/agent/cui-gfx.rb +3 -3
  18. data/lib/MINT-core/agent/cuicontrol.rb +94 -24
  19. data/lib/MINT-core/connector/redis_connector.rb +16 -0
  20. data/lib/MINT-core/manager/mapping_manager.rb +101 -0
  21. data/lib/MINT-core/manager/mapping_parser.rb +89 -0
  22. data/lib/MINT-core/manager/mapping_server.rb +99 -0
  23. data/lib/MINT-core/manager/position_updater.rb +33 -0
  24. data/lib/MINT-core/manager/scxml_client.rb +118 -0
  25. data/lib/MINT-core/manager/scxml_server.rb +86 -0
  26. data/lib/MINT-core/mapping/action/action.rb +32 -0
  27. data/lib/MINT-core/mapping/action/backend_action.rb +32 -0
  28. data/lib/MINT-core/mapping/action/bind_action.rb +88 -0
  29. data/lib/MINT-core/mapping/action/event_action.rb +40 -0
  30. data/lib/MINT-core/mapping/complementary_mapping.rb +31 -0
  31. data/lib/MINT-core/mapping/mapping.rb +170 -34
  32. data/lib/MINT-core/mapping/observation/negation_observation.rb +64 -0
  33. data/lib/MINT-core/mapping/observation/observation.rb +219 -0
  34. data/lib/MINT-core/mapping/sequential.rb +1 -2
  35. data/lib/MINT-core/mapping/sequential_mapping.rb +60 -0
  36. data/lib/MINT-core/model/aui/AIChoiceElement.rb +17 -0
  37. data/lib/MINT-core/model/aui/AICommand.rb +7 -0
  38. data/lib/MINT-core/model/aui/AIContainer.rb +73 -0
  39. data/lib/MINT-core/model/aui/AIContext.rb +12 -0
  40. data/lib/MINT-core/model/aui/AIIN.rb +8 -0
  41. data/lib/MINT-core/model/aui/AIINContinuous.rb +56 -0
  42. data/lib/MINT-core/model/aui/AIINDiscrete.rb +8 -0
  43. data/lib/MINT-core/model/aui/AIMultiChoice.rb +1 -2
  44. data/lib/MINT-core/model/aui/AIMultiChoiceElement.rb +4 -51
  45. data/lib/MINT-core/model/aui/AIO.rb +76 -123
  46. data/lib/MINT-core/model/aui/AIOUT.rb +8 -0
  47. data/lib/MINT-core/model/aui/AIOUTContinuous.rb +61 -0
  48. data/lib/MINT-core/model/aui/AIReference.rb +16 -0
  49. data/lib/MINT-core/model/aui/AISingleChoice.rb +18 -1
  50. data/lib/MINT-core/model/aui/AISingleChoiceElement.rb +10 -56
  51. data/lib/MINT-core/model/aui/AISinglePresence.rb +39 -71
  52. data/lib/MINT-core/model/aui/aicommand.scxml +47 -0
  53. data/lib/MINT-core/model/aui/aicontainer.scxml +41 -0
  54. data/lib/MINT-core/model/aui/aicontext.scxml +34 -0
  55. data/lib/MINT-core/model/aui/aiincontinuous.scxml +59 -0
  56. data/lib/MINT-core/model/aui/aiinrange.scxml +86 -0
  57. data/lib/MINT-core/model/aui/aimultichoice.scxml +67 -0
  58. data/lib/MINT-core/model/aui/aimultichoiceelement.scxml +51 -0
  59. data/lib/MINT-core/model/aui/aio.scxml +18 -27
  60. data/lib/MINT-core/model/aui/aioutcontinuous.scxml +66 -0
  61. data/lib/MINT-core/model/aui/aireference.scxml +28 -0
  62. data/lib/MINT-core/model/aui/aisinglechoice.scxml +60 -0
  63. data/lib/MINT-core/model/aui/aisinglechoiceelement.scxml +45 -60
  64. data/lib/MINT-core/model/aui/aisinglepresence.scxml +15 -24
  65. data/lib/MINT-core/model/aui/model.rb +15 -38
  66. data/lib/MINT-core/model/cui/gfx/CIC.rb +34 -10
  67. data/lib/MINT-core/model/cui/gfx/CIO.rb +66 -115
  68. data/lib/MINT-core/model/cui/gfx/CarouFredSel.scxml +58 -0
  69. data/lib/MINT-core/model/cui/gfx/MarkableRadioButton.rb +8 -0
  70. data/lib/MINT-core/model/cui/gfx/RadioButton.rb +8 -0
  71. data/lib/MINT-core/model/cui/gfx/RadioButtonGroup.rb +6 -0
  72. data/lib/MINT-core/model/cui/gfx/button.rb +16 -0
  73. data/lib/MINT-core/model/cui/gfx/button.scxml +58 -0
  74. data/lib/MINT-core/model/cui/gfx/caroufredsel.rb +48 -0
  75. data/lib/MINT-core/model/cui/gfx/cic.scxml +57 -0
  76. data/lib/MINT-core/model/cui/gfx/cio.scxml +54 -0
  77. data/lib/MINT-core/model/cui/gfx/markableradiobutton.scxml +67 -0
  78. data/lib/MINT-core/model/cui/gfx/model.rb +39 -176
  79. data/lib/MINT-core/model/cui/gfx/radiobutton.scxml +59 -0
  80. data/lib/MINT-core/model/interactor.rb +167 -46
  81. data/lib/MINT-core/model/interactor.scxml +3 -0
  82. data/lib/MINT-core/model/interactor_helpers.rb +25 -0
  83. data/lib/MINT-core/model/ir/body/OneHandPoseNavigation.rb +15 -0
  84. data/lib/MINT-core/model/ir/body/body.rb +5 -0
  85. data/lib/MINT-core/model/ir/body/fingertip.rb +114 -0
  86. data/lib/MINT-core/model/ir/body/fingertip.scxml +43 -0
  87. data/lib/MINT-core/model/{body → ir/body}/gesture_button.rb +0 -0
  88. data/lib/MINT-core/model/ir/body/hand.rb +5 -0
  89. data/lib/MINT-core/model/ir/body/head.rb +102 -0
  90. data/lib/MINT-core/model/ir/body/head.scxml +92 -0
  91. data/lib/MINT-core/model/ir/body/onehandposenavigation.scxml +53 -0
  92. data/lib/MINT-core/model/ir/body/pose.rb +99 -0
  93. data/lib/MINT-core/model/ir/browserscreen.rb +27 -0
  94. data/lib/MINT-core/model/ir/browserscreen.scxml +14 -0
  95. data/lib/MINT-core/model/{device → ir}/button.rb +1 -1
  96. data/lib/MINT-core/model/ir/ir.rb +5 -0
  97. data/lib/MINT-core/model/ir/irmedia.rb +5 -0
  98. data/lib/MINT-core/model/ir/irmode.rb +5 -0
  99. data/lib/MINT-core/model/{device → ir}/joypad.rb +1 -1
  100. data/lib/MINT-core/model/ir/mouse.rb +44 -0
  101. data/lib/MINT-core/model/ir/mouse.scxml +35 -0
  102. data/lib/MINT-core/model/{device/mouse.rb → ir/mouse_old.rb} +2 -2
  103. data/lib/MINT-core/model/{device → ir}/pointer.rb +20 -22
  104. data/lib/MINT-core/model/ir/pointer.scxml +19 -0
  105. data/lib/MINT-core/model/ir/screen.rb +5 -0
  106. data/lib/MINT-core/model/{device → ir}/wheel.rb +1 -1
  107. data/lib/MINT-core/model/mim/aicommand_activate_to_button_press.xml +13 -0
  108. data/lib/MINT-core/model/mim/aicommand_deactivate_to_button_release.xml +13 -0
  109. data/lib/MINT-core/model/mim/aio_defocus_to_cio_unhighlight.xml +13 -0
  110. data/lib/MINT-core/model/mim/aio_focus_to_cio_highlight.xml +14 -0
  111. data/lib/MINT-core/model/mim/aio_present_to_cio_display.xml +14 -0
  112. data/lib/MINT-core/model/mim/aio_suspend_to_cio_hide.xml +13 -0
  113. data/lib/MINT-core/model/mim/aisinglechoice_present_to_child_present.xml +14 -0
  114. data/lib/MINT-core/model/mim/aisinglechoiceelement_chosen_to_radiobutton_select.xml +13 -0
  115. data/lib/MINT-core/model/mim/aisinglechoiceelement_unchosen_to_radiobutton_unselect.xml +13 -0
  116. data/lib/MINT-core/model/mim/aisinglepresence_children_finished_to_caroufredsel_init_js.xml +14 -0
  117. data/lib/MINT-core/model/mim/aisinglepresence_present_to_child_present.xml +15 -0
  118. data/lib/MINT-core/model/mim/browserscreen_reload_to_cuicontrol_refresh_all.xml +12 -0
  119. data/lib/MINT-core/model/mim/button_press_to_aicommand_activate.xml +12 -0
  120. data/lib/MINT-core/model/mim/button_release_to_aicommand_deactivate.xml +12 -0
  121. data/lib/MINT-core/model/mim/caroufredsel_refreshing_to_caroufredsel_init_js.xml +14 -0
  122. data/lib/MINT-core/model/mim/cio_display_to_aio_defocus.xml +13 -0
  123. data/lib/MINT-core/model/mim/cio_display_to_aio_present.xml +12 -0
  124. data/lib/MINT-core/model/mim/cio_display_to_cio_display_cache_add.xml +11 -0
  125. data/lib/MINT-core/model/mim/cio_hide_to_aio_suspend.xml +12 -0
  126. data/lib/MINT-core/model/mim/cio_hide_to_cio_display_cache_remove.xml +12 -0
  127. data/lib/MINT-core/model/mim/cio_highlight_to_aio_focus.xml +13 -0
  128. data/lib/MINT-core/model/mim/head_looking_left_to_aisinglepresence_prev.xml +14 -0
  129. data/lib/MINT-core/model/mim/head_looking_right_to_aisinglepresence_next.xml +15 -0
  130. data/lib/MINT-core/model/mim/head_nodding_to_aisinglepresence_next.xml +15 -0
  131. data/lib/MINT-core/model/mim/head_tilting_left_to_aisinglepresence_prev.xml +14 -0
  132. data/lib/MINT-core/model/mim/head_tilting_right_to_aisinglepresence_next.xml +15 -0
  133. data/lib/MINT-core/model/mim/left_button_aisinglepresence_enter.xml +15 -0
  134. data/lib/MINT-core/model/mim/left_button_aisinglepresence_next.xml +15 -0
  135. data/lib/MINT-core/model/mim/mim_default.xml +52 -0
  136. data/lib/MINT-core/model/mim/mint-mappings.xsd +127 -0
  137. data/lib/MINT-core/model/mim/mouse_press_to_aicommand_activate.xml +17 -0
  138. data/lib/MINT-core/model/mim/mouse_press_to_aisinglechoiceelement_choose.xml +17 -0
  139. data/lib/MINT-core/model/mim/mouse_press_to_aisinglechoiceelement_unchoose.xml +17 -0
  140. data/lib/MINT-core/model/mim/mouse_release_to_aicommand_deactivate.xml +16 -0
  141. data/lib/MINT-core/model/mim/mouse_stop_to_cio_highlight.xml +13 -0
  142. data/lib/MINT-core/model/mim/onehandposnav_confirm_to_aichoiceelement_choose.xml +14 -0
  143. data/lib/MINT-core/model/mim/onehandposnav_next_to_aio_next.xml +14 -0
  144. data/lib/MINT-core/model/mim/onehandposnav_previous_to_aio_prev.xml +14 -0
  145. data/lib/MINT-core/model/mim/radiobutton_selected_to_aisinglechoiceelement_choose.xml +13 -0
  146. data/lib/MINT-core/model/mim/radiobutton_unselected_to_aisinglechoiceelement_unchoose.xml +13 -0
  147. data/lib/MINT-core/model/mim/right_button_aisinglepresence_prev.xml +15 -0
  148. data/lib/MINT-core/model/task.rb +6 -6
  149. data/script/console +0 -0
  150. data/script/destroy +0 -0
  151. data/script/generate +0 -0
  152. data/spec/AICommand_spec.rb +20 -0
  153. data/spec/AIContainer_spec.rb +161 -0
  154. data/spec/AIINContinuous_spec.rb +92 -0
  155. data/spec/AIOUTContinuous_spec.rb +93 -0
  156. data/spec/AIO_spec.rb +73 -0
  157. data/spec/AIReference_spec.rb +105 -0
  158. data/spec/AISinglePresence_spec.rb +204 -60
  159. data/spec/Button_spec.rb +114 -0
  160. data/spec/CIO_spec.rb +145 -0
  161. data/spec/Interactor_spec.rb +95 -0
  162. data/spec/MappingManager_spec.rb +126 -0
  163. data/spec/Spontaneous_spec.rb +53 -0
  164. data/spec/aio_agent_spec.rb +215 -186
  165. data/spec/aisinglechoice_spec.rb +147 -88
  166. data/spec/aisinglechoiceelement_spec.rb +154 -70
  167. data/spec/complementary_mapping_spec.rb +158 -0
  168. data/spec/core_spec.rb +27 -15
  169. data/spec/cui_helper.rb +100 -0
  170. data/spec/examples/browserscreen_reload_to_cuicontrol_refresh_all.xml +12 -0
  171. data/spec/examples/mim_streaming_example.xml +9 -0
  172. data/spec/examples/mouse_highlight.xml +22 -0
  173. data/spec/examples/performance_mapping.xml +15 -0
  174. data/spec/examples/reset_click.xml +24 -0
  175. data/spec/interactor_test.scxml +32 -0
  176. data/spec/interactor_test_2.scxml +16 -0
  177. data/spec/mapping_performance_spec.rb +118 -0
  178. data/spec/mapping_server_spec.rb +161 -0
  179. data/spec/mapping_spec.rb +307 -0
  180. data/spec/music_spec.rb +301 -135
  181. data/spec/performance_counter.scxml +9 -0
  182. data/spec/sequential_mappings_spec.rb +69 -0
  183. data/spec/shared/aio_shared.rb +144 -0
  184. data/spec/spec_helper.rb +22 -3
  185. data/spec/spontaneous.scxml +11 -0
  186. data/spec/support/connection_helper.rb +19 -0
  187. data/spec/support/redis_connector_monkey_patch.rb +1 -0
  188. data/spec/support/statemachine_helper.rb +84 -0
  189. data/spec/sync_mappings_spec.rb +96 -0
  190. metadata +219 -354
  191. data/lib/MINT-core/mapping/complementary.rb +0 -100
  192. data/lib/MINT-core/mapping/on_state_change.rb +0 -65
  193. data/lib/MINT-core/model/aui/AIC.rb +0 -86
  194. data/lib/MINT-core/model/aui/AIChoice.rb +0 -65
  195. data/lib/MINT-core/model/aui/AIINChoose.rb +0 -54
  196. data/lib/MINT-core/model/aui/AIOUTDiscrete.rb +0 -43
  197. data/lib/MINT-core/model/aui/aic.png +0 -0
  198. data/lib/MINT-core/model/aui/aic.scxml +0 -50
  199. data/lib/MINT-core/model/aui/aichoice.png +0 -0
  200. data/lib/MINT-core/model/aui/aichoice.scxml +0 -60
  201. data/lib/MINT-core/model/aui/aio.png +0 -0
  202. data/lib/MINT-core/model/aui/aisinglechoiceelement.png +0 -0
  203. data/lib/MINT-core/model/aui/aisinglepresence.png +0 -0
  204. data/lib/MINT-core/model/body/handgesture.rb +0 -279
  205. data/lib/MINT-core/model/body/head.png +0 -0
  206. data/lib/MINT-core/model/body/head.rb +0 -51
  207. data/lib/MINT-core/model/body/head.scxml +0 -28
  208. data/lib/MINT-core/model/cui/gfx/screen.rb +0 -18
  209. data/lib/MINT-core/overrides/rinda.rb +0 -34
  210. data/spec/AIC_spec.rb +0 -69
  211. data/spec/MINT-core_spec.rb +0 -11
  212. data/spec/aio_spec.rb +0 -144
  213. data/spec/cio_spec.rb +0 -369
  214. data/tasks/rspec.rake +0 -21
@@ -1,34 +0,0 @@
1
- require "rinda/tuplespace"
2
-
3
- module Rinda
4
- class TupleSpace
5
- def take_all(tuple)
6
- read_all(tuple).each { |t|
7
- take(t)
8
- }
9
- end
10
-
11
-
12
- end
13
-
14
- # fixed Templates to support partially matching
15
- class Template
16
- def match(tuple)
17
- return false unless tuple.respond_to?(:size)
18
- return false unless tuple.respond_to?(:fetch)
19
- return false unless self.size <= tuple.size
20
- each do |k, v|
21
- begin
22
- it = tuple.fetch(k)
23
- rescue
24
- return false
25
- end
26
- next if v.nil?
27
- next if v == it
28
- next if v === it
29
- return false
30
- end
31
- return true
32
- end
33
- end
34
- end
@@ -1,69 +0,0 @@
1
- require "spec_helper"
2
-
3
- include MINT
4
- describe 'AUI' do
5
- before :each do
6
- connection_options = { :adapter => "in_memory"}
7
- DataMapper.setup(:default, connection_options)
8
- # DataMapper.setup(:default, { :adapter => "rinda",:local =>Rinda::TupleSpace.new})
9
- AIC.new(:name=>"a", :childs =>[
10
- AIO.new(:name => "e1"),
11
- AIO.new(:name => "e2"),
12
- AIO.new(:name => "e3")
13
- ]).save
14
-
15
- @a = AIC.first
16
- end
17
-
18
- describe 'AIC' do
19
- it 'should initialize with initiated' do
20
- @a.states.should ==[:initialized]
21
- @a.new_states.should == [:initialized]
22
- end
23
-
24
- it 'should transform to organizing state ' do
25
- @a.process_event(:organize).should ==[:organized]
26
- @a.states.should == [:organized]
27
- @a.new_states.should == [:organized]
28
- end
29
-
30
- it 'should support navigation to child' do
31
- aio = @a.childs.first
32
- aio.states=[:defocused]
33
-
34
- @a.states = [:focused]
35
-
36
- @a.process_event(:child)
37
-
38
- @a.states.should ==[:defocused]
39
- aio.states.should ==[:focused]
40
- end
41
-
42
-
43
- it 'should transform all children to presented if presented' do
44
- AUIControl.organize(@a,nil,0)
45
- # @a.process_event(:organize).should ==[:organized]
46
- @a.states.should == [:organized]
47
- @a.new_states.should == [:organized]
48
- @a.process_event(:present).should ==[:defocused]
49
- @a.childs.each do |c|
50
- c.states.should == [:defocused]
51
- end
52
- end
53
-
54
- it 'should transform all children to suspended if suspended' do
55
- @a.childs.each do |c|
56
- c.states = [:defocused]
57
- end
58
- @a.states = [:focused]
59
-
60
- @a.process_event(:suspend).should ==[:suspended]
61
- @a.childs.each do |c|
62
- c.states.should == [:suspended]
63
- end
64
- end
65
-
66
-
67
-
68
- end
69
- end
@@ -1,11 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- # Time to add your specs!
4
- # http://rspec.info/
5
- describe "Place your specs here" do
6
-
7
- it "find this spec in spec directory" do
8
- # violated "Be sure to write your specs"
9
- end
10
-
11
- end
@@ -1,144 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe 'AUI' do
4
- before :each do
5
- connection_options = { :adapter => "in_memory"}
6
- DataMapper.setup(:default, connection_options)
7
- # DataMapper.setup(:default, { :adapter => "rinda",:local =>Rinda::TupleSpace.new})
8
- @a = MINT::AIO.create(:name => "test")
9
-
10
- end
11
-
12
- describe 'AIO' do
13
- it 'should initialize with initiated' do
14
- @a.states.should ==[:initialized]
15
- @a.new_states.should == [:initialized]
16
- end
17
-
18
- it 'should transform to organizing state for present action' do
19
- @a.process_event(:organize).should ==[:organized]
20
- @a.states.should == [:organized]
21
- @a.new_states.should == [:organized]
22
- end
23
-
24
- it 'should call back after event has been processed' do
25
- class CallbackContext
26
- attr_accessor :called
27
-
28
- def initialize
29
- @called = false
30
- end
31
- def focus_next
32
- @called = true
33
- end
34
- def inform_parent_presenting
35
- end
36
-
37
- def sync_cio_to_displayed
38
- end
39
- def sync_cio_to_highlighted
40
- end
41
- def exists_next
42
- true
43
- end
44
- def exists_prev
45
- true
46
- end
47
-
48
- end
49
-
50
- callback = CallbackContext.new
51
-
52
- @a.process_event(:organize,callback).should == [:organized]
53
- callback.called.should == false
54
-
55
- @a.process_event(:present,callback).should == [:defocused]
56
- callback.called.should == false
57
-
58
- @a.process_event(:focus,callback).should == [:focused]
59
- callback.called.should == false
60
-
61
- @a.process_event(:next,callback).should == [:defocused]
62
- callback.called.should == true
63
- end
64
-
65
- it 'should recover state after save and reload' do
66
- @a.process_event(:organize).should == [:organized]
67
- @a.save!
68
- b = MINT::AIO.first(:name=>"test")
69
- b.states.should == [:organized]
70
- b.process_event(:present).should == [:defocused]
71
- end
72
-
73
- it 'should store the state' do
74
- a = MINT::AIINReference.create(:name=>"RecipeSelection_label",:label=>"Rezeptdetails")
75
- a.states.should == [:initialized]
76
- a.process_event(:organize)
77
- a.states.should == [:organized]
78
- a.save!
79
- MINT::AIINReference.first(:name=>"RecipeSelection_label").states.should == [:organized]
80
- end
81
-
82
- #TODO Bug first sets states to array not sure ahy
83
-
84
- # it "should process after load" do
85
- # t = MINT::AIO.create(:name => "p")
86
- #
87
- # b = MINT::AIO.first(:name => "p")
88
- # # b.states.should == [:initialized]
89
- # b.process_event(:organized)
90
- #
91
- # end
92
-
93
-
94
- it 'should focus to next element' do
95
- b = MINT::AIO.create(:name=>"next")
96
- @a.next = b
97
- b.previous =@a
98
-
99
- @a.process_event(:organize)
100
- b.process_event(:organize)
101
-
102
- @a.process_event(:present)
103
- b.process_event(:present)
104
-
105
- @a.process_event(:focus).should == [:focused]
106
-
107
- @a.process_event(:next).should == [:defocused]
108
- b.states.should ==[:focused]
109
- @a.states.should ==[:defocused]
110
- end
111
-
112
- it 'should not defocus on next if there is no next element' do
113
- @a.states=[:focused]
114
- @a.process_event(:next)
115
- @a.states.should == [:focused]
116
- end
117
-
118
- it 'should not defocus on prev if there is no previous element' do
119
- @a.states=[:focused]
120
- @a.process_event(:prev).should ==[:focused]
121
- end
122
-
123
- it 'should handle previous' do
124
- @a.states=[:defocused]
125
- b = MINT::AIO.new(:name=>"test", :previous =>@a)
126
- b.states= [:focused]
127
- b.process_event(:prev)
128
-
129
- @a.states.should ==[:focused]
130
- b.states.should ==[:defocused]
131
- end
132
-
133
- it 'should handle parent' do
134
- @a.states=[:focused]
135
- b = MINT::AIC.new(:name=>"parent",:childs =>[@a])
136
- b.states = [:defocused]
137
- @a.process_event(:parent)
138
-
139
- @a.states.should ==[:defocused]
140
- b.states.should ==[:focused]
141
- end
142
- end
143
-
144
- end
@@ -1,369 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe 'CUI' do
4
- before :each do
5
- connection_options = { :adapter => "in_memory"}
6
- DataMapper.setup(:default, connection_options)
7
- # DataMapper.setup(:default, { :adapter => "rinda",:local =>Rinda::TupleSpace.new})
8
-
9
- end
10
-
11
- describe 'CIO' do
12
- before :each do
13
- @up = MINT::CIO.create(:name => "up")
14
- @down = MINT::CIO.create(:name => "down")
15
- @left = MINT::CIO.create(:name => "left")
16
- @right = MINT::CIO.create(:name => "right")
17
- @center = MINT::CIO.create(:name => "center",:left=>@left,:right =>@right,:up =>@up, :down=>@down)
18
- @down.up = @center
19
- @up.down = @center
20
- @left.right = @center
21
- @right.left = @center
22
- end
23
-
24
- it 'should initialize with initiated' do
25
- @center.states.should == [:initialized]
26
- end
27
-
28
- it 'should transform to display state after sequence of position,calculate, ready events ' do
29
- @center.process_event(:position).should ==[:positioning]
30
- @center.process_event(:calculated).should ==[:positioned]
31
- @center.process_event(:display).should ==[:displayed]
32
- @center.states.should == [:displayed]
33
- end
34
-
35
-
36
-
37
- describe "highlighting" do
38
- before :each do
39
- @up.states=[:displayed]
40
- @down.states=[:displayed]
41
- @left.states=[:displayed]
42
- @right.states=[:displayed]
43
- @center.states=[:highlighted]
44
- end
45
-
46
- it 'should move highlight to up and down' do
47
- @center.process_event("up").should ==[:displayed]
48
- @up.states.should ==[:highlighted]
49
-
50
- @up.process_event("down").should == [:displayed]
51
- @center.states.should ==[:highlighted]
52
- end
53
-
54
- it 'should move highlight to left and right' do
55
- @center.process_event("left").should ==[:displayed]
56
- @left.states.should ==[:highlighted]
57
-
58
- @left.process_event("right").should == [:displayed]
59
- @center.states.should ==[:highlighted]
60
- end
61
- end
62
-
63
- describe "sync with AUI" do
64
- before :each do
65
-
66
- @up.states=[:displayed]
67
- @down.states=[:displayed]
68
- @left.states=[:displayed]
69
- @right.states=[:displayed]
70
- @center.states=[:highlighted]
71
-
72
- @a_left = MINT::AIO.new(:name => "left",:states =>[:defocused])
73
- @a_left.save!
74
-
75
- @a_right = MINT::AIO.new(:name => "right",:states =>[:defocused])
76
- @a_right.save!
77
- @a_up = MINT::AIO.new(:name => "up",:states =>[:defocused])
78
- @a_up.save!
79
- @a_down = MINT::AIO.new(:name => "down",:states =>[:defocused])
80
- @a_down.save!
81
- @a_center = MINT::AIO.new(:name => "center",:states =>[:focused], :next =>@a_down)
82
- @a_center.save!
83
-
84
- end
85
-
86
- it 'should sync highlight movements to AUI' do
87
- @center.process_event(:left).should ==[:displayed]
88
- MINT::AIO.first(:name=>"center").states.should ==[:defocused]
89
- MINT::AIO.first(:name=>"left").states.should ==[:focused]
90
- @left.states.should ==[:highlighted]
91
- end
92
-
93
- it 'should sync AUI focus movements to CUI' do
94
- @center.save!
95
- @down.save!
96
- @a_center.process_event("next").should ==[:defocused]
97
- @a_down.states.should ==[:focused]
98
- MINT::CIO.first(:name=>"center").states.should ==[:displayed]
99
- MINT::CIO.first(:name=>"down").states.should ==[:highlighted]
100
- end
101
-
102
- it 'should calculate its minimum size' do
103
- @center.text="Hello world!"
104
- @center.calculateMinimumSize
105
- @center.minwidth.should==77
106
- @center.minheight.should==26
107
- end
108
-
109
- def checkSizes(cio,x,y,width,height)
110
- cio.x.should == x
111
- cio.y.should == y
112
- cio.width.should == width
113
- cio.height.should ==height
114
- end
115
-
116
- describe "layout calculation" do
117
- before :each do
118
- @solver = Cassowary::ClSimplexSolver.new
119
-
120
- @up.states=[:initialized]
121
- @down.states=[:initialized]
122
- @left.states=[:initialized]
123
- @right.states=[:initialized]
124
-
125
-
126
- @a_left.states=[:organized]
127
- @a_right.states=[:organized]
128
- @a_up.states=[:organized]
129
- @a_down.states=[:organized]
130
- end
131
- it "should calculate sizes for CIC" do
132
- a_parent = MINT::AIC.new(:name=>"parent", :childs =>[@a_left,@a_right,@a_up,@a_down])
133
- a_parent.save!
134
-
135
- parent_cic = MINT::CIC.create(:name =>"parent",:cols=>2,:rows=>2,:x=>0,:y=>0,:width=>800,:height=>600)
136
-
137
- parent_cic.calculate_container(@solver,10)
138
-
139
- checkSizes(MINT::CIO.first(:name=>"left"),10,10,385,285)
140
- checkSizes(MINT::CIO.first(:name=>"right"),405,10,385,285)
141
- checkSizes(MINT::CIO.first(:name=>"up"),10,305,385,285)
142
- checkSizes(MINT::CIO.first(:name=>"down"),405,305,385,285)
143
- end
144
-
145
- it "should calculate sizes for nested CICs" do
146
- a_top = MINT::AIC.new(:name=>"top", :childs =>[
147
- MINT::AIC.new(:name=>"parent_left", :childs =>[@a_left,@a_right,@a_up,@a_down],:states =>[:organized]),
148
- MINT::AIC.new(:name=>"parent_right",:states =>[:organized])
149
- ])
150
- a_top.save
151
-
152
- top_cic = MINT::CIC.create(:name =>"top",:cols=>2,:rows=>1,:x=>0,:y=>0,:width=>800,:height=>600)
153
- parent_left_cic = MINT::CIC.create(:name =>"parent_left",:cols=>2,:rows=>2)
154
- parent_right_cic = MINT::CIC.create(:name =>"parent_right",:cols=>2,:rows=>2)
155
-
156
- top_cic.calculate_container(@solver,10)
157
-
158
- checkSizes(MINT::CIO.first(:name=>"parent_left"),10,10,385,580)
159
- checkSizes(MINT::CIO.first(:name=>"parent_right"),405,10,385,580)
160
-
161
- checkSizes(MINT::CIO.first(:name=>"left"),20,20,177,275)
162
- checkSizes(MINT::CIO.first(:name=>"right"),207,20,177,275)
163
- checkSizes(MINT::CIO.first(:name=>"up"),20,305,177,275)
164
- checkSizes(MINT::CIO.first(:name=>"down"),207,305,177,275)
165
-
166
- end
167
-
168
- it "should consider CIC definitions without column or row definition to be positioned vertically" do
169
-
170
- a_top = MINT::AIC.new(:name=>"top", :childs =>[
171
- MINT::AIC.new(:name=>"parent_left", :childs =>[@a_left,@a_right],:states =>[:organized]),
172
- MINT::AIC.new(:name=>"parent_right",:states =>[:organized])
173
- ])
174
- a_top.save!
175
-
176
- top_cic = MINT::CIC.create(:name =>"top",:x=>0,:y=>0,:width=>800,:height=>800)
177
- parent_left_cic = MINT::CIC.create(:name =>"parent_left").save!
178
- parent_right_cic = MINT::CIC.create(:name =>"parent_right").save!
179
-
180
- top_cic.calculate_container(@solver,10)
181
-
182
- checkSizes(MINT::CIO.first(:name=>"parent_left"),10,10,780,385)
183
- checkSizes(MINT::CIO.first(:name=>"parent_right"),10,405,780,385)
184
-
185
- checkSizes(MINT::CIO.first(:name=>"left"),20,20,760,177)
186
- checkSizes(MINT::CIO.first(:name=>"right"),20,207,760,177)
187
-
188
- end
189
-
190
- it "should create CIC definitions that are missing and position them vertically vertically" do
191
-
192
- a_top = MINT::AIC.new(:name=>"top", :childs =>[
193
- MINT::AIC.new(:name=>"parent_left", :childs =>[@a_left,@a_right],:states =>[:organized]),
194
- MINT::AIC.new(:name=>"parent_right",:states =>[:organized])
195
- ])
196
- a_top.save!
197
-
198
- top_cic = MINT::CIC.create(:name =>"top",:x=>0,:y=>0,:width=>800,:height=>800)
199
-
200
- top_cic.calculate_container(@solver,10)
201
-
202
- checkSizes(MINT::CIO.first(:name=>"parent_left"),10,10,780,385)
203
- checkSizes(MINT::CIO.first(:name=>"parent_right"),10,405,780,385)
204
-
205
- checkSizes(MINT::CIO.first(:name=>"left"),20,20,760,177)
206
- checkSizes(MINT::CIO.first(:name=>"right"),20,207,760,177)
207
-
208
- end
209
-
210
- it "should handle nested AIC definitions" do
211
-
212
- MINT::AIC.new(:name=>"RecipeFinder_content",:states =>[:organized],
213
- :childs =>[
214
- MINT::AIC.new(:name=>"RecipeFilter",:states =>[:organized],
215
- :childs => [
216
- MINT::AIC.new(:name=>"RecipeFilter_description1",:states =>[:organized],
217
- :childs =>[
218
- MINT::AIINReference.new(:name=>"RecipeFilter_label",:label=>"Suchkriterien",:states =>[:organized]),
219
- MINT::AIOUTContext.new(:name=>"RecipeFilter_description",:states =>[:organized],:text=>"In diesem Feld können Sie mit genauen Angaben zu Ihrem Gericht-Wunsch die Suche nach Ihrem Rezeptvorschlag eingrenzen."),
220
- ]),
221
- MINT::AIC.new(:name=>"RecipeFilter_content",:states =>[:organized])
222
- ])
223
- ]).save!
224
-
225
-
226
- test = MINT::CIC.new( :name => "RecipeFinder_content", :rows => 1, :cols=> 1,:x=>0, :y=>0, :width =>800, :height => 600)
227
- test.save!
228
-
229
- test.calculate_container(@solver,10)
230
-
231
- checkSizes(MINT::CIO.first(:name=>"RecipeFilter_content"),20,305,760,275)
232
- MINT::AIO.first(:name=>"RecipeFilter_label").label.should=="Suchkriterien"
233
- end
234
-
235
- it "should calculate the layer level for nested containers" do
236
-
237
- MINT::AIC.new(:name=>"RecipeFinder_content",:states =>[:organized],
238
- :childs =>[
239
- MINT::AIC.new(:name=>"RecipeFilter",:states =>[:organized],
240
- :childs => [
241
- MINT::AIC.new(:name=>"RecipeFilter_description1",:states =>[:organized],
242
- :childs =>[
243
- MINT::AIINReference.new(:name=>"RecipeFilter_label",:states =>[:organized],:label=>"Suchkriterien"),
244
- MINT::AIOUTContext.new(:name=>"RecipeFilter_description",:states =>[:organized],:text=>"In diesem Feld können Sie mit genauen Angaben zu Ihrem Gericht-Wunsch die Suche nach Ihrem Rezeptvorschlag eingrenzen."),
245
- ]),
246
- MINT::AIC.new(:name=>"RecipeFilter_content",:states =>[:organized])
247
- ])
248
- ]).save!
249
-
250
-
251
- test = MINT::CIC.new( :name => "RecipeFinder_content", :rows => 1, :cols=> 1,:x=>0, :y=>0, :width =>800, :height => 600)
252
- test.save!
253
-
254
- test.calculate_container(@solver,10)
255
-
256
- MINT::CIO.first(:name=>"RecipeFilter_content").layer.should ==2
257
- MINT::CIO.first(:name=>"RecipeFilter_label").layer.should== 3
258
- end
259
-
260
-
261
-
262
- it "should end up with all cios set to state >positioned< after layout calculation" do
263
- @solver = Cassowary::ClSimplexSolver.new
264
- a_top = MINT::AIC.new(:name=>"top",:states =>[:organized], :childs =>[
265
- MINT::AIC.new(:name=>"parent_left", :childs =>[@a_left,@a_right],:states =>[:organized]),
266
- MINT::AIC.new(:name=>"parent_right",:states =>[:organized])
267
- ])
268
- a_top.save!
269
-
270
- top_cic = MINT::CIC.create(:name =>"top",:x=>0,:y=>0,:width=>800,:height=>800)
271
- parent_left_cic = MINT::CIC.create(:name =>"parent_left").save!
272
- parent_right_cic = MINT::CIC.create(:name =>"parent_right").save!
273
-
274
- top_cic.calculate_container(@solver,10)
275
-
276
- MINT::CIC.first(:name=>"top").states.should==[:positioned]
277
- MINT::CIC.first(:name=>"parent_left").states.should==[:positioned]
278
- MINT::CIC.first(:name=>"parent_right").states.should==[:positioned]
279
- end
280
-
281
- it "should layout only elements that have not been calculated - case uncalculated leaf cios" do
282
- @solver = Cassowary::ClSimplexSolver.new
283
- a_top = MINT::AIC.new(:name=>"top",:states =>[:organized], :childs =>[
284
- MINT::AIC.new(:name=>"parent_left",:states =>[:organized], :childs =>[@a_left,@a_right]),
285
- MINT::AIC.new(:name=>"parent_right",:states =>[:organized])
286
- ])
287
- a_top.save!
288
-
289
- top_cic = MINT::CIC.create(:name =>"top",:states=>[:positioned],:x=>0,:y=>0,:width=>800,:height=>800)
290
- parent_left_cic = MINT::CIC.create(:name =>"parent_left",:states=>[:positioned],:x=>10,:y=>10,:width=>300,:height=>800).save!
291
- parent_right_cic = MINT::CIC.create(:name =>"parent_right",:states=>[:positioned],:x=>310,:y=>10,:width=>470,:height=>800).save!
292
-
293
- top_cic.calculate_container(@solver,10)
294
-
295
- MINT::CIC.first(:name=>"parent_left").states.should==[:positioned]
296
- checkSizes(MINT::CIO.first(:name=>"parent_left"),10,10,300,800)
297
- checkSizes(MINT::CIO.first(:name=>"left"),20,20,280,385)
298
- checkSizes(MINT::CIO.first(:name=>"right"),20,415,280,385)
299
-
300
- MINT::CIO.first(:name=>"left").states.should==[:positioned]
301
- MINT::CIO.first(:name=>"right").states.should==[:positioned]
302
- end
303
-
304
- it "should layout uncalculated parental elements based on calculated leaf cios" do
305
- pending("get the right container calculation working that has no childs!")
306
- @solver = Cassowary::ClSimplexSolver.new
307
- a_top = MINT::AIC.new(:name=>"top",:states =>[:organized], :childs =>[
308
- MINT::AIC.new(:name=>"parent_left",:states =>[:organized], :childs =>[@a_left,@a_right]),
309
- MINT::AIC.new(:name=>"parent_right",:states =>[:organized])
310
- ])
311
- a_top.save!
312
-
313
- top_cic = MINT::CIC.create(:name =>"top",:x=>0,:y=>0,:width=>800,:height=>800)
314
- parent_left_cic = MINT::CIC.create(:name =>"parent_left").save!
315
- parent_right_cic = MINT::CIC.create(:name =>"parent_right").save!
316
- MINT::CIO.first(:name=>"left").update(:x =>20,:y=>20,:width=>280,:height=>385,:states=>[:positioned])
317
- MINT::CIO.first(:name=>"right").update(:x =>20,:y=>415,:width=>280,:height=>385,:states=>[:positioned])
318
-
319
- top_cic.calculate_position(nil,nil,@solver,0,10)
320
-
321
- checkSizes(MINT::CIO.first(:name=>"right"),20,415,280,385)
322
- checkSizes(MINT::CIO.first(:name=>"left"),20,20,280,385)
323
-
324
- MINT::CIO.first(:name=>"parent_left").states.should==[:positioned]
325
- MINT::CIO.first(:name=>"parent_right").states.should==[:positioned]
326
-
327
- checkSizes(MINT::CIO.first(:name=>"parent_left"),10,10,300,800) # results are wrong border missing!
328
- checkSizes(MINT::CIO.first(:name=>"parent_right"),10,10,0,0)
329
- end
330
-
331
- end
332
- end
333
-
334
- end
335
-
336
- describe 'mouse' do
337
- it "should highlight CIOs based on coordinates retrieved by mouse" do
338
- connection_options = { :adapter => "in_memory"}
339
- DataMapper.setup(:default, connection_options)
340
- # DataMapper.setup(:default, { :adapter => "rinda",:local =>Rinda::TupleSpace.new})
341
-
342
- a= MINT::CIO.create(:name=>"left_2x",:x=>1,:y =>1, :width=>390,:height =>800,:states => [:displayed])
343
- b= MINT::CIO.create(:name=>"right_2x",:x=>400,:y =>2, :width=>389,:height =>799,:states => [:displayed])
344
-
345
- puts b.pos.Xvalue
346
-
347
- CUIControl.fill_active_cio_cache
348
-
349
- Result = Struct.new(:x, :y)
350
-
351
- CUIControl.find_cio_from_coordinates(Result.new(10,10))
352
-
353
- a = MINT::CIO.first(:name=>"left_2x")
354
- a.states.should==[:highlighted]
355
- MINT::CIO.first(:name=>"right_2x").states.should==[:displayed]
356
-
357
- CUIControl.find_cio_from_coordinates(Result.new(410,10))
358
-
359
- MINT::CIO.first(:name=>"left_2x").states.should==[:displayed]
360
- MINT::CIO.first(:name=>"right_2x").states.should==[:highlighted]
361
-
362
- CUIControl.find_cio_from_coordinates(Result.new(395,10))
363
-
364
- MINT::CIO.first(:name=>"left_2x").states.should==[:displayed]
365
- MINT::CIO.first(:name=>"right_2x").states.should==[:displayed]
366
-
367
- end
368
- end
369
- end