# frozen_string_literal: true require 'spec_helper' require 'diff/lcs/hunk' describe 'Diff::LCS Issues' do include Diff::LCS::SpecHelper::Matchers describe 'issue #1' do shared_examples 'handles simple diffs' do |s1, s2, forward_diff| before do @diff_s1_s2 = Diff::LCS.diff(s1, s2) end it 'creates the correct diff' do expect(change_diff(forward_diff)).to eq(@diff_s1_s2) end it 'creates the correct patch s1->s2' do expect(Diff::LCS.patch(s1, @diff_s1_s2)).to eq(s2) end it 'creates the correct patch s2->s1' do expect(Diff::LCS.patch(s2, @diff_s1_s2)).to eq(s1) end end describe 'string' do it_has_behavior 'handles simple diffs', 'aX', 'bXaX', [ [ ['+', 0, 'b'], ['+', 1, 'X'] ] ] it_has_behavior 'handles simple diffs', 'bXaX', 'aX', [ [ ['-', 0, 'b'], ['-', 1, 'X'] ] ] end describe 'array' do it_has_behavior 'handles simple diffs', %w(a X), %w(b X a X), [ [ ['+', 0, 'b'], ['+', 1, 'X'] ] ] it_has_behavior 'handles simple diffs', %w(b X a X), %w(a X), [ [ ['-', 0, 'b'], ['-', 1, 'X'] ] ] end end describe 'issue #57' do it 'should fail with a correct error' do expect { actual = { :category => 'app.rack.request' } expected = { :category => 'rack.middleware', :title => 'Anonymous Middleware' } expect(actual).to eq(expected) }.to raise_error(RSpec::Expectations::ExpectationNotMetError) end end describe 'issue #60' do it 'should produce unified output with correct context' do old_data = <<-DATA_OLD.strip.split("\n").map(&:chomp) { "name": "x", "description": "hi" } DATA_OLD new_data = <<-DATA_NEW.strip.split("\n").map(&:chomp) { "name": "x", "description": "lo" } DATA_NEW diff = ::Diff::LCS.diff(old_data, new_data) hunk = ::Diff::LCS::Hunk.new(old_data, new_data, diff.first, 3, 0) expect(hunk.diff(:unified)).to eq(<<-EXPECTED.chomp) @@ -1,5 +1,5 @@ { "name": "x", - "description": "hi" + "description": "lo" } EXPECTED end end describe 'issue #65' do def diff_lines(old_lines, new_lines) file_length_difference = 0 previous_hunk = nil output = [] Diff::LCS.diff(old_lines, new_lines).each do |piece| hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, 3, file_length_difference) file_length_difference = hunk.file_length_difference maybe_contiguous_hunks = (previous_hunk.nil? || hunk.merge(previous_hunk)) output << "#{previous_hunk.diff(:unified)}\n" unless maybe_contiguous_hunks previous_hunk = hunk end output << "#{previous_hunk.diff(:unified, true)}\n" unless previous_hunk.nil? output.join end it 'should not misplace the new chunk' do old_data = [ 'recipe[a::default]', 'recipe[b::default]', 'recipe[c::default]', 'recipe[d::default]', 'recipe[e::default]', 'recipe[f::default]', 'recipe[g::default]', 'recipe[h::default]', 'recipe[i::default]', 'recipe[j::default]', 'recipe[k::default]', 'recipe[l::default]', 'recipe[m::default]', 'recipe[n::default]' ] new_data = [ 'recipe[a::default]', 'recipe[c::default]', 'recipe[d::default]', 'recipe[e::default]', 'recipe[f::default]', 'recipe[g::default]', 'recipe[h::default]', 'recipe[i::default]', 'recipe[j::default]', 'recipe[k::default]', 'recipe[l::default]', 'recipe[m::default]', 'recipe[n::default]', 'recipe[o::new]', 'recipe[p::new]', 'recipe[q::new]', 'recipe[r::new]' ] expect(diff_lines(old_data, new_data)).to eq(<<-EODIFF) @@ -1,5 +1,4 @@ recipe[a::default] -recipe[b::default] recipe[c::default] recipe[d::default] recipe[e::default] @@ -12,3 +11,7 @@ recipe[l::default] recipe[m::default] recipe[n::default] +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] EODIFF end end end