--- /dev/null
+package main
+
+import "testing"
+
+
+
+func TestAverage(t *testing.T) {
+ FilterNot410 := func(v XenVersion) bool { return v != "4.10" }
+
+ tests := []struct {
+ s string;
+ valid XenVersionSlice;
+ filter func(v XenVersion) bool;
+ result XenVersionSlice;
+ isError bool;
+ }{
+ {
+ "all",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ nil,
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ false,
+ },
+ {
+ "4.11",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ nil,
+ XenVersionSlice{"4.11"},
+ false,
+ },
+ {
+ "master..4.8",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ false,
+ },
+ {
+ "4.11..4.8",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ XenVersionSlice{"4.11", "4.10", "4.9", "4.8"},
+ false,
+ },
+ {
+ "4.11..4.9",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ XenVersionSlice{"4.11", "4.10", "4.9"},
+ false,
+ },
+ {
+ "..4.9",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ false,
+ },
+ {
+ "4.11..",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ XenVersionSlice{"4.11", "4.10", "4.9", "4.8"},
+ false,
+ },
+ {
+ "4.9..4.11",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ nil,
+ true,
+ },
+ {
+ "4.6",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ nil,
+ true,
+ },
+ {
+ "4.9..4.7",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ nil,
+ nil,
+ true,
+ },
+ {
+ "4.11..4.9",
+ XenVersionSlice{"master", "4.10", "4.9", "4.8"},
+ nil,
+ nil,
+ true,
+ },
+
+ // Same tests, with no 'valid' versions
+ {
+ "all", nil, nil, nil, true,
+ },
+ {
+ "4.11", nil, nil,
+ XenVersionSlice{"4.11"},
+ false,
+ },
+ {
+ // NB this can never work because we don't
+ // know the highest version to start with
+ "master..4.8", nil, nil, nil, true,
+ },
+ {
+ // FIXME: Unimplemented
+ "4.11..4.8", nil, nil,
+ nil, true,
+ // XenVersionSlice{"4.11", "4.10", "4.9", "4.8"}, false,
+
+ },
+ {
+ // FIXME: Unimplemented
+ "4.11..4.9", nil, nil,
+ nil, true,
+ // XenVersionSlice{"4.11", "4.10", "4.9"}, false,
+ },
+ {
+ "..4.9", nil, nil, nil, true,
+ },
+ {
+ "4.11..", nil, nil, nil, true,
+ },
+ {
+ "4.9..4.11", nil, nil, nil, true,
+ },
+
+ // Same tests, with filter
+ {
+ "all",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ FilterNot410,
+ XenVersionSlice{"master", "4.11", "4.9"},
+ false,
+ },
+ {
+ "4.11",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ FilterNot410,
+ XenVersionSlice{"4.11"},
+ false,
+ },
+ {
+ "4.10",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9"},
+ FilterNot410,
+ nil,
+ true,
+ },
+ {
+ "master..4.8",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ XenVersionSlice{"master", "4.11", "4.9", "4.8"},
+ false,
+ },
+ {
+ "4.11..4.8",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ XenVersionSlice{"4.11", "4.9", "4.8"},
+ false,
+ },
+ {
+ "4.11..4.9",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ XenVersionSlice{"4.11", "4.9"},
+ false,
+ },
+ {
+ "..4.9",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ XenVersionSlice{"master", "4.11", "4.9"},
+ false,
+ },
+ {
+ "4.11..",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ XenVersionSlice{"4.11", "4.9", "4.8"},
+ false,
+ },
+ {
+ "4.9..4.11",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ nil,
+ true,
+ },
+ {
+ "4.6",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ nil,
+ true,
+ },
+ {
+ "4.9..4.7",
+ XenVersionSlice{"master", "4.11", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ nil,
+ true,
+ },
+ {
+ "4.11..4.9",
+ XenVersionSlice{"master", "4.10", "4.9", "4.8"},
+ FilterNot410,
+ nil,
+ true,
+ },
+ }
+
+ for _, tc := range tests {
+ t.Logf("Testing: %v %v %v", tc.s, tc.valid, tc.filter != nil)
+ result, err := VersionsFromString(tc.s, tc.valid, tc.filter)
+ isError := (err != nil)
+ if isError != tc.isError || !result.IsEqual(tc.result) {
+ if err != nil {
+ t.Errorf("Test failed: wanted [%v %v], got [%v, %v]",
+ tc.result, tc.isError,
+ result, err)
+ } else {
+ t.Errorf("Test failed: wanted [%v %v], got [%v, %v]",
+ tc.result, tc.isError,
+ result, isError)
+ }
+ }
+ }
+}