blob: 63f5e53a1ca724d59768f57e4e07fa9d5ac3b602 [file] [log] [blame]
package ast
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRewriteUnmarshalJSON(t *testing.T) {
tests := []struct {
name string
input string
expected Rewrite
}{
{
name: "Standard rewrite with editor and original",
input: `{
"@type": "koral:rewrite",
"editor": "termMapper",
"operation": "operation:mapping",
"scope": "foundry",
"original": {
"@type": "koral:term",
"foundry": "opennlp",
"key": "PIDAT",
"layer": "p",
"match": "match:eq"
}
}`,
expected: Rewrite{
Editor: "termMapper",
Operation: "operation:mapping",
Scope: "foundry",
Original: map[string]any{
"@type": "koral:term",
"foundry": "opennlp",
"key": "PIDAT",
"layer": "p",
"match": "match:eq",
},
},
},
{
name: "Legacy rewrite with source instead of editor",
input: `{
"@type": "koral:rewrite",
"source": "legacy-mapper",
"operation": "operation:mapping",
"scope": "foundry",
"src": "legacy-source"
}`,
expected: Rewrite{
Editor: "legacy-mapper",
Operation: "operation:mapping",
Scope: "foundry",
Src: "legacy-source",
},
},
{
name: "Legacy rewrite with origin instead of original/src",
input: `{
"@type": "koral:rewrite",
"editor": "termMapper",
"operation": "operation:mapping",
"scope": "foundry",
"origin": "legacy-origin"
}`,
expected: Rewrite{
Editor: "termMapper",
Operation: "operation:mapping",
Scope: "foundry",
Src: "legacy-origin",
},
},
{
name: "Precedence test: editor over source",
input: `{
"@type": "koral:rewrite",
"editor": "preferred-editor",
"source": "legacy-source",
"operation": "operation:mapping"
}`,
expected: Rewrite{
Editor: "preferred-editor",
Operation: "operation:mapping",
},
},
{
name: "Precedence test: original over src over origin",
input: `{
"@type": "koral:rewrite",
"editor": "termMapper",
"operation": "operation:mapping",
"original": "preferred-original",
"src": "middle-src",
"origin": "lowest-origin"
}`,
expected: Rewrite{
Editor: "termMapper",
Operation: "operation:mapping",
Original: "preferred-original",
},
},
{
name: "Precedence test: src over origin when no original",
input: `{
"@type": "koral:rewrite",
"editor": "termMapper",
"operation": "operation:mapping",
"src": "preferred-src",
"origin": "lowest-origin"
}`,
expected: Rewrite{
Editor: "termMapper",
Operation: "operation:mapping",
Src: "preferred-src",
},
},
{
name: "Only legacy fields",
input: `{
"@type": "koral:rewrite",
"source": "legacy-editor",
"operation": "operation:mapping",
"origin": "legacy-origin",
"_comment": "Legacy rewrite"
}`,
expected: Rewrite{
Editor: "legacy-editor",
Operation: "operation:mapping",
Src: "legacy-origin",
Comment: "Legacy rewrite",
},
},
{
name: "Mixed with comment",
input: `{
"@type": "koral:rewrite",
"editor": "termMapper",
"operation": "operation:mapping",
"scope": "foundry",
"src": "original-source",
"_comment": "This is a comment"
}`,
expected: Rewrite{
Editor: "termMapper",
Operation: "operation:mapping",
Scope: "foundry",
Src: "original-source",
Comment: "This is a comment",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var rewrite Rewrite
err := json.Unmarshal([]byte(tt.input), &rewrite)
require.NoError(t, err)
assert.Equal(t, tt.expected, rewrite)
})
}
}
func TestRewriteArrayUnmarshal(t *testing.T) {
// Test unmarshaling an array of rewrites with mixed legacy and modern fields
input := `[
{
"@type": "koral:rewrite",
"editor": "termMapper",
"operation": "operation:mapping",
"original": "modern-original"
},
{
"@type": "koral:rewrite",
"source": "legacy-editor",
"operation": "operation:legacy",
"origin": "legacy-origin"
}
]`
var rewrites []Rewrite
err := json.Unmarshal([]byte(input), &rewrites)
require.NoError(t, err)
require.Len(t, rewrites, 2)
// Check first rewrite (modern)
assert.Equal(t, "termMapper", rewrites[0].Editor)
assert.Equal(t, "operation:mapping", rewrites[0].Operation)
assert.Equal(t, "modern-original", rewrites[0].Original)
// Check second rewrite (legacy)
assert.Equal(t, "legacy-editor", rewrites[1].Editor)
assert.Equal(t, "operation:legacy", rewrites[1].Operation)
assert.Equal(t, "legacy-origin", rewrites[1].Src)
}
func TestRewriteMarshalJSON(t *testing.T) {
// Test that marshaling works correctly and maintains the modern field names
rewrite := Rewrite{
Editor: "termMapper",
Operation: "operation:mapping",
Scope: "foundry",
Src: "source-value",
Comment: "Test comment",
Original: "original-value",
}
data, err := json.Marshal(rewrite)
require.NoError(t, err)
// Parse back to verify structure
var result map[string]any
err = json.Unmarshal(data, &result)
require.NoError(t, err)
assert.Equal(t, "termMapper", result["editor"])
assert.Equal(t, "operation:mapping", result["operation"])
assert.Equal(t, "foundry", result["scope"])
assert.Equal(t, "source-value", result["src"])
assert.Equal(t, "Test comment", result["_comment"])
assert.Equal(t, "original-value", result["original"])
// Ensure legacy fields are not present in output
assert.NotContains(t, result, "source")
assert.NotContains(t, result, "origin")
}