ohloh_scm / branches / master / test / unit / hg_rev_list_test.rb

history
require File.dirname(__FILE__) + '/../test_helper'

module Scm::Adapters
	# Repository hg_walk has the following structure:
	#
	#      G -> H -> I
	#     /      \    \
	#    A -> B -> C -> D -> tip
	#
	class HgRevListTest < Scm::Test

		def test_rev_list
			with_hg_repository('hg_walk') do |hg|
				# Full history to a commit
				assert_equal [:A],                         rev_list_helper(hg, nil, :A)
				assert_equal [:A, :B],                     rev_list_helper(hg, nil, :B)
				assert_equal [:A, :B, :G, :H, :C],         rev_list_helper(hg, nil, :C)
				assert_equal [:A, :B, :G, :H, :C, :I, :D], rev_list_helper(hg, nil, :D)
				assert_equal [:A, :G],                     rev_list_helper(hg, nil, :G)
				assert_equal [:A, :G, :H],                 rev_list_helper(hg, nil, :H)
				assert_equal [:A, :G, :H, :I],             rev_list_helper(hg, nil, :I)

				# Limited history from one commit to another
				assert_equal [],                           rev_list_helper(hg, :A, :A)
				assert_equal [:B],                         rev_list_helper(hg, :A, :B)
				assert_equal [:B, :G, :H, :C],             rev_list_helper(hg, :A, :C)
				assert_equal [:B, :G, :H, :C, :I, :D],     rev_list_helper(hg, :A, :D)
				assert_equal [:G, :H, :C, :I, :D],         rev_list_helper(hg, :B, :D)
				assert_equal [:I, :D],                     rev_list_helper(hg, :C, :D)
			end
		end

		protected

		def rev_list_helper(hg, from, to)
			to_labels(hg.commit_tokens(from_label(from), from_label(to)))
		end

		def commit_labels
			{ '4bfbf836feeebb236492199fbb0d1474e26f69d9' => :A,
				'23edb79d0d06c8c315d8b9e7456098823335377d' => :B,
				'7e33b9fde56a6e3576753868d08fa143e4e8a9cf' => :C,
				'8daa1aefa228d3ee5f9a0f685d696826e88266fb' => :D,
				'e43cf1bb4b80d8ae70a695ec070ce017fdc529f3' => :G,
				'dca215d8a3e4dd3e472379932f1dd9c909230331' => :H,
				'3a1495175e40b1c983441d6a8e8e627d2bd672b6' => :I
			}
		end

		def to_label(sha1)
			commit_labels[sha1.to_s]
		end

		def to_labels(sha1s)
			sha1s.collect { |sha1| to_label(sha1) }
		end

		def from_label(l)
			commit_labels.each_pair { |k,v| return k if v.to_s == l.to_s }
			nil
		end
	end
end