# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Diff::LineMapper do
  include RepoHelpers

  let(:project) { create(:project, :repository) }
  let(:repository) { project.repository }
  let(:commit) { project.commit(sample_commit.id) }
  let(:diffs) { commit.raw_diffs }
  let(:diff) { diffs.first }
  let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: commit.diff_refs, repository: repository) }

  subject { described_class.new(diff_file) }

  describe '#old_to_new' do
    context "with a diff file" do
      let(:mapping) do
        {
          1 => 1,
          2 => 2,
          3 => 3,
          4 => 4,
          5 => 5,
          6 => 6,
          7 => 7,
          8 => 8,
          9 => nil,
          # nil => 9,
          10 => 10,
          11 => 11,
          12 => 12,
          13 => nil,
          14 => nil,
          # nil => 15,
          # nil => 16,
          # nil => 17,
          # nil => 18,
          # nil => 19,
          # nil => 20,
          15 => 21,
          16 => 22,
          17 => 23,
          18 => 24,
          19 => 25,
          20 => 26,
          21 => 27,
          # nil => 28,
          22 => 29,
          23 => 30,
          24 => 31,
          25 => 32,
          26 => 33,
          27 => 34,
          28 => 35,
          29 => 36,
          30 => 37
        }
      end

      it 'returns the new line number for the old line number' do
        mapping.each do |old_line, new_line|
          expect(subject.old_to_new(old_line)).to eq(new_line)
        end
      end
    end

    context "without a diff file" do
      let(:diff_file) { nil }

      it "returns the same line number" do
        expect(subject.old_to_new(100)).to eq(100)
      end
    end
  end

  describe '#new_to_old' do
    context "with a diff file" do
      let(:mapping) do
        {
          1 => 1,
          2 => 2,
          3 => 3,
          4 => 4,
          5 => 5,
          6 => 6,
          7 => 7,
          8 => 8,
          # nil => 9,
          9 => nil,
          10 => 10,
          11 => 11,
          12 => 12,
          # nil => 13,
          # nil => 14,
          13 => nil,
          14 => nil,
          15 => nil,
          16 => nil,
          17 => nil,
          18 => nil,
          19 => nil,
          20 => nil,
          21 => 15,
          22 => 16,
          23 => 17,
          24 => 18,
          25 => 19,
          26 => 20,
          27 => 21,
          28 => nil,
          29 => 22,
          30 => 23,
          31 => 24,
          32 => 25,
          33 => 26,
          34 => 27,
          35 => 28,
          36 => 29,
          37 => 30
        }
      end

      it 'returns the old line number for the new line number' do
        mapping.each do |new_line, old_line|
          expect(subject.new_to_old(new_line)).to eq(old_line)
        end
      end
    end

    context "without a diff file" do
      let(:diff_file) { nil }

      it "returns the same line number" do
        expect(subject.new_to_old(100)).to eq(100)
      end
    end
  end
end
