blob: bf3bc750787da85dd3fbe63391201ab25925e857 [file] [log] [blame]
// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
// * with the License. You may obtain a copy of the License at *
// * *
// * http://www.apache.org/licenses/LICENSE-2.0 *
// * *
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
package org.apache.juneau.urlencoding;
import static org.junit.Assert.*;
import org.apache.juneau.*;
import org.apache.juneau.uon.*;
import org.junit.*;
@SuppressWarnings("javadoc")
public class UonSerializerTest {
static UonSerializer s = UonSerializer.DEFAULT_ENCODING;
static UonSerializer su = UonSerializer.DEFAULT;
static UonSerializer sr = UonSerializer.DEFAULT_READABLE;
//====================================================================================================
// Basic test
//====================================================================================================
@Test
public void testBasic() throws Exception {
Object t;
// Simple string
// Top level
t = "a";
assertEquals("a", s.serialize(t));
assertEquals("a", su.serialize(t));
assertEquals("a", sr.serialize(t));
// 2nd level
t = new ObjectMap("{a:'a'}");
assertEquals("(a=a)", s.serialize(t));
assertEquals("(a=a)", su.serialize(t));
assertEquals("(\n\ta=a\n)", sr.serialize(t));
// Simple map
// Top level
t = new ObjectMap("{a:'b',c:123,d:false,e:true,f:null}");
assertEquals("(a=b,c=123,d=false,e=true,f=null)", s.serialize(t));
assertEquals("(a=b,c=123,d=false,e=true,f=null)", su.serialize(t));
assertEquals("(\n\ta=b,\n\tc=123,\n\td=false,\n\te=true,\n\tf=null\n)", sr.serialize(t));
// 2nd level
t = new ObjectMap("{a:{a:'b',c:123,d:false,e:true,f:null}}");
assertEquals("(a=(a=b,c=123,d=false,e=true,f=null))", s.serialize(t));
assertEquals("(a=(a=b,c=123,d=false,e=true,f=null))", su.serialize(t));
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));
// Simple map with primitives as literals
t = new ObjectMap("{a:'b',c:'123',d:'false',e:'true',f:'null'}");
assertEquals("(a=b,c='123',d='false',e='true',f='null')", s.serialize(t));
assertEquals("(a=b,c='123',d='false',e='true',f='null')", su.serialize(t));
assertEquals("(\n\ta=b,\n\tc='123',\n\td='false',\n\te='true',\n\tf='null'\n)", sr.serialize(t));
// null
// Note that serializeParams is always encoded.
// Top level
t = null;
assertEquals("null", s.serialize(t));
assertEquals("null", su.serialize(t));
assertEquals("null", sr.serialize(t));
// 2nd level
t = new ObjectMap("{null:null}");
assertEquals("(null=null)", s.serialize(t));
assertEquals("(null=null)", su.serialize(t));
assertEquals("(\n\tnull=null\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{null:{null:null}}");
assertEquals("(null=(null=null))", s.serialize(t));
assertEquals("(null=(null=null))", su.serialize(t));
assertEquals("(\n\tnull=(\n\t\tnull=null\n\t)\n)", sr.serialize(t));
// Empty array
// Top level
t = new String[0];
assertEquals("@()", s.serialize(t));
assertEquals("@()", su.serialize(t));
assertEquals("@()", sr.serialize(t));
// 2nd level in map
t = new ObjectMap("{x:[]}");
assertEquals("(x=@())", s.serialize(t));
assertEquals("(x=@())", su.serialize(t));
assertEquals("(\n\tx=@()\n)", sr.serialize(t));
// Empty 2 dimensional array
t = new String[1][0];
assertEquals("@(@())", s.serialize(t));
assertEquals("@(@())", su.serialize(t));
assertEquals("@(\n\t@()\n)", sr.serialize(t));
// Array containing empty string
// Top level
t = new String[]{""};
assertEquals("@('')", s.serialize(t));
assertEquals("@('')", su.serialize(t));
assertEquals("@(\n\t''\n)", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:['']}");
assertEquals("(x=@(''))", s.serialize(t));
assertEquals("(x=@(''))", su.serialize(t));
assertEquals("(\n\tx=@(\n\t\t''\n\t)\n)", sr.serialize(t));
// Array containing 3 empty strings
t = new String[]{"","",""};
assertEquals("@('','','')", s.serialize(t));
assertEquals("@('','','')", su.serialize(t));
assertEquals("@(\n\t'',\n\t'',\n\t''\n)", sr.serialize(t));
// String containing \u0000
// Top level
t = "\u0000";
assertEquals("%00", s.serialize(t));
assertEquals("\u0000", su.serialize(t));
assertEquals("\u0000", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'\u0000':'\u0000'}");
assertEquals("(%00=%00)", s.serialize(t));
assertEquals("(\u0000=\u0000)", su.serialize(t));
assertEquals("(\n\t\u0000=\u0000\n)", sr.serialize(t));
// Boolean
// Top level
t = false;
assertEquals("false", s.serialize(t));
assertEquals("false", su.serialize(t));
assertEquals("false", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:false}");
assertEquals("(x=false)", s.serialize(t));
assertEquals("(x=false)", su.serialize(t));
assertEquals("(\n\tx=false\n)", sr.serialize(t));
// Number
// Top level
t = 123;
assertEquals("123", s.serialize(t));
assertEquals("123", su.serialize(t));
assertEquals("123", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:123}");
assertEquals("(x=123)", s.serialize(t));
assertEquals("(x=123)", su.serialize(t));
assertEquals("(\n\tx=123\n)", sr.serialize(t));
// Unencoded chars
// Top level
t = "x;/?:@-_.!*'";
assertEquals("x;/?:@-_.!*~'", s.serialize(t));
assertEquals("x;/?:@-_.!*~'", su.serialize(t));
assertEquals("x;/?:@-_.!*~'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:'x;/?:@-_.!*\\''}");
assertEquals("(x=x;/?:@-_.!*~')", s.serialize(t));
assertEquals("(x=x;/?:@-_.!*~')", su.serialize(t));
assertEquals("(\n\tx=x;/?:@-_.!*~'\n)", sr.serialize(t));
// Encoded chars
// Top level
t = "x{}|\\^[]`<>#%\"&+";
assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
assertEquals("x{}|\\^[]`<>#%\"&+", su.serialize(t));
assertEquals("x{}|\\^[]`<>#%\"&+", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'x{}|\\\\^[]`<>#%\"&+':'x{}|\\\\^[]`<>#%\"&+'}");
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));
assertEquals("(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)", su.serialize(t));
assertEquals("(\n\tx{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+\n)", sr.serialize(t));
// Escaped chars
// Top level
t = "x$,()~";
assertEquals("'x$,()~~'", s.serialize(t));
assertEquals("'x$,()~~'", su.serialize(t));
assertEquals("'x$,()~~'", sr.serialize(t));
// 2nd level
// Note behavior on serializeParams() is different since 2nd-level is top level.
t = new ObjectMap("{'x$,()~':'x$,()~'}");
assertEquals("('x$,()~~'='x$,()~~')", s.serialize(t));
assertEquals("('x$,()~~'='x$,()~~')", su.serialize(t));
assertEquals("(\n\t'x$,()~~'='x$,()~~'\n)", sr.serialize(t));
// 3rd level
// Note behavior on serializeParams().
t = new ObjectMap("{'x$,()~':{'x$,()~':'x$,()~'}}");
assertEquals("('x$,()~~'=('x$,()~~'='x$,()~~'))", s.serialize(t));
assertEquals("('x$,()~~'=('x$,()~~'='x$,()~~'))", su.serialize(t));
assertEquals("(\n\t'x$,()~~'=(\n\t\t'x$,()~~'='x$,()~~'\n\t)\n)", sr.serialize(t));
// Equals sign
// Gets encoded at top level, and encoded+escaped at 2nd level.
// Top level
t = "x=";
assertEquals("'x='", s.serialize(t));
assertEquals("'x='", su.serialize(t));
assertEquals("'x='", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'x=':'x='}");
assertEquals("('x='='x=')", s.serialize(t));
assertEquals("('x='='x=')", su.serialize(t));
assertEquals("(\n\t'x='='x='\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'x=':{'x=':'x='}}");
assertEquals("('x='=('x='='x='))", s.serialize(t));
assertEquals("('x='=('x='='x='))", su.serialize(t));
assertEquals("(\n\t'x='=(\n\t\t'x='='x='\n\t)\n)", sr.serialize(t));
// String starting with parenthesis
// Top level
t = "()";
assertEquals("'()'", s.serialize(t));
assertEquals("'()'", su.serialize(t));
assertEquals("'()'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'()':'()'}");
assertEquals("('()'='()')", s.serialize(t));
assertEquals("('()'='()')", su.serialize(t));
assertEquals("(\n\t'()'='()'\n)", sr.serialize(t));
// String starting with $
// Top level
t = "$a";
assertEquals("$a", s.serialize(t));
assertEquals("$a", su.serialize(t));
assertEquals("$a", sr.serialize(t));
// 2nd level
t = new ObjectMap("{$a:'$a'}");
assertEquals("($a=$a)", s.serialize(t));
assertEquals("($a=$a)", su.serialize(t));
assertEquals("(\n\t$a=$a\n)", sr.serialize(t));
// Blank string
// Top level
t = "";
assertEquals("''", s.serialize(t));
assertEquals("''", su.serialize(t));
assertEquals("''", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'':''}");
assertEquals("(''='')", s.serialize(t));
assertEquals("(''='')", su.serialize(t));
assertEquals("(\n\t''=''\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'':{'':''}}");
assertEquals("(''=(''=''))", s.serialize(t));
assertEquals("(''=(''=''))", su.serialize(t));
assertEquals("(\n\t''=(\n\t\t''=''\n\t)\n)", sr.serialize(t));
// Newline character
// Top level
t = "\n";
assertEquals("'%0A'", s.serialize(t));
assertEquals("'\n'", su.serialize(t));
assertEquals("'\n'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'\n':'\n'}");
assertEquals("('%0A'='%0A')", s.serialize(t));
assertEquals("('\n'='\n')", su.serialize(t));
assertEquals("(\n\t'\n'='\n'\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'\n':{'\n':'\n'}}");
assertEquals("('%0A'=('%0A'='%0A'))", s.serialize(t));
assertEquals("('\n'=('\n'='\n'))", su.serialize(t));
assertEquals("(\n\t'\n'=(\n\t\t'\n'='\n'\n\t)\n)", sr.serialize(t));
}
//====================================================================================================
// Unicode characters test
//====================================================================================================
@Test
public void testUnicodeChars() throws Exception {
Object t;
// 2-byte UTF-8 character
// Top level
t = "¢";
assertEquals("%C2%A2", s.serialize(t));
assertEquals("¢", su.serialize(t));
assertEquals("¢", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'¢':'¢'}");
assertEquals("(%C2%A2=%C2%A2)", s.serialize(t));
assertEquals("(¢=¢)", su.serialize(t));
assertEquals("(\n\t¢=¢\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'¢':{'¢':'¢'}}");
assertEquals("(%C2%A2=(%C2%A2=%C2%A2))", s.serialize(t));
assertEquals("(¢=(¢=¢))", su.serialize(t));
assertEquals("(\n\t¢=(\n\t\t¢=¢\n\t)\n)", sr.serialize(t));
// 3-byte UTF-8 character
// Top level
t = "€";
assertEquals("%E2%82%AC", s.serialize(t));
assertEquals("€", su.serialize(t));
assertEquals("€", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'€':'€'}");
assertEquals("(%E2%82%AC=%E2%82%AC)", s.serialize(t));
assertEquals("(€=€)", su.serialize(t));
assertEquals("(\n\t€=€\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'€':{'€':'€'}}");
assertEquals("(%E2%82%AC=(%E2%82%AC=%E2%82%AC))", s.serialize(t));
assertEquals("(€=(€=€))", su.serialize(t));
assertEquals("(\n\t€=(\n\t\t€=€\n\t)\n)", sr.serialize(t));
// 4-byte UTF-8 character
// Top level
t = "𤭢";
assertEquals("%F0%A4%AD%A2", s.serialize(t));
assertEquals("𤭢", su.serialize(t));
assertEquals("𤭢", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'𤭢':'𤭢'}");
assertEquals("(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
assertEquals("(𤭢=𤭢)", su.serialize(t));
assertEquals("(\n\t𤭢=𤭢\n)", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'𤭢':{'𤭢':'𤭢'}}");
assertEquals("(%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2))", s.serialize(t));
assertEquals("(𤭢=(𤭢=𤭢))", su.serialize(t));
assertEquals("(\n\t𤭢=(\n\t\t𤭢=𤭢\n\t)\n)", sr.serialize(t));
}
}