spec/role_spec.rb in moosex-0.0.13 vs spec/role_spec.rb in moosex-0.0.14
- old
+ new
@@ -79,5 +79,135 @@
ComplexRole::WrongClass.new(one: 1, two: 2)
}.to raise_error(MooseX::RequiredMethodNotFoundError,
"you must implement method 'equal' in ComplexRole::WrongClass: required")
end
end
+
+module AfterBefore
+ module Sayhi
+ include MooseX
+ requires :say
+ before(:say) do |object, message|
+ object.logger.before_say_2(message)
+ end
+ end
+
+ module Sayhi2
+ include MooseX
+ requires :say
+ after(:say) do |object, message|
+ object.logger.after_say_2(message)
+ end
+ end
+
+ module Sayhi3
+ include MooseX
+ requires :say
+ around(:say) do |lambda, object, message|
+ object.logger.around_say_2(message)
+ v = lambda.call(object,message + 1)
+ object.logger.around_say_2(message)
+ v + 2
+ end
+ end
+
+ class Undertest
+ include MooseX
+ has logger: { is: :rw, required: true }
+
+ def say(message)
+ self.logger.say(message)
+ message
+ end
+
+ around(:say) do |lambda, object, message|
+ object.logger.around_say_1(message)
+ v = lambda.call(object,message + 1)
+ object.logger.around_say_1(message)
+ v + 1
+ end
+
+ after(:say) do |object, message|
+ object.logger.after_say_1(message)
+ end
+
+ before(:say) do |object, message|
+ object.logger.before_say_1(message)
+ end
+
+ include Sayhi
+ include Sayhi2
+ include Sayhi3
+
+ after(:say) do |object, message|
+ object.logger.after_say_3(message)
+ end
+
+ before(:say) do |object, message|
+ object.logger.before_say_3(message)
+ end
+
+ around(:say) do |lambda, object, message|
+ object.logger.around_say_3(message)
+ v = lambda.call(object,message + 1)
+ object.logger.around_say_3(message)
+ v + 1
+ end
+ end
+
+ class Undertest2 < Undertest
+ def say(x) ; self.logger.say(x); 2*x; end
+ include Sayhi; include Sayhi3
+ end
+end
+
+describe "AfterBefore::Undertest" do
+ it "should print two messages" do
+ logger = double()
+
+ logger.should_receive(:around_say_3).with(1).once()
+
+ logger.should_receive(:before_say_3).with(2).once()
+
+ logger.should_receive(:around_say_2).with(2).once()
+
+ logger.should_receive(:before_say_2).with(3).once()
+
+ logger.should_receive(:before_say_1).with(3).once()
+
+ logger.should_receive(:around_say_1).with(3).once()
+
+ logger.should_receive(:say).with(4).once()
+
+ logger.should_receive(:around_say_1).with(3).once()
+
+ logger.should_receive(:after_say_1).with(3).once()
+
+ logger.should_receive(:after_say_2).with(3).once()
+
+ logger.should_receive(:around_say_2).with(2).once()
+
+ logger.should_receive(:after_say_3).with(2).once()
+
+ logger.should_receive(:around_say_3).with(1).once()
+
+ u = AfterBefore::Undertest.new(logger: logger)
+ u.say(1).should == 8
+ end
+end
+
+describe "AfterBefore::Undertest2" do
+ it "should print two messages" do
+ logger = double()
+
+ logger.should_receive(:before_say_2).with(2).once()
+
+ logger.should_receive(:around_say_2).with(1).once()
+
+ logger.should_receive(:say).with(2).once()
+
+ logger.should_receive(:around_say_2).with(1).once()
+
+ u = AfterBefore::Undertest2.new(logger: logger)
+ u.say(1).should == 6 # 1 -> 1+1 -> 2*2 -> 4+2
+ end
+end
\ No newline at end of file