Fix broken test introduced in previous commit

This commit is contained in:
2025-08-22 10:04:11 +02:00
parent d234616406
commit 5b46ff0efd
4 changed files with 62 additions and 40 deletions

9
go.mod
View File

@@ -13,7 +13,6 @@ require (
require ( require (
github.com/davecgh/go-spew v1.1.1 // indirect 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/hexops/valast v1.5.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // 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/mattn/go-sqlite3 v1.14.22 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.14.1 // 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/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // 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/mod v0.21.0 // indirect
golang.org/x/sync v0.11.0 // indirect golang.org/x/sync v0.11.0 // indirect
golang.org/x/text v0.22.0 // indirect golang.org/x/text v0.22.0 // indirect
@@ -33,4 +30,8 @@ require (
mvdan.cc/gofumpt v0.4.0 // indirect 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
)

3
go.sum
View File

@@ -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/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 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= 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 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= 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 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= 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 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=

View File

@@ -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) 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 { if err != nil {
processJsonLogger.Error("Failed to apply JSON changes: %v", err) processJsonLogger.Error("Failed to apply surgical JSON changes: %v", err)
return commands, fmt.Errorf("failed to apply 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)) 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) // Apply removals first (from end to beginning to avoid index shifting)
for _, removalPath := range removals { for _, removalPath := range removals {
actualPath := strings.TrimSuffix(removalPath, "@remove") actualPath := strings.TrimSuffix(removalPath, "@remove")
index := extractIndexFromRemovalPath(removalPath) elementIndex := extractIndexFromRemovalPath(actualPath)
arrayPath := getArrayPathFromElementPath(actualPath) arrayPath := getArrayPathFromElementPath(actualPath)
// Get the array element to remove jsonLogger.Debug("Processing removal: path=%s, index=%d, arrayPath=%s", actualPath, elementIndex, arrayPath)
result := gjson.Get(content, actualPath)
if !result.Exists() { // Find the exact byte range to remove
continue from, to := findArrayElementRemovalRange(content, arrayPath, elementIndex)
}
jsonLogger.Debug("Removing bytes %d-%d", from, to)
// 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{ commands = append(commands, utils.ReplaceCommand{
From: startPos, From: from,
To: endPos, To: to,
With: "", // Remove the element With: "",
}) })
}
jsonLogger.Debug("Added removal command: From=%d, To=%d, With=\"\"", from, to)
} }
// Apply additions (new fields) // Apply additions (new fields)
@@ -200,10 +200,11 @@ func applyChanges(content string, originalData, modifiedData interface{}) ([]uti
// Convert the new value to JSON string // Convert the new value to JSON string
newValueStr := convertValueToJSONString(newValue) 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{ commands = append(commands, utils.ReplaceCommand{
From: startPos, From: startPos,
@@ -311,10 +312,31 @@ func convertValueToJSONString(value interface{}) string {
return strconv.FormatBool(v) return strconv.FormatBool(v)
case nil: case nil:
return "null" 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: default:
// For complex types, we need to avoid json.Marshal // For other complex types (arrays), we need to use json.Marshal
// This should not happen if we're doing true surgical edits jsonBytes, err := json.Marshal(v)
return "" if err != nil {
return "null" // Fallback to null if marshaling fails
}
return string(jsonBytes)
} }
} }

View File

@@ -3,6 +3,8 @@ package processor
import ( import (
"cook/utils" "cook/utils"
"testing" "testing"
"github.com/google/go-cmp/cmp"
) )
func TestSurgicalJSONEditing(t *testing.T) { func TestSurgicalJSONEditing(t *testing.T) {
@@ -592,6 +594,7 @@ func TestRetardedJSONEditing(t *testing.T) {
result = result[:cmd.From] + cmd.With + result[cmd.To:] result = result[:cmd.From] + cmd.With + result[cmd.To:]
} }
// Check that the weight was changed // Check that the weight was changed
if result != expected { if result != expected {
t.Errorf("Expected:\n%s\nGot:\n%s", expected, result) t.Errorf("Expected:\n%s\nGot:\n%s", expected, result)
@@ -777,9 +780,7 @@ func TestRetardedJSONEditing2(t *testing.T) {
], ],
"ParentTags": [] "ParentTags": []
} }
,"AdditionalStats": { ,"AdditionalStats": {"(Value=\"BaseDeepMiningDrillSpeed_+%\")":4000}}
"(Value=\"BaseDeepMiningDrillSpeed_+%\")": 4000
}
} }
] ]
} }
@@ -818,8 +819,9 @@ func TestRetardedJSONEditing2(t *testing.T) {
result = result[:cmd.From] + cmd.With + result[cmd.To:] result = result[:cmd.From] + cmd.With + result[cmd.To:]
} }
// Check that the weight was changed
if result != expected { diff := cmp.Diff(result, expected)
t.Errorf("Expected:\n%s\nGot:\n%s", expected, result) if diff != "" {
t.Errorf("Differences:\n%s", diff)
} }
} }