MINT-core 1.0.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 (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