/*
* Copyright 2010 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed 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 com.alibaba.citrus.service.requestcontext.parser;
import static com.alibaba.citrus.service.requestcontext.parser.ParserRequestContext.*;
import static com.alibaba.citrus.test.TestUtil.*;
import static org.junit.Assert.*;
import java.beans.PropertyEditor;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.beans.TypeMismatchException;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import com.alibaba.citrus.service.requestcontext.AbstractRequestContextsTests;
/**
* ����ValueParser�ࡣ
*
* @author Michael Zhou
*/
public class ValueParserTests extends AbstractRequestContextsTests<ParserRequestContext> {
private final static Logger log = LoggerFactory.getLogger(ValueParserTests.class);
private AbstractValueParser parser;
private AbstractValueParser parserNoisy;
@BeforeClass
public static void initFactory() {
createBeanFactory("services-parser.xml");
}
@Before
public void init() throws Exception {
invokeReadFileServlet("form.html");
// converterQuiet=false
initRequestContext("parser_noisy");
parserNoisy = new AbstractValueParser(requestContext) {
@Override
protected Logger getLogger() {
return log;
}
};
assertEquals(URL_CASE_FOLDING_LOWER_WITH_UNDERSCORES, requestContext.getCaseFolding());
assertFalse(requestContext.isConverterQuiet());
// converterQuiet=true
initRequestContext();
parser = new AbstractValueParser(requestContext) {
@Override
protected Logger getLogger() {
return log;
}
};
assertEquals(URL_CASE_FOLDING_LOWER_WITH_UNDERSCORES, requestContext.getCaseFolding());
assertTrue(requestContext.isConverterQuiet());
}
@Test
public void getBoolean() {
parser.add("Aa_a", " true ");
parser.add("aaA", false);
// ���Ե���
assertEquals(true, parser.getBoolean("aa_a"));
// ��������
assertAnyArrayEquals(new boolean[] { true, false }, parser.getObjectOfType("aa_a", boolean[].class));
// ����Ĭ��ֵ
assertEquals(false, parser.getBoolean("bbb"));
assertEquals(true, parser.getBoolean("bbb", true));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertAnyArrayEquals(new boolean[] {}, parser.getObjectOfType("bbb", boolean[].class));
assertAnyArrayEquals(new boolean[] { true, true, false },
parser.getObjectOfType("bbb", boolean[].class, null, new Boolean[] { true, true, false }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(false, parser.getBoolean("ccc"));
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getBoolean("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Boolean"));
}
}
@Test
public void getByte() {
parser.add("Aa_a", " 11 ");
parser.add("aaA", (byte) 22);
// ���Ե���
assertEquals((byte) 11, parser.getByte("aa_a"));
// ��������
assertArrayEquals(new byte[] { 11, 22 }, parser.getObjectOfType("aa_a", byte[].class));
// ����Ĭ��ֵ
assertEquals((byte) 0, parser.getByte("bbb"));
assertEquals((byte) 33, parser.getByte("bbb", (byte) 33));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertArrayEquals(new byte[] {}, parser.getObjectOfType("bbb", byte[].class));
assertArrayEquals(new byte[] { 33, 44 },
parser.getObjectOfType("bbb", byte[].class, null, new Byte[] { 33, 44 }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(0, parser.getByte("ccc"));
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getByte("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Byte"));
}
}
@Test
public void getBytes() throws UnsupportedEncodingException {
parser.add("Aaa", "abcde");
byte[] values = parser.getBytes("aaa");
assertEquals('a', values[0]);
assertEquals('b', values[1]);
assertEquals('c', values[2]);
assertEquals('d', values[3]);
assertEquals('e', values[4]);
}
@Test
public void getChar() {
parser.add("Aa_a", "a");
parser.add("aaA", 'b');
// ���Ե���
assertEquals('a', parser.getChar("aa_a"));
// ��������
char[] values = parser.getObjectOfType("aa_a", char[].class);
assertEquals('a', values[0]);
assertEquals('b', values[1]);
// ����Ĭ��ֵ
assertEquals('\0', parser.getChar("bbb"));
assertEquals('c', parser.getChar("bbb", 'c'));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertArrayEquals(new char[] {}, parser.getObjectOfType("bbb", char[].class));
assertArrayEquals(new char[] { 'a', 'b' },
parser.getObjectOfType("bbb", char[].class, null, new Character[] { 'a', 'b' }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals('\0', parser.getChar("ccc"));
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getChar("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Character"));
}
}
@Test
public void getDouble() {
parser.add("Aa_a", " 1.23 ");
parser.add("aaA", 2.34D);
// ���Ե���
assertEquals(1.23D, parser.getDouble("aa_a"), 0.0D);
// ��������
double[] values = parser.getObjectOfType("aa_a", double[].class);
assertEquals(1.23D, values[0], 0);
assertEquals(2.34D, values[1], 0);
// ����Ĭ��ֵ
assertEquals(0.0D, parser.getDouble("bbb"), 0.0D);
assertEquals(3.45D, parser.getDouble("bbb", 3.45D), 0.0D);
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertAnyArrayEquals(new double[] {}, parser.getObjectOfType("bbb", double[].class));
assertAnyArrayEquals(new double[] { 11D, 22D },
parser.getObjectOfType("bbb", double[].class, null, new Double[] { 11D, 22D }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(0D, parser.getDouble("ccc"), 0);
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getDouble("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Double"));
}
}
@Test
public void getFloat() {
parser.add("Aa_a", " 1.23 ");
parser.add("aaA", 2.34F);
// ���Ե���
assertEquals(1.23F, parser.getFloat("aa_a"), 0.0F);
// ��������
float[] values = parser.getObjectOfType("aa_a", float[].class);
assertEquals(1.23F, values[0], 0);
assertEquals(2.34F, values[1], 0);
// ����Ĭ��ֵ
assertEquals(0.0f, parser.getFloat("bbb"), 0.0F);
assertEquals(3.45F, parser.getFloat("bbb", 3.45F), 0.0D);
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertAnyArrayEquals(new float[] {}, parser.getObjectOfType("bbb", float[].class));
assertAnyArrayEquals(new float[] { 11F, 22F },
parser.getObjectOfType("bbb", float[].class, null, new Float[] { 11F, 22F }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(0D, parser.getFloat("ccc"), 0);
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getFloat("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Float"));
}
}
@Test
public void getInt() {
parser.add("Aa_a", " 111 ");
parser.add("aaA", 222);
// ���Ե���
assertEquals(111, parser.getInt("aa_a"));
// ��������
assertArrayEquals(new int[] { 111, 222 }, parser.getInts("aa_a"));
// ����Ĭ��ֵ
assertEquals(0, parser.getInt("bbb"));
assertEquals(333, parser.getInt("bbb", 333));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertArrayEquals(new int[] {}, parser.getInts("bbb"));
assertArrayEquals(new int[] { 3, 4 }, parser.getInts("bbb", new int[] { 3, 4 }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(0D, parser.getInt("ccc"), 0);
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getInt("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Integer"));
}
}
@Test
public void getLong() {
parser.add("Aa_a", 111L);
parser.add("aaA", 222L);
// ���Ե���
assertEquals(111L, parser.getLong("aa_a"));
// ��������
assertArrayEquals(new long[] { 111L, 222L }, parser.getLongs("aa_a"));
// ����Ĭ��ֵ
assertEquals(0L, parser.getLong("bbb"));
assertEquals(333, parser.getLong("bbb", 333));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertArrayEquals(new long[] {}, parser.getLongs("bbb"));
assertArrayEquals(new long[] { 1, 2 }, parser.getLongs("bbb", new long[] { 1, 2 }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(0D, parser.getLong("ccc"), 0);
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getLong("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Long"));
}
}
@Test
public void getShort() {
parser.add("Aa_a", (short) 11);
parser.add("aaA", (short) 22);
// ���Ե���
assertEquals((short) 11, parser.getShort("aa_a"));
// ��������
assertAnyArrayEquals(new short[] { 11, 22 }, parser.getObjectOfType("aa_a", short[].class));
// ����Ĭ��ֵ
assertEquals((short) 0, parser.getShort("bbb"));
assertEquals((short) 33, parser.getShort("bbb", (short) 33));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertAnyArrayEquals(new short[] {}, parser.getObjectOfType("bbb", short[].class, null, null));
assertAnyArrayEquals(new short[] { 1, 2 },
parser.getObjectOfType("bbb", short[].class, null, new Short[] { 1, 2 }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(0D, parser.getShort("ccc"), 0);
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getShort("ccc");
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Short"));
}
}
@Test
public void getString() {
parser.add("Aa_a", "111");
parser.add("aaA", "222");
// ���Ե���
assertEquals("111", parser.getString("aa_a"));
// ��������
assertArrayEquals(new String[] { "111", "222" }, parser.getStrings("aa_a"));
// ����Ĭ��ֵ
assertEquals(null, parser.getString("bbb"));
assertEquals("333", parser.getString("bbb", "333"));
assertEquals(null, parser.getString("bbb", null));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertArrayEquals(new String[] {}, parser.getStrings("bbb"));
assertArrayEquals(new String[] { "aa", "bb" }, parser.getStrings("bbb", new String[] { "aa", "bb" }));
// �������
parser.add("ccc", "null");
assertEquals(null, parser.getString("ccc"));
assertEquals("333", parser.getString("ccc", "333"));
assertEquals("", parser.getStrings("ccc")[0]);
parser.add("ccc", "");
assertEquals(null, parser.getString("ccc"));
assertEquals("333", parser.getString("ccc", "333"));
assertEquals("", parser.getStrings("ccc")[0]);
}
@Test
public void get() {
parser.add("Aaa", new Integer(111));
assertEquals(new Integer(111), parser.get("aaa"));
assertNull(parser.get("bbb"));
}
@Test
public void getObject() {
parser.add("Aa_a", new Integer(111));
parser.add("aaA", new Double(222));
// ���Ե���
assertEquals(new Integer(111), parser.getObject("aa_a"));
// ��������
assertArrayEquals(new Object[] { 111, 222D }, parser.getObjects("aa_a"));
// ����Ĭ��ֵ
assertEquals(null, parser.getObject("bbb"));
assertEquals("333", parser.getObject("bbb", "333"));
// ��������Ĭ��ֵ
assertArrayEquals(new Object[] {}, parser.getObjects("bbb"));
assertArrayEquals(new Object[] { 111 }, parser.getObjects("bbb", new Object[] { 111 }));
}
@Test
public void getObjectOfType() {
parser.add("Aa_a", " 111 ");
parser.add("aaA", 222);
// ���Ե���
assertEquals((Integer) 111, parser.getObjectOfType("aa_a", Integer.class));
// ��������
assertArrayEquals(new int[] { 111, 222 }, parser.getObjectOfType("aa_a", int[].class));
// ����Ĭ��ֵ
assertEquals(null, parser.getObjectOfType("bbb", Integer.class));
assertEquals((Integer) 0, parser.getObjectOfType("bbb", Integer.class, true, null, null));
assertEquals((Integer) 333, parser.getObjectOfType("bbb", Integer.class, null, new Object[] { 333 }));
// ��������Ĭ��ֵ
parser.add("bbb", null);
assertArrayEquals(new int[] {}, parser.getObjectOfType("bbb", int[].class));
assertArrayEquals(new int[] { 3, 4 }, parser.getObjectOfType("bbb", int[].class, null, new Integer[] { 3, 4 }));
// ���ԷǷ�ֵ
parser.add("ccc", "illegal");
assertEquals(null, parser.getObjectOfType("ccc", Integer.class));
try {
parserNoisy.add("ccc", "illegal");
parserNoisy.getObjectOfType("ccc", Integer.class);
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal", "Integer"));
}
}
@Test
public void getDate() {
parser.add("aaa", "2003-10-21");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = parser.getDate("aaa", format);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
assertEquals(2003, calendar.get(Calendar.YEAR));
assertEquals(9, calendar.get(Calendar.MONTH));
assertEquals(21, calendar.get(Calendar.DATE));
assertSame(date, parser.getDate("bbb", format, date));
}
@Test
public void setString() {
parser.add("Aa_a", "111");
parser.setString("aaA", "222");
assertEquals("222", parser.getString("aa_a"));
parser.setStrings("aa_a", new String[] { "333", "444" });
assertEquals("333", parser.getString("aa_a"));
assertEquals("333", parser.getStrings("aa_a")[0]);
assertEquals("444", parser.getStrings("aa_a")[1]);
}
@Test
public void setObject() {
parser.add("Aa_a", new Integer(111));
parser.setObject("aaA", new Integer(222));
assertEquals("222", parser.getString("aa_a"));
parser.setObjects("aa_a", new Object[] { new Integer(333), new Integer(444) });
assertEquals("333", parser.getString("aa_a"));
assertEquals("333", parser.getStrings("aa_a")[0]);
assertEquals("444", parser.getStrings("aa_a")[1]);
}
@Test
public void remove() {
parser.add("Aaa", "111");
assertEquals("111", parser.getString("aaa"));
parser.remove("aaa");
assertNull(parser.getString("aaa"));
}
@Test
public void clear() {
parser.add("Aa_a", "111");
parser.add("bbB", "222");
assertEquals("111", parser.getString("aa_a"));
assertEquals("222", parser.getString("bb_b"));
parser.clear();
assertNull(parser.getString("aa_a"));
assertNull(parser.getString("bb_b"));
}
@Test
public void containsKey() {
parser.add("Aa_a", "111");
parser.add("bbB", "222");
assertTrue(parser.containsKey("aa_a"));
assertTrue(parser.containsKey("bb_b"));
assertFalse(parser.containsKey("ccc"));
}
@Test
public void keys() {
parser.add("Aa_a", "111");
parser.add("bbB", "222");
String[] keys = parser.getKeys();
assertEquals("Aa_a", keys[0]);
assertEquals("bbB", keys[1]);
Iterator<String> i = parser.keySet().iterator();
assertEquals("Aa_a", i.next());
assertEquals("bbB", i.next());
}
@Test
public void setProperties() {
MyClass myClass = new MyClass();
parser.setObject("my_integer", "illegal");
parser.setObjects("my_strings", new Object[] { "hello\nworld", "haha" });
parser.setObject("my_long", "ten");
parser.setObjects("my_integerList", new Object[] { 1, 2, 3 });
parser.setObject("my_noProperty", "value");
parser.setProperties(myClass);
assertEquals(0, myClass.getMyInteger());
assertArrayEquals(new String[] { "hello\nworld", "haha" }, myClass.getMyStrings());
assertEquals(10L, myClass.getMyLong());
assertArrayEquals(new Integer[] { 1, 2, 3 }, myClass.getMyIntegerList().toArray(new Integer[3]));
}
@Test
public void setProperties_noisy() {
MyClass myClass = new MyClass();
parserNoisy.setObject("my_integer", "illegal");
parserNoisy.setObject("my_strings", new Object[] { "hello\nworld", "haha" });
parserNoisy.setObject("my_long", "ten");
parserNoisy.setObject("my_integerList", new Object[] { 1, 2, 3 });
parserNoisy.setObject("my_noProperty", "value");
try {
parserNoisy.setProperties(myClass);
fail();
} catch (TypeMismatchException e) {
assertThat(e, exception("illegal"));
}
}
public static class MyClass {
private int myInteger = -1;
private String[] myStrings;
private long myLong = -1;
private List<Integer> myIntegerList;
public int getMyInteger() {
return myInteger;
}
public void setMyInteger(int myInteger) {
this.myInteger = myInteger;
}
public String[] getMyStrings() {
return myStrings;
}
public void setMyStrings(String[] myStrings) {
this.myStrings = myStrings;
}
public long getMyLong() {
return myLong;
}
public void setMyLong(long myLong) {
this.myLong = myLong;
}
public List<Integer> getMyIntegerList() {
return myIntegerList;
}
public void setMyIntegerList(List<Integer> myIntegerList) {
this.myIntegerList = myIntegerList;
}
}
private void assertAnyArrayEquals(Object b1, Object b2) {
assertEquals(Array.getLength(b1), Array.getLength(b2));
for (int i = 0; i < Array.getLength(b1); i++) {
assertEquals(Array.get(b1, i), Array.get(b2, i));
}
}
public static class MyRegistrar implements PropertyEditorRegistrar {
private final static String[] NUMBERS = { "zero", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten" };
public void registerCustomEditors(PropertyEditorRegistry registry) {
PropertyEditor editor = new CustomNumberEditor(Long.class, true) {
@Override
public void setAsText(String text) {
for (int i = 0; i < NUMBERS.length; i++) {
if (NUMBERS[i].equalsIgnoreCase(text)) {
setValue(i);
return;
}
}
super.setAsText(text);
}
};
registry.registerCustomEditor(Long.class, editor);
registry.registerCustomEditor(long.class, editor);
}
}
}