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