package yqlib

import (
	"testing"
)

var toNumberScenarios = []expressionScenario{
	{
		description: "Converts strings to numbers",
		document:    `["3", "3.1", "-1e3"]`,
		expression:  `.[] | to_number`,
		expected: []string{
			"D0, P[0], (!!int)::3\n",
			"D0, P[1], (!!float)::3.1\n",
			"D0, P[2], (!!float)::-1e3\n",
		},
	},
	{
		skipDoc:     true,
		description: "Converts strings to numbers, with tonumber because jq",
		document:    `["3", "3.1", "-1e3"]`,
		expression:  `.[] | tonumber`,
		expected: []string{
			"D0, P[0], (!!int)::3\n",
			"D0, P[1], (!!float)::3.1\n",
			"D0, P[2], (!!float)::-1e3\n",
		},
	},
	{
		description: "Doesn't change numbers",
		document:    `[3, 3.1, -1e3]`,
		expression:  `.[] | to_number`,
		expected: []string{
			"D0, P[0], (!!int)::3\n",
			"D0, P[1], (!!float)::3.1\n",
			"D0, P[2], (!!float)::-1e3\n",
		},
	},
	{
		description:   "Cannot convert null",
		expression:    `.a.b | to_number`,
		expectedError: "cannot convert node value [null] at path a.b of tag !!null to number",
	},
}

func TestToNumberOperatorScenarios(t *testing.T) {
	for _, tt := range toNumberScenarios {
		testScenario(t, &tt)
	}
	documentOperatorScenarios(t, "to_number", toNumberScenarios)
}