#!/bin/bash

source tests-common.sh

inherit versionator

eshopts_push -s extglob
ver=( "" "lt" "eq" "gt" )
lt=1 eq=2 gt=3

test_version_compare() {
	tbegin "version_compare ${1} -${ver[${2}]} ${3}"
	version_compare "${1}" "${3}"
	local r=$?
	[[ ${r} -eq ${2} ]]
	tend $? "FAIL: ${@} (got ${r} exp ${2})"
}

echo "
	0             $lt 1
	1             $lt 2
	2             $gt 1
	2             $eq 2
	0             $eq 0
	10            $lt 20
	68            $eq 068
	068           $gt 67
	068           $lt 69

	1.0           $lt 2.0
	2.0           $eq 2.0
	2.0           $gt 1.0

	1.0           $gt 0.0
	0.0           $eq 0.0
	0.0           $lt 1.0

	0.1           $lt 0.2
	0.2           $eq 0.2
	0.3           $gt 0.2

	1.2           $lt 2.1
	2.1           $gt 1.2

	1.2.3         $lt 1.2.4
	1.2.4         $gt 1.2.3

	1.2.0         $gt 1.2
	1.2.1         $gt 1.2
	1.2           $lt 1.2.1

	1.2b          $eq 1.2b
	1.2b          $lt 1.2c
	1.2b          $gt 1.2a
	1.2b          $gt 1.2
	1.2           $lt 1.2a

	1.3           $gt 1.2a
	1.3           $lt 1.3a

	1.0_alpha7    $lt 1.0_beta7
	1.0_beta      $lt 1.0_pre
	1.0_pre5      $lt 1.0_rc2
	1.0_rc2       $lt 1.0

	1.0_p1        $gt 1.0
	1.0_p1-r1     $gt 1.0_p1

	1.0_alpha6-r1 $gt 1.0_alpha6
	1.0_beta6-r1  $gt 1.0_alpha6-r2

	1.0_pre1      $lt 1.0_p1

	1.0p          $gt 1.0_p1
	1.0r          $gt 1.0-r1
	1.6.15        $gt 1.6.10-r2
	1.6.10-r2     $lt 1.6.15

" | while read a b c ; do
	[[ -z "${a}${b}${c}" ]] && continue
	test_version_compare "${a}" "${b}" "${c}"
done


for q in "alpha beta pre rc=${lt};${gt}" "p=${gt};${lt}" ; do
	for p in ${q%%=*} ; do
		c=${q##*=}
		alt=${c%%;*} agt=${c##*;}
		test_version_compare "1.0" $agt "1.0_${p}"
		test_version_compare "1.0" $agt "1.0_${p}1"
		test_version_compare "1.0" $agt "1.0_${p}068"

		test_version_compare "2.0_${p}"    $alt "2.0"
		test_version_compare "2.0_${p}1"   $alt "2.0"
		test_version_compare "2.0_${p}068" $alt "2.0"

		test_version_compare "1.0_${p}"  $eq "1.0_${p}"
		test_version_compare "0.0_${p}"  $lt "0.0_${p}1"
		test_version_compare "666_${p}3" $gt "666_${p}"

		test_version_compare "1_${p}7"  $lt "1_${p}8"
		test_version_compare "1_${p}7"  $eq "1_${p}7"
		test_version_compare "1_${p}7"  $gt "1_${p}6"
		test_version_compare "1_${p}09" $eq "1_${p}9"

		test_version_compare "1_${p}7-r0"  $eq "1_${p}7"
		test_version_compare "1_${p}7-r0"  $lt "1_${p}7-r1"
		test_version_compare "1_${p}7-r0"  $lt "1_${p}7-r01"
		test_version_compare "1_${p}7-r01" $eq "1_${p}7-r1"
		test_version_compare "1_${p}8-r1"  $gt "1_${p}7-r100"

		test_version_compare "1_${p}_alpha" $lt "1_${p}_beta"
	done
done

for p in "-r" "_p" ; do
	test_version_compare "7.2${p}1" $lt "7.2${p}2"
	test_version_compare "7.2${p}2" $gt "7.2${p}1"
	test_version_compare "7.2${p}3" $gt "7.2${p}2"
	test_version_compare "7.2${p}2" $lt "7.2${p}3"
done

# The following tests all come from portage's test cases:
test_version_compare "6.0" $gt "5.0"
test_version_compare "5.0" $gt "5"
test_version_compare "1.0-r1" $gt "1.0-r0"
test_version_compare "1.0-r1" $gt "1.0"
test_version_compare "999999999999999999999999999999" $gt "999999999999999999999999999998"
test_version_compare "1.0.0" $gt "1.0"
test_version_compare "1.0.0" $gt "1.0b"
test_version_compare "1b" $gt "1"
test_version_compare "1b_p1" $gt "1_p1"
test_version_compare "1.1b" $gt "1.1"
test_version_compare "12.2.5" $gt "12.2b"

test_version_compare "4.0" $lt "5.0"
test_version_compare "5" $lt "5.0"
test_version_compare "1.0_pre2" $lt "1.0_p2"
test_version_compare "1.0_alpha2" $lt "1.0_p2"
test_version_compare "1.0_alpha1" $lt "1.0_beta1"
test_version_compare "1.0_beta3" $lt "1.0_rc3"
test_version_compare "1.001000000000000000001" $lt "1.001000000000000000002"
test_version_compare "1.00100000000" $lt "1.0010000000000000001"
test_version_compare "999999999999999999999999999998" $lt "999999999999999999999999999999"
test_version_compare "1.01" $lt "1.1"
test_version_compare "1.0-r0" $lt "1.0-r1"
test_version_compare "1.0" $lt "1.0-r1"
test_version_compare "1.0" $lt "1.0.0"
test_version_compare "1.0b" $lt "1.0.0"
test_version_compare "1_p1" $lt "1b_p1"
test_version_compare "1" $lt "1b"
test_version_compare "1.1" $lt "1.1b"
test_version_compare "12.2b" $lt "12.2.5"

test_version_compare "4.0" $eq "4.0"
test_version_compare "1.0" $eq "1.0"
test_version_compare "1.0-r0" $eq "1.0"
test_version_compare "1.0" $eq "1.0-r0"
test_version_compare "1.0-r0" $eq "1.0-r0"
test_version_compare "1.0-r1" $eq "1.0-r1"

# The following were just tests for != in portage, we need something a bit
# more precise
test_version_compare "1" $lt "2"
test_version_compare "1.0_alpha" $lt "1.0_pre"
test_version_compare "1.0_beta" $gt "1.0_alpha"
test_version_compare "0" $lt "0.0"
test_version_compare "1.0-r0" $lt "1.0-r1"
test_version_compare "1.0-r1" $gt "1.0-r0"
test_version_compare "1.0" $lt "1.0-r1"
test_version_compare "1.0-r1" $gt "1.0"
test_version_compare "1_p1" $lt "1b_p1"
test_version_compare "1b" $gt "1"
test_version_compare "1.1b" $gt "1.1"
test_version_compare "12.2b" $gt "12.2"

# The following tests all come from paludis's test cases:
test_version_compare "1.0" $gt "1"
test_version_compare "1" $lt "1.0"
test_version_compare "1.0_alpha" $gt "1_alpha"
test_version_compare "1.0_alpha" $gt "1"
test_version_compare "1.0_alpha" $lt "1.0"
test_version_compare "1.2.0.0_alpha7-r4" $gt "1.2_alpha7-r4"

test_version_compare "0001" $eq "1"
test_version_compare "01" $eq "001"
test_version_compare "0001.1" $eq "1.1"
test_version_compare "01.01" $eq "1.01"
test_version_compare "1.010" $eq "1.01"
test_version_compare "1.00" $eq "1.0"
test_version_compare "1.0100" $eq "1.010"
test_version_compare "1" $eq "1-r0"
test_version_compare "1-r00" $eq "1-r0"

eshopts_pop

texit