func CompareCommandOutputs()

in internal/engine/common/outputs.go [15:82]


func CompareCommandOutputs(
	actualOutput string,
	expectedOutput string,
	expectedSimilarity float64,
	expectedRegex *regexp.Regexp,
	expectedOutputLanguage string,
) (float64, error) {
	if expectedRegex != nil {
		if !expectedRegex.MatchString(actualOutput) {
			return 0.0, fmt.Errorf(
				ui.ErrorMessageStyle.Render(
					fmt.Sprintf("Expected output does not match: %q.", expectedRegex),
				),
			)
		}

		return 0.0, nil
	}

	if strings.ToLower(expectedOutputLanguage) == "json" {
		logging.GlobalLogger.Debugf(
			"Comparing JSON strings:\nExpected: %s\nActual%s",
			expectedOutput,
			actualOutput,
		)
		results, err := lib.CompareJsonStrings(actualOutput, expectedOutput, expectedSimilarity)
		if err != nil {
			return results.Score, err
		}

		logging.GlobalLogger.Debugf(
			"Expected Similarity: %f, Actual Similarity: %f",
			expectedSimilarity,
			results.Score,
		)

		if !results.AboveThreshold {
			return results.Score, fmt.Errorf(
				ui.ErrorMessageStyle.Render(
					"Expected output does not match actual output.\nGot:\n%s\nExpected:\n%s\nExpected Score:%s\nActual Score:%s",
				),
				ui.VerboseStyle.Render(actualOutput),
				ui.VerboseStyle.Render(expectedOutput),
				ui.VerboseStyle.Render(fmt.Sprintf("%f", expectedSimilarity)),
				ui.VerboseStyle.Render(fmt.Sprintf("%f", results.Score)),
			)
		}

		return results.Score, nil
	}

	// Default case, using similarity on non JSON block.
	score := smetrics.JaroWinkler(expectedOutput, actualOutput, 0.7, 4)

	if expectedSimilarity > score {
		return score, fmt.Errorf(
			ui.ErrorMessageStyle.Render(
				"Expected output does not match actual output.\nGot:\n%s\nExpected:\n%s\nExpected Score:%s\nActual Score:%s",
			),
			ui.VerboseStyle.Render(actualOutput),
			ui.VerboseStyle.Render(expectedOutput),
			ui.VerboseStyle.Render(fmt.Sprintf("%f", expectedSimilarity)),
			ui.VerboseStyle.Render(fmt.Sprintf("%f", score)),
		)
	}

	return score, nil
}