// ***************************************************************************************************************************
// * 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));
	}
}