summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorAustin Ziegler <austin@zieglers.ca>2020-06-30 09:51:08 -0400
committerAustin Ziegler <austin@zieglers.ca>2020-07-01 11:53:51 -0400
commit60613d2af564a93dc5c19c8a71c3f674a5db6fdb (patch)
treed88bb489d8f8e44b323073a32195b951d9d9629b /spec
parent99f65fdc8253c3bf800bc0e17c2cbbde9ade9ba8 (diff)
downloaddiff-lcs-60613d2af564a93dc5c19c8a71c3f674a5db6fdb.tar.gz
# This is a combination of 9 commits.
# This is the 1st commit message: Fix improperly placed chunks Resolve #65 - Also add even more tests for checking `ldiff` results against `diff` results. - Fix issues with diff/ldiff output highlighted by the above tests. - Add a parameter to indicate that the hunk being processed is the _last_ hunk; this results in correct counting of the hunk size. - The misplaced chunks were happening because of an improper `.abs` on `#diff_size`, when the `.abs` needed to be on the finding of the maximum diff size. # This is the commit message #2: Ooops. Debugger # This is the commit message #3: Restore missing test - Fix some more format issues raised by the missing test. - Start fixing Rubocop formatting. # This is the commit message #4: Last RuboCop fixes # This is the commit message #5: Finalize diff-lcs 1.4 # This is the commit message #6: Fix #44 The problem here was the precedence of `or` vs `||`. Switching to `||` resulted in the expected behaviour. # This is the commit message #7: Resolve #43 # This is the commit message #8: Typo # This is the commit message #9: Resolve #35 with a comment
Diffstat (limited to 'spec')
-rw-r--r--spec/fixtures/ldiff/output.diff-c4
-rw-r--r--spec/fixtures/ldiff/output.diff-u4
-rw-r--r--spec/fixtures/ldiff/output.diff.chef4
-rw-r--r--spec/fixtures/ldiff/output.diff.chef-c15
-rw-r--r--spec/fixtures/ldiff/output.diff.chef-e3
-rw-r--r--spec/fixtures/ldiff/output.diff.chef-f3
-rw-r--r--spec/fixtures/ldiff/output.diff.chef-u7
-rw-r--r--spec/fixtures/ldiff/output.diff.chef27
-rw-r--r--spec/fixtures/ldiff/output.diff.chef2-c20
-rw-r--r--spec/fixtures/ldiff/output.diff.chef2-d7
-rw-r--r--spec/fixtures/ldiff/output.diff.chef2-e7
-rw-r--r--spec/fixtures/ldiff/output.diff.chef2-f7
-rw-r--r--spec/fixtures/ldiff/output.diff.chef2-u16
-rw-r--r--spec/fixtures/new-chef217
-rw-r--r--spec/fixtures/old-chef214
-rw-r--r--spec/hunk_spec.rb31
-rw-r--r--spec/issues_spec.rb64
-rw-r--r--spec/ldiff_spec.rb65
-rw-r--r--spec/spec_helper.rb38
19 files changed, 261 insertions, 72 deletions
diff --git a/spec/fixtures/ldiff/output.diff-c b/spec/fixtures/ldiff/output.diff-c
index 92ea5a2..0e1ad99 100644
--- a/spec/fixtures/ldiff/output.diff-c
+++ b/spec/fixtures/ldiff/output.diff-c
@@ -1,5 +1,5 @@
-*** spec/fixtures/aX 2019-02-01 22:29:34.000000000 -0500
---- spec/fixtures/bXaX 2019-02-01 22:29:43.000000000 -0500
+*** spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400
+--- spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400
***************
*** 1 ****
! aX
diff --git a/spec/fixtures/ldiff/output.diff-u b/spec/fixtures/ldiff/output.diff-u
index c4ba30f..b84f718 100644
--- a/spec/fixtures/ldiff/output.diff-u
+++ b/spec/fixtures/ldiff/output.diff-u
@@ -1,5 +1,5 @@
---- spec/fixtures/aX 2019-02-01 22:29:34.000000000 -0500
-+++ spec/fixtures/bXaX 2019-02-01 22:29:43.000000000 -0500
+--- spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400
++++ spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400
@@ -1 +1 @@
-aX
+bXaX
diff --git a/spec/fixtures/ldiff/output.diff.chef b/spec/fixtures/ldiff/output.diff.chef
new file mode 100644
index 0000000..8b98efb
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef
@@ -0,0 +1,4 @@
+3c3
+< "description": "hi"
+---
+> "description": "lo"
diff --git a/spec/fixtures/ldiff/output.diff.chef-c b/spec/fixtures/ldiff/output.diff.chef-c
new file mode 100644
index 0000000..efbfa19
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef-c
@@ -0,0 +1,15 @@
+*** spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400
+--- spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400
+***************
+*** 1,4 ****
+ {
+ "name": "x",
+! "description": "hi"
+ }
+\ No newline at end of file
+--- 1,4 ----
+ {
+ "name": "x",
+! "description": "lo"
+ }
+\ No newline at end of file
diff --git a/spec/fixtures/ldiff/output.diff.chef-e b/spec/fixtures/ldiff/output.diff.chef-e
new file mode 100644
index 0000000..775d881
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef-e
@@ -0,0 +1,3 @@
+3c
+ "description": "lo"
+.
diff --git a/spec/fixtures/ldiff/output.diff.chef-f b/spec/fixtures/ldiff/output.diff.chef-f
new file mode 100644
index 0000000..9bf1e67
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef-f
@@ -0,0 +1,3 @@
+c3
+ "description": "lo"
+.
diff --git a/spec/fixtures/ldiff/output.diff.chef-u b/spec/fixtures/ldiff/output.diff.chef-u
index ebf2b12..dbacd88 100644
--- a/spec/fixtures/ldiff/output.diff.chef-u
+++ b/spec/fixtures/ldiff/output.diff.chef-u
@@ -1,8 +1,9 @@
---- spec/fixtures/old-chef 2019-02-01 21:57:15.000000000 -0400
-+++ spec/fixtures/new-chef 2019-02-01 21:57:29.000000000 -0400
-@@ -1,5 +1,5 @@
+--- spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400
++++ spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400
+@@ -1,4 +1,4 @@
{
"name": "x",
- "description": "hi"
+ "description": "lo"
}
+\ No newline at end of file
diff --git a/spec/fixtures/ldiff/output.diff.chef2 b/spec/fixtures/ldiff/output.diff.chef2
new file mode 100644
index 0000000..496b3dc
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef2
@@ -0,0 +1,7 @@
+2d1
+< recipe[b::default]
+14a14,17
+> recipe[o::new]
+> recipe[p::new]
+> recipe[q::new]
+> recipe[r::new]
diff --git a/spec/fixtures/ldiff/output.diff.chef2-c b/spec/fixtures/ldiff/output.diff.chef2-c
new file mode 100644
index 0000000..8349a7a
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef2-c
@@ -0,0 +1,20 @@
+*** spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400
+--- spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400
+***************
+*** 1,5 ****
+ recipe[a::default]
+- recipe[b::default]
+ recipe[c::default]
+ recipe[d::default]
+ recipe[e::default]
+--- 1,4 ----
+***************
+*** 12,14 ****
+--- 11,17 ----
+ recipe[l::default]
+ recipe[m::default]
+ recipe[n::default]
++ recipe[o::new]
++ recipe[p::new]
++ recipe[q::new]
++ recipe[r::new]
diff --git a/spec/fixtures/ldiff/output.diff.chef2-d b/spec/fixtures/ldiff/output.diff.chef2-d
new file mode 100644
index 0000000..ca32a49
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef2-d
@@ -0,0 +1,7 @@
+d2
+a14
+recipe[o::new]
+recipe[p::new]
+recipe[q::new]
+recipe[r::new]
+.
diff --git a/spec/fixtures/ldiff/output.diff.chef2-e b/spec/fixtures/ldiff/output.diff.chef2-e
new file mode 100644
index 0000000..89f3fa0
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef2-e
@@ -0,0 +1,7 @@
+14a
+recipe[o::new]
+recipe[p::new]
+recipe[q::new]
+recipe[r::new]
+.
+2d
diff --git a/spec/fixtures/ldiff/output.diff.chef2-f b/spec/fixtures/ldiff/output.diff.chef2-f
new file mode 100644
index 0000000..ca32a49
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef2-f
@@ -0,0 +1,7 @@
+d2
+a14
+recipe[o::new]
+recipe[p::new]
+recipe[q::new]
+recipe[r::new]
+.
diff --git a/spec/fixtures/ldiff/output.diff.chef2-u b/spec/fixtures/ldiff/output.diff.chef2-u
new file mode 100644
index 0000000..ef025c7
--- /dev/null
+++ b/spec/fixtures/ldiff/output.diff.chef2-u
@@ -0,0 +1,16 @@
+--- spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400
++++ spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400
+@@ -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]
diff --git a/spec/fixtures/new-chef2 b/spec/fixtures/new-chef2
new file mode 100644
index 0000000..8213c73
--- /dev/null
+++ b/spec/fixtures/new-chef2
@@ -0,0 +1,17 @@
+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]
diff --git a/spec/fixtures/old-chef2 b/spec/fixtures/old-chef2
new file mode 100644
index 0000000..4a23407
--- /dev/null
+++ b/spec/fixtures/old-chef2
@@ -0,0 +1,14 @@
+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]
diff --git a/spec/hunk_spec.rb b/spec/hunk_spec.rb
index 277f739..b3616bf 100644
--- a/spec/hunk_spec.rb
+++ b/spec/hunk_spec.rb
@@ -6,28 +6,39 @@ if String.method_defined?(:encoding)
require 'diff/lcs/hunk'
describe Diff::LCS::Hunk do
- let(:old_data) { ['Tu avec carté {count} itém has'.encode('UTF-16LE')] }
- let(:new_data) { ['Tu avec carte {count} item has'.encode('UTF-16LE')] }
+ let(:old_data) { ['Tu a un carté avec {count} itéms'.encode('UTF-16LE')] }
+ let(:new_data) { ['Tu a un carte avec {count} items'.encode('UTF-16LE')] }
let(:pieces) { Diff::LCS.diff old_data, new_data }
let(:hunk) { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) }
it 'produces a unified diff from the two pieces' do
expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
@@ -1 +1 @@
- -Tu avec carté {count} itém has
- +Tu avec carte {count} item has
+ -Tu a un carté avec {count} itéms
+ +Tu a un carte avec {count} items
EXPECTED
expect(hunk.diff(:unified)).to eq(expected)
end
+ it 'produces a unified diff from the two pieces (last entry)' do
+ expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
+ @@ -1 +1 @@
+ -Tu a un carté avec {count} itéms
+ +Tu a un carte avec {count} items
+ \\ No newline at end of file
+ EXPECTED
+
+ expect(hunk.diff(:unified, true)).to eq(expected)
+ end
+
it 'produces a context diff from the two pieces' do
expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
***************
*** 1 ****
- ! Tu avec carté {count} itém has
+ ! Tu a un carté avec {count} itéms
--- 1 ----
- ! Tu avec carte {count} item has
+ ! Tu a un carte avec {count} items
EXPECTED
expect(hunk.diff(:context)).to eq(expected)
@@ -36,9 +47,9 @@ if String.method_defined?(:encoding)
it 'produces an old diff from the two pieces' do
expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp
1c1
- < Tu avec carté {count} itém has
+ < Tu a un carté avec {count} itéms
---
- > Tu avec carte {count} item has
+ > Tu a un carte avec {count} items
EXPECTED
@@ -48,7 +59,7 @@ if String.method_defined?(:encoding)
it 'produces a reverse ed diff from the two pieces' do
expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp
c1
- Tu avec carte {count} item has
+ Tu a un carte avec {count} items
.
EXPECTED
@@ -62,7 +73,7 @@ if String.method_defined?(:encoding)
it 'produces a unified diff' do
expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
@@ -1 +1,2 @@
- +Tu avec carte {count} item has
+ +Tu a un carte avec {count} items
EXPECTED
expect(hunk.diff(:unified)).to eq(expected)
diff --git a/spec/issues_spec.rb b/spec/issues_spec.rb
index c9a1e53..ad73123 100644
--- a/spec/issues_spec.rb
+++ b/spec/issues_spec.rb
@@ -56,17 +56,17 @@ describe 'Diff::LCS Issues' do
end
end
- describe "issue #57" do
+ 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"}
+ 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
+ describe 'issue #60' do
it 'should produce unified output with correct context' do
old_data = <<-DATA_OLD.strip.split("\n").map(&:chomp)
{
@@ -95,4 +95,60 @@ describe 'Diff::LCS Issues' do
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
diff --git a/spec/ldiff_spec.rb b/spec/ldiff_spec.rb
index 2f4c235..a2468f8 100644
--- a/spec/ldiff_spec.rb
+++ b/spec/ldiff_spec.rb
@@ -5,40 +5,39 @@ require 'spec_helper'
RSpec.describe 'bin/ldiff' do
include CaptureSubprocessIO
- let(:output_diff) { read_fixture }
- let(:output_diff_c) { read_fixture('-c') }
- let(:output_diff_e) { read_fixture('-e') }
- let(:output_diff_f) { read_fixture('-f') }
- let(:output_diff_u) { read_fixture('-u') }
- let(:output_diff_chef) { read_fixture('-u', :base => 'output.diff.chef') }
+ fixtures = [
+ { :name => 'output.diff', :left => 'aX', :right => 'bXaX' },
+ { :name => 'output.diff.chef', :left => 'old-chef', :right => 'new-chef' },
+ { :name => 'output.diff.chef2', :left => 'old-chef2', :right => 'new-chef2' }
+ ].product([nil, '-e', '-f', '-c', '-u']).map { |(fixture, flag)|
+ fixture = fixture.dup
+ fixture[:flag] = flag
+ fixture
+ }
- specify do
- expect(run_ldiff('-u', :left => 'old-chef', :right => 'new-chef')).to eq(output_diff_chef)
- end
-
- specify do
- expect(run_ldiff).to eq(output_diff)
- end
-
- specify do
- expect(run_ldiff('-c')).to eq(output_diff_c)
- end
+ def self.test_ldiff(fixture)
+ desc = [
+ fixture[:flag],
+ "spec/fixtures/#{fixture[:left]}",
+ "spec/fixtures/#{fixture[:right]}",
+ '#',
+ '=>',
+ "spec/fixtures/ldiff/#{fixture[:name]}#{fixture[:flag]}"
+ ].join(' ')
- specify do
- expect(run_ldiff('-e')).to eq(output_diff_e)
- end
-
- specify do
- expect(run_ldiff('-f')).to eq(output_diff_f)
+ it desc do
+ expect(run_ldiff(fixture)).to eq(read_fixture(fixture))
+ end
end
- specify do
- expect(run_ldiff('-u')).to eq(output_diff_u)
+ fixtures.each do |fixture|
+ test_ldiff(fixture)
end
- def read_fixture(flag = nil, options = {})
- base = options.fetch(:base, 'output.diff')
- name = "spec/fixtures/ldiff/#{base}#{flag}"
+ def read_fixture(options)
+ fixture = options.fetch(:name)
+ flag = options.fetch(:flag)
+ name = "spec/fixtures/ldiff/#{fixture}#{flag}"
data = IO.__send__(IO.respond_to?(:binread) ? :binread : :read, name)
clean_data(data, flag)
end
@@ -68,13 +67,15 @@ RSpec.describe 'bin/ldiff' do
\s*
(?:[-+]\d{4}|Z)
}x,
- '*** spec/fixtures/\1 0000-00-00 00:00:00.000000000 -0000'
+ '*** spec/fixtures/\1 0000-00-00 :00 =>:00 =>00.000000000 -0000'
)
end
- def run_ldiff(flag = nil, options = {})
- left = options.fetch(:left, 'aX')
- right = options.fetch(:right, 'bXaX')
+ def run_ldiff(options)
+ flag = options.fetch(:flag)
+ left = options.fetch(:left)
+ right = options.fetch(:right)
+
stdout, stderr = capture_subprocess_io do
system("ruby -Ilib bin/ldiff #{flag} spec/fixtures/#{left} spec/fixtures/#{right}")
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index b1935d0..7212f30 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -5,7 +5,6 @@ require 'pathname'
require 'psych' if RUBY_VERSION >= '1.9'
-
if ENV['COVERAGE']
require 'simplecov'
@@ -45,30 +44,31 @@ module CaptureSubprocessIO
end
def capture_subprocess_io
- _synchronize do
- begin
- require 'tempfile'
+ _synchronize { _capture_subprocess_io { yield } }
+ end
+
+ def _capture_subprocess_io
+ require 'tempfile'
- captured_stdout, captured_stderr = Tempfile.new('out'), Tempfile.new('err')
+ captured_stdout, captured_stderr = Tempfile.new('out'), Tempfile.new('err')
- orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
- $stdout.reopen captured_stdout
- $stderr.reopen captured_stderr
+ orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
+ $stdout.reopen captured_stdout
+ $stderr.reopen captured_stderr
- yield
+ yield
- $stdout.rewind
- $stderr.rewind
+ $stdout.rewind
+ $stderr.rewind
- return captured_stdout.read, captured_stderr.read
- ensure
- captured_stdout.unlink
- captured_stderr.unlink
- $stdout.reopen orig_stdout
- $stderr.reopen orig_stderr
- end
- end
+ [captured_stdout.read, captured_stderr.read]
+ ensure
+ captured_stdout.unlink
+ captured_stderr.unlink
+ $stdout.reopen orig_stdout
+ $stderr.reopen orig_stderr
end
+ private :_capture_subprocess_io
end
require 'diff-lcs'