moduleSpecmoduleExamplemoduleExampleGroupMethodsclass<<selfdefdescription_text(*args)args.inject("")do|result,arg|result<<" "unless(result==""||arg.to_s=~/^(\s|\.|#)/)result<<arg.to_sendendendattr_reader:description_text,:description_args,:description_options,:spec_pathdefinherited(klass)superklass.registerend# Makes the describe/it syntax available from a class. For example:## class StackSpec < Spec::ExampleGroup# describe Stack, "with no elements"## before# @stack = Stack.new# end## it "should raise on pop" do# lambda{ @stack.pop }.should raise_error# end# end#defdescribe(*args,&example_group_block)ifexample_group_blockself.subclass("Subclass")dodescribe(*args)module_eval(&example_group_block)endelseset_description(*args)before_evalselfendend# Use this to pull in examples from shared example groups.# See Spec::Runner for information about shared example groups.defit_should_behave_like(shared_example_group)caseshared_example_groupwhenSharedExampleGroupincludeshared_example_groupelseexample_group=SharedExampleGroup.find_shared_example_group(shared_example_group)unlessexample_groupraiseRuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")endinclude(example_group)endend# :call-seq:# predicate_matchers[matcher_name] = method_on_object# predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]## Dynamically generates a custom matcher that will match# a predicate on your class. RSpec provides a couple of these# out of the box:## exist (or state expectations)# File.should exist("path/to/file")## an_instance_of (for mock argument constraints)# mock.should_receive(:message).with(an_instance_of(String))## == Examples## class Fish# def can_swim?# true# end# end## describe Fish do# predicate_matchers[:swim] = :can_swim?# it "should swim" do# Fish.new.should swim# end# enddefpredicate_matchers@predicate_matchers||={:an_instance_of=>:is_a?}end# Creates an instance of Spec::Example::Example and adds# it to a collection of examples of the current example group.defit(description=nil,&implementation)e=new(description,&implementation)example_objects<<eeendalias_method:specify,:it# Use this to temporarily disable an example.defxit(description=nil,opts={},&block)Kernel.warn("Example disabled: #{description}")enddefrunexamples=examples_to_runreturntrueifexamples.empty?reporter.add_example_group(self)returndry_run(examples)ifdry_run?plugin_mock_frameworkdefine_methods_from_predicate_matcherssuccess,before_all_instance_variables=run_before_allsuccess,after_all_instance_variables=execute_examples(success,before_all_instance_variables,examples)success=run_after_all(success,after_all_instance_variables)enddefdescriptionresult=ExampleGroupMethods.description_text(*description_parts)ifresult.nil?||result==""returnto_selseresultendenddefdescribed_typedescription_parts.find{|part|part.is_a?(Module)}enddefdescription_parts#:nodoc:parts=[]execute_in_class_hierarchydo|example_group|parts<<example_group.description_argsendparts.flatten.compactenddefset_description(*args)args,options=args_and_options(*args)@description_args=args@description_options=options@description_text=ExampleGroupMethods.description_text(*args)@spec_path=File.expand_path(options[:spec_path])ifoptions[:spec_path]ifdescribed_type.class==Moduleincludedescribed_typeendselfenddefexamples#:nodoc:examples=example_objects.dupadd_method_examples(examples)rspec_options.reverse?examples.reverse:examplesenddefnumber_of_examples#:nodoc:examples.lengthend# Registers a block to be executed before each example.# This method prepends +block+ to existing before blocks.defprepend_before(*args,&block)scope,options=scope_and_options(*args)parts=before_parts_from_scope(scope)parts.unshift(block)end# Registers a block to be executed before each example.# This method appends +block+ to existing before blocks.defappend_before(*args,&block)scope,options=scope_and_options(*args)parts=before_parts_from_scope(scope)parts<<blockendalias_method:before,:append_before# Registers a block to be executed after each example.# This method prepends +block+ to existing after blocks.defprepend_after(*args,&block)scope,options=scope_and_options(*args)parts=after_parts_from_scope(scope)parts.unshift(block)endalias_method:after,:prepend_after# Registers a block to be executed after each example.# This method appends +block+ to existing after blocks.defappend_after(*args,&block)scope,options=scope_and_options(*args)parts=after_parts_from_scope(scope)parts<<blockenddefremove_after(scope,&block)after_each_parts.delete(block)end# Deprecated. Use before(:each)defsetup(&block)before(:each,&block)end# Deprecated. Use after(:each)defteardown(&block)after(:each,&block)enddefbefore_all_parts# :nodoc:@before_all_parts||=[]enddefafter_all_parts# :nodoc:@after_all_parts||=[]enddefbefore_each_parts# :nodoc:@before_each_parts||=[]enddefafter_each_parts# :nodoc:@after_each_parts||=[]end# Only used from RSpec's own examplesdefreset# :nodoc:@before_all_parts=nil@after_all_parts=nil@before_each_parts=nil@after_each_parts=nilenddefregisterrspec_options.add_example_groupselfenddefunregister#:nodoc:rspec_options.remove_example_groupselfenddefrun_before_each(example)execute_in_class_hierarchydo|example_group|example.eval_each_fail_fast(example_group.before_each_parts)endenddefrun_after_each(example)execute_in_class_hierarchy(:superclass_first)do|example_group|example.eval_each_fail_slow(example_group.after_each_parts)endendprivatedefdry_run(examples)examples.eachdo|example|rspec_options.reporter.example_started(example)rspec_options.reporter.example_finished(example)endreturntrueenddefrun_before_allbefore_all=new("before(:all)")beginexecute_in_class_hierarchydo|example_group|before_all.eval_each_fail_fast(example_group.before_all_parts)endreturn[true,before_all.instance_variable_hash]rescueException=>ereporter.failure(before_all,e)return[false,before_all.instance_variable_hash]endenddefexecute_examples(success,instance_variables,examples)return[success,instance_variables]unlesssuccessafter_all_instance_variables=instance_variablesexamples.eachdo|example_group_instance|success&=example_group_instance.execute(rspec_options,instance_variables)after_all_instance_variables=example_group_instance.instance_variable_hashendreturn[success,after_all_instance_variables]enddefrun_after_all(success,instance_variables)after_all=new("after(:all)")after_all.set_instance_variables_from_hash(instance_variables)execute_in_class_hierarchy(:superclass_first)do|example_group|after_all.eval_each_fail_slow(example_group.after_all_parts)endreturnsuccessrescueException=>ereporter.failure(after_all,e)returnfalseenddefexamples_to_runall_examples=examplesreturnall_examplesunlessspecified_examples?all_examples.rejectdo|example|matcher=ExampleMatcher.new(description.to_s,example.description)!matcher.matches?(specified_examples)endenddefspecified_examples?specified_examples&&!specified_examples.empty?enddefspecified_examplesrspec_options.examplesenddefreporterrspec_options.reporterenddefdry_run?rspec_options.dry_runenddefexample_objects@example_objects||=[]enddefexecute_in_class_hierarchy(superclass_last=false)classes=[]current_class=selfwhileis_example_group?(current_class)superclass_last?classes<<current_class:classes.unshift(current_class)current_class=current_class.superclassendsuperclass_last?classes<<ExampleMethods:classes.unshift(ExampleMethods)classes.eachdo|example_group|yieldexample_groupendenddefis_example_group?(klass)Module===klass&&klass.kind_of?(ExampleGroupMethods)enddefplugin_mock_frameworkcasemock_framework=Spec::Runner.configuration.mock_frameworkwhenModuleincludemock_frameworkelserequireSpec::Runner.configuration.mock_frameworkincludeSpec::Plugins::MockFrameworkendenddefdefine_methods_from_predicate_matchers# :nodoc:all_predicate_matchers=predicate_matchers.merge(Spec::Runner.configuration.predicate_matchers)all_predicate_matchers.each_pairdo|matcher_method,method_on_object|define_methodmatcher_methoddo|*args|eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")endendenddefscope_and_options(*args)args,options=args_and_options(*args)scope=(args[0]||:each),optionsenddefbefore_parts_from_scope(scope)casescopewhen:each;before_each_partswhen:all;before_all_partsendenddefafter_parts_from_scope(scope)casescopewhen:each;after_each_partswhen:all;after_all_partsendenddefbefore_evalenddefadd_method_examples(examples)instance_methods.sort.eachdo|method_name|ifexample_method?(method_name)examples<<new(method_name)do__send__(method_name)endendendenddefexample_method?(method_name)should_method?(method_name)enddefshould_method?(method_name)!(method_name=~/^should(_not)?$/)&&method_name=~/^should/&&(instance_method(method_name).arity==0||instance_method(method_name).arity==-1)endendendend