classTryouts::Drill# = Response## A generic base class for Dream and Reality#classResponseattr_accessor:output,:formatdefinitialize(output=nil,format=nil)@output,@format=output,formatenddefformat(val=nil);@format=val.to_symunlessval.nil?;@format;enddefformat=(val);@format=val.to_sym;@format;enddefResponse.compare(dream,reality)returnfalseifreality.nil?## I don't think this check is necessary or useful##return false unless reality.error.nil? && reality.trace.nil?returntrueifreality.output==trueanddream.nil?begincasedream.formatwhen:exceptionreality.etype==dream.outputwhen:matchreality.output.respond_to?(:match)&&!reality.output.match(dream.output).nil?when:procdream.output.is_a?(Proc)&&reality.comparison_value(dream)==dream.comparison_valuewhen:mean,:sdevreality.comparison_value(dream)<=dream.comparison_valuewhen:gtreality.output>dream.outputwhen:gtereality.output>=dream.outputwhen:ltreality.output<dream.outputwhen:ltereality.output<=dream.outputwhen:nereality.output!=dream.outputwhen:respond_to?,:kind_of?,:is_a?reality.output.send(dream.format,dream.output)elseifdream.format.nil?reality.output==dream.outputelsifreality.output.respond_to?(dream.format)reality.comparison_value(dream)==dream.outputelsefalseendendrescue=>exputsex.message,ex.backtraceifTryouts.debug?reality.error,reality.trace,reality.etype=ex.message,ex.backtrace,ex.classreturnfalseendenddefResponse.compare_string(dream,reality)return"[noreality]"ifreality.nil?ifreality.output==trueanddream.nil?return"#{reality.output.inspect} == true"endbegincasedream.formatwhen:proctest=dream.outputtest.arity>0?"Proc.call(reality) == true":"Proc.call == true"when:exception"#{reality.etype} == #{dream.output}"when:mean,:sdev"#{reality.comparison_value(dream)} <= #{dream.output}"when:match"#{reality.output.inspect}.match(#{dream.output.inspect})"when:gt,:gte,:lt,:lte,:neop={:gt=>'>',:gte=>'>=',:lt=>'<',:lte=>'<=',:ne=>'!='}.find{|i|i[0]==dream.format}"#{reality.output.inspect}#{op[1]}#{dream.output.inspect}"when:respond_to?"#{reality.output.class}.respond_to? #{dream.output.inspect}"when:kind_of?"#{reality.output.class}.kind_of? #{dream.output.inspect}"when:is_a?"#{reality.output.class}.is_a? #{dream.output.inspect}"elseifdream.format.nil?"#{reality.output.inspect} == #{dream.output.inspect}"elsifreality.output.respond_to?(dream.format)"#{reality.output.inspect}.#{dream.format} == #{dream.output.inspect}"else"Unknown method #{dream.format.inspect} for #{reality.output.class} "endendrescue=>exputsex.message,ex.backtraceifTryouts.debug?reality.error,reality.trace,reality.etype=ex.message,ex.backtrace,ex.classreturn""endendend# = Dream## Contains the expected response of a Drill#classDream<Tryouts::Drill::Responsedefself.from_block(definition)d=Tryouts::Drill::Dream.newd.from_blockdefinitiondenddeffrom_block(definition)instance_eval&definitionselfend# Takes a String +val+ and splits the lines into an Array.definline(val=nil)lines=(val.split($/)||[])lines.shiftiflines.first.strip==""lines.popiflines.last.strip==""linesenddef==(reality)return@answerunless@answer.nil?@answer=Response.compare(self,reality)enddeftest_to_string(reality)return@test_stringunless@test_string.nil?@test_string=Response.compare_string(self,reality)enddefcomparison_valuereturn@retunless@ret.nil?@ret=case@formatwhen:gt,:gte,:lt,:lte,:neop={:gt=>'>',:gte=>'>=',:lt=>'<',:lte=>'<=',:ne=>'!='}.find{|i|i[0]==@format}@outputwhen:proctruewhen:respond_to?,:is_a?,:kind_of?trueelse@outputendendend# = Reality ## Contains the actual response of a Drill#classReality<Tryouts::Drill::Response# An ordered hash taken from the DrillContext that created this Reality. attr_accessor:stashattr_accessor:errorattr_accessor:traceattr_accessor:ecodeattr_accessor:etypedefinitialize@stash=Tryouts::HASH_TYPE.newenddef==(dream)Response.compare(dream,self)enddefcomparison_value(dream)casedream.formatwhen:proctest=dream.output(test.arity>0?test.call(@output):test.call)when:exception@etypewhen:respond_to?,:is_a?,:kind_of?@output.send(dream.format,dream.output)whennil@outputelsereturnnilif@output.nil?if!dream.format.is_a?(Symbol)"This dream format is not a Symbol: #{dream.format}"elsif@output.respond_to?(dream.format)@output.send(dream.format)else@outputendendendendend