package domain import ( "errors" "testing" ) func TestSemVerPrecedence(t *testing.T) { ordered := []string{ "1.0.0-alpha", "1.0.0-alpha.1", "1.0.0-alpha.beta", "1.0.0-beta", "1.0.0-beta.2", "1.0.0-beta.11", "1.0.0-rc.1", "1.0.0", "1.0.1", "1.1.0", "2.0.0", } for index := 0; index < len(ordered)-1; index++ { comparison, err := CompareSemVer(ordered[index], ordered[index+1]) if err != nil { t.Fatalf("CompareSemVer() error = %v", err) } if comparison >= 0 { t.Fatalf("%q should precede %q", ordered[index], ordered[index+1]) } } } func TestSemVerIgnoresBuildMetadata(t *testing.T) { comparison, err := CompareSemVer("1.2.3+build.1", "1.2.3+build.99") if err != nil { t.Fatalf("CompareSemVer() error = %v", err) } if comparison != 0 { t.Fatalf("comparison = %d, want 0", comparison) } } func TestSemVerSupportsLargeNumericIdentifiers(t *testing.T) { comparison, err := CompareSemVer( "999999999999999999999999999.0.0", "1000000000000000000000000000.0.0", ) if err != nil { t.Fatalf("CompareSemVer() error = %v", err) } if comparison >= 0 { t.Fatalf("comparison = %d, want negative", comparison) } } func TestSemVerRejectsInvalidValues(t *testing.T) { for _, value := range []string{ "", "1", "1.2", "01.2.3", "1.02.3", "1.2.03", "1.2.3-", "1.2.3-alpha..1", "1.2.3-01", "1.2.3+", "1.2.3+build..1", "v1.2.3", "1.2.3 alpha", } { t.Run(value, func(t *testing.T) { _, err := ParseSemVer(value) if !errors.Is(err, ErrInvalidSemVer) { t.Fatalf("ParseSemVer(%q) error = %v, want %v", value, err, ErrInvalidSemVer) } }) } }