func TestYAMLEqual()

in pkg/dubboctl/internal/util/golden.go [47:117]


func TestYAMLEqual(golden, result string) (bool, string, error) {
	golden = ApplyFilters(golden, LicenseFilter, SpaceLineFilter)
	result = ApplyFilters(result, LicenseFilter, SpaceLineFilter)
	// do not use FormatterFilter here because we need to know whether manifest could be formatted
	var err error
	golden, err = formatTestYAML(golden)
	if err != nil {
		return false, "", fmt.Errorf("golden file format err: %s", err)
	}
	result, err = formatTestYAML(result)
	if err != nil {
		return false, "", fmt.Errorf("result file format err: %s", err)
	}

	var diffBuilder strings.Builder
	var diffFlag bool
	var line int
	scannerG := bufio.NewScanner(strings.NewReader(strings.TrimSpace(golden)))
	scannerR := bufio.NewScanner(strings.NewReader(strings.TrimSpace(result)))
	for scannerG.Scan() && scannerR.Scan() {
		line += 1
		lineG := scannerG.Text()
		lineR := scannerR.Text()
		// judge whether lineG and lindR are the same. if not, add this diff line to diffBuilder.
		if !isTestYAMLLineEqual(lineG, lineR) {
			diffFlag = true
			diffBuilder.WriteString(
				fmt.Sprintf("line %d diff:\n--golden--\n%s\n--result--\n%s\n", line, lineG, lineR),
			)
		}
	}
	// additional lines processing
	// [lineStart, lineEnd] represents additional lines

	// scan golden ends.
	if len(scannerG.Text()) == 0 {
		var addBuilder strings.Builder
		lineStart, lineEnd := line+1, line
		for scannerR.Scan() {
			lineEnd += 1
			addBuilder.WriteString(scannerR.Text() + "\n")
		}
		// length of result is equal to length of golden
		if lineStart > lineEnd {
			// result is equal to golden
			if !diffFlag {
				return true, "", nil
			}
			return false, diffBuilder.String(), nil
		}
		// result is longer than golden, we add these additional lines to diffBuilder
		diffBuilder.WriteString(
			fmt.Sprintf("line %d to %d:\n--result addition--\n%s", lineStart, lineEnd, addBuilder.String()),
		)
		return false, diffBuilder.String(), nil
	}

	// scan result ends, we know that golden is longer than result.
	// due to scannerG.Scan has been invoked before, we add the first additional line.
	var addBuilder strings.Builder
	lineStart, lineEnd := line+1, line+1
	addBuilder.WriteString(scannerG.Text() + "\n")
	for scannerG.Scan() {
		lineEnd += 1
		addBuilder.WriteString(scannerG.Text() + "\n")
	}
	diffBuilder.WriteString(
		fmt.Sprintf("line %d to %d:\n--golden addition--\n%s", lineStart, lineEnd, addBuilder.String()),
	)
	return false, diffBuilder.String(), nil
}