diff options
author | Austin Ziegler <austin@halostatue.ca> | 2011-07-31 13:52:14 -0400 |
---|---|---|
committer | Austin Ziegler <austin@halostatue.ca> | 2011-07-31 13:52:14 -0400 |
commit | 340073b761d16d7ec3a0a559e0c8d706b1d2dff9 (patch) | |
tree | d864acc05816669a3788d88d9f79779ecf3351ac /spec | |
parent | 85076475902cc7f5a5eb7d52d8aaf56d1ff43583 (diff) | |
download | diff-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.rb | 263 | ||||
-rw-r--r-- | spec/spec_helper.rb | 57 |
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 |