// Copyright IBM Corp. 2014, 2026
// SPDX-License-Identifier: BUSL-1.1

package tfdiags

import (
	"fmt"
	"testing"

	"github.com/hashicorp/terraform/internal/lang/marks"
	"github.com/zclconf/go-cty/cty"
)

func TestCompactValueStr(t *testing.T) {
	tests := []struct {
		Val  cty.Value
		Want string
	}{
		{
			cty.NullVal(cty.DynamicPseudoType),
			"null",
		},
		{
			cty.UnknownVal(cty.DynamicPseudoType),
			"(not yet known)",
		},
		{
			cty.False,
			"false",
		},
		{
			cty.True,
			"true",
		},
		{
			cty.NumberIntVal(5),
			"5",
		},
		{
			cty.NumberFloatVal(5.2),
			"5.2",
		},
		{
			cty.StringVal(""),
			`""`,
		},
		{
			cty.StringVal("hello"),
			`"hello"`,
		},
		{
			cty.ListValEmpty(cty.String),
			"empty list of string",
		},
		{
			cty.SetValEmpty(cty.String),
			"empty set of string",
		},
		{
			cty.EmptyTupleVal,
			"empty tuple",
		},
		{
			cty.MapValEmpty(cty.String),
			"empty map of string",
		},
		{
			cty.EmptyObjectVal,
			"object with no attributes",
		},
		{
			cty.ListVal([]cty.Value{cty.StringVal("a")}),
			"list of string with 1 element",
		},
		{
			cty.ListVal([]cty.Value{cty.StringVal("a"), cty.StringVal("b")}),
			"list of string with 2 elements",
		},
		{
			cty.ObjectVal(map[string]cty.Value{
				"a": cty.StringVal("b"),
			}),
			`object with 1 attribute "a"`,
		},
		{
			cty.ObjectVal(map[string]cty.Value{
				"a": cty.StringVal("b"),
				"c": cty.StringVal("d"),
			}),
			"object with 2 attributes",
		},
		{
			cty.StringVal("a sensitive value").Mark(marks.Sensitive),
			"(sensitive value)",
		},
		{
			cty.StringVal("an ephemeral value").Mark(marks.Ephemeral),
			"(ephemeral value)",
		},
	}

	for _, test := range tests {
		t.Run(fmt.Sprintf("%#v", test.Val), func(t *testing.T) {
			got := CompactValueStr(test.Val)
			if got != test.Want {
				t.Errorf("wrong result\nvalue: %#v\ngot:   %s\nwant:  %s", test.Val, got, test.Want)
			}
		})
	}
}
