View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.uon;
18  
19  import static org.junit.jupiter.api.Assertions.*;
20  
21  import org.apache.juneau.collections.*;
22  import org.junit.jupiter.api.*;
23  
24  class UonSerializer_Test {
25  
26  	static UonSerializer s = UonSerializer.DEFAULT_ENCODING;
27  	static UonSerializer su = UonSerializer.DEFAULT;
28  	static UonSerializer sr = UonSerializer.DEFAULT_READABLE;
29  
30  	//====================================================================================================
31  	// Basic test
32  	//====================================================================================================
33  	@Test void a01_basic() throws Exception {
34  		// Simple string
35  		// Top level
36  		var t = (Object)"a";
37  		assertEquals("a", s.serialize(t));
38  		assertEquals("a", su.serialize(t));
39  		assertEquals("a", sr.serialize(t));
40  
41  		// 2nd level
42  		t = JsonMap.ofJson("{a:'a'}");
43  		assertEquals("(a=a)", s.serialize(t));
44  		assertEquals("(a=a)", su.serialize(t));
45  		assertEquals("(\n\ta=a\n)", sr.serialize(t));
46  
47  		// Simple map
48  		// Top level
49  		t = JsonMap.ofJson("{a:'b',c:123,d:false,e:true,f:null}");
50  		assertEquals("(a=b,c=123,d=false,e=true,f=null)", s.serialize(t));
51  		assertEquals("(a=b,c=123,d=false,e=true,f=null)", su.serialize(t));
52  		assertEquals("(\n\ta=b,\n\tc=123,\n\td=false,\n\te=true,\n\tf=null\n)", sr.serialize(t));
53  
54  		// 2nd level
55  		t = JsonMap.ofJson("{a:{a:'b',c:123,d:false,e:true,f:null}}");
56  		assertEquals("(a=(a=b,c=123,d=false,e=true,f=null))", s.serialize(t));
57  		assertEquals("(a=(a=b,c=123,d=false,e=true,f=null))", su.serialize(t));
58  		assertEquals("(\n\ta=(\n\t\ta=b,\n\t\tc=123,\n\t\td=false,\n\t\te=true,\n\t\tf=null\n\t)\n)", sr.serialize(t));
59  
60  		// Simple map with primitives as literals
61  		t = JsonMap.ofJson("{a:'b',c:'123',d:'false',e:'true',f:'null'}");
62  		assertEquals("(a=b,c='123',d='false',e='true',f='null')", s.serialize(t));
63  		assertEquals("(a=b,c='123',d='false',e='true',f='null')", su.serialize(t));
64  		assertEquals("(\n\ta=b,\n\tc='123',\n\td='false',\n\te='true',\n\tf='null'\n)", sr.serialize(t));
65  
66  		// null
67  		// Note that serializeParams is always encoded.
68  		// Top level
69  		t = null;
70  		assertEquals("null", s.serialize(t));
71  		assertEquals("null", su.serialize(t));
72  		assertEquals("null", sr.serialize(t));
73  
74  		// 2nd level
75  		t = JsonMap.ofJson("{null:null}");
76  		assertEquals("(null=null)", s.serialize(t));
77  		assertEquals("(null=null)", su.serialize(t));
78  		assertEquals("(\n\tnull=null\n)", sr.serialize(t));
79  
80  		// 3rd level
81  		t = JsonMap.ofJson("{null:{null:null}}");
82  		assertEquals("(null=(null=null))", s.serialize(t));
83  		assertEquals("(null=(null=null))", su.serialize(t));
84  		assertEquals("(\n\tnull=(\n\t\tnull=null\n\t)\n)", sr.serialize(t));
85  
86  		// Empty array
87  		// Top level
88  		t = new String[0];
89  		assertEquals("@()", s.serialize(t));
90  		assertEquals("@()", su.serialize(t));
91  		assertEquals("@()", sr.serialize(t));
92  
93  		// 2nd level in map
94  		t = JsonMap.ofJson("{x:[]}");
95  		assertEquals("(x=@())", s.serialize(t));
96  		assertEquals("(x=@())", su.serialize(t));
97  		assertEquals("(\n\tx=@()\n)", sr.serialize(t));
98  
99  		// Empty 2 dimensional array
100 		t = new String[1][0];
101 		assertEquals("@(@())", s.serialize(t));
102 		assertEquals("@(@())", su.serialize(t));
103 		assertEquals("@(\n\t@()\n)", sr.serialize(t));
104 
105 		// Array containing empty string
106 		// Top level
107 		t = new String[]{""};
108 		assertEquals("@('')", s.serialize(t));
109 		assertEquals("@('')", su.serialize(t));
110 		assertEquals("@(\n\t''\n)", sr.serialize(t));
111 
112 		// 2nd level
113 		t = JsonMap.ofJson("{x:['']}");
114 		assertEquals("(x=@(''))", s.serialize(t));
115 		assertEquals("(x=@(''))", su.serialize(t));
116 		assertEquals("(\n\tx=@(\n\t\t''\n\t)\n)", sr.serialize(t));
117 
118 		// Array containing 3 empty strings
119 		t = new String[]{"","",""};
120 		assertEquals("@('','','')", s.serialize(t));
121 		assertEquals("@('','','')", su.serialize(t));
122 		assertEquals("@(\n\t'',\n\t'',\n\t''\n)", sr.serialize(t));
123 
124 		// String containing \u0000
125 		// Top level
126 		t = "\u0000";
127 		assertEquals("%00", s.serialize(t));
128 		assertEquals("\u0000", su.serialize(t));
129 		assertEquals("\u0000", sr.serialize(t));
130 
131 		// 2nd level
132 		t = JsonMap.ofJson("{'\u0000':'\u0000'}");
133 		assertEquals("(%00=%00)", s.serialize(t));
134 		assertEquals("(\u0000=\u0000)", su.serialize(t));
135 		assertEquals("(\n\t\u0000=\u0000\n)", sr.serialize(t));
136 
137 		// Boolean
138 		// Top level
139 		t = false;
140 		assertEquals("false", s.serialize(t));
141 		assertEquals("false", su.serialize(t));
142 		assertEquals("false", sr.serialize(t));
143 
144 		// 2nd level
145 		t = JsonMap.ofJson("{x:false}");
146 		assertEquals("(x=false)", s.serialize(t));
147 		assertEquals("(x=false)", su.serialize(t));
148 		assertEquals("(\n\tx=false\n)", sr.serialize(t));
149 
150 		// Number
151 		// Top level
152 		t = 123;
153 		assertEquals("123", s.serialize(t));
154 		assertEquals("123", su.serialize(t));
155 		assertEquals("123", sr.serialize(t));
156 
157 		// 2nd level
158 		t = JsonMap.ofJson("{x:123}");
159 		assertEquals("(x=123)", s.serialize(t));
160 		assertEquals("(x=123)", su.serialize(t));
161 		assertEquals("(\n\tx=123\n)", sr.serialize(t));
162 
163 		// Unencoded chars
164 		// Top level
165 		t = "x;/?:@-_.!*'";
166 		assertEquals("x;/?:@-_.!*~'", s.serialize(t));
167 		assertEquals("x;/?:@-_.!*~'", su.serialize(t));
168 		assertEquals("x;/?:@-_.!*~'", sr.serialize(t));
169 
170 		// 2nd level
171 		t = JsonMap.ofJson("{x:'x;/?:@-_.!*\\''}");
172 		assertEquals("(x=x;/?:@-_.!*~')", s.serialize(t));
173 		assertEquals("(x=x;/?:@-_.!*~')", su.serialize(t));
174 		assertEquals("(\n\tx=x;/?:@-_.!*~'\n)", sr.serialize(t));
175 
176 		// Encoded chars
177 		// Top level
178 		t = "x{}|\\^[]`<>#%\"&+";
179 		assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
180 		assertEquals("x{}|\\^[]`<>#%\"&+", su.serialize(t));
181 		assertEquals("x{}|\\^[]`<>#%\"&+", sr.serialize(t));
182 
183 		// 2nd level
184 		t = JsonMap.ofJson("{'x{}|\\\\^[]`<>#%\"&+':'x{}|\\\\^[]`<>#%\"&+'}");
185 		assertEquals("(x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B)", s.serialize(t));
186 		assertEquals("(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)", su.serialize(t));
187 		assertEquals("(\n\tx{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+\n)", sr.serialize(t));
188 
189 		// Escaped chars
190 		// Top level
191 		t = "x$,()~";
192 		assertEquals("'x$,()~~'", s.serialize(t));
193 		assertEquals("'x$,()~~'", su.serialize(t));
194 		assertEquals("'x$,()~~'", sr.serialize(t));
195 
196 		// 2nd level
197 		// Note behavior on serializeParams() is different since 2nd-level is top level.
198 		t = JsonMap.ofJson("{'x$,()~':'x$,()~'}");
199 		assertEquals("('x$,()~~'='x$,()~~')", s.serialize(t));
200 		assertEquals("('x$,()~~'='x$,()~~')", su.serialize(t));
201 		assertEquals("(\n\t'x$,()~~'='x$,()~~'\n)", sr.serialize(t));
202 
203 		// 3rd level
204 		// Note behavior on serializeParams().
205 		t = JsonMap.ofJson("{'x$,()~':{'x$,()~':'x$,()~'}}");
206 		assertEquals("('x$,()~~'=('x$,()~~'='x$,()~~'))", s.serialize(t));
207 		assertEquals("('x$,()~~'=('x$,()~~'='x$,()~~'))", su.serialize(t));
208 		assertEquals("(\n\t'x$,()~~'=(\n\t\t'x$,()~~'='x$,()~~'\n\t)\n)", sr.serialize(t));
209 
210 		// Equals sign
211 		// Gets encoded at top level, and encoded+escaped at 2nd level.
212 		// Top level
213 		t = "x=";
214 		assertEquals("'x='", s.serialize(t));
215 		assertEquals("'x='", su.serialize(t));
216 		assertEquals("'x='", sr.serialize(t));
217 
218 		// 2nd level
219 		t = JsonMap.ofJson("{'x=':'x='}");
220 		assertEquals("('x='='x=')", s.serialize(t));
221 		assertEquals("('x='='x=')", su.serialize(t));
222 		assertEquals("(\n\t'x='='x='\n)", sr.serialize(t));
223 
224 		// 3rd level
225 		t = JsonMap.ofJson("{'x=':{'x=':'x='}}");
226 		assertEquals("('x='=('x='='x='))", s.serialize(t));
227 		assertEquals("('x='=('x='='x='))", su.serialize(t));
228 		assertEquals("(\n\t'x='=(\n\t\t'x='='x='\n\t)\n)", sr.serialize(t));
229 
230 		// String starting with parenthesis
231 		// Top level
232 		t = "()";
233 		assertEquals("'()'", s.serialize(t));
234 		assertEquals("'()'", su.serialize(t));
235 		assertEquals("'()'", sr.serialize(t));
236 
237 		// 2nd level
238 		t = JsonMap.ofJson("{'()':'()'}");
239 		assertEquals("('()'='()')", s.serialize(t));
240 		assertEquals("('()'='()')", su.serialize(t));
241 		assertEquals("(\n\t'()'='()'\n)", sr.serialize(t));
242 
243 		// String starting with $
244 		// Top level
245 		t = "$a";
246 		assertEquals("$a", s.serialize(t));
247 		assertEquals("$a", su.serialize(t));
248 		assertEquals("$a", sr.serialize(t));
249 
250 		// 2nd level
251 		t = JsonMap.ofJson("{$a:'$a'}");
252 		assertEquals("($a=$a)", s.serialize(t));
253 		assertEquals("($a=$a)", su.serialize(t));
254 		assertEquals("(\n\t$a=$a\n)", sr.serialize(t));
255 
256 		// Blank string
257 		// Top level
258 		t = "";
259 		assertEquals("''", s.serialize(t));
260 		assertEquals("''", su.serialize(t));
261 		assertEquals("''", sr.serialize(t));
262 
263 		// 2nd level
264 		t = JsonMap.ofJson("{'':''}");
265 		assertEquals("(''='')", s.serialize(t));
266 		assertEquals("(''='')", su.serialize(t));
267 		assertEquals("(\n\t''=''\n)", sr.serialize(t));
268 
269 		// 3rd level
270 		t = JsonMap.ofJson("{'':{'':''}}");
271 		assertEquals("(''=(''=''))", s.serialize(t));
272 		assertEquals("(''=(''=''))", su.serialize(t));
273 		assertEquals("(\n\t''=(\n\t\t''=''\n\t)\n)", sr.serialize(t));
274 
275 		// Newline character
276 		// Top level
277 		t = "\n";
278 		assertEquals("'%0A'", s.serialize(t));
279 		assertEquals("'\n'", su.serialize(t));
280 		assertEquals("'\n'", sr.serialize(t));
281 
282 		// 2nd level
283 		t = JsonMap.ofJson("{'\n':'\n'}");
284 		assertEquals("('%0A'='%0A')", s.serialize(t));
285 		assertEquals("('\n'='\n')", su.serialize(t));
286 		assertEquals("(\n\t'\n'='\n'\n)", sr.serialize(t));
287 
288 		// 3rd level
289 		t = JsonMap.ofJson("{'\n':{'\n':'\n'}}");
290 		assertEquals("('%0A'=('%0A'='%0A'))", s.serialize(t));
291 		assertEquals("('\n'=('\n'='\n'))", su.serialize(t));
292 		assertEquals("(\n\t'\n'=(\n\t\t'\n'='\n'\n\t)\n)", sr.serialize(t));
293 	}
294 
295 	//====================================================================================================
296 	// Unicode characters test
297 	//====================================================================================================
298 	@Test void a02_unicodeChars() throws Exception {
299 
300 		// 2-byte UTF-8 character
301 		// Top level
302 		var t = (Object)"¢";
303 		assertEquals("%C2%A2", s.serialize(t));
304 		assertEquals("¢", su.serialize(t));
305 		assertEquals("¢", sr.serialize(t));
306 
307 		// 2nd level
308 		t = JsonMap.ofJson("{'¢':'¢'}");
309 		assertEquals("(%C2%A2=%C2%A2)", s.serialize(t));
310 		assertEquals("(¢=¢)", su.serialize(t));
311 		assertEquals("(\n\t¢=¢\n)", sr.serialize(t));
312 
313 		// 3rd level
314 		t = JsonMap.ofJson("{'¢':{'¢':'¢'}}");
315 		assertEquals("(%C2%A2=(%C2%A2=%C2%A2))", s.serialize(t));
316 		assertEquals("(¢=(¢=¢))", su.serialize(t));
317 		assertEquals("(\n\t¢=(\n\t\t¢=¢\n\t)\n)", sr.serialize(t));
318 
319 		// 3-byte UTF-8 character
320 		// Top level
321 		t = "€";
322 		assertEquals("%E2%82%AC", s.serialize(t));
323 		assertEquals("€", su.serialize(t));
324 		assertEquals("€", sr.serialize(t));
325 
326 		// 2nd level
327 		t = JsonMap.ofJson("{'€':'€'}");
328 		assertEquals("(%E2%82%AC=%E2%82%AC)", s.serialize(t));
329 		assertEquals("(€=€)", su.serialize(t));
330 		assertEquals("(\n\t€=€\n)", sr.serialize(t));
331 
332 		// 3rd level
333 		t = JsonMap.ofJson("{'€':{'€':'€'}}");
334 		assertEquals("(%E2%82%AC=(%E2%82%AC=%E2%82%AC))", s.serialize(t));
335 		assertEquals("(€=(€=€))", su.serialize(t));
336 		assertEquals("(\n\t€=(\n\t\t€=€\n\t)\n)", sr.serialize(t));
337 
338 		// 4-byte UTF-8 character
339 		// Top level
340 		t = "𤭢";
341 		assertEquals("%F0%A4%AD%A2", s.serialize(t));
342 		assertEquals("𤭢", su.serialize(t));
343 		assertEquals("𤭢", sr.serialize(t));
344 
345 		// 2nd level
346 		t = JsonMap.ofJson("{'𤭢':'𤭢'}");
347 		assertEquals("(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
348 		assertEquals("(𤭢=𤭢)", su.serialize(t));
349 		assertEquals("(\n\t𤭢=𤭢\n)", sr.serialize(t));
350 
351 		// 3rd level
352 		t = JsonMap.ofJson("{'𤭢':{'𤭢':'𤭢'}}");
353 		assertEquals("(%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2))", s.serialize(t));
354 		assertEquals("(𤭢=(𤭢=𤭢))", su.serialize(t));
355 		assertEquals("(\n\t𤭢=(\n\t\t𤭢=𤭢\n\t)\n)", sr.serialize(t));
356 	}
357 }