MINT-core 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.gemtest +0 -0
  2. data/Gemfile +17 -0
  3. data/Gemfile.lock +69 -0
  4. data/History.txt +3 -0
  5. data/MINT-core.gemspec +58 -0
  6. data/Manifest.txt +77 -0
  7. data/PostInstall.txt +7 -0
  8. data/README.rdoc +63 -0
  9. data/Rakefile +29 -0
  10. data/bin/mint-aui +40 -0
  11. data/bin/mint-cui-gfx +47 -0
  12. data/bin/mint-juggernaut.sh +4 -0
  13. data/bin/mint-tuplespace +12 -0
  14. data/lib/MINT-core.rb +42 -0
  15. data/lib/MINT-core/agent/agent.rb +28 -0
  16. data/lib/MINT-core/agent/aui.rb +52 -0
  17. data/lib/MINT-core/agent/auicontrol.rb +135 -0
  18. data/lib/MINT-core/agent/cui-gfx.rb +160 -0
  19. data/lib/MINT-core/agent/cuicontrol.rb +46 -0
  20. data/lib/MINT-core/mapping/complementary.rb +100 -0
  21. data/lib/MINT-core/mapping/mapping.rb +47 -0
  22. data/lib/MINT-core/mapping/on_state_change.rb +65 -0
  23. data/lib/MINT-core/mapping/sequential.rb +87 -0
  24. data/lib/MINT-core/model/aui/AIC.rb +86 -0
  25. data/lib/MINT-core/model/aui/AIChoice.rb +65 -0
  26. data/lib/MINT-core/model/aui/AIINChoose.rb +54 -0
  27. data/lib/MINT-core/model/aui/AIMultiChoice.rb +5 -0
  28. data/lib/MINT-core/model/aui/AIMultiChoiceElement.rb +56 -0
  29. data/lib/MINT-core/model/aui/AIO.rb +170 -0
  30. data/lib/MINT-core/model/aui/AIOUTDiscrete.rb +43 -0
  31. data/lib/MINT-core/model/aui/AISingleChoice.rb +9 -0
  32. data/lib/MINT-core/model/aui/AISingleChoiceElement.rb +69 -0
  33. data/lib/MINT-core/model/aui/AISinglePresence.rb +100 -0
  34. data/lib/MINT-core/model/aui/aic.png +0 -0
  35. data/lib/MINT-core/model/aui/aic.scxml +50 -0
  36. data/lib/MINT-core/model/aui/aichoice.png +0 -0
  37. data/lib/MINT-core/model/aui/aichoice.scxml +60 -0
  38. data/lib/MINT-core/model/aui/aio.png +0 -0
  39. data/lib/MINT-core/model/aui/aio.scxml +43 -0
  40. data/lib/MINT-core/model/aui/aisinglechoiceelement.png +0 -0
  41. data/lib/MINT-core/model/aui/aisinglechoiceelement.scxml +71 -0
  42. data/lib/MINT-core/model/aui/aisinglepresence.png +0 -0
  43. data/lib/MINT-core/model/aui/aisinglepresence.scxml +58 -0
  44. data/lib/MINT-core/model/aui/model.rb +50 -0
  45. data/lib/MINT-core/model/body/gesture_button.rb +26 -0
  46. data/lib/MINT-core/model/body/handgesture.rb +279 -0
  47. data/lib/MINT-core/model/body/head.png +0 -0
  48. data/lib/MINT-core/model/body/head.rb +51 -0
  49. data/lib/MINT-core/model/body/head.scxml +28 -0
  50. data/lib/MINT-core/model/cui/gfx/CIC.rb +266 -0
  51. data/lib/MINT-core/model/cui/gfx/CIO.rb +381 -0
  52. data/lib/MINT-core/model/cui/gfx/model.rb +204 -0
  53. data/lib/MINT-core/model/cui/gfx/screen.rb +18 -0
  54. data/lib/MINT-core/model/device/button.rb +20 -0
  55. data/lib/MINT-core/model/device/joypad.rb +30 -0
  56. data/lib/MINT-core/model/device/mouse.rb +171 -0
  57. data/lib/MINT-core/model/device/pointer.rb +85 -0
  58. data/lib/MINT-core/model/device/wheel.rb +51 -0
  59. data/lib/MINT-core/model/interactor.rb +167 -0
  60. data/lib/MINT-core/model/task.rb +71 -0
  61. data/lib/MINT-core/overrides/rinda.rb +34 -0
  62. data/script/console +10 -0
  63. data/script/destroy +14 -0
  64. data/script/generate +14 -0
  65. data/spec/AIC_spec.rb +69 -0
  66. data/spec/AISinglePresence_spec.rb +94 -0
  67. data/spec/MINT-core_spec.rb +11 -0
  68. data/spec/aio_agent_spec.rb +234 -0
  69. data/spec/aio_spec.rb +144 -0
  70. data/spec/aisinglechoice_spec.rb +152 -0
  71. data/spec/aisinglechoiceelement_spec.rb +106 -0
  72. data/spec/cio_spec.rb +369 -0
  73. data/spec/core_spec.rb +29 -0
  74. data/spec/music_spec.rb +179 -0
  75. data/spec/rcov.opts +2 -0
  76. data/spec/spec.opts +4 -0
  77. data/spec/spec_helper.rb +7 -0
  78. data/tasks/rspec.rake +21 -0
  79. metadata +227 -0
data/spec/AIC_spec.rb ADDED
@@ -0,0 +1,69 @@
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
@@ -0,0 +1,94 @@
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
+ AISinglePresence.new(:name=>"a", :childs =>[
10
+ AIO.new(:name => "e1"),
11
+ AIO.new(:name => "e2"),
12
+ AIO.new(:name => "e3")
13
+ ]).save
14
+
15
+ @a = AISinglePresence.first
16
+ end
17
+
18
+ describe 'AISinglePresence' 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 transform first child to presented if presented and rest to suspended' do
31
+ AUIControl.organize(@a,nil,0)
32
+ # @a.process_event(:organize).should ==[:organized]
33
+ @a.states.should == [:organized]
34
+ @a.new_states.should == [:organized]
35
+ @a.process_event(:present).should ==[:defocused]
36
+ children = @a.childs
37
+ children[0].states.should == [:defocused]
38
+ children[1].states.should == [:suspended]
39
+ children[2].states.should == [:suspended]
40
+ end
41
+
42
+ it 'should hide the other elements if a child is presented' do
43
+ AUIControl.organize(@a,nil,0)
44
+ @a.process_event(:present).should == [:defocused]
45
+
46
+ AIO.first(:name => "e1").states.should == [:defocused]
47
+ AIO.first(:name => "e2").states.should == [:suspended]
48
+ AIO.first(:name => "e3").states.should == [:suspended]
49
+
50
+ e3 = AIO.first(:name => "e3")
51
+ e3.states.should ==[:suspended]
52
+ e3.process_event(:present).should == [:defocused]
53
+
54
+ AIO.first(:name => "e1").states.should == [:suspended]
55
+ AIO.first(:name => "e2").states.should == [:suspended]
56
+ AIO.first(:name => "e3").states.should == [:defocused]
57
+
58
+ e2 = AIO.first(:name => "e2")
59
+ e2.states.should ==[:suspended]
60
+ e2.process_event(:present).should == [:defocused]
61
+
62
+ AIO.first(:name => "e1").states.should == [:suspended]
63
+ AIO.first(:name => "e2").states.should == [:defocused]
64
+ AIO.first(:name => "e3").states.should == [:suspended]
65
+
66
+ end
67
+
68
+ it 'should hide the other elements if a child is presented (using next and prev events)' do
69
+ AUIControl.organize(@a,nil,0)
70
+ @a.process_event(:present).should == [:defocused]
71
+
72
+ AIO.first(:name => "e1").states.should == [:defocused]
73
+ AIO.first(:name => "e2").states.should == [:suspended]
74
+ AIO.first(:name => "e3").states.should == [:suspended]
75
+
76
+ @a.process_event(:focus).should == [:waiting]
77
+ @a.process_event(:enter).should == [:entered]
78
+ @a.process_event(:next).should == [:entered]
79
+
80
+ AIO.first(:name => "e1").states.should == [:suspended]
81
+ AIO.first(:name => "e2").states.should == [:defocused]
82
+ AIO.first(:name => "e3").states.should == [:suspended]
83
+
84
+ @a.process_event(:prev).should == [:entered]
85
+
86
+ AIO.first(:name => "e1").states.should == [:defocused]
87
+ AIO.first(:name => "e2").states.should == [:suspended]
88
+ AIO.first(:name => "e3").states.should == [:suspended]
89
+ end
90
+
91
+
92
+
93
+ end
94
+ end
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,234 @@
1
+ require "spec"
2
+ require "spec_helper"
3
+
4
+ describe 'AUI-Agent' do
5
+ before :each do
6
+ connection_options = { :adapter => "in_memory"}
7
+ DataMapper.setup(:default, connection_options)
8
+ # DataMapper.setup(:default, { :adapter => "rinda", :host =>"localhost",:port=>4000})
9
+ # ,:local =>Rinda::TupleSpace.new})
10
+ # DataMapper::Logger.new("data.log", :debug)
11
+ @aui = AIC.new(:name=>"RecipeFinder",
12
+ :childs =>[
13
+ AIINReference.new(:name=>"RecipeFinder_label",:label=>"Willkommen"),
14
+ AIOUTContext.new(:name=>"RecipeFinder_description",:text=>"Willkommen beim 4 Sterne Koch Assistenten."),
15
+ AIC.new(:name=>"RecipeFilter",
16
+ :childs => [
17
+ AIINReference.new(:name=>"RecipeFilter_label",:label=>"Suchkriterien"),
18
+ AIOUTContext.new(:name=>"RecipeFilter_description",:text=>"In diesem Feld können Sie mit genauen Angaben zu Ihrem Gericht-Wunsch die Suche nach Ihrem Rezeptvorschlag eingrenzen."),
19
+ AIC.new(:name=>"RecipeCuisine",
20
+ :childs=>[
21
+ AIINReference.new(:name=>"RecipeCuisine_label",:label=>"Nationale Küche"),
22
+ AIOUTContext.new(:name=>"RecipeCuisine_description",:text=>"Welche nationale Küche wählen Sie? "),
23
+ AIMultiChoice.new(:name=>"RecipeCuisine_choice",
24
+ :childs =>[
25
+ AIINChoose.new(:name => "French", :label =>"Französisch"),
26
+ AIINChoose.new(:name => "German",:label =>"Deutsch"),
27
+ AIINChoose.new(:name => "Italian",:label =>"Italienisch"),
28
+ AIINChoose.new(:name => "Chinese",:label =>"Chinesisch")
29
+ ]
30
+ )
31
+ ]),
32
+ AIC.new(:name=>"RecipeCategory",
33
+ :childs=>[
34
+ AIINReference.new(:name=>"RecipeCategory_label",:label=>"Menǘart "),
35
+ AIOUTContext.new(:name=>"RecipeCategory_description",:text=>" Welche Menǘart möchten Sie kochen? "),
36
+ AIMultiChoice.new(:name=>"RecipeCategory_choice",
37
+ :childs =>[
38
+ AIINChoose.new(:name => "Main", :label =>"Hauptgericht"),
39
+ AIINChoose.new(:name => "Pastry",:label =>"Gebäck"),
40
+ AIINChoose.new(:name => "Dessert",:label =>"Nachtisch"),
41
+ AIINChoose.new(:name => "Starter",:label =>"Vorspeise")
42
+ ]
43
+ )
44
+ ]),
45
+ AIC.new(:name=>"RecipeCalories",
46
+ :childs=>[
47
+ AIINReference.new(:name=>"RecipeCalories_label",:label=>"gesundheitsbewusst "),
48
+ AIOUTContext.new(:name=>"RecipeCalories_description",:text=>" Wollen Sie gesundheitsbewusst kochen? "),
49
+ AISingleChoice.new(:name=>"RecipeCalories_choice",
50
+ :childs =>[
51
+ AIINChoose.new(:name => "Diet", :label =>"Hauptgericht"),
52
+ AIINChoose.new(:name => "Low fat",:label =>"Gebäck"),
53
+ AIINChoose.new(:name => "Not Relevant",:label =>"Nachtisch"),
54
+ ]
55
+ )
56
+ ]),
57
+ ]),
58
+ AIC.new(:name =>"RecipeSelection",
59
+ :childs => [
60
+ AIINReference.new(:name=>"RecipeSelection_label",:label=>"Rezeptdetails"),
61
+ AIOUTContext.new(:name=>"RecipeSelection_description",:text=>"Hier werden Ihre Rezeptvorschläge mit den Details angezeigt und Sie können bestimmen, für wieviele Personen das Rezept berechnet werden soll."),
62
+ AISingleChoice.new(:name=>"FoundRecipes",
63
+ :childs =>[
64
+ AIINChoose.new(:name => "Schweinebraten", :label =>"Schweinebraten"),
65
+ AIINChoose.new(:name => "Lamkotletts",:label =>"Lammkotletts"),
66
+ AIINChoose.new(:name => "Spagetti",:label =>"Spagetti"),
67
+ ]
68
+ ),
69
+ AICommand.new(:name=>"Start",:label=>"Kochassistent starten",:description=>"Hier können Sie den Kochassistenten starten.")
70
+ ])
71
+ ])
72
+ @aui.save!
73
+
74
+ end
75
+
76
+ describe 'organizing' do
77
+
78
+ it 'should save correctly' do
79
+ class P <Element
80
+
81
+ # belongs_to :c
82
+ belongs_to :parent, 'C',
83
+ :parent_key => [ :id ], # in the remote model (Blog)
84
+ :child_key => [ :c_id ], # local to this model (Post)
85
+ :required => true
86
+
87
+ has 1, :next, P
88
+ has 1, :previous, P
89
+ end
90
+
91
+ class C < P
92
+ has n, :childs, 'P',
93
+ :parent_key => [ :id ], # local to this model (Blog)
94
+ :child_key => [ :c_id ] # in the remote model (Post)
95
+
96
+ end
97
+
98
+ t2 = P.new(:name=>"Test2")
99
+ t1 = C.new(:name=>"Test1", :childs =>[t2],:next=>t2)
100
+ t2.previous = t1
101
+
102
+ t1.childs[0].parent.name.should =="Test1"
103
+
104
+ t1.save!
105
+
106
+
107
+ P.first(:name=>"Test2").parent.name.should == "Test1"
108
+ P.first(:name=>"Test2").previous.name.should == "Test1"
109
+ C.first(:name=>"Test1").next.name.should == "Test2"
110
+ end
111
+
112
+ it "should organize parental relations correctly" do
113
+ aic = AIC.new(:name =>"AIC", :childs=>[AIO.new(:name=>"AIO")])
114
+ aic.save!
115
+
116
+ AIO.first(:name=>"AIO").parent.name.should == "AIC"
117
+ end
118
+
119
+ it "should organize parental relations correctly 2" do
120
+ AIC.new(:name=>"RecipeFinder",
121
+ :childs =>[
122
+ AIINReference.new(:name=>"RecipeFinder_label",:label=>"Willkommen")]).save!
123
+
124
+ AIO.first(:name=>"RecipeFinder_label").parent.name.should == "RecipeFinder"
125
+ end
126
+
127
+ it "should organize parental relations correctly 3" do
128
+ AIO.first(:name=>"RecipeFinder_label").parent.name.should == "RecipeFinder"
129
+ end
130
+
131
+ it 'should organize with parental relationships 4' do
132
+ AIINChoose.first(:name => "Main").parent.name.should == "RecipeCategory_choice"
133
+ end
134
+
135
+ it 'should support next navigation' do
136
+ pending("get the organize function working")
137
+ AUIControl.organize(@aui)
138
+ @aui.save!#.should==true
139
+ @aui.next.name.should=="RecipeFinder_label"
140
+ @aui.next.next.next.next.name.should=="RecipeFilter_label"
141
+
142
+
143
+ n = AIO.first(:name => "RecipeFinder")
144
+ 10.times {n=n.next}
145
+ n.name.should=="French"
146
+ 12.times {n=n.next}
147
+ n.name.should=="RecipeCalories"
148
+ 14.times {n=n.next}
149
+ n.name.should=="Start"
150
+ end
151
+
152
+ it "should support previous navigation" do
153
+
154
+ AUIControl.organize(@aui)
155
+
156
+ @aui.save! # there is still a bug, because save results in false!!
157
+ #.should==true
158
+
159
+ n = AIO.first(:name => "Start")
160
+ # n = @aui #
161
+ # 36.times {n=n.next}
162
+ #n.name.should=="Start"
163
+
164
+ 10.times {n=n.previous}
165
+ n.name.should=="Diet"
166
+ 4.times {n=n.previous}
167
+ n.name.should=="RecipeCalories"
168
+ 22.times {n=n.previous}
169
+ n.name.should=="RecipeFinder"
170
+ end
171
+
172
+ it 'should support next navigation in organize 2' do
173
+ pending("get the organize2 function working")
174
+ AUIControl.organize2(@aui)
175
+ # @aui.save#.should==true
176
+ # @aui.next.name.should=="RecipeFinder"
177
+ # @aui.next.next.next.next.name.should=="RecipeFinder"
178
+
179
+
180
+ n = AIO.first(:name => "RecipeFinder_label")
181
+ 3.times {n=n.next}
182
+ n.name.should=="RecipeSelection"
183
+
184
+ n = AIO.first(:name => "RecipeCalories_label")
185
+ 2.times {n=n.next}
186
+ n.name.should=="RecipeCalories_choice"
187
+
188
+ # n = AIO.first(:name => "Start")
189
+ # 7.times {n=n.next}
190
+ # n.name.should=="FoundRecipes"
191
+ end
192
+
193
+ it "should support previous navigation in organize 2" do
194
+
195
+ AUIControl.organize2(@aui)
196
+
197
+ @aui.save # there is still a bug, because save results in false!!
198
+ #.should==true
199
+
200
+ n = AIO.first(:name => "Start")
201
+ # n = @aui #
202
+ # 36.times {n=n.next}
203
+ #n.name.should=="Start"
204
+
205
+ 3.times {n=n.previous}
206
+ n.name.should=="RecipeSelection_label"
207
+
208
+ n = AIO.first(:name => "RecipeCalories")
209
+ 2.times {n=n.previous}
210
+ n.name.should=="RecipeCuisine"
211
+
212
+ # n = AIO.first(:name => "RecipeFinder")
213
+ # 3.times {n=n.previous}
214
+ # n.name.should=="RecipeFinder"
215
+ end
216
+
217
+ it "should find the correct common aic for only one task in ETS" do
218
+ AUIControl.find_common(["Start"]).should=="Start"
219
+ end
220
+
221
+ it "should find the correct common aic for a given ETS" do
222
+ AUIControl.find_common(["RecipeCuisine","RecipeCategory"]).should=="RecipeFilter"
223
+ AUIControl.find_common(["Schweinebraten","RecipeSelection_description"]).should=="RecipeSelection"
224
+ AUIControl.find_common(["Italian","Starter"]).should=="RecipeFilter"
225
+ AUIControl.find_common(["RecipeFinder_label","RecipeFinder_description"]).should=="RecipeFinder"
226
+ AUIControl.find_common(["Schweinebraten","RecipeCalories_choice","RecipeFinder_description"]).should=="RecipeFinder"
227
+ end
228
+
229
+ it "should find the correct common AIC for a given ETS 2" do
230
+ AUIControl.find_common(["RecipeCategory","Start", "FoundRecipes"]).should=="RecipeFinder"
231
+ AUIControl.find_common(["RecipeCategory", "Start", "FoundRecipes", "RecipeCuisine", "RecipeCalories"]).should=="RecipeFinder"
232
+ end
233
+ end
234
+ end
data/spec/aio_spec.rb ADDED
@@ -0,0 +1,144 @@
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