require'rubygems'require'formatador'moduleShindounlessVERSIONVERSION='0.0.18'enddefself.tests(description=nil,tags=[],&block)STDOUT.sync=trueShindo::Tests.new(description,tags,&block)endclassTestsdefinitialize(description,tags=[],&block)@afters=[]@befores=[]@formatador=Formatador.new@tag_stack=[]Thread.current[:reload]=falseThread.current[:success]=trueThread.current[:tags]||=[]@if_tagged=[]@unless_tagged=[]fortaginThread.current[:tags]casetag[0...1]when'+'@if_tagged<<tag[1..-1]when'-'@unless_tagged<<tag[1..-1]endend@formatador.display_linetests(description,tags,&block)@formatador.display_lineenddefafter(&block)@afters.last.push(block)enddefbefore(&block)@befores.last.push(block)enddefprompt(description,&block)@formatador.display("Action? [c,e,i,q,r,t,?]? ")choice=STDIN.gets.strip@formatador.display_line@formatador.indentdocasechoicewhen'c','continue'returnwhen/^e .*/,/^eval .*/value=eval(choice[2..-1],block.binding)ifvalue.nil?value='nil'end@formatador.display_line(value)when'i','interactive','irb'@formatador.display_line('Starting interactive session...')if@irb.nil?require'irb'ARGV.clear# Avoid passing args to IRBIRB.setup(nil)@irb=IRB::Irb.new(nil)IRB.conf[:MAIN_CONTEXT]=@irb.contextIRB.conf[:PROMPT][:SHINDO]={}endforkey,valueinIRB.conf[:PROMPT][:SIMPLE]IRB.conf[:PROMPT][:SHINDO][key]="#{@formatador.indentation}#{value}"end@irb.context.prompt_mode=:SHINDO@irb.context.workspace=IRB::WorkSpace.new(block.binding)begin@irb.eval_inputrescueSystemExitendwhen'q','quit','exit'Thread.current[:success]=falseThread.exitwhen'r','reload'@formatador.display_line("Reloading...")Thread.current[:reload]=trueThread.exitwhen't','backtrace','trace'require'gestalt'Gestalt.trace({'c-call'=>true,'formatador'=>@formatador},&block)when'?','help'@formatador.display_lines(['c - ignore this error and continue','i - interactive mode','q - quit Shindo','r - reload and run the tests again','t - display backtrace','? - display help'])else@formatador.display_line("[red]#{choice} is not a valid choice, please try again.[/]")end@formatador.display_lineend@formatador.display_line("[red]- #{description}[/]")prompt(description,&block)enddeftests(description,tags=[],&block)tags=[*tags]@tag_stack.push(tags)@befores.push([])@afters.push([])unlesstags.empty?taggings=" (#{tags.join(', ')})"end@formatador.display_line((description||'Shindo.tests')<<taggings.to_s)ifblock_given?@formatador.indent{instance_eval(&block)}end@afters.pop@befores.pop@tag_stack.popenddeftest(description,tags=[],&block)tags=[*tags]@tag_stack.push(tags)unlesstags.empty?taggings=" (#{tags.join(', ')})"end# if the test includes +tags and discludes -tags, evaluate itif(@if_tagged.empty?||!(@if_tagged&@tag_stack.flatten).empty?)&&(@unless_tagged.empty?||(@unless_tagged&@tag_stack.flatten).empty?)ifblock_given?beginforbeforein@befores.flatten.compactbefore.callendThread.current[:success]=instance_eval(&block)forafterin@afters.flatten.compactafter.callendrescue=>errorThread.current[:success]=false@formatador.display_line("[red]#{error.message} (#{error.class})[/]")endifThread.current[:success]@formatador.display_line("[green]+ #{description}#{taggings.to_s}[/]")else@formatador.display_line("[red]- #{description}#{taggings.to_s}[/]")ifSTDOUT.tty?prompt(description,&block)endendelse@formatador.display_line("[yellow]* #{description}#{taggings.to_s}[/]")endelse@formatador.display_line("_ #{description}#{taggings.to_s}")end@tag_stack.popendendendif__FILE__==$0defbar(string,remaining=['b','a','r'])ifremaining.empty?stringelsebar(string<<remaining.shift,remaining)endendShindo.testsdotest('failure')doraiseStandardError.new('exception')@foo=''bar(@foo)@foo=='foo'endendend