summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorAustin Ziegler <austin@halostatue.ca>2011-07-31 13:52:14 -0400
committerAustin Ziegler <austin@halostatue.ca>2011-07-31 13:52:14 -0400
commit340073b761d16d7ec3a0a559e0c8d706b1d2dff9 (patch)
treed864acc05816669a3788d88d9f79779ecf3351ac /spec
parent85076475902cc7f5a5eb7d52d8aaf56d1ff43583 (diff)
downloaddiff-lcs-340073b761d16d7ec3a0a559e0c8d706b1d2dff9.tar.gz
Expanding rspec tests to reflect reality.
There's a lot more testing that was happening in the code than was being reported. Now many of the special cases that were hidden by the transforms for balanced traversal (reverse, change/no change) have been made into individual tests with the use of shared example groups.
Diffstat (limited to 'spec')
-rw-r--r--spec/diff_lcs_balanced_spec.rb263
-rw-r--r--spec/spec_helper.rb57
2 files changed, 226 insertions, 94 deletions
diff --git a/spec/diff_lcs_balanced_spec.rb b/spec/diff_lcs_balanced_spec.rb
index 36e11c9..1e03c5d 100644
--- a/spec/diff_lcs_balanced_spec.rb
+++ b/spec/diff_lcs_balanced_spec.rb
@@ -2,58 +2,34 @@
require 'spec_helper'
-describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
+describe "Diff::LCS.traverse_balanced" do
include Diff::LCS::SpecHelper::Matchers
- def reverse(change_result)
- new_result = []
- change_result.each { |line|
- line = [ line[0], line[2], line[1] ]
- case line[0]
- when '<'
- line[0] = '>'
- when '>'
- line[0] = '<'
- end
- new_result << line
- }
- new_result.sort_by { |line| line[1] }
- end
-
- def no_change(change_result)
- new_result = []
- change_result.each { |line|
- case line[0]
- when '!'
- new_result << [ '<', line[1], line[2] ]
- new_result << [ '>', line[1] + 1, line[2] ]
- else
- new_result << line
- end
- }
- new_result
- end
-
- def traverse(s1, s2, callback_type)
- callback = __send__(callback_type)
- Diff::LCS.traverse_balanced(s1, s2, callback)
- callback
- end
-
- def do_balanced_traversal(s1, s2, result)
- balanced_s1_s2 = traverse(s1, s2, :balanced_callback)
- balanced_s2_s1 = traverse(s2, s1, :balanced_callback)
- balanced_s1_s2_no_change = traverse(s1, s2, :balanced_callback_no_change)
- balanced_s2_s1_no_change = traverse(s2, s1, :balanced_callback_no_change)
-
- balanced_s1_s2.result.should == result
- balanced_s2_s1.result.should == reverse(result)
-
- balanced_s1_s2_no_change.result.should == no_change(result)
- balanced_s2_s1_no_change.result.should == no_change(reverse(result))
- end
-
- it "sequence-a" do
+ shared_examples "with a #change callback" do |s1, s2, result|
+ it "should traverse s1 -> s2 correctly" do
+ traversal = balanced_traversal(s1, s2, :balanced_callback)
+ traversal.result.should == result
+ end
+
+ it "should traverse s2 -> s1 correctly" do
+ traversal = balanced_traversal(s2, s1, :balanced_callback)
+ traversal.result.should == balanced_reverse(result)
+ end
+ end
+
+ shared_examples "without a #change callback" do |s1, s2, result|
+ it "should traverse s1 -> s2 correctly" do
+ traversal = balanced_traversal(s1, s2, :balanced_callback_no_change)
+ traversal.result.should == map_to_no_change(result)
+ end
+
+ it "should traverse s2 -> s1 correctly" do
+ traversal = balanced_traversal(s2, s1, :balanced_callback_no_change)
+ traversal.result.should == map_to_no_change(balanced_reverse(result))
+ end
+ end
+
+ describe "sequences %w(a b c) & %w(a x c)" do
s1 = %w(a b c)
s2 = %w(a x c)
@@ -63,10 +39,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '=', 2, 2 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-b" do
+ describe "sequences %w(a x y c) & %w(a v w c)" do
s1 = %w(a x y c)
s2 = %w(a v w c)
@@ -77,10 +54,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '=', 3, 3 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-c" do
+ describe "sequences %w(x y c) & %w(v w c)" do
s1 = %w(x y c)
s2 = %w(v w c)
result = [
@@ -89,10 +67,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '=', 2, 2 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-d" do
+ describe "sequences %w(a x y z) & %w(b v w)" do
s1 = %w(a x y z)
s2 = %w(b v w)
result = [
@@ -102,10 +81,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '<', 3, 3 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-e" do
+ describe "sequences %w(a z) & %w(a)" do
s1 = %w(a z)
s2 = %w(a)
result = [
@@ -113,10 +93,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '<', 1, 1 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-f" do
+ describe "sequences %w(z a) & %w(a)" do
s1 = %w(z a)
s2 = %w(a)
result = [
@@ -124,10 +105,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '=', 1, 0 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-g" do
+ describe "sequences %w(a b c) & %w(x y z)" do
s1 = %w(a b c)
s2 = %w(x y z)
result = [
@@ -136,10 +118,11 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '!', 2, 2 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-h" do
+ describe "sequences %w(abcd efgh ijkl mnoopqrstuvwxyz) & []" do
s1 = %w(abcd efgh ijkl mnopqrstuvwxyz)
s2 = []
result = [
@@ -149,20 +132,154 @@ describe "Diff::LCS.traverse_balanced should traverse sequences correctly" do
[ '<', 3, 0 ]
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(a b c) & %Q(a x c)" do
+ s1 = %Q(a b c)
+ s2 = %Q(a x c)
+
+ result = [
+ [ '=', 0, 0 ],
+ [ '=', 1, 1 ],
+ [ '!', 2, 2 ],
+ [ '=', 3, 3 ],
+ [ '=', 4, 4 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(a x y c) & %Q(a v w c)" do
+ s1 = %Q(a x y c)
+ s2 = %Q(a v w c)
+
+ result = [
+ [ '=', 0, 0 ],
+ [ '=', 1, 1 ],
+ [ '!', 2, 2 ],
+ [ '=', 3, 3 ],
+ [ '!', 4, 4 ],
+ [ '=', 5, 5 ],
+ [ '=', 6, 6 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(x y c) & %Q(v w c)" do
+ s1 = %Q(x y c)
+ s2 = %Q(v w c)
+ result = [
+ [ '!', 0, 0 ],
+ [ '=', 1, 1 ],
+ [ '!', 2, 2 ],
+ [ '=', 3, 3 ],
+ [ '=', 4, 4 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(a x y z) & %Q(b v w)" do
+ s1 = %Q(a x y z)
+ s2 = %Q(b v w)
+ result = [
+ [ '!', 0, 0 ],
+ [ '=', 1, 1 ],
+ [ '!', 2, 2 ],
+ [ '=', 3, 3 ],
+ [ '!', 4, 4 ],
+ [ '<', 5, 5 ],
+ [ '<', 6, 5 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(a z) & %Q(a)" do
+ s1 = %Q(a z)
+ s2 = %Q(a)
+ result = [
+ [ '=', 0, 0 ],
+ [ '<', 1, 1 ],
+ [ '<', 2, 1 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(z a) & %Q(a)" do
+ s1 = %Q(z a)
+ s2 = %Q(a)
+ result = [
+ [ '<', 0, 0 ],
+ [ '<', 1, 0 ],
+ [ '=', 2, 0 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
+ end
+
+ describe "strings %Q(a b c) & %Q(x y z)" do
+ s1 = %Q(a b c)
+ s2 = %Q(x y z)
+ result = [
+ [ '!', 0, 0 ],
+ [ '=', 1, 1 ],
+ [ '!', 2, 2 ],
+ [ '=', 3, 3 ],
+ [ '!', 4, 4 ]
+ ]
+
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
- it "sequence-i" do
- s1 = []
- s2 = %w(abcd efgh ijkl mnopqrstuvwxyz)
+ describe "strings %Q(abcd efgh ijkl mnopqrstuvwxyz) & %Q()" do
+ s1 = %Q(abcd efgh ijkl mnopqrstuvwxyz)
+ s2 = ""
result = [
- [ '>', 0, 0 ],
- [ '>', 0, 1 ],
- [ '>', 0, 2 ],
- [ '>', 0, 3 ]
+ [ '<', 0, 0 ],
+ [ '<', 1, 0 ],
+ [ '<', 2, 0 ],
+ [ '<', 3, 0 ],
+ [ '<', 4, 0 ],
+ [ '<', 5, 0 ],
+ [ '<', 6, 0 ],
+ [ '<', 7, 0 ],
+ [ '<', 8, 0 ],
+ [ '<', 9, 0 ],
+ [ '<', 10, 0 ],
+ [ '<', 11, 0 ],
+ [ '<', 12, 0 ],
+ [ '<', 13, 0 ],
+ [ '<', 14, 0 ],
+ [ '<', 15, 0 ],
+ [ '<', 16, 0 ],
+ [ '<', 17, 0 ],
+ [ '<', 18, 0 ],
+ [ '<', 19, 0 ],
+ [ '<', 20, 0 ],
+ [ '<', 21, 0 ],
+ [ '<', 22, 0 ],
+ [ '<', 23, 0 ],
+ [ '<', 24, 0 ],
+ [ '<', 25, 0 ],
+ [ '<', 26, 0 ],
+ [ '<', 27, 0 ],
+ [ '<', 28, 0 ],
]
- do_balanced_traversal(s1, s2, result)
+ it_should_behave_like "with a #change callback", s1, s2, result
+ it_should_behave_like "without a #change callback", s1, s2, result
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 1c934e7..5150b10 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -126,6 +126,42 @@ module Diff::LCS::SpecHelper
end
end
+ def balanced_traversal(s1, s2, callback_type)
+ callback = __send__(callback_type)
+ Diff::LCS.traverse_balanced(s1, s2, callback)
+ callback
+ end
+
+ def balanced_reverse(change_result)
+ new_result = []
+ change_result.each { |line|
+ line = [ line[0], line[2], line[1] ]
+ case line[0]
+ when '<'
+ line[0] = '>'
+ when '>'
+ line[0] = '<'
+ end
+ new_result << line
+ }
+ new_result.sort_by { |line| line[1] }
+ end
+
+ def map_to_no_change(change_result)
+ new_result = []
+ change_result.each { |line|
+ case line[0]
+ when '!'
+ new_result << [ '<', line[1], line[2] ]
+ new_result << [ '>', line[1] + 1, line[2] ]
+ else
+ new_result << line
+ end
+ }
+ new_result
+ end
+
+
def simple_callback
callbacks = Object.new
class << callbacks
@@ -246,25 +282,4 @@ RSpec.configure do |conf|
conf.include Diff::LCS::SpecHelper
end
-
-=begin
-RSpec::Matchers.define :be_a_multiple_of do |expected|
- match do |actual|
- actual % expected == 0
- end
-
- failure_message_for_should do |actual|
- "expected that #{actual} would be a multiple of #{expected}"
- end
-
- failure_message_for_should_not do |actual|
- "expected that #{actual} would not be a multiple of #{expected}"
- end
-
- description do
- "be multiple of #{expected}"
- end
-end
-=end
-
# vim: ft=ruby