Skip to content

Commit 7eb346e

Browse files
committed
add DefaultTokenWriter; tests
1 parent 2ce17b6 commit 7eb346e

File tree

8 files changed

+916
-105
lines changed

8 files changed

+916
-105
lines changed
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
package tethys.jackson
2+
3+
import tethys.writers.tokens.{
4+
TokenWriterProducer,
5+
TokenWriterConfig,
6+
JsonWriterSpec
7+
}
8+
import tethys._
9+
10+
class JacksonJsonWriterSpec extends JsonWriterSpec {
11+
{
12+
import tethys.jackson.pretty._
13+
import tethys.writers.tokens.TestModels._
14+
15+
configurableTestCase(
16+
description = "pretty print complex structures",
17+
config = TokenWriterConfig.default.withDefaultPrettyPrinter,
18+
value = Department(
19+
"Global Engineering",
20+
List(
21+
Employee(
22+
1L,
23+
Person("John Doe", 30, Some("[email protected]")),
24+
Address("123 Main St", "New York", "USA", Some("10001")),
25+
"Backend",
26+
BigDecimal("100000.00")
27+
),
28+
Employee(
29+
2L,
30+
Person("Jane Smith", 28, None),
31+
Address("456 Park Ave", "Boston", "USA", None),
32+
"Frontend",
33+
BigDecimal("95000.50")
34+
)
35+
),
36+
Set("global", "engineering", "tech"),
37+
Map(
38+
"headquarters" -> "New York",
39+
"founded" -> "2020",
40+
"status" -> "active"
41+
)
42+
),
43+
json = """{
44+
"name" : "Global Engineering",
45+
"employees" : [ {
46+
"id" : 1,
47+
"person" : {
48+
"name" : "John Doe",
49+
"age" : 30,
50+
"email" : "[email protected]"
51+
},
52+
"address" : {
53+
"street" : "123 Main St",
54+
"city" : "New York",
55+
"country" : "USA",
56+
"postalCode" : "10001"
57+
},
58+
"department" : "Backend",
59+
"salary" : 100000.00
60+
}, {
61+
"id" : 2,
62+
"person" : {
63+
"name" : "Jane Smith",
64+
"age" : 28
65+
},
66+
"address" : {
67+
"street" : "456 Park Ave",
68+
"city" : "Boston",
69+
"country" : "USA"
70+
},
71+
"department" : "Frontend",
72+
"salary" : 95000.50
73+
} ],
74+
"tags" : [ "global", "engineering", "tech" ],
75+
"metadata" : {
76+
"headquarters" : "New York",
77+
"founded" : "2020",
78+
"status" : "active"
79+
}
80+
}"""
81+
82+
)
83+
84+
configurableTestCase(
85+
description = "escape unicode",
86+
config = TokenWriterConfig.default.withEscapeUnicode(true),
87+
value = "Unicode: \u00a9 \u20ac \u2603",
88+
json = "\"Unicode: \\u00A9 \\u20AC \\u2603\""
89+
)
90+
91+
configurableTestCase(
92+
description = "escape unicode emoji",
93+
config = TokenWriterConfig.default.withEscapeUnicode(true),
94+
value = "Emoji: 😀 🚀 🌍",
95+
json = "\"Emoji: \\uD83D\\uDE00 \\uD83D\\uDE80 \\uD83C\\uDF0D\""
96+
)
97+
98+
configurableTestCase(
99+
description = "unicode characters in object keys",
100+
config = TokenWriterConfig.default.withEscapeUnicode(true),
101+
value = Map("café" -> "coffee", "résumé" -> "CV", "über" -> "super"),
102+
json = "{\"caf\\u00E9\":\"coffee\",\"r\\u00E9sum\\u00E9\":\"CV\",\"\\u00FCber\":\"super\"}"
103+
)
104+
105+
case class MenuItem(name: String, price: Double)
106+
case class Menu(items: List[MenuItem])
107+
case class Restaurant(menu: Menu)
108+
109+
implicit val menuItemWriter: JsonWriter[MenuItem] = JsonWriter.obj[MenuItem]
110+
.addField("name")(_.name)
111+
.addField("price")(_.price)
112+
113+
implicit val menuWriter: JsonWriter[Menu] = JsonWriter.obj[Menu]
114+
.addField("items")(_.items)
115+
116+
implicit val restaurantWriter: JsonWriter[Restaurant] = JsonWriter.obj[Restaurant]
117+
.addField("menu")(_.menu)
118+
119+
configurableTestCase(
120+
description = "unicode characters in nested objects",
121+
config = TokenWriterConfig.default.withEscapeUnicode(true),
122+
value = Restaurant(Menu(List(
123+
MenuItem("Café au lait", 3.50),
124+
MenuItem("Crème brûlée", 5.75)
125+
))),
126+
json = "{\"menu\":{\"items\":[{\"name\":\"Caf\\u00E9 au lait\",\"price\":3.5},{\"name\":\"Cr\\u00E8me br\\u00FBl\\u00E9e\",\"price\":5.75}]}}"
127+
)
128+
129+
configurableTestCase(
130+
description = "mixed ASCII and unicode in arrays",
131+
config = TokenWriterConfig.default.withEscapeUnicode(true),
132+
value = List("hello", "世界", "こんにちは", "안녕하세요"),
133+
json = "[\"hello\",\"\\u4E16\\u754C\",\"\\u3053\\u3093\\u306B\\u3061\\u306F\",\"\\uC548\\uB155\\uD558\\uC138\\uC694\"]"
134+
)
135+
136+
configurableTestCase(
137+
description = "control characters that should always be escaped",
138+
config = TokenWriterConfig.default.withEscapeUnicode(false),
139+
value = "Control chars: \u0000\u0001\u0008\u0009\u000A\u000C\u000D\u001F",
140+
json = "\"Control chars: \\u0000\\u0001\\b\\t\\n\\f\\r\\u001F\""
141+
)
142+
143+
configurableTestCase(
144+
description = "unicode characters with escapeUnicode set to false",
145+
config = TokenWriterConfig.default.withEscapeUnicode(false),
146+
value = "Unicode: \u00a9 \u20ac \u2603",
147+
json = "\"Unicode: © € ☃\""
148+
)
149+
150+
case class SurrogatePairsTest(text: String, list: List[String], keyValue: (String, String))
151+
152+
implicit val surrogatePairsTestWriter: JsonWriter[SurrogatePairsTest] = JsonWriter.obj[SurrogatePairsTest]
153+
.addField("text")(_.text)
154+
.addField("list")(_.list)
155+
.addField("nested")(test => Map(test.keyValue))
156+
157+
configurableTestCase(
158+
description = "surrogate pairs in different contexts",
159+
config = TokenWriterConfig.default.withEscapeUnicode(true),
160+
value = SurrogatePairsTest(
161+
"Surrogate pairs: 𝄞 𝌆 𝓐",
162+
List("𝄞", "𝌆", "𝓐"),
163+
("key𝄞", "value𝌆")
164+
),
165+
json = "{\"text\":\"Surrogate pairs: \\uD834\\uDD1E \\uD834\\uDF06 \\uD835\\uDCD0\",\"list\":[\"\\uD834\\uDD1E\",\"\\uD834\\uDF06\",\"\\uD835\\uDCD0\"],\"nested\":{\"key\\uD834\\uDD1E\":\"value\\uD834\\uDF06\"}}"
166+
)
167+
}
168+
169+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package tethys.jackson
2+
3+
import tethys._
4+
import tethys.writers.tokens.{TokenWriterSpec, TokenWriterProducer}
5+
6+
class JacksonTokenWriterSpec extends TokenWriterSpec

modules/backend/jackson/jackson-backend/src/test/scala/tethys/jackson/JacksonTokenWriterTest.scala

Lines changed: 0 additions & 105 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package tethys.writers.tokens
2+
3+
import tethys._
4+
5+
class DefaultJsonWriterSpec extends JsonWriterSpec {
6+
{
7+
import TestModels._
8+
9+
configurableTestCase(
10+
description = "unicode characters in object keys",
11+
config = TokenWriterConfig.default.withEscapeUnicode(true),
12+
value = Map("café" -> "coffee", "résumé" -> "CV", "über" -> "super"),
13+
json = "{\"caf\\u00e9\":\"coffee\",\"r\\u00e9sum\\u00e9\":\"CV\",\"\\u00fcber\":\"super\"}"
14+
)
15+
16+
case class MenuItem(name: String, price: Double)
17+
case class Menu(items: List[MenuItem])
18+
case class Restaurant(menu: Menu)
19+
20+
implicit val menuItemWriter: JsonWriter[MenuItem] = JsonWriter.obj[MenuItem]
21+
.addField("name")(_.name)
22+
.addField("price")(_.price)
23+
24+
implicit val menuWriter: JsonWriter[Menu] = JsonWriter.obj[Menu]
25+
.addField("items")(_.items)
26+
27+
implicit val restaurantWriter: JsonWriter[Restaurant] = JsonWriter.obj[Restaurant]
28+
.addField("menu")(_.menu)
29+
30+
configurableTestCase(
31+
description = "unicode characters in nested objects",
32+
config = TokenWriterConfig.default.withEscapeUnicode(true),
33+
value = Restaurant(Menu(List(
34+
MenuItem("Café au lait", 3.50),
35+
MenuItem("Crème brûlée", 5.75)
36+
))),
37+
json = "{\"menu\":{\"items\":[{\"name\":\"Caf\\u00e9 au lait\",\"price\":3.5},{\"name\":\"Cr\\u00e8me br\\u00fbl\\u00e9e\",\"price\":5.75}]}}"
38+
)
39+
40+
configurableTestCase(
41+
description = "mixed ASCII and unicode in arrays",
42+
config = TokenWriterConfig.default.withEscapeUnicode(true),
43+
value = List("hello", "世界", "こんにちは", "안녕하세요"),
44+
json = "[\"hello\",\"\\u4e16\\u754c\",\"\\u3053\\u3093\\u306b\\u3061\\u306f\",\"\\uc548\\ub155\\ud558\\uc138\\uc694\"]"
45+
)
46+
47+
configurableTestCase(
48+
description = "control characters that should always be escaped",
49+
config = TokenWriterConfig.default.withEscapeUnicode(false),
50+
value = "Control chars: \u0000\u0001\u0008\u0009\u000A\u000C\u000D\u001F",
51+
json = "\"Control chars: \\u0000\\u0001\\b\\t\\n\\f\\r\\u001f\""
52+
)
53+
54+
configurableTestCase(
55+
description = "unicode characters with escapeUnicode set to false",
56+
config = TokenWriterConfig.default.withEscapeUnicode(false),
57+
value = "Unicode: \u00a9 \u20ac \u2603",
58+
json = "\"Unicode: © € ☃\""
59+
)
60+
61+
case class SurrogatePairsTest(text: String, list: List[String], keyValue: (String, String))
62+
63+
implicit val surrogatePairsTestWriter: JsonWriter[SurrogatePairsTest] = JsonWriter.obj[SurrogatePairsTest]
64+
.addField("text")(_.text)
65+
.addField("list")(_.list)
66+
.addField("nested")(test => Map(test.keyValue))
67+
68+
configurableTestCase(
69+
description = "surrogate pairs in different contexts",
70+
config = TokenWriterConfig.default.withEscapeUnicode(true),
71+
value = SurrogatePairsTest(
72+
"Surrogate pairs: 𝄞 𝌆 𝓐",
73+
List("𝄞", "𝌆", "𝓐"),
74+
("key𝄞", "value𝌆")
75+
),
76+
json = "{\"text\":\"Surrogate pairs: \\ud834\\udd1e \\ud834\\udf06 \\ud835\\udcd0\",\"list\":[\"\\ud834\\udd1e\",\"\\ud834\\udf06\",\"\\ud835\\udcd0\"],\"nested\":{\"key\\ud834\\udd1e\":\"value\\ud834\\udf06\"}}"
77+
)
78+
}
79+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package tethys.writers.tokens
2+
3+
class DefaultTokenWriterSpec extends TokenWriterSpec

0 commit comments

Comments
 (0)