package getproviders import ( "testing" ) func TestVersionConstraintsString(t *testing.T) { testCases := map[string]struct { spec VersionConstraints want string }{ "exact": { MustParseVersionConstraints("1.2.3"), "1.2.3", }, "prerelease": { MustParseVersionConstraints("1.2.3-beta"), "1.2.3-beta", }, "metadata": { MustParseVersionConstraints("1.2.3+foo.bar"), "1.2.3+foo.bar", }, "prerelease and metadata": { MustParseVersionConstraints("1.2.3-beta+foo.bar"), "1.2.3-beta+foo.bar", }, "major only": { MustParseVersionConstraints(">= 3"), ">= 3.0.0", }, "major only with pessimistic operator": { MustParseVersionConstraints("~> 3"), "~> 3.0", }, "pessimistic minor": { MustParseVersionConstraints("~> 3.0"), "~> 3.0", }, "pessimistic patch": { MustParseVersionConstraints("~> 3.0.0"), "~> 3.0.0", }, "other operators": { MustParseVersionConstraints("> 1.0.0, < 1.0.0, >= 1.0.0, <= 1.0.0, != 1.0.0"), "> 1.0.0, >= 1.0.0, <= 1.0.0, < 1.0.0, != 1.0.0", }, "multiple": { MustParseVersionConstraints(">= 3.0, < 4.0"), ">= 3.0.0, < 4.0.0", }, "duplicates removed": { MustParseVersionConstraints(">= 1.2.3, 1.2.3, ~> 1.2, 1.2.3"), "~> 1.2, >= 1.2.3, 1.2.3", }, "equivalent duplicates removed": { MustParseVersionConstraints(">= 2.68, >= 2.68.0"), ">= 2.68.0", }, "consistent ordering, exhaustive": { // This weird jumble is just to exercise the different sort // ordering codepaths. Hopefully nothing quite this horrific // shows up often in practice. MustParseVersionConstraints("< 1.2.3, <= 1.2.3, != 1.2.3, 1.2.3+local.2, 1.2.3+local.1, = 1.2.4, = 1.2.3, > 2, > 1.2.3, >= 1.2.3, ~> 1.2.3, ~> 1.2"), "~> 1.2, > 1.2.3, >= 1.2.3, 1.2.3, ~> 1.2.3, <= 1.2.3, < 1.2.3, != 1.2.3, 1.2.3+local.1, 1.2.3+local.2, 1.2.4, > 2.0.0", }, "consistent ordering, more typical": { // This one is aiming to simulate a common situation where // various different modules express compatible constraints // but some modules are more constrained than others. The // combined results here can be kinda confusing, but hopefully // ordering them consistently makes them a _little_ easier to read. MustParseVersionConstraints("~> 1.2, >= 1.2, 1.2.4"), ">= 1.2.0, ~> 1.2, 1.2.4", }, "consistent ordering, disjoint": { // One situation where our presentation of version constraints is // particularly important is when a user accidentally ends up with // disjoint constraints that can therefore never match. In that // case, our ordering should hopefully make it easier to determine // that the constraints are disjoint, as a first step to debugging, // by showing > or >= constrains sorted after < or <= constraints. MustParseVersionConstraints(">= 2, >= 1.2, < 1.3"), ">= 1.2.0, < 1.3.0, >= 2.0.0", }, } for name, tc := range testCases { t.Run(name, func(t *testing.T) { got := VersionConstraintsString(tc.spec) if got != tc.want { t.Errorf("wrong\n got: %q\nwant: %q", got, tc.want) } }) } } func TestParsePlatform(t *testing.T) { tests := []struct { Input string Want Platform Err bool }{ { "", Platform{}, true, }, { "too_many_notes", Platform{}, true, }, { "extra _ whitespaces ", Platform{}, true, }, { "arbitrary_os", Platform{OS: "arbitrary", Arch: "os"}, false, }, } for _, test := range tests { got, err := ParsePlatform(test.Input) if err != nil { if test.Err == false { t.Errorf("unexpected error: %s", err.Error()) } } else { if test.Err { t.Errorf("wrong result: expected error, got none") } } if got != test.Want { t.Errorf("wrong\n got: %q\nwant: %q", got, test.Want) } } }