apotomo 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -3
  3. data/.travis.yml +6 -8
  4. data/CHANGES.textile +9 -5
  5. data/README.md +211 -0
  6. data/apotomo.gemspec +4 -4
  7. data/config/routes.rb +1 -1
  8. data/gemfiles/Gemfile.rails3-0 +6 -0
  9. data/gemfiles/Gemfile.rails3-1 +6 -0
  10. data/gemfiles/Gemfile.rails3-2 +6 -0
  11. data/gemfiles/Gemfile.rails4-0 +6 -0
  12. data/lib/apotomo/javascript_generator.rb +3 -3
  13. data/lib/apotomo/test_case.rb +14 -8
  14. data/lib/apotomo/version.rb +1 -1
  15. data/lib/apotomo/widget/javascript_methods.rb +3 -3
  16. data/lib/apotomo/widget/tree_node.rb +1 -1
  17. data/lib/apotomo/widget.rb +3 -3
  18. data/lib/generators/apotomo/widget_generator.rb +1 -1
  19. data/lib/generators/templates/view.slim +3 -4
  20. data/test/apotomo_test.rb +25 -14
  21. data/test/dummy/config/routes.rb +2 -57
  22. data/test/event_handler_test.rb +30 -60
  23. data/test/event_methods_test.rb +62 -62
  24. data/test/event_test.rb +11 -11
  25. data/test/invoke_event_handler_test.rb +59 -0
  26. data/test/javascript_generator_test.rb +57 -72
  27. data/test/rails/caching_test.rb +11 -11
  28. data/test/rails/controller_methods_test.rb +63 -57
  29. data/test/rails/rails_integration_test.rb +47 -47
  30. data/test/rails/view_helper_test.rb +31 -26
  31. data/test/rails/widget_generator_test.rb +16 -16
  32. data/test/render_test.rb +50 -50
  33. data/test/request_processor_test.rb +74 -74
  34. data/test/test_case_test.rb +45 -45
  35. data/test/test_helper.rb +14 -10
  36. data/test/tree_node_test.rb +5 -10
  37. data/test/widget_shortcuts_test.rb +25 -25
  38. data/test/widget_test.rb +82 -80
  39. metadata +73 -49
  40. data/README.rdoc +0 -205
  41. data/TODO +0 -36
  42. data/lib/apotomo/proc_event_handler.rb +0 -18
  43. data/test/onfire_integration_test.rb +0 -22
@@ -1,69 +1,39 @@
1
1
  require 'test_helper'
2
- require 'apotomo/proc_event_handler'
3
2
 
4
- class EventHandlerTest < Test::Unit::TestCase
3
+ class EventHandlerTest < MiniTest::Spec
5
4
  include Apotomo::TestCaseMethods::TestController
6
-
7
- context "an abstract EventHandler" do
8
- should "push nil to root's ordered page_updates when #call'ed" do
5
+
6
+ describe "EventHandler" do
7
+ before do
9
8
  @mum = mouse
10
9
  @mum << mouse_mock(:kid)
11
-
12
- assert_equal 0, @mum.page_updates.size
13
-
14
- [@mum, @mum[:kid], @mum].each do |source|
15
- Apotomo::EventHandler.new.call(Apotomo::Event.new(:squeak, source))
10
+ end
11
+
12
+ it "respond to #process_event" do
13
+ h = Apotomo::EventHandler.new
14
+ e = Apotomo::Event.new(:squeak, @mum)
15
+ assert_equal nil, h.process_event(e)
16
+ end
17
+
18
+ describe "#call" do
19
+ it "push #process_events' results ordered to root's #page_updates" do
20
+ [@mum, @mum[:kid], @mum].each_with_index do |source, i|
21
+ e = Apotomo::Event.new(:squeak, source)
22
+ h = Apotomo::EventHandler.new
23
+ h.stub :process_event, "tick#{i}" do
24
+ h.call(e)
25
+ end
26
+ end
27
+
28
+ assert_equal 3, @mum.page_updates.size
29
+ assert_equal "tick0", @mum.page_updates[0]
30
+ assert_equal "tick1", @mum.page_updates[1]
31
+ assert_equal "tick2", @mum.page_updates[2]
32
+ assert_equal 0, @mum[:kid].page_updates.size
16
33
  end
17
-
18
- # order matters:
19
- assert_equal 3, @mum.page_updates.size
20
- assert_equal 0, @mum[:kid].page_updates.size
21
- assert_equal(nil, @mum.page_updates[0])
22
- assert_equal(nil, @mum.page_updates[1])
23
- assert_equal(nil, @mum.page_updates[2])
34
+
35
+ #TODO: handler expect #process_event
24
36
  end
25
37
  end
26
-
27
-
28
-
29
- def test_invoke_to_s
30
- h = Apotomo::InvokeEventHandler.new
31
- h.widget_id = :widget_id
32
- h.state = :my_state
33
- assert_equal "InvokeEventHandler:widget_id#my_state", h.to_s
34
- end
35
-
36
- def test_proc_to_s
37
- h = Apotomo::ProcEventHandler.new
38
- h.proc = :my_method
39
- assert_equal "ProcEventHandler:my_method", h.to_s
40
- end
41
-
42
- def test_constructor_for_proc
43
- h = Apotomo::ProcEventHandler.new
44
- assert_nil h.proc
45
- h = Apotomo::ProcEventHandler.new(:proc => :method)
46
- assert_equal :method, h.proc
47
- end
48
-
49
- def test_constructor_for_invoke
50
- h = Apotomo::InvokeEventHandler.new
51
- assert_nil h.widget_id
52
- assert_nil h.state
53
- h = Apotomo::InvokeEventHandler.new(:widget_id => :widget, :state => :state)
54
- assert_equal :widget, h.widget_id
55
- assert_equal :state, h.state
56
- end
57
-
58
- def test_equal
59
- h1 = Apotomo::ProcEventHandler.new(:proc => :run)
60
- h2 = Apotomo::ProcEventHandler.new(:proc => :run)
61
- h3 = Apotomo::ProcEventHandler.new(:proc => :walk)
62
-
63
- assert h1 == h2
64
- assert h1 != h3
65
- end
66
-
67
- ### TODO: test #call
68
-
38
+
69
39
  end
@@ -1,105 +1,105 @@
1
1
  require 'test_helper'
2
-
3
- class EventMethodsTest < Test::Unit::TestCase
2
+
3
+ class EventMethodsTest < MiniTest::Spec
4
4
  include Apotomo::TestCaseMethods::TestController
5
-
5
+
6
6
  def handler(id, state)
7
7
  Apotomo::InvokeEventHandler.new(:widget_id => id, :state => state)
8
8
  end
9
-
10
-
11
- context "#respond_to_event and #fire" do
12
- setup do
9
+
10
+
11
+ describe "#respond_to_event and #fire" do
12
+ before do
13
13
  mum_and_kid!
14
14
  end
15
-
16
- should "alert @mum first, then make her squeak when @kid squeaks" do
15
+
16
+ it "alert @mum first, then make her squeak when @kid squeaks" do
17
17
  @kid.fire :squeak
18
18
  assert_equal ['be alerted', 'answer squeak'], @mum.list
19
19
  end
20
-
21
- should "make @mum just squeak back when jerry squeaks" do
20
+
21
+ it "make @mum just squeak back when jerry squeaks" do
22
22
  @mum << mouse_mock(:jerry)
23
23
  @mum[:jerry].fire :squeak
24
24
  assert_equal ['answer squeak'], @mum.list
25
25
  end
26
-
27
-
28
- should "make @mum run away while @kid keeps watching" do
26
+
27
+
28
+ it "make @mum run away while @kid keeps watching" do
29
29
  @kid.fire :footsteps
30
30
  assert_equal ['peek', 'escape'], @mum.list
31
31
  end
32
-
33
- should "by default add a handler only once" do
32
+
33
+ it "by default add a handler only once" do
34
34
  @mum.respond_to_event :peep, :with => :answer_squeak
35
35
  @mum.respond_to_event :peep, :with => :answer_squeak
36
36
  @mum.fire :peep
37
37
  assert_equal ['answer squeak'], @mum.list
38
38
  end
39
-
40
- should "squeak back twice when using the :once => false option" do
39
+
40
+ it "squeak back twice when using the :once => false option" do
41
41
  @mum.respond_to_event :peep, :with => :answer_squeak
42
42
  @mum.respond_to_event :peep, :with => :answer_squeak, :once => false
43
43
  @mum.fire :peep
44
44
  assert_equal ['answer squeak', 'answer squeak'], @mum.list
45
45
  end
46
-
47
- should "also accept an event argument only" do
46
+
47
+ it "also accept an event argument only" do
48
48
  @mum.respond_to_event :answer_squeak
49
49
  @mum.fire :answer_squeak
50
50
  assert_equal ['answer squeak'], @mum.list
51
- end
52
-
53
- should "make pass the event into the triggered state" do
51
+ end
52
+
53
+ it "make pass the event into the triggered state" do
54
54
  @mum.instance_eval do
55
55
  respond_to_event :footsteps
56
-
56
+
57
57
  def footsteps(evt)
58
58
  list << evt
59
59
  end
60
60
  end
61
-
61
+
62
62
  @mum.trigger :footsteps, "near"
63
63
  assert_kind_of Apotomo::Event, @mum.list.last
64
64
  end
65
-
66
- should "accept payload data for the event" do
65
+
66
+ it "accept payload data for the event" do
67
67
  @mum.respond_to_event :answer_squeak
68
68
  @mum.instance_eval do
69
69
  def answer_squeak(evt)
70
70
  list << evt.data
71
71
  end
72
72
  end
73
-
73
+
74
74
  @mum.fire :answer_squeak, :volume => 9
75
75
  assert_equal [{:volume => 9}], @mum.list
76
76
  end
77
-
78
-
79
- context "#responds_to_event with :passing" do
80
- setup do
77
+
78
+
79
+ describe "#responds_to_event with :passing" do
80
+ before do
81
81
  class AdolescentMouse < MouseWidget
82
82
  responds_to_event :squeak, :passing => :root
83
83
  end
84
-
84
+
85
85
  @root = mouse(:root)
86
86
  end
87
-
88
- should "add handlers to root when called with :passing" do
87
+
88
+ it "add handlers to root when called with :passing" do
89
89
  AdolescentMouse.new(@root, 'jerry')
90
-
90
+
91
91
  assert_equal [handler('jerry', :squeak)], @root.event_table.all_handlers_for(:squeak, 'jerry')
92
92
  end
93
-
94
- should "inherit :passing handlers" do
93
+
94
+ it "inherit :passing handlers" do
95
95
  Class.new(AdolescentMouse).new(@root, 'jerry')
96
-
96
+
97
97
  assert_equal [handler('jerry', :squeak)], @root.event_table.all_handlers_for(:squeak, 'jerry')
98
98
  end
99
-
99
+
100
100
  end
101
-
102
- context "#responds_to_event in class context" do
101
+
102
+ describe "#responds_to_event in class context" do
103
103
  class AdultMouse < Apotomo::Widget
104
104
  responds_to_event :peep, :with => :answer_squeak
105
105
  end
@@ -107,46 +107,46 @@ class EventMethodsTest < Test::Unit::TestCase
107
107
  responds_to_event :peep
108
108
  responds_to_event :footsteps, :with => :squeak
109
109
  end
110
-
111
- setup do
110
+
111
+ before do
112
112
  @mum = AdultMouse.new(parent_controller, 'mum')
113
113
  end
114
-
115
- should "add the handlers at creation time" do
114
+
115
+ it "add the handlers at creation time" do
116
116
  assert_equal [handler('mum', :answer_squeak)], @mum.event_table.all_handlers_for(:peep, 'mum')
117
117
  end
118
-
119
- should "inherit handlers" do
118
+
119
+ it "inherit handlers" do
120
120
  assert_equal [[:peep, {:with=>:answer_squeak}]], AdultMouse.responds_to_event_options
121
121
  assert_equal [[:peep, {:with=>:answer_squeak}], [:peep], [:footsteps, {:with=>:squeak}]], BabyMouse.responds_to_event_options
122
122
  end
123
-
124
- should "not share responds_to_event options between different instances" do
123
+
124
+ it "not share responds_to_event options between different instances" do
125
125
  assert_equal [handler('mum', :answer_squeak)], @mum.event_table.all_handlers_for(:peep, 'mum')
126
-
126
+
127
127
  assert_equal [handler('dad', :answer_squeak)], AdultMouse.new(parent_controller, 'dad', :show).event_table.all_handlers_for(:peep, 'dad')
128
128
  end
129
129
  end
130
-
131
- context "#trigger" do
132
- should "be an alias for #fire" do
130
+
131
+ describe "#trigger" do
132
+ it "be an alias for #fire" do
133
133
  @kid.trigger :footsteps
134
134
  assert_equal ['peek', 'escape'], @mum.list
135
135
  end
136
136
  end
137
-
138
-
139
- context "page_updates" do
140
- should "expose a simple Array for now" do
137
+
138
+
139
+ describe "page_updates" do
140
+ it "expose a simple Array for now" do
141
141
  assert_kind_of Array, @mum.page_updates
142
142
  assert_equal 0, @mum.page_updates.size
143
143
  end
144
-
145
- should "be queued in root#page_updates after #fire" do
144
+
145
+ it "be queued in root#page_updates after #fire" do
146
146
  @mum.fire :footsteps
147
147
  assert_equal ["escape"], @mum.page_updates
148
148
  end
149
149
  end
150
-
151
- end
150
+
151
+ end
152
152
  end
data/test/event_test.rb CHANGED
@@ -1,26 +1,26 @@
1
1
  require 'test_helper'
2
-
3
- class EventTest < Test::Unit::TestCase
2
+
3
+ class EventTest < MiniTest::Spec
4
4
  include Apotomo::TestCaseMethods::TestController
5
-
6
- context "An Event" do
7
- should "respond to #type and #source" do
5
+
6
+ describe "An Event" do
7
+ it "respond to #type and #source" do
8
8
  @event = Apotomo::Event.new(:footsteps, 'mum')
9
9
  assert_equal :footsteps, @event.type
10
10
  assert_equal 'mum', @event.source
11
11
  end
12
-
13
- should "accept an additional data object and respond to #data" do
12
+
13
+ it "accept an additional data object and respond to #data" do
14
14
  @event = Apotomo::Event.new(:footsteps, 'mum', {:volume => :loud})
15
15
  assert_equal({:volume => :loud}, @event.data)
16
16
  end
17
-
18
- should "delegate #[] to data" do
17
+
18
+ it "delegate #[] to data" do
19
19
  @event = Apotomo::Event.new(:footsteps, 'mum', {:volume => :loud})
20
20
  assert_equal :loud, @event[:volume]
21
21
  end
22
-
23
- should "respond to #to_s" do
22
+
23
+ it "respond to #to_s" do
24
24
  @event = Apotomo::Event.new(:footsteps, mouse('mum'))
25
25
  assert_equal "<Event :footsteps source=mum>", @event.to_s
26
26
  end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ class EventHandlerTest < MiniTest::Spec
4
+ include Apotomo::TestCaseMethods::TestController
5
+
6
+ describe "InvokeEventHandler" do
7
+ describe "constructor" do
8
+ it "accept no arguments" do
9
+ h = Apotomo::InvokeEventHandler.new
10
+ assert_nil h.widget_id
11
+ assert_nil h.state
12
+ end
13
+
14
+ it "accept options" do
15
+ h = Apotomo::InvokeEventHandler.new(:widget_id => :widget, :state => :state)
16
+ assert_equal :widget, h.widget_id
17
+ assert_equal :state, h.state
18
+ end
19
+ end
20
+
21
+ describe "equality methods" do
22
+ it "repond to #==" do
23
+ h1 = Apotomo::InvokeEventHandler.new(:widget_id => :widget, :state => :state)
24
+ h2 = Apotomo::InvokeEventHandler.new(:widget_id => :widget, :state => :state)
25
+
26
+ assert h1 == h2
27
+ assert h2 == h1
28
+ end
29
+
30
+ it "repond to #!=" do
31
+ h1 = Apotomo::InvokeEventHandler.new(:widget_id => :widget, :state => :state)
32
+
33
+ h3 = Apotomo::InvokeEventHandler.new(:widget_id => :another_widget, :state => :state)
34
+ assert h1 != h3
35
+ assert h3 != h1
36
+
37
+ h4 = Apotomo::InvokeEventHandler.new(:widget_id => :widget, :state => :another_state)
38
+ assert h1 != h4
39
+ assert h4 != h1
40
+
41
+ h5 = Apotomo::InvokeEventHandler.new
42
+ assert h1 != h5
43
+ assert h5 != h1
44
+
45
+ # TODO: test InvokeEventHandler == EventHandler
46
+ end
47
+ end
48
+
49
+ it "respond to #to_s" do
50
+ h = Apotomo::InvokeEventHandler.new
51
+ h.widget_id = :widget_id
52
+ h.state = :my_state
53
+ assert_equal "InvokeEventHandler:widget_id#my_state", h.to_s
54
+ end
55
+ end
56
+
57
+ ### TODO: test #process_event
58
+
59
+ end
@@ -1,89 +1,74 @@
1
1
  require 'test_helper'
2
2
 
3
- class JavascriptGeneratorTest < Test::Unit::TestCase
4
- context "The JavascriptGenerator" do
5
- should "raise an error if no framework passed" do
6
- assert_raises RuntimeError do
7
- Apotomo::JavascriptGenerator.new(nil)
8
- end
9
- end
10
-
11
- context "in prototype mode" do
12
- setup do
13
- @gen = Apotomo::JavascriptGenerator.new(:prototype)
14
- end
15
-
16
- should "respond to prototype" do
17
- assert_respond_to @gen, :prototype
18
- end
19
-
20
- should "respond to replace" do
21
- assert_equal "$(\"drinks\").replace(\"EMPTY!\");", @gen.replace(:drinks, 'EMPTY!')
22
- end
23
-
24
- should "respond to replace_id" do
25
- assert_equal "$(\"drinks\").replace(\"EMPTY!\");", @gen.replace_id("drinks", 'EMPTY!')
26
- end
27
-
28
- should "respond to update" do
29
- assert_equal "$(\"drinks\").update(\"<li id=\\\"beer\\\"><\\/li>\");", @gen.update(:drinks, '<li id="beer"></li>')
3
+ class JavascriptGeneratorTest < MiniTest::Spec
4
+ describe "The JavascriptGenerator" do
5
+ describe "constructor" do
6
+ it "accept framework name and return an correct instance" do
7
+ @gen = Apotomo::JavascriptGenerator.new(:Jquery)
8
+
9
+ assert_kind_of Apotomo::JavascriptGenerator, @gen
10
+ assert_kind_of Apotomo::JavascriptGenerator::Jquery, @gen
30
11
  end
31
-
32
- should "respond to update_id" do
33
- assert_equal "$(\"drinks\").update(\"EMPTY!\");", @gen.update_id("drinks", 'EMPTY!')
12
+
13
+ it "raise an error if no framework passed" do
14
+ assert_raises RuntimeError do
15
+ Apotomo::JavascriptGenerator.new(nil)
16
+ end
34
17
  end
35
18
  end
36
-
37
- context "in right mode" do
38
- setup do
39
- @gen = Apotomo::JavascriptGenerator.new(:right)
40
- end
41
-
42
- should "respond to right" do
43
- assert_respond_to @gen, :right
44
- end
45
-
46
- should "respond to replace" do
47
- assert_equal "$(\"drinks\").replace(\"EMPTY!\");", @gen.replace(:drinks, 'EMPTY!')
48
- end
49
-
50
- should "respond to replace_id" do
51
- assert_equal "$(\"drinks\").replace(\"EMPTY!\");", @gen.replace_id("drinks", 'EMPTY!')
52
- end
53
-
54
- should "respond to update" do
55
- assert_equal "$(\"drinks\").update(\"<li id=\\\"beer\\\"><\\/li>\");", @gen.update(:drinks, '<li id="beer"></li>')
19
+
20
+ it "respond to ::escape" do
21
+ assert_equal '', Apotomo::JavascriptGenerator.escape(nil)
22
+ assert_equal %(This \\"thing\\" is really\\n netos\\'), Apotomo::JavascriptGenerator.escape(%(This "thing" is really\n netos'))
23
+ assert_equal %(backslash\\\\test), Apotomo::JavascriptGenerator.escape(%(backslash\\test))
24
+ assert_equal %(dont <\\/close> tags), Apotomo::JavascriptGenerator.escape(%(dont </close> tags))
25
+ end
26
+
27
+ describe "in jQuery mode" do
28
+ before do
29
+ @gen = Apotomo::JavascriptGenerator.new(:Jquery)
56
30
  end
57
-
58
- should "respond to update_id" do
59
- assert_equal "$(\"drinks\").update(\"EMPTY!\");", @gen.update_id("drinks", 'EMPTY!')
31
+
32
+ it "respond to #escape" do
33
+ assert_equal '', @gen.escape(nil)
34
+ assert_equal %(This \\"thing\\" is really\\n netos\\'), @gen.escape(%(This "thing" is really\n netos'))
35
+ assert_equal %(backslash\\\\test), @gen.escape(%(backslash\\test))
36
+ assert_equal %(dont <\\/close> tags), @gen.escape(%(dont </close> tags))
60
37
  end
61
- end
62
-
63
- context "in jquery mode" do
64
- setup do
65
- @gen = Apotomo::JavascriptGenerator.new(:jquery)
38
+
39
+ it "respond to #<< and return argument converted to String" do
40
+ assert_equal "bla_bla", (@gen << "bla_bla")
41
+ assert_equal "bla_bla", (@gen << :bla_bla)
66
42
  end
67
-
68
- should "respond to jquery" do
43
+
44
+ it "respond to #jquery" do
69
45
  assert_respond_to @gen, :jquery
70
46
  end
71
-
72
- should "respond to replace" do
73
- assert_equal "$(\"#drinks\").replaceWith(\"EMPTY!\");", @gen.replace("#drinks", 'EMPTY!')
47
+
48
+ it "respond to #element" do
49
+ assert_equal "jQuery(\"#drinks\")", @gen.element("#drinks")
50
+ end
51
+
52
+ it "respond to #replace" do
53
+ assert_equal "jQuery(\"#drinks\").replaceWith(\"EMPTY!\");", @gen.replace("#drinks", 'EMPTY!')
74
54
  end
75
-
76
- should "respond to replace_id" do
77
- assert_equal "$(\"#drinks\").replaceWith(\"EMPTY!\");", @gen.replace_id("drinks", 'EMPTY!')
55
+
56
+ it "respond to #replace_id" do
57
+ assert_equal "jQuery(\"#drinks\").replaceWith(\"EMPTY!\");", @gen.replace_id("drinks", 'EMPTY!')
78
58
  end
79
-
80
- should "respond to update" do
81
- assert_equal "$(\"#drinks\").html(\"<li id=\\\"beer\\\"><\\/li>\");", @gen.update("#drinks", '<li id="beer"></li>')
59
+
60
+ it "respond to #update" do
61
+ assert_equal "jQuery(\"#drinks\").html(\"<li id=\\\"beer\\\"><\\/li>\");", @gen.update("#drinks", '<li id="beer"></li>')
82
62
  end
83
-
84
- should "respond to update_id" do
85
- assert_equal "$(\"#drinks\").html(\"EMPTY!\");", @gen.update_id("drinks", 'EMPTY!')
63
+
64
+ it "respond to #update_id" do
65
+ assert_equal "jQuery(\"#drinks\").html(\"EMPTY!\");", @gen.update_id("drinks", 'EMPTY!')
86
66
  end
67
+
68
+ # TODO: Prototype mode
69
+
70
+ # TODO: Right mode
71
+
87
72
  end
88
73
  end
89
74
  end
@@ -2,28 +2,28 @@ require 'test_helper'
2
2
 
3
3
  # TODO: assert that same-named cells and widgets don't overwrite their caches.
4
4
 
5
- class CachingTest < ActiveSupport::TestCase
5
+ class CachingTest < MiniTest::Spec
6
6
  include Apotomo::TestCaseMethods::TestController
7
-
7
+
8
8
  class CheeseWidget < Apotomo::Widget
9
9
  cache :holes
10
-
10
+
11
11
  def holes(count)
12
12
  render :text => count
13
- end
13
+ end
14
14
  end
15
-
16
- context "A caching widget" do
17
- setup do
15
+
16
+ describe "A caching widget" do
17
+ before do
18
18
  ActionController::Base.perform_caching = true
19
19
  @cheese = CheeseWidget.new(parent_controller, 'cheese', :holes)
20
20
  end
21
-
22
- teardown do
21
+
22
+ after do
23
23
  ActionController::Base.perform_caching = false
24
24
  end
25
-
26
- should "invoke the cached state only once" do
25
+
26
+ it "invoke the cached state only once" do
27
27
  assert_equal "1", @cheese.invoke(:holes, 1)
28
28
  assert_equal "1", @cheese.invoke(:holes, 2)
29
29
  end