blob: 87b46e1bf1a86aaf0150c0a86bc1e08af45f03ea [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 java.util.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.uon.*;
import org.junit.*;
@SuppressWarnings({"rawtypes","javadoc"})
public class UonParserTest {
static UonParser p = UonParser.DEFAULT;
static UonParser pe = UonParser.DEFAULT_DECODING;
//====================================================================================================
// Basic test
//====================================================================================================
@Test
public void testBasic() throws Exception {
String t;
Map m;
// Simple string
// Top level
t = "a";
assertEquals("a", p.parse(t, String.class));
assertEquals("a", p.parse(t, Object.class));
assertEquals("a", pe.parse(t, String.class));
t = "'a'";
assertEquals("a", p.parse(t, String.class));
assertEquals("a", p.parse(t, Object.class));
t = " 'a' ";
assertEquals("a", p.parse(t, String.class));
// 2nd level
t = "(a=a)";
assertEquals("a", ((Map)p.parse(t, Map.class)).get("a"));
assertEquals("a", ((Map)pe.parse(t, Map.class)).get("a"));
t = "('a'='a')";
assertEquals("a", ((Map)p.parse(t, Map.class)).get("a"));
assertEquals("a", ((Map)pe.parse(t, Map.class)).get("a"));
// Simple map
// Top level
t = "(a=b,c=123,d=false,e=true,f=null)";
m = p.parse(t, Map.class);
assertEquals("b", m.get("a"));
assertTrue(m.get("c") instanceof Number);
assertEquals(123, m.get("c"));
assertTrue(m.get("d") instanceof Boolean);
assertEquals(Boolean.FALSE, m.get("d"));
assertTrue(m.get("e") instanceof Boolean);
assertEquals(Boolean.TRUE, m.get("e"));
m = pe.parse(t, Map.class);
assertNull(m.get("f"));
t = "(a=true)";
m = p.parse(t, HashMap.class, String.class, Boolean.class);
assertTrue(m.get("a") instanceof Boolean);
assertEquals("true", m.get("a").toString());
// null
// Top level
t = "null";
assertNull(p.parse(t, Object.class));
assertNull(pe.parse(t, Object.class));
// 2nd level
t = "(null=null)";
m = p.parse(t, Map.class);
assertTrue(m.containsKey(null));
assertNull(m.get(null));
m = pe.parse(t, Map.class);
assertTrue(m.containsKey(null));
assertNull(m.get(null));
t = " ( null = null ) ";
m = p.parse(t, Map.class);
assertTrue(m.containsKey(null));
assertNull(m.get(null));
m = pe.parse(t, Map.class);
assertTrue(m.containsKey(null));
assertNull(m.get(null));
// 3rd level
t = "(null=(null=null))";
m = p.parse(t, Map.class);
assertTrue(((Map)m.get(null)).containsKey(null));
assertNull(((Map)m.get(null)).get(null));
m = pe.parse(t, Map.class);
assertTrue(((Map)m.get(null)).containsKey(null));
assertNull(((Map)m.get(null)).get(null));
// Empty array
// Top level
t = "@()";
List l = (List)p.parse(t, Object.class);
assertTrue(l.isEmpty());
t = " @( ) ";
l = p.parse(t, List.class);
assertTrue(l.isEmpty());
// 2nd level in map
t = "(x=@())";
m = p.parse(t, HashMap.class, String.class, List.class);
assertTrue(m.containsKey("x"));
assertTrue(((List)m.get("x")).isEmpty());
m = (Map)p.parse(t, Object.class);
assertTrue(m.containsKey("x"));
assertTrue(((List)m.get("x")).isEmpty());
t = " ( x = @( ) )";
m = p.parse(t, HashMap.class, String.class, List.class);
assertTrue(m.containsKey("x"));
assertTrue(((List)m.get("x")).isEmpty());
// Empty 2 dimensional array
t = "@(@())";
l = (List)p.parse(t, Object.class);
assertTrue(l.size() == 1);
l = (List)l.get(0);
assertTrue(l.isEmpty());
t = " @( @( ) ) ";
l = p.parse(t, LinkedList.class, List.class);
assertTrue(l.size() == 1);
l = (List)l.get(0);
assertTrue(l.isEmpty());
// Array containing empty string
// Top level
t = "@('')";
l = (List)p.parse(t, Object.class);
assertTrue(l.size() == 1);
assertEquals("", l.get(0));
t = " @( '' ) ";
l = p.parse(t, List.class, String.class);
assertTrue(l.size() == 1);
assertEquals("", l.get(0));
// 2nd level
t = "(''=@(''))";
m = (Map)p.parse(t, Object.class);
assertEquals("", ((List)m.get("")).get(0));
t = " ( '' = @( '' ) ) ";
m = p.parse(t, HashMap.class, String.class, List.class);
assertEquals("", ((List)m.get("")).get(0));
// Array containing 3 empty strings
t = "@('','','')";
l = (List)p.parse(t, Object.class);
assertTrue(l.size() == 3);
assertEquals("", l.get(0));
assertEquals("", l.get(1));
assertEquals("", l.get(2));
t = " @( '' , '' , '' ) ";
l = p.parse(t, List.class, Object.class);
assertTrue(l.size() == 3);
assertEquals("", l.get(0));
assertEquals("", l.get(1));
assertEquals("", l.get(2));
// String containing \u0000
// Top level
t = "'\u0000'";
assertEquals("\u0000", p.parse(t, Object.class));
t = " '\u0000' ";
assertEquals("\u0000", p.parse(t, String.class));
assertEquals("\u0000", p.parse(t, Object.class));
// 2nd level
t = "('\u0000'='\u0000')";
m = (Map)p.parse(t, Object.class);
assertTrue(m.size() == 1);
assertEquals("\u0000", m.get("\u0000"));
t = " ( '\u0000' = '\u0000' ) ";
m = p.parse(t, HashMap.class, String.class, String.class);
assertTrue(m.size() == 1);
assertEquals("\u0000", m.get("\u0000"));
m = p.parse(t, HashMap.class, String.class, Object.class);
assertTrue(m.size() == 1);
assertEquals("\u0000", m.get("\u0000"));
// Boolean
// Top level
t = "false";
Boolean b = (Boolean)p.parse(t, Object.class);
assertEquals(Boolean.FALSE, b);
b = p.parse(t, Boolean.class);
assertEquals(Boolean.FALSE, b);
t = " false ";
b = p.parse(t, Boolean.class);
assertEquals(Boolean.FALSE, b);
// 2nd level
t = "(x=false)";
m = (Map)p.parse(t, Object.class);
assertEquals(Boolean.FALSE, m.get("x"));
t = " ( x = false ) ";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals(Boolean.FALSE, m.get("x"));
// Number
// Top level
t = "123";
Integer i = (Integer)p.parse(t, Object.class);
assertEquals(123, i.intValue());
i = p.parse(t, Integer.class);
assertEquals(123, i.intValue());
Double d = p.parse(t, Double.class);
assertEquals(123, d.intValue());
Float f = p.parse(t, Float.class);
assertEquals(123, f.intValue());
t = " 123 ";
i = p.parse(t, Integer.class);
assertEquals(123, i.intValue());
// 2nd level
t = "(x=123)";
m = (Map)p.parse(t, Object.class);
assertEquals(123, ((Integer)m.get("x")).intValue());
t = " ( x = 123 ) ";
m = p.parse(t, HashMap.class, String.class, Number.class);
assertEquals(123, ((Integer)m.get("x")).intValue());
m = p.parse(t, HashMap.class, String.class, Double.class);
assertEquals(123, ((Double)m.get("x")).intValue());
// Unencoded chars
// Top level
t = "x;/?:@-_.!*~'";
assertEquals("x;/?:@-_.!*'", p.parse(t, Object.class));
assertEquals("x;/?:@-_.!*'", pe.parse(t, Object.class));
// 2nd level
t = "(x;/?:@-_.!*~'=x;/?:@-_.!*~')";
m = (Map)p.parse(t, Object.class);
assertEquals("x;/?:@-_.!*'", m.get("x;/?:@-_.!*'"));
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("x;/?:@-_.!*'", m.get("x;/?:@-_.!*'"));
m = p.parse(t, HashMap.class, String.class, String.class);
assertEquals("x;/?:@-_.!*'", m.get("x;/?:@-_.!*'"));
// Encoded chars
// Top level
t = "x{}|\\^[]`<>#%\"&+";
assertEquals("x{}|\\^[]`<>#%\"&+", p.parse(t, Object.class));
assertEquals("x{}|\\^[]`<>#%\"&+", p.parse(t, String.class));
try {
assertEquals("x{}|\\^[]`<>#%\"&+", pe.parse(t, Object.class));
fail("Expected parse exception from invalid hex sequence.");
} catch (ParseException e) {
// Good.
}
t = "x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B";
assertEquals("x{}|\\^[]`<>#%\"&+", pe.parse(t, Object.class));
assertEquals("x{}|\\^[]`<>#%\"&+", pe.parse(t, String.class));
// 2nd level
t = "(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)";
m = (Map)p.parse(t, Object.class);
assertEquals("x{}|\\^[]`<>#%\"&+", m.get("x{}|\\^[]`<>#%\"&+"));
try {
m = (Map)pe.parse(t, Object.class);
fail("Expected parse exception from invalid hex sequence.");
} catch (ParseException e) {
// Good.
}
t = "(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)";
m = (Map)pe.parse(t, Object.class);
assertEquals("x{}|\\^[]`<>#%\"&+", m.get("x{}|\\^[]`<>#%\"&+"));
// Special chars
// Top level
t = "'x$,()~''";
assertEquals("x$,()'", p.parse(t, Object.class));
t = " 'x$,()~'' ";
assertEquals("x$,()'", p.parse(t, Object.class));
// 2nd level
t = "('x$,()~''='x$,()~'')";
m = (Map)p.parse(t, Object.class);
assertEquals("x$,()'", m.get("x$,()'"));
t = " ( 'x$,()~'' = 'x$,()~'' ) ";
m = (Map)p.parse(t, Object.class);
assertEquals("x$,()'", m.get("x$,()'"));
// Equals sign
// Gets encoded at top level, and encoded+escaped at 2nd level.
// Top level
t = "x=";
assertEquals("x=", p.parse(t, Object.class));
t = "x%3D";
assertEquals("x=", pe.parse(t, Object.class));
// 2nd level
t = "('x='='x=')";
m = (Map)p.parse(t, Object.class);
assertEquals("x=", m.get("x="));
t = "('x='='x=')";
m = (Map)p.parse(t, Object.class);
assertEquals("x=", m.get("x="));
t = " ( 'x=' = 'x=' ) ";
m = (Map)p.parse(t, Object.class);
assertEquals("x=", m.get("x="));
t = "('x='='x=')";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("x=", m.get("x="));
t = " ( 'x=' = 'x=' ) ";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("x=", m.get("x="));
t = "('x%3D'='x%3D')";
m = (Map)pe.parse(t, Object.class);
assertEquals("x=", m.get("x="));
t = " ( 'x%3D' = 'x%3D' ) ";
m = (Map)pe.parse(t, Object.class);
assertEquals("x=", m.get("x="));
// String starting with parenthesis
// Top level
t = "'()'";
assertEquals("()", p.parse(t, Object.class));
assertEquals("()", p.parse(t, String.class));
t = " '()' ";
assertEquals("()", p.parse(t, Object.class));
assertEquals("()", p.parse(t, String.class));
// 2nd level
t = "('()'='()')";
m = (Map)p.parse(t, Object.class);
assertEquals("()", m.get("()"));
t = " ( '()' = '()' ) ";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("()", m.get("()"));
// String starting with $
// Top level
t = "$a";
assertEquals("$a", p.parse(t, Object.class));
t = "'$a'";
assertEquals("$a", p.parse(t, Object.class));
// 2nd level
t = "($a=$a)";
m = (Map)p.parse(t, Object.class);
assertEquals("$a", m.get("$a"));
t = " ( $a = $a ) ";
m = (Map)p.parse(t, Object.class);
assertEquals("$a", m.get("$a"));
t = "('$a'='$a')";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("$a", m.get("$a"));
t = " ( '$a' = '$a' ) ";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("$a", m.get("$a"));
// Blank string
// Top level
t = "";
assertEquals("", p.parse(t, Object.class));
assertEquals("", pe.parse(t, Object.class));
// 2nd level
t = "(=)";
m = (Map)p.parse(t, Object.class);
assertEquals("", m.get(""));
t = "(''='')";
m = p.parse(t, HashMap.class, String.class, Object.class);
assertEquals("", m.get(""));
// 3rd level
t = "(=(=))";
m = (Map)p.parse(t, Object.class);
assertEquals("", ((Map)m.get("")).get(""));
t = " ( = ( = ) ) ";
m = p.parse(t, HashMap.class, String.class, HashMap.class);
assertEquals("", ((Map)m.get("")).get(""));
// Newline character
// Top level
t = "'%0A'";
assertEquals("\n", pe.parse(t, Object.class));
assertEquals("%0A", p.parse(t, Object.class));
// 2nd level
t = "('%0A'='%0A')";
m = (Map)pe.parse(t, Object.class);
assertEquals("\n", m.get("\n"));
m = (Map)p.parse(t, Object.class);
assertEquals("%0A", m.get("%0A"));
// 3rd level
t = "('%0A'=('%0A'='%0A'))";
m = (Map)pe.parse(t, Object.class);
assertEquals("\n", ((Map)m.get("\n")).get("\n"));
}
//====================================================================================================
// Unicode character test
//====================================================================================================
@Test
public void testUnicodeChars() throws Exception {
String t;
Map m;
// 2-byte UTF-8 character
// Top level
t = "¢";
assertEquals("¢", p.parse(t, Object.class));
assertEquals("¢", p.parse(t, String.class));
t = "%C2%A2";
assertEquals("¢", pe.parse(t, Object.class));
assertEquals("¢", pe.parse(t, String.class));
// 2nd level
t = "(¢=¢)";
m = (Map)p.parse(t, Object.class);
assertEquals("¢", m.get("¢"));
t = "(%C2%A2=%C2%A2)";
m = (Map)pe.parse(t, Object.class);
assertEquals("¢", m.get("¢"));
// 3rd level
t = "(¢=(¢=¢))";
m = (Map)p.parse(t, Object.class);
assertEquals("¢", ((Map)m.get("¢")).get("¢"));
t = "(%C2%A2=(%C2%A2=%C2%A2))";
m = (Map)pe.parse(t, Object.class);
assertEquals("¢", ((Map)m.get("¢")).get("¢"));
// 3-byte UTF-8 character
// Top level
t = "€";
assertEquals("€", p.parse(t, Object.class));
assertEquals("€", p.parse(t, String.class));
t = "%E2%82%AC";
assertEquals("€", pe.parse(t, Object.class));
assertEquals("€", pe.parse(t, String.class));
// 2nd level
t = "(€=€)";
m = (Map)p.parse(t, Object.class);
assertEquals("€", m.get("€"));
t = "(%E2%82%AC=%E2%82%AC)";
m = (Map)pe.parse(t, Object.class);
assertEquals("€", m.get("€"));
// 3rd level
t = "(€=(€=€))";
m = (Map)p.parse(t, Object.class);
assertEquals("€", ((Map)m.get("€")).get("€"));
t = "(%E2%82%AC=(%E2%82%AC=%E2%82%AC))";
m = (Map)pe.parse(t, Object.class);
assertEquals("€", ((Map)m.get("€")).get("€"));
// 4-byte UTF-8 character
// Top level
t = "𤭢";
assertEquals("𤭢", p.parse(t, Object.class));
assertEquals("𤭢", p.parse(t, String.class));
t = "%F0%A4%AD%A2";
assertEquals("𤭢", pe.parse(t, Object.class));
assertEquals("𤭢", pe.parse(t, String.class));
// 2nd level
t = "(𤭢=𤭢)";
m = (Map)p.parse(t, Object.class);
assertEquals("𤭢", m.get("𤭢"));
t = "(%F0%A4%AD%A2=%F0%A4%AD%A2)";
m = (Map)pe.parse(t, Object.class);
assertEquals("𤭢", m.get("𤭢"));
// 3rd level
t = "(𤭢=(𤭢=𤭢))";
m = (Map)p.parse(t, Object.class);
assertEquals("𤭢", ((Map)m.get("𤭢")).get("𤭢"));
t = "(%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2))";
m = (Map)pe.parse(t, Object.class);
assertEquals("𤭢", ((Map)m.get("𤭢")).get("𤭢"));
}
//====================================================================================================
// Test simple bean
//====================================================================================================
@Test
public void testSimpleBean() throws Exception {
UonParser p = UonParser.DEFAULT;
A t;
String s = "(f1=foo,f2=123)";
t = p.parse(s, A.class);
assertEquals("foo", t.f1);
assertEquals(123, t.f2);
}
public static class A {
public String f1;
public int f2;
}
}