/** * Copyright 2011-2017 Asakusa Framework Team. * * 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.asakusafw.testdriver.excel.extension; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import org.junit.Test; import com.asakusafw.testdriver.core.PropertyName; import com.asakusafw.testdriver.core.PropertyType; import com.asakusafw.testdriver.core.TestContext; import com.asakusafw.testdriver.core.VerifyContext; import com.asakusafw.testdriver.excel.ExcelRuleExtractor.FormatException; import com.asakusafw.testdriver.rule.ValuePredicate; /** * Test for {@link ExcelSheetApproximateRule}. */ public class ExcelSheetApproximateRuleTest { /** * simple case for integral value. * @throws Exception if failed */ @Test public void simple_int() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.INT, "~10"); assertNg(pred, 50, 30); assertNg(pred, 50, 39); assertOk(pred, 50, 40); assertOk(pred, 50, 45); assertOk(pred, 50, 50); assertOk(pred, 50, 55); assertOk(pred, 50, 60); assertNg(pred, 50, 61); assertNg(pred, 50, 70); } /** * simple case for integral value. * @throws Exception if failed */ @Test public void simple_int_plus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.INT, "~+10"); assertNg(pred, 50, 45); assertNg(pred, 50, 49); assertOk(pred, 50, 50); assertOk(pred, 50, 55); assertOk(pred, 50, 60); assertNg(pred, 50, 61); assertNg(pred, 50, 70); } /** * simple case for integral value. * @throws Exception if failed */ @Test public void simple_int_minus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.INT, "~-10"); assertNg(pred, 50, 30); assertNg(pred, 50, 39); assertOk(pred, 50, 40); assertOk(pred, 50, 45); assertOk(pred, 50, 50); assertNg(pred, 50, 51); assertNg(pred, 50, 55); } /** * invalid case for integral value. * @throws Exception if failed */ @Test(expected = FormatException.class) public void simple_int_invalid() throws Exception { parse(PropertyType.INT, "~INVALID"); } /** * simple case for float value. * @throws Exception if failed */ @Test public void simple_float() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.FLOAT, "~2.5"); assertNg(pred, 15.0, 10.0); assertNg(pred, 15.0, 12.4); assertOk(pred, 15.0, 12.6); assertOk(pred, 15.0, 14.0); assertOk(pred, 15.0, 15.0); assertOk(pred, 15.0, 16.0); assertOk(pred, 15.0, 17.4); assertNg(pred, 15.0, 17.6); assertNg(pred, 15.0, 20.0); } /** * simple case for float value. * @throws Exception if failed */ @Test public void simple_float_plus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.FLOAT, "~+2.5"); assertNg(pred, 15.0, 13.0); assertNg(pred, 15.0, 14.9); assertOk(pred, 15.0, 15.0); assertOk(pred, 15.0, 16.0); assertOk(pred, 15.0, 17.4); assertNg(pred, 15.0, 17.6); assertNg(pred, 15.0, 20.0); } /** * simple case for float value. * @throws Exception if failed */ @Test public void simple_float_minus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.FLOAT, "~-2.5"); assertNg(pred, 15.0, 10.0); assertNg(pred, 15.0, 12.4); assertOk(pred, 15.0, 12.6); assertOk(pred, 15.0, 14.0); assertOk(pred, 15.0, 15.0); assertNg(pred, 15.0, 15.1); assertNg(pred, 15.0, 17.0); } /** * invalid case for float value. * @throws Exception if failed */ @Test(expected = FormatException.class) public void simple_float_invalid() throws Exception { parse(PropertyType.FLOAT, "~INVALID"); } /** * simple case for decimal value. * @throws Exception if failed */ @Test public void simple_decimal() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DECIMAL, "~2.5"); assertNg(pred, dec("15.0"), dec("10.0")); assertNg(pred, dec("15.0"), dec("12.4")); assertOk(pred, dec("15.0"), dec("12.5")); assertOk(pred, dec("15.0"), dec("14.0")); assertOk(pred, dec("15.0"), dec("15.0")); assertOk(pred, dec("15.0"), dec("16.0")); assertOk(pred, dec("15.0"), dec("17.5")); assertNg(pred, dec("15.0"), dec("17.6")); assertNg(pred, dec("15.0"), dec("20.0")); } /** * simple case for decimal value. * @throws Exception if failed */ @Test public void simple_decimal_plus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DECIMAL, "~+2.5"); assertNg(pred, dec("15.0"), dec("13.0")); assertNg(pred, dec("15.0"), dec("14.9")); assertOk(pred, dec("15.0"), dec("15.0")); assertOk(pred, dec("15.0"), dec("16.0")); assertOk(pred, dec("15.0"), dec("17.5")); assertNg(pred, dec("15.0"), dec("17.6")); assertNg(pred, dec("15.0"), dec("20.0")); } /** * simple case for decimal value. * @throws Exception if failed */ @Test public void simple_decimal_minus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DECIMAL, "~-2.5"); assertNg(pred, dec("15.0"), dec("10.0")); assertNg(pred, dec("15.0"), dec("12.4")); assertOk(pred, dec("15.0"), dec("12.5")); assertOk(pred, dec("15.0"), dec("14.0")); assertOk(pred, dec("15.0"), dec("15.0")); assertNg(pred, dec("15.0"), dec("15.1")); assertNg(pred, dec("15.0"), dec("17.0")); } /** * invalid case for decimal value. * @throws Exception if failed */ @Test(expected = FormatException.class) public void simple_decimal_invalid() throws Exception { parse(PropertyType.DECIMAL, "~INVALID"); } /** * simple case for date value. * @throws Exception if failed */ @Test public void simple_date() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DATE, "~5"); assertNg(pred, date("1970/01/15"), date("1970/01/05")); assertNg(pred, date("1970/01/15"), date("1970/01/09")); assertOk(pred, date("1970/01/15"), date("1970/01/10")); assertOk(pred, date("1970/01/15"), date("1970/01/12")); assertOk(pred, date("1970/01/15"), date("1970/01/15")); assertOk(pred, date("1970/01/15"), date("1970/01/18")); assertOk(pred, date("1970/01/15"), date("1970/01/20")); assertNg(pred, date("1970/01/15"), date("1970/01/21")); assertNg(pred, date("1970/01/15"), date("1970/01/25")); } /** * simple case for date value. * @throws Exception if failed */ @Test public void simple_date_plus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DATE, "~+5"); assertNg(pred, date("1970/01/15"), date("1970/01/05")); assertNg(pred, date("1970/01/15"), date("1970/01/14")); assertOk(pred, date("1970/01/15"), date("1970/01/15")); assertOk(pred, date("1970/01/15"), date("1970/01/18")); assertOk(pred, date("1970/01/15"), date("1970/01/20")); assertNg(pred, date("1970/01/15"), date("1970/01/21")); assertNg(pred, date("1970/01/15"), date("1970/01/25")); } /** * simple case for date value. * @throws Exception if failed */ @Test public void simple_date_minus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DATE, "~-5"); assertNg(pred, date("1970/01/15"), date("1970/01/05")); assertNg(pred, date("1970/01/15"), date("1970/01/09")); assertOk(pred, date("1970/01/15"), date("1970/01/10")); assertOk(pred, date("1970/01/15"), date("1970/01/12")); assertOk(pred, date("1970/01/15"), date("1970/01/15")); assertNg(pred, date("1970/01/15"), date("1970/01/16")); assertNg(pred, date("1970/01/15"), date("1970/01/25")); } /** * invalid case for date value. * @throws Exception if failed */ @Test(expected = FormatException.class) public void simple_date_invalid() throws Exception { parse(PropertyType.DATE, "~INVALID"); } /** * simple case for date-time value. * @throws Exception if failed */ @Test public void simple_datetime() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DATETIME, "~15"); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:00")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:14")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:15")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:20")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:30")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:40")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:45")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:46")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:01:00")); } /** * simple case for date-time value. * @throws Exception if failed */ @Test public void simple_datetime_plus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DATETIME, "~+15"); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:00")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:29")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:30")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:40")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:45")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:46")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:01:00")); } /** * simple case for date-time value. * @throws Exception if failed */ @Test public void simple_datetime_minus() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.DATETIME, "~-15"); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:00")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:14")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:15")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:20")); assertOk(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:30")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:00:31")); assertNg(pred, datetime("1970/01/01 00:00:30"), datetime("1970/01/01 00:01:00")); } /** * invalid case for date-time value. * @throws Exception if failed */ @Test(expected = FormatException.class) public void simple_datetime_invalid() throws Exception { parse(PropertyType.DATE, "~INVALID"); } /** * unsupported expression. * @throws Exception if failed */ @Test public void unsupported() throws Exception { ValuePredicate<Object> pred = parse(PropertyType.INT, "UNSUPPORTED"); assertThat(pred, is(nullValue())); } /** * invalid expression. * @throws Exception if failed */ @Test(expected = FormatException.class) public void invalid() throws Exception { parse(PropertyType.INT, "~"); } /** * inconsistent type. * @throws Exception if failed */ @Test(expected = FormatException.class) public void inconsistent_type() throws Exception { parse(PropertyType.BOOLEAN, "~1"); } @SuppressWarnings("unchecked") private static ValuePredicate<Object> parse(PropertyType type, String expr) throws FormatException { VerifyContext context = new VerifyContext(new TestContext.Empty()); ExcelSheetApproximateRule rule = new ExcelSheetApproximateRule(); return (ValuePredicate<Object>) rule.resolve(context, PropertyName.newInstance("testing"), type, expr); } private static void assertOk(ValuePredicate<Object> pred, Object expected, Object actual) { assertThat(pred.describeExpected(expected, actual), pred.accepts(expected, actual), is(true)); } private static void assertNg(ValuePredicate<Object> pred, Object expected, Object actual) { assertThat(pred.describeExpected(expected, actual), pred.accepts(expected, actual), is(false)); } private BigDecimal dec(String string) { return new BigDecimal(string); } private Calendar date(String string) { try { Calendar calendar = Calendar.getInstance(); calendar.setTime(new SimpleDateFormat("yyyy/MM/dd").parse(string)); Calendar result = Calendar.getInstance(); result.clear(); result.set( calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)); return result; } catch (ParseException e) { throw new AssertionError(e); } } private Calendar datetime(String string) { try { Calendar calendar = Calendar.getInstance(); calendar.setTime(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(string)); Calendar result = Calendar.getInstance(); result.clear(); result.set( calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)); return result; } catch (ParseException e) { throw new AssertionError(e); } } }