package yqlib

import "testing"

var withOperatorScenarios = []expressionScenario{
	{
		description: "Update and style",
		document:    `a: {deeply: {nested: value}}`,
		expression:  `with(.a.deeply.nested; . = "newValue" | . style="single")`,
		expected: []string{
			"D0, P[], (!!map)::a: {deeply: {nested: 'newValue'}}\n",
		},
	},
	{
		description: "with splat",
		skipDoc:     true,
		document:    `a: {deeply: {nested: value}}`,
		expression:  `with(.a.deeply.nested; . = "newValue" | . style="single")[]`,
		expected: []string{
			"D0, P[a], (!!map)::{deeply: {nested: 'newValue'}}\n",
		},
	},
	{
		description: "Update multiple deeply nested properties",
		document:    `a: {deeply: {nested: value, other: thing}}`,
		expression:  `with(.a.deeply; .nested = "newValue" | .other= "newThing")`,
		expected: []string{
			"D0, P[], (!!map)::a: {deeply: {nested: newValue, other: newThing}}\n",
		},
	},
	{
		description:    "Update array elements relatively",
		subdescription: "The second expression runs with each element of the array as it's contextual root. This allows you to make updates relative to the element.",
		document:       `myArray: [{a: apple},{a: banana}]`,
		expression:     `with(.myArray[]; .b = .a + " yum")`,
		expected: []string{
			"D0, P[], (!!map)::myArray: [{a: apple, b: apple yum}, {a: banana, b: banana yum}]\n",
		},
	},
	{
		description:    "Update array elements relatively +=",
		skipDoc:        true,
		subdescription: "The second expression runs with each element of the array as it's contextual root. This allows you to make updates relative to the element.",
		document:       `myArray: [{a: apple},{a: banana}]`,
		expression:     `with(.myArray[]; .a += .a)`,
		expected: []string{
			"D0, P[], (!!map)::myArray: [{a: appleapple}, {a: bananabanana}]\n",
		},
	},
}

func TestWithOperatorScenarios(t *testing.T) {
	for _, tt := range withOperatorScenarios {
		testScenario(t, &tt)
	}
	documentOperatorScenarios(t, "with", withOperatorScenarios)
}
