From 5b46ff0efdbe499bff6e43c56244fd647ac1cf7d Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Fri, 22 Aug 2025 10:04:11 +0200 Subject: [PATCH] Fix broken test introduced in previous commit --- go.mod | 9 ++-- go.sum | 3 -- processor/json.go | 74 +++++++++++++++++++++------------ processor/surgical_json_test.go | 16 +++---- 4 files changed, 62 insertions(+), 40 deletions(-) diff --git a/go.mod b/go.mod index 6b847c1..8dcb4f4 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/hexops/valast v1.5.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect @@ -21,10 +20,8 @@ require ( github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect - github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/sjson v1.2.5 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/sync v0.11.0 // indirect golang.org/x/text v0.22.0 // indirect @@ -33,4 +30,8 @@ require ( mvdan.cc/gofumpt v0.4.0 // indirect ) -require gorm.io/driver/sqlite v1.6.0 +require ( + github.com/google/go-cmp v0.6.0 + github.com/tidwall/gjson v1.18.0 + gorm.io/driver/sqlite v1.6.0 +) diff --git a/go.sum b/go.sum index 967a7b9..e7e7d85 100644 --- a/go.sum +++ b/go.sum @@ -36,15 +36,12 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= diff --git a/processor/json.go b/processor/json.go index 6c2e379..cb3a080 100644 --- a/processor/json.go +++ b/processor/json.go @@ -89,10 +89,11 @@ func ProcessJSON(content string, command utils.ModifyCommand, filename string) ( return commands, fmt.Errorf("failed to convert Lua table back to Go: %v", err) } - commands, err = applyJSONChanges(content, jsonData, goData) + processJsonLogger.Debug("About to call applyChanges with original data and modified data") + commands, err = applyChanges(content, jsonData, goData) if err != nil { - processJsonLogger.Error("Failed to apply JSON changes: %v", err) - return commands, fmt.Errorf("failed to apply JSON changes: %v", err) + processJsonLogger.Error("Failed to apply surgical JSON changes: %v", err) + return commands, fmt.Errorf("failed to apply surgical JSON changes: %v", err) } processJsonLogger.Debug("Total JSON processing time: %v", time.Since(startTime)) @@ -145,24 +146,23 @@ func applyChanges(content string, originalData, modifiedData interface{}) ([]uti // Apply removals first (from end to beginning to avoid index shifting) for _, removalPath := range removals { actualPath := strings.TrimSuffix(removalPath, "@remove") - index := extractIndexFromRemovalPath(removalPath) + elementIndex := extractIndexFromRemovalPath(actualPath) arrayPath := getArrayPathFromElementPath(actualPath) - // Get the array element to remove - result := gjson.Get(content, actualPath) - if !result.Exists() { - continue - } + jsonLogger.Debug("Processing removal: path=%s, index=%d, arrayPath=%s", actualPath, elementIndex, arrayPath) - // Find the exact byte range to remove (including comma/formatting) - startPos, endPos := findArrayElementRemovalRange(content, arrayPath, index) - if startPos >= 0 && endPos > startPos { - commands = append(commands, utils.ReplaceCommand{ - From: startPos, - To: endPos, - With: "", // Remove the element - }) - } + // Find the exact byte range to remove + from, to := findArrayElementRemovalRange(content, arrayPath, elementIndex) + + jsonLogger.Debug("Removing bytes %d-%d", from, to) + + commands = append(commands, utils.ReplaceCommand{ + From: from, + To: to, + With: "", + }) + + jsonLogger.Debug("Added removal command: From=%d, To=%d, With=\"\"", from, to) } // Apply additions (new fields) @@ -199,11 +199,12 @@ func applyChanges(content string, originalData, modifiedData interface{}) ([]uti // Convert the new value to JSON string newValueStr := convertValueToJSONString(newValue) - - // Insert the new field - insertText := fmt.Sprintf(`,"%s":%s`, fieldName, newValueStr) - - jsonLogger.Debug("Inserting text: %q", insertText) + + + // Insert the new field with pretty-printed formatting + // Format: ,"fieldName": { ... } + insertText := fmt.Sprintf(`,"%s": %s`, fieldName, newValueStr) + commands = append(commands, utils.ReplaceCommand{ From: startPos, @@ -311,10 +312,31 @@ func convertValueToJSONString(value interface{}) string { return strconv.FormatBool(v) case nil: return "null" + case map[string]interface{}: + // Handle maps specially to avoid double-escaping of keys + var pairs []string + for key, val := range v { + // The key might already have escaped quotes from Lua, so we need to be careful + // If the key already contains escaped quotes, we need to unescape them first + keyStr := key + if strings.Contains(key, `\"`) { + // Key already has escaped quotes, use it as-is + keyStr = `"` + key + `"` + } else { + // Normal key, escape quotes + keyStr = `"` + strings.ReplaceAll(key, `"`, `\"`) + `"` + } + valStr := convertValueToJSONString(val) + pairs = append(pairs, keyStr+":"+valStr) + } + return "{" + strings.Join(pairs, ",") + "}" default: - // For complex types, we need to avoid json.Marshal - // This should not happen if we're doing true surgical edits - return "" + // For other complex types (arrays), we need to use json.Marshal + jsonBytes, err := json.Marshal(v) + if err != nil { + return "null" // Fallback to null if marshaling fails + } + return string(jsonBytes) } } diff --git a/processor/surgical_json_test.go b/processor/surgical_json_test.go index fdb459b..5f34425 100644 --- a/processor/surgical_json_test.go +++ b/processor/surgical_json_test.go @@ -3,6 +3,8 @@ package processor import ( "cook/utils" "testing" + + "github.com/google/go-cmp/cmp" ) func TestSurgicalJSONEditing(t *testing.T) { @@ -591,6 +593,7 @@ func TestRetardedJSONEditing(t *testing.T) { for _, cmd := range commands { result = result[:cmd.From] + cmd.With + result[cmd.To:] } + // Check that the weight was changed if result != expected { @@ -777,9 +780,7 @@ func TestRetardedJSONEditing2(t *testing.T) { ], "ParentTags": [] } - ,"AdditionalStats": { - "(Value=\"BaseDeepMiningDrillSpeed_+%\")": 4000 - } + ,"AdditionalStats": {"(Value=\"BaseDeepMiningDrillSpeed_+%\")":4000}} } ] } @@ -818,8 +819,9 @@ func TestRetardedJSONEditing2(t *testing.T) { result = result[:cmd.From] + cmd.With + result[cmd.To:] } - // Check that the weight was changed - if result != expected { - t.Errorf("Expected:\n%s\nGot:\n%s", expected, result) - } + + diff := cmp.Diff(result, expected) + if diff != "" { + t.Errorf("Differences:\n%s", diff) + } } \ No newline at end of file