|
33 | 33 | import static java.util.Collections.singletonList; |
34 | 34 |
|
35 | 35 | import org.junit.jupiter.api.Test; |
| 36 | +import org.junit.jupiter.params.ParameterizedTest; |
| 37 | +import org.junit.jupiter.params.provider.CsvSource; |
36 | 38 |
|
37 | 39 | import java.io.IOException; |
38 | 40 | import java.net.URISyntaxException; |
@@ -1152,6 +1154,87 @@ void xmpToJson6() { |
1152 | 1154 | + "</root>")); |
1153 | 1155 | } |
1154 | 1156 |
|
| 1157 | + @Test |
| 1158 | + void xmpToJson7() { |
| 1159 | + assertEquals( |
| 1160 | + "{\n" |
| 1161 | + + " \"Comment\": {\n" |
| 1162 | + + " \"-stringValue\": \"a\",\n" |
| 1163 | + + " \"-self-closing\": \"true\"\n" |
| 1164 | + + " },\n" |
| 1165 | + + " \"#omit-xml-declaration\": \"yes\"\n" |
| 1166 | + + "}", |
| 1167 | + U.xmlToJson("<Comment stringValue='a'/>")); |
| 1168 | + assertEquals( |
| 1169 | + "{\n" |
| 1170 | + + " \"Comment\": {\n" |
| 1171 | + + " },\n" |
| 1172 | + + " \"#omit-xml-declaration\": \"yes\"\n" |
| 1173 | + + "}", |
| 1174 | + U.xmlToJson("<Comment stringValue='a\"'/>")); |
| 1175 | + assertEquals( |
| 1176 | + "{\n" |
| 1177 | + + " \"Comment\": {\n" |
| 1178 | + + " \"-stringValue\": \"a'\",\n" |
| 1179 | + + " \"-self-closing\": \"true\"\n" |
| 1180 | + + " },\n" |
| 1181 | + + " \"#omit-xml-declaration\": \"yes\"\n" |
| 1182 | + + "}", |
| 1183 | + U.xmlToJson("<Comment stringValue=\"a'\"/>")); |
| 1184 | + assertThrows( |
| 1185 | + IllegalArgumentException.class, () -> U.xmlToJson("<Comment stringValue=\"a'/>")); |
| 1186 | + assertThrows( |
| 1187 | + IllegalArgumentException.class, () -> U.xmlToJson("<Comment stringValue='a\"/>")); |
| 1188 | + } |
| 1189 | + |
| 1190 | + @ParameterizedTest(name = "{0}") |
| 1191 | + @CsvSource(delimiter = '|', value = { |
| 1192 | + // input | expected (k=v,k=v) |
| 1193 | + "key=\"value\" | key=value", |
| 1194 | + "key='value' | key=value", |
| 1195 | + "a=\"1\" b='2' | a=1,b=2", |
| 1196 | + "key=\"it's a value\" | key=it's a value", |
| 1197 | + "key='say \"hi\"' | key=say \"hi\"", |
| 1198 | + "key=\"a=b=c\" | key=a=b=c", |
| 1199 | + "key=\"\" | key=", |
| 1200 | + " key =\"value\" | key=value", |
| 1201 | + "data-id=\"5\" | data-id=5", |
| 1202 | + "x==\"y\" | x=y", |
| 1203 | + "k=\"first\" k=\"second\" | k=second", |
| 1204 | + }) |
| 1205 | + void parses(String input, String expected) { |
| 1206 | + assertEquals(parse(expected), Xml.parseAttributes(input)); |
| 1207 | + } |
| 1208 | + |
| 1209 | + @ParameterizedTest(name = "empty: \"{0}\"") |
| 1210 | + @CsvSource({ |
| 1211 | + "''", |
| 1212 | + "\"orphan\"", |
| 1213 | + "lonekey", |
| 1214 | + "key=\"value", |
| 1215 | + }) |
| 1216 | + void producesNothing(String input) { |
| 1217 | + assertTrue(Xml.parseAttributes(input).isEmpty()); |
| 1218 | + } |
| 1219 | + |
| 1220 | + @Test |
| 1221 | + void preservesInsertionOrder() { |
| 1222 | + assertEquals("[z, a, m]", |
| 1223 | + Xml.parseAttributes("z=\"1\" a=\"2\" m=\"3\"").keySet().toString()); |
| 1224 | + } |
| 1225 | + |
| 1226 | + // builds expected map from "k=v,k=v" |
| 1227 | + private static Map<String, String> parse(String s) { |
| 1228 | + Map<String, String> m = new LinkedHashMap<>(); |
| 1229 | + if (s != null && !s.isEmpty()) { |
| 1230 | + for (String pair : s.split(",", -1)) { |
| 1231 | + int i = pair.indexOf('='); |
| 1232 | + m.put(pair.substring(0, i), pair.substring(i + 1)); |
| 1233 | + } |
| 1234 | + } |
| 1235 | + return m; |
| 1236 | + } |
| 1237 | + |
1155 | 1238 | @Test |
1156 | 1239 | void xmlToJsonMinimum() { |
1157 | 1240 | assertEquals( |
|
0 commit comments