require "spec_helper"
describe Flog do
  if MetricFu.configuration.mri?
    before :each do
      MetricFu::Configuration.run {}
      File.stub!(:directory?).and_return(true)
      @flog = MetricFu::Flog.new('base_dir')
    end

    describe "emit method" do
      it "should look for files and flog them" do
        Dir.should_receive(:glob).with("lib/**/*.rb").and_return(["found/file.rb"])
        ::Flog.should_receive(:parse_options).with(["--all"]).and_return("options")
        ::Flog.should_receive(:new).with("options").and_return(flogger = mock('flogger'))
        flogger.should_receive(:flog).with(["found/file.rb"])
        @flog.emit
      end
    end

    describe "analyze method" do
      it "should harvest the flog information and put it into method_containers" do
        first_full_method_name = "ClassName#first_method_name"
        second_full_method_name = "ClassName#second_method_name"

        flogger = mock('flogger', :calls => {first_full_method_name => {:branch => 11.1, :puts => 1.1},
                                             second_full_method_name => {:branch => 22.2, :puts => 2.2}},
                                  :method_locations => {first_full_method_name => '/file/location.rb:11',
                                                        second_full_method_name => '/file/location.rb:22'},
                                  :totals => {first_full_method_name => 11.11,
                                              second_full_method_name => 22.22})
        @flog.instance_variable_set(:@flogger, flogger)
        @flog.analyze
        method_containers = @flog.instance_variable_get(:@method_containers)
        method_containers.size.should == 1

        expected={:methods=>{"ClassName#first_method_name" => { :path=>"/file/location.rb:11",
                                                                :score=>11.11,
                                                                :operators=>{ :branch=>11.1,
                                                                              :puts=>1.1}},
                             "ClassName#second_method_name" => {:path=>"/file/location.rb:22",
                                                                :score=>22.22,
                                                                :operators=>{ :branch=>22.2,
                                                                              :puts=>2.2}}},
                  :path=>"/file/location.rb",
                  :average_score=>((11.11 + 22.22) / 2.0),
                  :total_score=>33.33,
                  :highest_score=>22.22,
                  :name=>"ClassName"}

        method_containers["ClassName"].to_h.should == expected
      end
    end

    describe "to_h method" do
      it "should make-a nice hash" do
        flogger = mock('flogger', :total => 111.1, :average => 7.3)
        @flog.instance_variable_set(:@flogger, flogger)
        method_containers = {:ignore_me_1 =>  mock('container_1', :highest_score => 11.1, :to_h => 'container_1'),
                             :ignore_me_2 =>  mock('container_2', :highest_score => 33.3, :to_h => 'container_2'),
                             :ignore_me_3 =>  mock('container_3', :highest_score => 22.2, :to_h => 'container_3')}
        @flog.instance_variable_set(:@method_containers, method_containers)

        expected = {:flog => { :total => 111.1,
                    :average => 7.3,
                    :method_containers => ['container_2', 'container_3', 'container_1']}}

        @flog.to_h.should == expected
      end

    end
  end
end