blob: 63f5e53a1ca724d59768f57e4e07fa9d5ac3b602 [file] [log] [blame]
Akron8f1970f2025-05-30 12:52:03 +02001package ast
2
3import (
4 "encoding/json"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9)
10
11func TestRewriteUnmarshalJSON(t *testing.T) {
12 tests := []struct {
13 name string
14 input string
15 expected Rewrite
16 }{
17 {
18 name: "Standard rewrite with editor and original",
19 input: `{
20 "@type": "koral:rewrite",
21 "editor": "termMapper",
22 "operation": "operation:mapping",
23 "scope": "foundry",
24 "original": {
25 "@type": "koral:term",
26 "foundry": "opennlp",
27 "key": "PIDAT",
28 "layer": "p",
29 "match": "match:eq"
30 }
31 }`,
32 expected: Rewrite{
33 Editor: "termMapper",
34 Operation: "operation:mapping",
35 Scope: "foundry",
36 Original: map[string]any{
37 "@type": "koral:term",
38 "foundry": "opennlp",
39 "key": "PIDAT",
40 "layer": "p",
41 "match": "match:eq",
42 },
43 },
44 },
45 {
46 name: "Legacy rewrite with source instead of editor",
47 input: `{
48 "@type": "koral:rewrite",
49 "source": "legacy-mapper",
50 "operation": "operation:mapping",
51 "scope": "foundry",
52 "src": "legacy-source"
53 }`,
54 expected: Rewrite{
55 Editor: "legacy-mapper",
56 Operation: "operation:mapping",
57 Scope: "foundry",
58 Src: "legacy-source",
59 },
60 },
61 {
62 name: "Legacy rewrite with origin instead of original/src",
63 input: `{
64 "@type": "koral:rewrite",
65 "editor": "termMapper",
66 "operation": "operation:mapping",
67 "scope": "foundry",
68 "origin": "legacy-origin"
69 }`,
70 expected: Rewrite{
71 Editor: "termMapper",
72 Operation: "operation:mapping",
73 Scope: "foundry",
74 Src: "legacy-origin",
75 },
76 },
77 {
78 name: "Precedence test: editor over source",
79 input: `{
80 "@type": "koral:rewrite",
81 "editor": "preferred-editor",
82 "source": "legacy-source",
83 "operation": "operation:mapping"
84 }`,
85 expected: Rewrite{
86 Editor: "preferred-editor",
87 Operation: "operation:mapping",
88 },
89 },
90 {
91 name: "Precedence test: original over src over origin",
92 input: `{
93 "@type": "koral:rewrite",
94 "editor": "termMapper",
95 "operation": "operation:mapping",
96 "original": "preferred-original",
97 "src": "middle-src",
98 "origin": "lowest-origin"
99 }`,
100 expected: Rewrite{
101 Editor: "termMapper",
102 Operation: "operation:mapping",
103 Original: "preferred-original",
104 },
105 },
106 {
107 name: "Precedence test: src over origin when no original",
108 input: `{
109 "@type": "koral:rewrite",
110 "editor": "termMapper",
111 "operation": "operation:mapping",
112 "src": "preferred-src",
113 "origin": "lowest-origin"
114 }`,
115 expected: Rewrite{
116 Editor: "termMapper",
117 Operation: "operation:mapping",
118 Src: "preferred-src",
119 },
120 },
121 {
122 name: "Only legacy fields",
123 input: `{
124 "@type": "koral:rewrite",
125 "source": "legacy-editor",
126 "operation": "operation:mapping",
127 "origin": "legacy-origin",
128 "_comment": "Legacy rewrite"
129 }`,
130 expected: Rewrite{
131 Editor: "legacy-editor",
132 Operation: "operation:mapping",
133 Src: "legacy-origin",
134 Comment: "Legacy rewrite",
135 },
136 },
137 {
138 name: "Mixed with comment",
139 input: `{
140 "@type": "koral:rewrite",
141 "editor": "termMapper",
142 "operation": "operation:mapping",
143 "scope": "foundry",
144 "src": "original-source",
145 "_comment": "This is a comment"
146 }`,
147 expected: Rewrite{
148 Editor: "termMapper",
149 Operation: "operation:mapping",
150 Scope: "foundry",
151 Src: "original-source",
152 Comment: "This is a comment",
153 },
154 },
155 }
156
157 for _, tt := range tests {
158 t.Run(tt.name, func(t *testing.T) {
159 var rewrite Rewrite
160 err := json.Unmarshal([]byte(tt.input), &rewrite)
161 require.NoError(t, err)
162 assert.Equal(t, tt.expected, rewrite)
163 })
164 }
165}
166
167func TestRewriteArrayUnmarshal(t *testing.T) {
168 // Test unmarshaling an array of rewrites with mixed legacy and modern fields
169 input := `[
170 {
171 "@type": "koral:rewrite",
172 "editor": "termMapper",
173 "operation": "operation:mapping",
174 "original": "modern-original"
175 },
176 {
177 "@type": "koral:rewrite",
178 "source": "legacy-editor",
179 "operation": "operation:legacy",
180 "origin": "legacy-origin"
181 }
182 ]`
183
184 var rewrites []Rewrite
185 err := json.Unmarshal([]byte(input), &rewrites)
186 require.NoError(t, err)
187 require.Len(t, rewrites, 2)
188
189 // Check first rewrite (modern)
190 assert.Equal(t, "termMapper", rewrites[0].Editor)
191 assert.Equal(t, "operation:mapping", rewrites[0].Operation)
192 assert.Equal(t, "modern-original", rewrites[0].Original)
193
194 // Check second rewrite (legacy)
195 assert.Equal(t, "legacy-editor", rewrites[1].Editor)
196 assert.Equal(t, "operation:legacy", rewrites[1].Operation)
197 assert.Equal(t, "legacy-origin", rewrites[1].Src)
198}
199
200func TestRewriteMarshalJSON(t *testing.T) {
201 // Test that marshaling works correctly and maintains the modern field names
202 rewrite := Rewrite{
203 Editor: "termMapper",
204 Operation: "operation:mapping",
205 Scope: "foundry",
206 Src: "source-value",
207 Comment: "Test comment",
208 Original: "original-value",
209 }
210
211 data, err := json.Marshal(rewrite)
212 require.NoError(t, err)
213
214 // Parse back to verify structure
215 var result map[string]any
216 err = json.Unmarshal(data, &result)
217 require.NoError(t, err)
218
219 assert.Equal(t, "termMapper", result["editor"])
220 assert.Equal(t, "operation:mapping", result["operation"])
221 assert.Equal(t, "foundry", result["scope"])
222 assert.Equal(t, "source-value", result["src"])
223 assert.Equal(t, "Test comment", result["_comment"])
224 assert.Equal(t, "original-value", result["original"])
225
226 // Ensure legacy fields are not present in output
227 assert.NotContains(t, result, "source")
228 assert.NotContains(t, result, "origin")
229}