//
// Copyright 2010 Cinch Logic Pty Ltd.
//
// http://www.chililog.com
//
// 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 org.chililog.server.engine.parsers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.text.ParseException;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.chililog.server.data.RepositoryFieldConfigBO;
import org.chililog.server.engine.parsers.BooleanFieldParser;
import org.chililog.server.engine.parsers.DateFieldParser;
import org.chililog.server.engine.parsers.DoubleFieldParser;
import org.chililog.server.engine.parsers.IntegerFieldParser;
import org.chililog.server.engine.parsers.LongIntegerFieldParser;
import org.chililog.server.engine.parsers.StringFieldParser;
import org.junit.Test;
public class FieldParserTest {
@Test
public void testParseString() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.String);
StringFieldParser p = new StringFieldParser(repoFieldInfo);
assertEquals("abc", p.parse("abc"));
assertEquals("", p.parse(""));
assertEquals(null, p.parse(null));
}
@Test
public void testParseInteger() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Integer);
IntegerFieldParser p = new IntegerFieldParser(repoFieldInfo);
assertEquals(123, p.parse("123"));
assertEquals(123, p.parse(" 123 "));
try {
p.parse("123.45");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse("123adb");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "1");
p = new IntegerFieldParser(repoFieldInfo);
assertEquals(123, p.parse("123"));
assertEquals(123, p.parse(" 123 "));
assertEquals(1, p.parse("abc"));
assertEquals(1, p.parse("123abc"));
assertEquals(1, p.parse(""));
assertEquals(1, p.parse(null));
}
@Test
public void testParseIntegerNumberFormat() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Integer);
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.NUMBER_FORMAT_PROPERTY_NAME, "#,##0");
IntegerFieldParser p = new IntegerFieldParser(repoFieldInfo);
assertEquals(222222222, p.parse("222222222"));
assertEquals(1234, p.parse("1,234"));
assertEquals(123, p.parse("123"));
assertEquals(123, p.parse(" 123 "));
assertEquals(2222, p.parse("2222d df22222"));
assertEquals(123, p.parse("123.11"));
assertEquals(123, p.parse("123.99"));
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NullPointerException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "1");
p = new IntegerFieldParser(repoFieldInfo);
assertEquals(222222222, p.parse("222222222"));
assertEquals(1234, p.parse("1,234"));
assertEquals(123, p.parse("123"));
assertEquals(123, p.parse(" 123 "));
assertEquals(2222, p.parse("2222d df22222"));
assertEquals(1, p.parse("abc"));
assertEquals(123, p.parse("123abc"));
assertEquals(1, p.parse(""));
assertEquals(1, p.parse(null));
}
@Test
public void testParseLong() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Long);
LongIntegerFieldParser p = new LongIntegerFieldParser(repoFieldInfo);
assertEquals(123L, p.parse("123"));
assertEquals(123L, p.parse(" 123 "));
try {
p.parse("123.45");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse("123adb");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "1");
p = new LongIntegerFieldParser(repoFieldInfo);
assertEquals(123L, p.parse("123"));
assertEquals(123L, p.parse(" 123 "));
assertEquals(1L, p.parse("abc"));
assertEquals(1L, p.parse("123abc"));
assertEquals(1L, p.parse(""));
assertEquals(1L, p.parse(null));
}
@Test
public void testParseLongNumberFormat() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Long);
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.NUMBER_FORMAT_PROPERTY_NAME, "#,##0");
LongIntegerFieldParser p = new LongIntegerFieldParser(repoFieldInfo);
assertEquals(222222222L, p.parse("222222222"));
assertEquals(1234L, p.parse("1,234"));
assertEquals(123L, p.parse("123"));
assertEquals(123L, p.parse(" 123 "));
assertEquals(2222L, p.parse("2222d df22222"));
assertEquals(123L, p.parse("123.45"));
assertEquals(123L, p.parse("123.99"));
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NullPointerException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "1");
p = new LongIntegerFieldParser(repoFieldInfo);
assertEquals(222222222L, p.parse("222222222"));
assertEquals(1234L, p.parse("1,234"));
assertEquals(123L, p.parse("123"));
assertEquals(123L, p.parse(" 123 "));
assertEquals(2222L, p.parse("2222d df22222"));
assertEquals(1L, p.parse("abc"));
assertEquals(123L, p.parse("123abc"));
assertEquals(1L, p.parse(""));
assertEquals(1L, p.parse(null));
}
@Test
public void testParseDouble() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Double);
DoubleFieldParser p = new DoubleFieldParser(repoFieldInfo);
assertEquals(123d, p.parse("123"));
assertEquals(123d, p.parse(" 123 "));
assertEquals(123.45, p.parse("123.45"));
assertEquals(123.99, p.parse("123.99"));
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse("123adb");
fail();
} catch (Exception ex) {
assertEquals(NumberFormatException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NullPointerException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "1");
p = new DoubleFieldParser(repoFieldInfo);
assertEquals(123d, p.parse("123"));
assertEquals(123d, p.parse(" 123 "));
assertEquals(1d, p.parse("abc"));
assertEquals(1d, p.parse("123abc"));
assertEquals(1d, p.parse(""));
assertEquals(1d, p.parse(null));
}
@Test
public void testParseDoubleNumberFormat() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Double);
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.NUMBER_FORMAT_PROPERTY_NAME, "#,##0");
DoubleFieldParser p = new DoubleFieldParser(repoFieldInfo);
assertEquals(222222222d, p.parse("222222222"));
assertEquals(1234d, p.parse("1,234"));
assertEquals(123d, p.parse("123"));
assertEquals(123d, p.parse(" 123 "));
assertEquals(2222d, p.parse("2222d df22222"));
assertEquals(123.45, p.parse("123.45"));
assertEquals(123.99, p.parse("123.99"));
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NullPointerException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "1");
p = new DoubleFieldParser(repoFieldInfo);
assertEquals(222222222d, p.parse("222222222"));
assertEquals(1234d, p.parse("1,234"));
assertEquals(123d, p.parse("123"));
assertEquals(123d, p.parse(" 123 "));
assertEquals(2222d, p.parse("2222d df22222"));
assertEquals(1d, p.parse("abc"));
assertEquals(123d, p.parse("123abc"));
assertEquals(1d, p.parse(""));
assertEquals(1d, p.parse(null));
}
@Test
public void testParseBoolean() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Boolean);
BooleanFieldParser p = new BooleanFieldParser(repoFieldInfo);
assertEquals(true, p.parse("true"));
assertEquals(true, p.parse("True"));
assertEquals(true, p.parse("TRUE"));
assertEquals(false, p.parse("asfd"));
assertEquals(false, p.parse(""));
assertEquals(false, p.parse(null));
}
@Test
public void testParseBooleanFormat() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Boolean);
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.TRUE_PATTERN_PROPERTY_NAME, "[\\s]*[A-Z]+[\\s]*");
BooleanFieldParser p = new BooleanFieldParser(repoFieldInfo);
assertEquals(true, p.parse("TRUE"));
assertEquals(true, p.parse("AAAAAA"));
assertEquals(false, p.parse("true"));
assertEquals(false, p.parse("True"));
assertEquals(false, p.parse("asfd123"));
assertEquals(false, p.parse(""));
assertEquals(false, p.parse(null));
}
@Test
public void testParseDate() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Date);
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DATE_FORMAT_PROPERTY_NAME, "yyyy-MM-dd HH:mm:ss");
DateFieldParser p = new DateFieldParser(repoFieldInfo);
assertEquals(new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime(), p.parse("2011-01-02 03:04:05"));
assertEquals(new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime(), p.parse("2011-1-2 3:4:5"));
assertEquals(new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime(), p.parse("2011-1-2 3:4:5 this is not parsed"));
try {
p.parse("xx 2011-1-2 3:4:5 zzz");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse("2011-01-02");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NullPointerException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME, "2011-01-02 03:04:05");
p = new DateFieldParser(repoFieldInfo);
assertEquals(new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime(), p.parse("123"));
}
@Test
public void testParseDateFormat() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Date);
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DATE_FORMAT_PROPERTY_NAME, "yyyy-MM-dd HH:mm:ss,SSS");
DateFieldParser p = new DateFieldParser(repoFieldInfo);
Date d = new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime();
d.setTime(d.getTime() + 123);
assertEquals(d, p.parse("2011-01-02 03:04:05,123"));
try {
p.parse("2011-01-02");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse("");
fail();
} catch (Exception ex) {
assertEquals(ParseException.class, ex.getClass());
}
try {
p.parse(null);
fail();
} catch (Exception ex) {
assertEquals(NullPointerException.class, ex.getClass());
}
// Default values
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DEFAULT_VALUE_PROPERTY_NAME,
"2011-01-02 03:04:05,123");
p = new DateFieldParser(repoFieldInfo);
d = new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime();
d.setTime(d.getTime() + 123);
assertEquals(d, p.parse("123"));
assertEquals(d, p.parse("xxxxx"));
}
@Test
public void testParseDateFormatTimezone() throws Exception {
RepositoryFieldConfigBO repoFieldInfo = new RepositoryFieldConfigBO();
repoFieldInfo.setName("field1");
repoFieldInfo.setDisplayName("Field Number 1");
repoFieldInfo.setDescription("description");
repoFieldInfo.setDataType(RepositoryFieldConfigBO.DataType.Date);
repoFieldInfo.getProperties()
.put(RepositoryFieldConfigBO.DATE_FORMAT_PROPERTY_NAME, "yyyy-MM-dd HH:mm:ss,SSSZ");
DateFieldParser p = new DateFieldParser(repoFieldInfo);
Date d = new GregorianCalendar(2011, 0, 2, 3, 4, 5).getTime();
d.setTime(d.getTime() + 123);
assertEquals(d, p.parse("2011-01-02 03:04:05,123+1100"));
// Set default timezone as UTC - i.e. all time is assumed to be UTC
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DATE_FORMAT_PROPERTY_NAME, "yyyy-MM-dd HH:mm:ss,SSS");
repoFieldInfo.getProperties().put(RepositoryFieldConfigBO.DATE_TIMEZONE_PROPERTY_NAME, "UTC");
p = new DateFieldParser(repoFieldInfo);
GregorianCalendar c = new GregorianCalendar(2011, 0, 2, 3, 4, 5);
c.setTimeZone(TimeZone.getTimeZone("UTC"));
d = c.getTime();
d.setTime(d.getTime() + 123);
assertEquals(d, p.parse("2011-01-02 03:04:05,123"));
}
@Test
public void testPreParsingExamples() {
// Strip white spaces
Pattern p = Pattern.compile("[\\s]*([A-Z]+)[\\s]*");
Matcher m = p.matcher("ABC");
assertTrue(m.find());
assertEquals("ABC", m.group(1));
// http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
// Capturing groups are numbered by counting their opening parentheses from left to right. In the expression
// ((A)(B(C))), for example, there are four such groups:
//
// 1 ((A)(B(C)))
// 2 (A)
// 3 (B(C))
// 4 (C)
// Group zero always stands for the entire expression.
// Matching by group non capturing group
p = Pattern.compile("^(?:[0-9]+ [\\w\\.\\[\\]]+ )([\\w\\.]+) ");
m = p.matcher("913745345 [Main] com.test.abc - test");
assertTrue(m.find());
assertEquals("com.test.abc", m.group(1));
m = p.matcher("test");
assertFalse(m.find());
}
}