I don't believe that for a second. On Wed, Jun 23, 2010 at 5:40 PM, Rein Henrichs <[email protected]> wrote:
> I never meta spec I didn't like. > > Rein Henrichs > http://puppetlabs.com > > > On Wed, Jun 23, 2010 at 5:27 PM, Matt Robinson <[email protected]>wrote: > >> +1. I was okay with the spec_specs directory name, but if anyone has a >> better suggestion I'd be glad to hear it. At some point if this goes >> through we'll want to get something like this in master, and there we should >> remember that the Rakefile there runs the specs differently and we'd need to >> include the new directory there. >> >> >> On Wed, Jun 23, 2010 at 5:12 PM, Rein Henrichs <[email protected]>wrote: >> >>> This way the test can be evaluated lazily when needed. Adds tests and >>> documentation. >>> >>> Signed-off-by: Rein Henrichs <[email protected]> >>> --- >>> spec/spec_specs/runnable_spec.rb | 95 >>> ++++++++++++++++++++++++++++++++++ >>> test/lib/puppettest/runnable_test.rb | 54 +++++++++++-------- >>> 2 files changed, 127 insertions(+), 22 deletions(-) >>> create mode 100644 spec/spec_specs/runnable_spec.rb >>> >>> diff --git a/spec/spec_specs/runnable_spec.rb >>> b/spec/spec_specs/runnable_spec.rb >>> new file mode 100644 >>> index 0000000..fd2e488 >>> --- /dev/null >>> +++ b/spec/spec_specs/runnable_spec.rb >>> @@ -0,0 +1,95 @@ >>> +require File.dirname(__FILE__) + '/../spec_helper' >>> + >>> +describe PuppetTest::RunnableTest do >>> + before do >>> + @runnable_test = Class.new.extend(PuppetTest::RunnableTest) >>> + end >>> + >>> + describe "#confine" do >>> + subject { @runnable_test } >>> + >>> + it "should accept a hash" do >>> + subject.confine({}).should_not raise_error(ArgumentError) >>> + end >>> + >>> + it "should accept a message and a block" do >>> + subject.confine(""){}.should_not raise_error(ArgumentError) >>> + end >>> + >>> + end >>> + >>> + describe "#runnable?" do >>> + describe "when the superclass is not runnable" do >>> + before { >>> @runnable_test.stubs(:superclass).returns(stub("unrunnable superclass", >>> :runnable? => false)) } >>> + subject { @runnable_test.runnable? } >>> + >>> + it { should be_false } >>> + end >>> + >>> + describe "when a confine is false" do >>> + before { @runnable_test.confine(:message => false) } >>> + subject { @runnable_test.runnable? } >>> + >>> + it { should be_false } >>> + end >>> + >>> + describe "when a confine has a block that returns false" do >>> + before { @runnable_test.confine(:message){ false } } >>> + subject { @runnable_test.runnable? } >>> + >>> + it { should be_false } >>> + end >>> + >>> + describe "when a confine is true and no false confines" do >>> + before { @runnable_test.confine(:message => true) } >>> + subject { @runnable_test.runnable? } >>> + >>> + it { should be_true } >>> + end >>> + >>> + describe "when a confine has block that returns true and no >>> false confines" do >>> + before { @runnable_test.confine(:message){ true } } >>> + subject { @runnable_test.runnable? } >>> + >>> + it { should be_true } >>> + end >>> + >>> + end >>> + >>> + describe "#messages" do >>> + describe "before runnable? is called" do >>> + subject { @runnable_test.messages } >>> + >>> + it { should == [] } >>> + end >>> + >>> + describe "when runnable? is called and returns false" do >>> + before do >>> + @runnable_test.confine(:message => false) >>> + @runnable_test.runnable? >>> + end >>> + >>> + subject { @runnable_test.messages } >>> + >>> + it "should include the failed confine's message" do >>> + should include(:message) >>> + end >>> + >>> + end >>> + >>> + describe "when runnable? is called whose block returns false" do >>> + before do >>> + @runnable_test.confine(:message){ false } >>> + @runnable_test.runnable? >>> + end >>> + >>> + subject { @runnable_test.messages } >>> + >>> + it "should include the failed confine's message" do >>> + should include(:message) >>> + end >>> + >>> + end >>> + >>> + end >>> +end >>> diff --git a/test/lib/puppettest/runnable_test.rb >>> b/test/lib/puppettest/runnable_test.rb >>> index 977dba4..6fcd9c6 100644 >>> --- a/test/lib/puppettest/runnable_test.rb >>> +++ b/test/lib/puppettest/runnable_test.rb >>> @@ -1,35 +1,45 @@ >>> # Manage whether a test is runnable. >>> module PuppetTest >>> module RunnableTest >>> - # Confine this test based on specified criteria. The keys of >>> the >>> - # hash should be the message to use if the test is not suitable, >>> - # and the values should be either 'true' or 'false'; true values >>> - # mean the test is suitable. >>> - def confine(hash) >>> - @confines ||= {} >>> - hash.each do |message, result| >>> - @confines[message] = result >>> - end >>> + # Confine this example group based on specified criteria. This >>> can be >>> + # a message and its related test either as a hash or as a single >>> + # message argument and a block to be evaluated at the time the >>> confine >>> + # is checked. >>> + # >>> + # Examples: >>> + # >>> + # confine "Rails is not available" => Puppet.features.rails? >>> + # >>> + # confine("ActiveRecord 2.1.x") { ::ActiveRecord::VERSION::MAJOR >>> == 2 and ::ActiveRecord::VERSION::MINOR <= 1 } >>> + # >>> + def confine(hash_or_message, &block) >>> + hash = block_given? ? {hash_or_message => block} : >>> hash_or_message >>> + confines.update hash >>> end >>> >>> - attr_reader :messages >>> - >>> - # Evaluate all of our tests to see if any of them are false >>> - # and thus whether this test is considered not runnable. >>> + # Check all confines for a given example group, starting with >>> any >>> + # specified in the parent example group. If any confine test is >>> false, >>> + # the example group is not runnable (and will be skipped). Note: >>> This >>> + # is used directly by Rspec and is not intended for develper >>> use. >>> + # >>> def runnable? >>> - @messages ||= [] >>> - if superclass.respond_to?(:runnable?) and ! >>> superclass.runnable? >>> + if superclass.respond_to?(:runnable?) and not >>> superclass.runnable? >>> return false >>> end >>> - return false unless @messages.empty? >>> - return true unless defined? @confines >>> - @confines.find_all do |message, result| >>> - ! result >>> - end.each do |message, result| >>> - @messages << message >>> + >>> + confines.each do |message, is_runnable| >>> + is_runnable = is_runnable.call if >>> is_runnable.respond_to?(:call) >>> + messages << message unless is_runnable >>> end >>> >>> - return @messages.empty? >>> + messages.empty? >>> end >>> + >>> + def messages; @messages ||= [] end >>> + >>> + private >>> + >>> + def confines; @confines ||= {} end >>> end >>> + >>> end >>> -- >>> 1.7.0.4 >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Puppet Developers" group. >>> To post to this group, send email to [email protected]. >>> To unsubscribe from this group, send email to >>> [email protected]<puppet-dev%[email protected]> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/puppet-dev?hl=en. >>> >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "Puppet Developers" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]<puppet-dev%[email protected]> >> . >> For more options, visit this group at >> http://groups.google.com/group/puppet-dev?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Developers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<puppet-dev%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/puppet-dev?hl=en. > -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
