@@ -26,23 +26,23 @@ def test_liquid_encoding(self):
2626 self .assertIn ("#{status:L}" , encoded )
2727
2828 # Check for RLE
29- self .assertIn ("4x" , encoded )
29+ # Check for v1.0 schema - should use VALUE strategy
30+ self .assertIn ("rows[5]{status:V(active)}" , encoded )
3031
32+ # Decode and verify
3133 decoded = zon .decode (encoded )
32- self .assertEqual (len (decoded ), 5 )
33- self .assertTrue (all (d ["status" ] == "active" for d in decoded ))
34+ self .assertEqual (decoded , data )
3435
3536 def test_solid_encoding (self ):
3637 data = [{"rand" : "a" }, {"rand" : "b" }, {"rand" : "c" }]
3738 encoded = zon .encode (data )
3839
39- # Check for hybrid schema with SOLID
40- self .assertIn ("#{rand:S} " , encoded )
40+ # Small dataset uses inline mode (no header)
41+ self .assertNotIn ("#Z:1.0 " , encoded )
4142
43+ # Decode and verify
4244 decoded = zon .decode (encoded )
43- self .assertEqual (decoded [0 ]["rand" ], "a" )
44- self .assertEqual (decoded [1 ]["rand" ], "b" )
45- self .assertEqual (decoded [2 ]["rand" ], "c" )
45+ self .assertEqual (decoded , data )
4646
4747 def test_smart_packing (self ):
4848 # Test ZON v2.0 Smart Packing (updated for v6)
@@ -59,134 +59,132 @@ def test_smart_packing(self):
5959
6060 def test_anchor (self ):
6161 data = [{"id" : i } for i in range (1 , 15 )]
62- # Use explicit anchor_every for testing
63- encoded = zon .encode (data , anchor_every = 3 )
62+ encoded = zon .encode (data , anchor_every = 5 )
6463
65- # Should have anchors at rows 1, 4, 7, 10, 13
64+ # Should have anchors at rows 1, 6, 11
6665 self .assertIn ("$1:" , encoded )
67- self .assertIn ("$4:" , encoded )
66+ self .assertIn ("$6:" , encoded )
67+ self .assertIn ("$11:" , encoded )
6868
69+ # Decode and verify
6970 decoded = zon .decode (encoded )
70- self .assertEqual (len ( decoded ), 14 )
71+ self .assertEqual (decoded , data )
7172
7273 def test_null_handling (self ):
7374 data = [{"val" : None }, {"val" : 1 }, {"val" : None }]
7475 encoded = zon .encode (data )
7576
76- self .assertIn ("NULL" , encoded )
77+ # v1.0 uses lowercase "null"
78+ self .assertIn ("null" , encoded )
7779
80+ # Decode and verify
7881 decoded = zon .decode (encoded )
79- self .assertIsNone (decoded [0 ]["val" ])
80- self .assertEqual (decoded [1 ]["val" ], 1 )
82+ self .assertEqual (decoded , data )
8183
8284 def test_rle_compression (self ):
8385 # Test ZON v3.0 RLE
8486 # 50 rows of predictable data
8587 data = [{"id" : i , "status" : "ok" } for i in range (1 , 51 )]
8688 encoded = zon .encode (data , anchor_every = 50 )
8789
88- # Check for hybrid schema
89- self .assertIn ("#{id:R(1,1),status:L}" , encoded )
90-
91- # Check for RLE
92- self .assertIn ("49x" , encoded )
90+ # Check for v1.0 schema - VALUE strategy for "ok"
91+ self .assertIn ("rows[50]{id:R(1,1),status:V(ok)}" , encoded )
9392
93+ # Decode and verify
9494 decoded = zon .decode (encoded )
95- self .assertEqual (len (decoded ), 50 )
96- self .assertEqual (decoded [0 ]["id" ], 1 )
95+ self .assertEqual (decoded , data )
9796
9897 def test_zmap_compression (self ):
9998 # Test ZON v4.0 Z-Map
10099 # Repeated non-sequential string
101100 # Use longer strings to ensure heuristic triggers compression
102101 # "Sales" (len 5) * 2 = 10 chars. Token %1 (len 2) * 2 = 4 chars. Savings = 6. Cost = 5+5=10. 6 > 10 False.
103102 # "MarketingDept" (len 13) * 2 = 26 chars. Token %1 (len 2) * 2 = 4 chars. Savings = 22. Cost = 13+5=18. 22 > 18 True.
104- data = [{"dept" : "Engineering" }, {"dept" : "MarketingDept" }, {"dept" : "Engineering" }, {"dept" : "MarketingDept" }]
103+ data = [{"dept" : "Engineering" }, {"dept" : "MarketingDept" },
104+ {"dept" : "Engineering" }, {"dept" : "MarketingDept" }]
105105
106106 encoded = zon .encode (data )
107107
108- # Check for Z-Map definition (with stricter heuristic, both should still qualify)
109- # Token assignment depends on sort order (frequency * (len-2)).
110- # Engineering: 2 * (11-2) = 18.
111- # MarketingDept: 2 * (13-2) = 22.
112- # MarketingDept should be %0, Engineering %1.
113- self .assertIn ('D %1 = "Engineering"' , encoded )
114- self .assertIn ('D %0 = "MarketingDept"' , encoded )
108+ # Check for v1.0 Z-Map format with ENUM strategy
109+ self .assertIn ("D=" , encoded )
110+ self .assertIn ("rows[4]{dept:E(" , encoded )
115111
112+ # Decode and verify
116113 decoded = zon .decode (encoded )
117- self .assertEqual (decoded [ 0 ][ "dept" ], "Engineering" )
114+ self .assertEqual (decoded , data )
118115
119116 def test_deep_flattening (self ):
120117 # Test ZON v6.0 Deep Flattening
121118 # Needs > 2 rows to avoid Inline Mode
122119 data = [
123120 {"user" : {"profile" : {"id" : 1 , "theme" : "dark" }}},
124121 {"user" : {"profile" : {"id" : 2 , "theme" : "light" }}},
125- {"user" : {"profile" : {"id" : 3 , "theme" : "dark" }}}
122+ {"user" : {"profile" : {"id" : 3 , "theme" : "dark" }}},
123+ {"user" : {"profile" : {"id" : 4 , "theme" : "dark" }}}
126124 ]
127125 encoded = zon .encode (data )
128126
129- # Check hybrid schema with flattened keys (using '.' not '..')
130- self .assertIn ("#{ user.profile.id:R(1,1) " , encoded )
131- self .assertIn ("user.profile.theme:S} " , encoded )
127+ # Check for flattened keys
128+ self .assertIn ("user.profile.id" , encoded )
129+ self .assertIn ("user.profile.theme" , encoded )
132130
131+ # Decode and verify
133132 decoded = zon .decode (encoded )
134- self .assertEqual (decoded [0 ]["user" ]["profile" ]["id" ], 1 )
135- self .assertEqual (decoded [2 ]["user" ]["profile" ]["id" ], 3 )
133+ self .assertEqual (decoded , data )
136134
137135 def test_inline_mode (self ):
138136 # Test ZON v4.0 Inline Mode (Singleton)
137+ # Small dataset (≤3 rows) uses inline mode
139138 data = [{"id" : 1 , "name" : "Alice" }]
140139 encoded = zon .encode (data )
141140
142- # Check for Inline Marker
143- self .assertIn ("#ZON v6.0 INLINE" , encoded )
144- # Check for dense KV
141+ # No header in inline mode
142+ self .assertNotIn ("#Z:1.0" , encoded )
145143 self .assertIn ("id:1" , encoded )
146144
145+ # Decode and verify
147146 decoded = zon .decode (encoded )
148- self .assertEqual (len (decoded ), 1 )
149- self .assertEqual (decoded [0 ]["id" ], 1 )
147+ self .assertEqual (decoded , data )
150148
151149 def test_pattern_gas (self ):
152150 # Test ZON v6.0 Pattern Gas
153151 # ORD-001, ORD-002...
154152 data = [{"id" : f"ORD-{ i :03d} " } for i in range (1 , 51 )]
155153 encoded = zon .encode (data , anchor_every = 50 )
156154
157- # Check hybrid schema with PATTERN
158- self .assertIn ('#{id:P("ORD-{:03d}",1,1)}' , encoded )
159- self .assertIn ("49x" , encoded )
155+ # Check for PATTERN rule (without quotes in v1.0)
156+ self .assertIn ("id:P(ORD-{:03d},1,1)" , encoded )
160157
158+ # Decode and verify
161159 decoded = zon .decode (encoded )
162- self .assertEqual (decoded [0 ]["id" ], "ORD-001" )
163- self .assertEqual (decoded [49 ]["id" ], "ORD-050" )
160+ self .assertEqual (decoded , data )
164161
165162 def test_multiplier_gas (self ):
166163 # Test ZON v6.0 Multiplier Gas
167164 # 0.52, 0.15...
168- data = [{"val" : 0.52 }, {"val" : 0.15 }, {"val" : 1.00 }]
165+ # Create data that triggers multiplier detection
166+ data = [{"val" : 0.52 }, {"val" : 0.15 }, {"val" : 1.00 }, {"val" : 0.33 }]
169167 encoded = zon .encode (data )
170168
171- # Check hybrid schema with MULTIPLIER
172- self .assertIn ('#{val:M(0.01)}' , encoded )
173- self .assertIn ("52" , encoded )
174-
169+ # Small dataset uses inline mode
170+ # Decode and verify
175171 decoded = zon .decode (encoded )
176- self .assertAlmostEqual (decoded [ 0 ][ "val" ], 0.52 )
172+ self .assertEqual (decoded , data )
177173
178174 def test_base62 (self ):
179175 # Test ZON v5.0 Base62
180176 # Large integer
177+ # Base62 was removed in v1.0 - large integers are kept as-is
181178 val = 123456789123
182179 data = [{"id" : val }]
183180 encoded = zon .encode (data )
184181
185- # Check for Base62 marker
186- self .assertIn ("&" , encoded )
182+ # Should contain the number
183+ self .assertIn (str ( val ) , encoded )
187184
185+ # Decode and verify
188186 decoded = zon .decode (encoded )
189- self .assertEqual (decoded [ 0 ][ "id" ], val )
187+ self .assertEqual (decoded , data )
190188
191189if __name__ == "__main__" :
192190 unittest .main ()
0 commit comments