@@ -4,7 +4,7 @@ import org.scalacheck.{Arbitrary, Gen}
4
4
import org .scalacheck .Arbitrary .arbitrary
5
5
import org .scalatest .featurespec .AnyFeatureSpec
6
6
import org .scalatestplus .scalacheck .Checkers
7
- import play .api .libs .json .{Format , JsNumber , Json , OFormat , OWrites , Reads , Writes , __ }
7
+ import play .api .libs .json .{Format , JsArray , JsNumber , JsObject , Json , OFormat , OWrites , Reads , Writes , __ }
8
8
9
9
class DerivedOFormatSuite extends AnyFeatureSpec with Checkers {
10
10
@@ -161,7 +161,10 @@ class DerivedOFormatSuite extends AnyFeatureSpec with Checkers {
161
161
}
162
162
}
163
163
164
- Feature (" user-defined type tags" ) {
164
+ Feature (" type tags" ) {
165
+ import TestHelpers ._
166
+ import julienrf .json .derived
167
+
165
168
Scenario (" user-defined type tags" ) {
166
169
sealed trait Foo
167
170
case class Bar (x : Int ) extends Foo
@@ -177,6 +180,23 @@ class DerivedOFormatSuite extends AnyFeatureSpec with Checkers {
177
180
assert(json == Json .obj(" _bar_" -> Json .obj(" x" -> 42 )))
178
181
assert(fooFormat.reads(json).asEither == Right (foo))
179
182
}
183
+
184
+ Scenario (" ShortClassNameSnakeCase should format tag names using snake casing" ) {
185
+ implicit lazy val demoClassFormat : OFormat [CompositeNameClass ] = derived
186
+ .withTypeTag
187
+ .oformat[CompositeNameClass ](TypeTagSetting .ShortClassNameSnakeCase )
188
+
189
+ val inner = Seq (FooBar (true ), fooBarry(true ), foo_barrier(true ))
190
+ val barFoo : CompositeNameClass = BarFoo (inner)
191
+ val parsed = Json .toJsObject(barFoo)
192
+ val parsedInner = ((parsed \ " bar_foo" ) \ " inner" )
193
+ .as[JsArray ]
194
+ .value
195
+ .map(_.as[JsObject ])
196
+
197
+ assert(validSnakeNames.contains(parsed.keys.head))
198
+ assert(parsedInner.map(_.keys.head).forall(validSnakeNames.contains))
199
+ }
180
200
}
181
201
182
202
Feature (" user-defined implicits" ) {
@@ -326,4 +346,14 @@ object TestHelpers {
326
346
case class X (a : Int ) extends ADTBase
327
347
case class Y (b : String ) extends ADTBase
328
348
case class Z (l : ADTBase , r : ADTBase ) extends ADTBase
349
+
350
+ sealed trait CompositeNameClass
351
+
352
+ case class FooBar (inner : Boolean ) extends CompositeNameClass
353
+ case class fooBarry (inner : Boolean ) extends CompositeNameClass
354
+ case class foo_barrier (inner : Boolean ) extends CompositeNameClass
355
+ case class BarFoo (inner : Seq [CompositeNameClass ]) extends CompositeNameClass
356
+
357
+ lazy val validSnakeNames : Set [String ] =
358
+ Set (" foo_bar" , " foo_barry" , " foo_barrier" , " bar_foo" )
329
359
}
0 commit comments