// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package discovery

import (
	"fmt"
	"testing"
)

func TestVersionSet(t *testing.T) {
	tests := []struct {
		ConstraintStr string
		VersionStr    string
		ShouldHave    bool
	}{
		// These test cases are not exhaustive since the underlying go-version
		// library is well-tested. This is mainly here just to exercise our
		// wrapper code, but also used as an opportunity to cover some basic
		// but important cases such as the ~> constraint so that we'll be more
		// likely to catch any accidental breaking behavior changes in the
		// underlying library.
		{
			">=1.0.0",
			"1.0.0",
			true,
		},
		{
			">=1.0.0",
			"0.0.0",
			false,
		},
		{
			">=1.0.0",
			"1.1.0-beta1",
			false,
		},
		{
			">=1.0.0",
			"1.1.0",
			true,
		},
		{
			"~>1.1.0-a",
			"1.1.0-beta1",
			true,
		},
		{
			"~>1.1.0",
			"1.1.2",
			true,
		},
		{
			"~>1.1.0",
			"1.2.0",
			false,
		},
	}

	for _, test := range tests {
		t.Run(fmt.Sprintf("%s has %s", test.ConstraintStr, test.VersionStr), func(t *testing.T) {
			accepted, err := ConstraintStr(test.ConstraintStr).Parse()
			if err != nil {
				t.Fatalf("unwanted error parsing constraints string %q: %s", test.ConstraintStr, err)
			}

			version, err := VersionStr(test.VersionStr).Parse()
			if err != nil {
				t.Fatalf("unwanted error parsing version string %q: %s", test.VersionStr, err)
			}

			if got, want := accepted.Allows(version), test.ShouldHave; got != want {
				t.Errorf("Has returned %#v; want %#v", got, want)
			}
		})
	}
}
