require "spec_helper" describe MetricFu::RcovGenerator do before :each do MetricFu.configuration.configure_metric(:rcov) do |rcov| rcov.enabled = true end @default_options = MetricFu::Metric.get_metric(:rcov).run_options end describe "emit" do before :each do options = {:external => nil} @rcov = MetricFu::RcovGenerator.new(@default_options.merge(options)) end it "should clear out previous output and make output folder" do @rcov.stub(:`) FileUtils.should_receive(:rm_rf).with(MetricFu::RcovGenerator.metric_directory, :verbose => false) Dir.should_receive(:mkdir).with(MetricFu::RcovGenerator.metric_directory) @rcov.emit end it "should set the RAILS_ENV" do next if breaks_when?(MetricFu.configuration.rubinius?) FileUtils.stub(:rm_rf) Dir.stub(:mkdir) options = {:environment => 'metrics'} @rcov = MetricFu::RcovGenerator.new(@default_options.merge(options)) @rcov.should_receive(:`).with(/RAILS_ENV=metrics/) @rcov.emit end end describe "with RCOV_OUTPUT fed into" do next if breaks_when?(MetricFu.configuration.rubinius?) before :each do options = {:external => nil} @rcov = MetricFu::RcovGenerator.new(@default_options.merge(options)) File.should_receive(:open). with(MetricFu::RcovGenerator.metric_directory + '/rcov.txt'). and_return(double("io", :read => RCOV_OUTPUT)) @files = @rcov.analyze end describe "analyze" do it "should compute percent of lines run" do @files["lib/templates/awesome/awesome_template.rb"][:percent_run].should == 13 @files["lib/templates/standard/standard_template.rb"][:percent_run].should == 14 end it "should know which lines were run" do @files["lib/templates/awesome/awesome_template.rb"][:lines]. should include({:content=>"require 'fileutils'", :was_run=>true}) end it "should know which lines NOT were run" do @files["lib/templates/awesome/awesome_template.rb"][:lines]. should include({:content=>" if template_exists?(section)", :was_run=>false}) end end describe "to_h" do it "should calculate total percentage for all files" do @rcov.to_h[:rcov][:global_percent_run].should == 13.7 end end end describe "with external configuration option set" do before :each do options = {:external => 'coverage/rcov.txt'} @rcov = MetricFu::RcovGenerator.new(@default_options.merge(options)) end it "should emit nothing if external configuration option is set" do FileUtils.should_not_receive(:rm_rf) @rcov.emit end it "should open the external rcov analysis file" do File.should_receive(:open). with('coverage/rcov.txt'). and_return(double("io", :read => RCOV_OUTPUT)) @files = @rcov.analyze end end RCOV_OUTPUT = <<-HERE Profiling enabled. ............................................................................................................................................................................................. Top 10 slowest examples: 0.2707830 MetricFu::RoodiGrapher responding to #get_metrics should push 13 to roodi_count 0.1994550 MetricFu::RcovGrapher responding to #get_metrics should update labels with the date 0.1985800 MetricFu::ReekGrapher responding to #get_metrics should set a hash of code smells to reek_count 0.1919860 MetricFu::ReekGrapher responding to #get_metrics should update labels with the date 0.1907400 MetricFu::RoodiGrapher responding to #get_metrics should update labels with the date 0.1883000 MetricFu::FlogGrapher responding to #get_metrics should update labels with the date 0.1882650 MetricFu::FlayGrapher responding to #get_metrics should push 476 to flay_score 0.1868780 MetricFu::FlogGrapher responding to #get_metrics should push to top_five_percent_average 0.1847730 MetricFu::FlogGrapher responding to #get_metrics should push 9.9 to flog_average 0.1844090 MetricFu::FlayGrapher responding to #get_metrics should update labels with the date Finished in 2.517686 seconds 189 examples, 0 failures ================================================================================ lib/templates/awesome/awesome_template.rb ================================================================================ require 'fileutils' class AwesomeTemplate < MetricFu::Template def write !! # Getting rid of the crap before and after the project name from integrity !! @name = File.basename(Dir.pwd).gsub(/^\w+-|-\w+$/, "") !! !! # Copy Bluff javascripts to output directory !! Dir[File.join(template_directory, '..', 'javascripts', '*')].each do |f| !! FileUtils.copy(f, File.join(MetricFu.output_directory, File.basename(f))) !! end !! !! report.each_pair do |section, contents| !! if template_exists?(section) !! create_instance_var(section, contents) !! @html = erbify(section) !! html = erbify('layout') !! fn = output_filename(section) !! MetricFu.report.save_output(html, MetricFu.output_directory, fn) !! end !! end !! !! # Instance variables we need should already be created from above !! if template_exists?('index') !! @html = erbify('index') !! html = erbify('layout') !! fn = output_filename('index') !! MetricFu.report.save_output(html, MetricFu.output_directory, fn) !! end !! end def template_directory !! File.dirname(__FILE__) !! end !! end ================================================================================ lib/templates/standard/standard_template.rb ================================================================================ class StandardTemplate < MetricFu::Template def write !! report.each_pair do |section, contents| !! if template_exists?(section) !! create_instance_var(section, contents) !! html = erbify(section) !! fn = output_filename(section) !! MetricFu.report.save_output(html, MetricFu.output_directory, fn) !! end !! end !! !! # Instance variables we need should already be created from above !! if template_exists?('index') !! html = erbify('index') !! fn = output_filename('index') !! MetricFu.report.save_output(html, MetricFu.output_directory, fn) !! end !! end def template_directory !! File.dirname(__FILE__) !! end !! end HERE end