# frozen_string_literal: true

require File.expand_path("../../test_helper", File.dirname(__FILE__))

describe "results" do
  describe "with a (mocked) Coverage.result" do
    let(:source_file) { Coverband::Utils::SourceFile.new(source_fixture("app/models/user.rb"), run_lines) }
    let(:eager_lines) { [nil, 1, 1, 0, nil, nil, 1, 0, nil, nil] }
    let(:run_lines) { [nil, nil, nil, 1, nil, nil, nil, nil, nil, nil] }
    let(:missing_run_coverage_file) { false }
    let(:original_result) do
      orig = {
        Coverband::MERGED_TYPE => {source_fixture("app/models/user.rb") => eager_lines}
      }
      orig[Coverband::EAGER_TYPE] = {source_fixture("app/models/user.rb") => eager_lines} if eager_lines
      orig[Coverband::RUNTIME_TYPE] = {source_fixture("app/models/user.rb") => run_lines} if run_lines
      orig[Coverband::RUNTIME_TYPE] = {"random.rb" => [nil, 1, nil]} if missing_run_coverage_file
      orig
    end
    subject { Coverband::Utils::Results.new(original_result) }

    describe "runtime relevant lines is supported" do
      it "has correct runtime relevant coverage" do
        assert_equal 50.0, subject.runtime_relevant_coverage(source_file)
      end

      it "has correct runtime relevant lines" do
        assert_equal 2, subject.runtime_relavent_lines(source_file)
      end
    end

    describe "runtime relevant lines when no runtime coverage file matches" do
      let(:run_lines) { nil }

      it "has correct runtime relevant coverage" do
        assert_equal 0, subject.runtime_relevant_coverage(source_file)
      end

      it "has correct runtime relevant lines" do
        assert_equal 0, subject.runtime_relavent_lines(source_file)
      end
    end

    describe "runtime relevant lines when no runtime coverage exists" do
      let(:run_lines) { nil }
      let(:missing_run_coverage_file) { true }

      it "has correct runtime relevant coverage" do
        assert_equal 0.0, subject.runtime_relevant_coverage(source_file)
      end

      it "has correct runtime relevant lines" do
        assert_equal 0, subject.runtime_relavent_lines(source_file)
      end
    end

    describe "runtime relevant lines when no eager coverage exists" do
      let(:eager_lines) { nil }

      it "has correct runtime relevant lines" do
        assert_equal 100.0, subject.runtime_relevant_coverage(source_file)
      end

      it "has correct runtime relevant lines" do
        assert_equal 1, subject.runtime_relavent_lines(source_file)
      end
    end
  end
end