@@ -5,6 +5,7 @@ import org.scalatest.funsuite._
55import org .scalatest .matchers ._
66
77import scala .beans .BeanProperty
8+ import scala .collection .concurrent .TrieMap
89import scala .collection .immutable ._
910
1011case class MapTestEntity (@ BeanProperty var m : Map [String , Any ] = Map ()) {
@@ -47,33 +48,82 @@ class VPackMapTest extends AnyFunSuite with should.Matchers {
4748 vpack.get(" o" ).get(" ss" ).getAsString should be(" hello world" )
4849 }
4950
51+ test(" serialize TrieMap" ) {
52+ val vp = new VPack .Builder ().registerModule(new VPackScalaModule ).build()
53+ val vpack = vp.serialize(TrieMap (" s" -> " hello world" , " i" -> 69 , " o" -> TrieMap (" ss" -> " hello world" )))
54+ vpack should not be null
55+ vpack.isObject should be(true )
56+ vpack.size should be(3 )
57+ vpack.get(" s" ).isString should be(true )
58+ vpack.get(" s" ).getAsString should be(" hello world" )
59+ vpack.get(" i" ).isInteger should be(true )
60+ vpack.get(" i" ).getAsInt should be(69 )
61+ vpack.get(" o" ).isObject should be(true )
62+ vpack.get(" o" ).size should be(1 )
63+ vpack.get(" o" ).get(" ss" ).isString should be(true )
64+ vpack.get(" o" ).get(" ss" ).getAsString should be(" hello world" )
65+ }
66+
67+ test(" serialize inner Map and MapLike maps" ) {
68+ val vp = new VPack .Builder ().registerModule(new VPackScalaModule ).build()
69+
70+ // dummy transformations that return inner Map classes' implementations
71+ val dummyMapOperations : Seq [Map [String , _] => Map [String , _]] = Seq (
72+ _.withDefaultValue(42 ),
73+ )
74+
75+ dummyMapOperations.foreach(dummyOp => {
76+ val mapLike1 = dummyOp(Map (" ss" -> " hello world" ))
77+ val mapLike2 = dummyOp(Map (" s" -> " hello world" , " i" -> 69 , " o" -> mapLike1))
78+ val entity = MapTestEntity (m = mapLike2)
79+
80+ val vpack = vp.serialize(entity)
81+
82+ vpack should not be null
83+ vpack.isObject should be(true )
84+ vpack.size should be(1 )
85+ vpack.get(" m" ) should not be null
86+ vpack.get(" m" ).isObject should be(true )
87+ vpack.get(" m" ).size should be(3 )
88+ vpack.get(" m" ).get(" s" ).isString should be(true )
89+ vpack.get(" m" ).get(" s" ).getAsString should be(" hello world" )
90+ vpack.get(" m" ).get(" i" ).isInteger should be(true )
91+ vpack.get(" m" ).get(" i" ).getAsInt should be(69 )
92+ vpack.get(" m" ).get(" o" ).isObject should be(true )
93+ vpack.get(" m" ).get(" o" ).size should be(1 )
94+ vpack.get(" m" ).get(" o" ).get(" ss" ).isString should be(true )
95+ vpack.get(" m" ).get(" o" ).get(" ss" ).getAsString should be(" hello world" )
96+ })
97+ }
5098
5199 test(" serialize different kinds of nested maps" ) {
52100 val vp = new VPack .Builder ().registerModule(new VPackScalaModule ).build()
53101
54102 val entity = MapTestEntity (m =
55- HashMap ( // scala <= 2.12 -> HashTrieMap is in fact used behind the scene when Map size is >= 5
103+ HashMap (
56104 " seq" -> Seq (
57- HashMap (" foo" -> 42 ), // scala <= 2.12 -> Map.Map1, Map.Map2, Map.Map3, HashMap4 is in fact used behind the scene when Map size is <5
105+ VectorMap (" foo" -> 42 ),
106+ TreeSeqMap (" foo" -> 42 ),
107+ Map (" foo" -> 42 ), // Map.Map1
58108 SortedMap (" foo" -> 42 ),
59109 ListMap (" foo" -> 42 ),
60- HashMap (" foo" -> 42 ),
61- Map (" foo" -> 42 ),
110+ TrieMap (" foo" -> 42 ),
62111 ListMap .empty,
63112 Map .empty
64113 ),
65114 " seq2" -> Seq (Map (" foo" -> 42 )), // Map.Map1
66115 " seq3" -> Seq (Map (" foo" -> 42 , " foo2" -> 42 )), // Map.Map2
67116 " seq4" -> Seq (Map (" foo" -> 42 , " foo2" -> 42 , " foo3" -> 42 )), // Map.Map3
68117 " seq5" -> Seq (Map (" foo" -> 42 , " foo2" -> 42 , " foo3" -> 42 , " foo4" -> 42 )), // Map.Map4
118+ " seq6" -> Seq (TreeMap (" foo" -> 42 ))
69119 ))
70120
71121 val vpack = vp.serialize(entity)
72122 vpack should not be null
73123 vpack.isObject should be(true )
74124 vpack.size should be(1 )
75125 vpack.get(" m" ).isObject should be(true )
76- vpack.get(" m" ).size should be(5 )
126+ vpack.get(" m" ).size should be(6 )
77127 vpack.get(" m" ).get(" seq" ).isArray should be(true )
78128
79129 vpack.get(" m" ).get(" seq" ).get(0 ).isObject should be(true )
@@ -102,10 +152,15 @@ class VPackMapTest extends AnyFunSuite with should.Matchers {
102152 vpack.get(" m" ).get(" seq" ).get(4 ).get(" foo" ).getAsInt should be(42 )
103153
104154 vpack.get(" m" ).get(" seq" ).get(5 ).isObject should be(true )
105- vpack.get(" m" ).get(" seq" ).get(5 ).size should be(0 )
155+ vpack.get(" m" ).get(" seq" ).get(5 ).size should be(1 )
156+ vpack.get(" m" ).get(" seq" ).get(5 ).get(" foo" ).isInt should be(true )
157+ vpack.get(" m" ).get(" seq" ).get(5 ).get(" foo" ).getAsInt should be(42 )
106158
107- vpack.get(" m" ).get(" seq" ).get(5 ).isObject should be(true )
108- vpack.get(" m" ).get(" seq" ).get(5 ).size should be(0 )
159+ vpack.get(" m" ).get(" seq" ).get(6 ).isObject should be(true )
160+ vpack.get(" m" ).get(" seq" ).get(6 ).size should be(0 )
161+
162+ vpack.get(" m" ).get(" seq" ).get(7 ).isObject should be(true )
163+ vpack.get(" m" ).get(" seq" ).get(7 ).size should be(0 )
109164
110165 vpack.get(" m" ).get(" seq2" ).get(0 ).isObject should be(true )
111166 vpack.get(" m" ).get(" seq2" ).get(0 ).size should be(1 )
@@ -127,6 +182,10 @@ class VPackMapTest extends AnyFunSuite with should.Matchers {
127182 vpack.get(" m" ).get(" seq5" ).get(0 ).get(" foo4" ).isInt should be(true )
128183 vpack.get(" m" ).get(" seq5" ).get(0 ).get(" foo4" ).getAsInt should be(42 )
129184
185+ vpack.get(" m" ).get(" seq6" ).get(0 ).isObject should be(true )
186+ vpack.get(" m" ).get(" seq6" ).get(0 ).size should be(1 )
187+ vpack.get(" m" ).get(" seq6" ).get(0 ).get(" foo" ).isInt should be(true )
188+ vpack.get(" m" ).get(" seq6" ).get(0 ).get(" foo" ).getAsInt should be(42 )
130189 }
131190
132191 test(" deserialize map" ) {
0 commit comments