Compare commits
3 Commits
af3e55e518
...
969ccae25c
Author | SHA1 | Date | |
---|---|---|---|
969ccae25c | |||
5b46ff0efd | |||
d234616406 |
9
go.mod
9
go.mod
@@ -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
3
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/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=
|
||||||
|
@@ -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
|
|
||||||
|
// Insert the new field with pretty-printed formatting
|
||||||
|
// Format: ,"fieldName": { ... }
|
||||||
insertText := fmt.Sprintf(`,"%s": %s`, fieldName, newValueStr)
|
insertText := fmt.Sprintf(`,"%s": %s`, fieldName, newValueStr)
|
||||||
|
|
||||||
jsonLogger.Debug("Inserting text: %q", insertText)
|
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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) {
|
||||||
@@ -92,6 +94,11 @@ modified = true
|
|||||||
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diff := cmp.Diff(result, tt.expected)
|
||||||
|
if diff != "" {
|
||||||
|
t.Errorf("Differences:\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
// Check the actual result matches expected
|
// Check the actual result matches expected
|
||||||
if result != tt.expected {
|
if result != tt.expected {
|
||||||
t.Errorf("Expected:\n%s\n\nGot:\n%s", tt.expected, result)
|
t.Errorf("Expected:\n%s\n\nGot:\n%s", tt.expected, result)
|
||||||
@@ -178,6 +185,11 @@ modified = true
|
|||||||
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diff := cmp.Diff(result, expected)
|
||||||
|
if diff != "" {
|
||||||
|
t.Errorf("Differences:\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
// Check that the result matches expected (preserves formatting and changes weight)
|
// Check that the result matches expected (preserves formatting and changes weight)
|
||||||
if result != expected {
|
if result != expected {
|
||||||
t.Errorf("Expected:\n%s\n\nGot:\n%s", expected, result)
|
t.Errorf("Expected:\n%s\n\nGot:\n%s", expected, result)
|
||||||
@@ -500,6 +512,11 @@ func TestSurgicalJSONPreservesFormatting2(t *testing.T) {
|
|||||||
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diff := cmp.Diff(result, expected)
|
||||||
|
if diff != "" {
|
||||||
|
t.Errorf("Differences:\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
// Check that the result matches expected (preserves formatting and changes weight)
|
// Check that the result matches expected (preserves formatting and changes weight)
|
||||||
if result != expected {
|
if result != expected {
|
||||||
t.Errorf("Expected:\n%s\n\nGot:\n%s", expected, result)
|
t.Errorf("Expected:\n%s\n\nGot:\n%s", expected, result)
|
||||||
@@ -592,8 +609,239 @@ func TestRetardedJSONEditing(t *testing.T) {
|
|||||||
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diff := cmp.Diff(result, expected)
|
||||||
|
if diff != "" {
|
||||||
|
t.Errorf("Differences:\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
// 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRetardedJSONEditing2(t *testing.T) {
|
||||||
|
original := `
|
||||||
|
{
|
||||||
|
"Rows": [
|
||||||
|
{
|
||||||
|
"Name": "Deep_Mining_Drill_Biofuel",
|
||||||
|
"Meshable": {
|
||||||
|
"RowName": "Mesh_Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Itemable": {
|
||||||
|
"RowName": "Item_Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Interactable": {
|
||||||
|
"RowName": "Deployable"
|
||||||
|
},
|
||||||
|
"Focusable": {
|
||||||
|
"RowName": "Focusable_1H"
|
||||||
|
},
|
||||||
|
"Highlightable": {
|
||||||
|
"RowName": "Generic"
|
||||||
|
},
|
||||||
|
"Actionable": {
|
||||||
|
"RowName": "Deployable"
|
||||||
|
},
|
||||||
|
"Usable": {
|
||||||
|
"RowName": "Place"
|
||||||
|
},
|
||||||
|
"Deployable": {
|
||||||
|
"RowName": "Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Durable": {
|
||||||
|
"RowName": "Deployable_750"
|
||||||
|
},
|
||||||
|
"Inventory": {
|
||||||
|
"RowName": "Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Decayable": {
|
||||||
|
"RowName": "Decay_MetaItem"
|
||||||
|
},
|
||||||
|
"Generator": {
|
||||||
|
"RowName": "Deep_Mining_Biofuel_Drill"
|
||||||
|
},
|
||||||
|
"Resource": {
|
||||||
|
"RowName": "Simple_Internal_Flow_Only"
|
||||||
|
},
|
||||||
|
"Manual_Tags": {
|
||||||
|
"GameplayTags": [
|
||||||
|
{
|
||||||
|
"TagName": "Item.Machine"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Generated_Tags": {
|
||||||
|
"GameplayTags": [
|
||||||
|
{
|
||||||
|
"TagName": "Item.Machine"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Meshable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Itemable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Interactable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Highlightable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Actionable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Usable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Deployable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Durable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Inventory"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ParentTags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
expected := `
|
||||||
|
{
|
||||||
|
"Rows": [
|
||||||
|
{
|
||||||
|
"Name": "Deep_Mining_Drill_Biofuel",
|
||||||
|
"Meshable": {
|
||||||
|
"RowName": "Mesh_Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Itemable": {
|
||||||
|
"RowName": "Item_Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Interactable": {
|
||||||
|
"RowName": "Deployable"
|
||||||
|
},
|
||||||
|
"Focusable": {
|
||||||
|
"RowName": "Focusable_1H"
|
||||||
|
},
|
||||||
|
"Highlightable": {
|
||||||
|
"RowName": "Generic"
|
||||||
|
},
|
||||||
|
"Actionable": {
|
||||||
|
"RowName": "Deployable"
|
||||||
|
},
|
||||||
|
"Usable": {
|
||||||
|
"RowName": "Place"
|
||||||
|
},
|
||||||
|
"Deployable": {
|
||||||
|
"RowName": "Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Durable": {
|
||||||
|
"RowName": "Deployable_750"
|
||||||
|
},
|
||||||
|
"Inventory": {
|
||||||
|
"RowName": "Deep_Mining_Drill_Biofuel"
|
||||||
|
},
|
||||||
|
"Decayable": {
|
||||||
|
"RowName": "Decay_MetaItem"
|
||||||
|
},
|
||||||
|
"Generator": {
|
||||||
|
"RowName": "Deep_Mining_Biofuel_Drill"
|
||||||
|
},
|
||||||
|
"Resource": {
|
||||||
|
"RowName": "Simple_Internal_Flow_Only"
|
||||||
|
},
|
||||||
|
"Manual_Tags": {
|
||||||
|
"GameplayTags": [
|
||||||
|
{
|
||||||
|
"TagName": "Item.Machine"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Generated_Tags": {
|
||||||
|
"GameplayTags": [
|
||||||
|
{
|
||||||
|
"TagName": "Item.Machine"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Meshable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Itemable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Interactable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Highlightable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Actionable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Usable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Deployable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Durable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TagName": "Traits.Inventory"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ParentTags": []
|
||||||
|
}
|
||||||
|
,"AdditionalStats": {"(Value=\"BaseDeepMiningDrillSpeed_+%\")":4000}}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
command := utils.ModifyCommand{
|
||||||
|
Name: "test",
|
||||||
|
Lua: `
|
||||||
|
for i, row in ipairs(data.Rows) do
|
||||||
|
-- Special case: Deep_Mining_Drill_Biofuel
|
||||||
|
if string.find(row.Name, "Deep_Mining_Drill_Biofuel") then
|
||||||
|
print("[DEBUG] Special case: Deep_Mining_Drill_Biofuel")
|
||||||
|
if not row.AdditionalStats then
|
||||||
|
print("[DEBUG] Creating AdditionalStats table for Deep_Mining_Drill_Biofuel")
|
||||||
|
row.AdditionalStats = {}
|
||||||
|
end
|
||||||
|
print("[DEBUG] Setting BaseDeepMiningDrillSpeed_+% to 4000")
|
||||||
|
row.AdditionalStats["(Value=\\\"BaseDeepMiningDrillSpeed_+%\\\")"] = 4000
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
|
||||||
|
commands, err := ProcessJSON(original, command, "test.json")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ProcessJSON failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(commands) == 0 {
|
||||||
|
t.Fatal("Expected at least one command")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the commands
|
||||||
|
result := original
|
||||||
|
for _, cmd := range commands {
|
||||||
|
result = result[:cmd.From] + cmd.With + result[cmd.To:]
|
||||||
|
}
|
||||||
|
|
||||||
|
diff := cmp.Diff(result, expected)
|
||||||
|
if diff != "" {
|
||||||
|
t.Errorf("Differences:\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result != expected {
|
||||||
|
t.Errorf("Expected:\n%s\nGot:\n%s", expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user