package version

import (
	"sort"
	"testing"
)

func TestListSort(t *testing.T) {
	type TestCase struct {
		Input    List
		Expected List
	}

	testCases := []TestCase{
		{
			Input:    List{MustParse("1.1.1"), MustParse("1.0.1"), MustParse("1.1.0"), MustParse("1.0.0")},
			Expected: List{MustParse("1.0.0"), MustParse("1.0.1"), MustParse("1.1.0"), MustParse("1.1.1")},
		},
		{
			Input:    List{MustParse("4.0.0"), MustParse("3.0.0"), MustParse("2.0.0"), MustParse("1.0.0")},
			Expected: List{MustParse("1.0.0"), MustParse("2.0.0"), MustParse("3.0.0"), MustParse("4.0.0")},
		},
		{
			Input:    List{MustParse("2.0.4"), MustParse("1.2.4"), MustParse("1.2.3"), MustParse("1.3.1")},
			Expected: List{MustParse("1.2.3"), MustParse("1.2.4"), MustParse("1.3.1"), MustParse("2.0.4")},
		},
	}

	for i, testCase := range testCases {
		actual := List{}
		actual = append(actual, testCase.Input...)

		sort.Stable(actual)

		ok := true
		for j, v := range actual {
			expected := testCase.Expected[j]
			cmp := v.Compare(expected)
			if cmp != 0 {
				ok = false
				t.Errorf("test %d failed at position %d (expected %s, got %s)", i, j, expected, actual)
			}
		}

		if ok {
			t.Logf("test %d passed", i)
		}
	}
}