/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.components.fuse; import static org.junit.Assert.assertEquals; import org.apache.metamodel.schema.MutableColumn; import org.apache.metamodel.schema.MutableTable; import org.datacleaner.api.InputColumn; import org.datacleaner.data.MockInputColumn; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class CoalesceUnitTest { @Rule public final ExpectedException expectedException = ExpectedException.none(); @Test public void testGetOutputDataType() throws Exception { final MockInputColumn<?> numberCol1 = new MockInputColumn<>("num1", Number.class); final MockInputColumn<?> numberCol2 = new MockInputColumn<>("num1", Number.class); final MockInputColumn<?> integerCol1 = new MockInputColumn<>("int1", Integer.class); final MockInputColumn<?> integerCol2 = new MockInputColumn<>("int2", Integer.class); final MockInputColumn<?> stringCol1 = new MockInputColumn<>("str1", String.class); final MockInputColumn<?> stringCol2 = new MockInputColumn<>("str2", String.class); final MockInputColumn<?> objCol1 = new MockInputColumn<>("obj1", Object.class); final InputColumn<?>[] allColumns = new InputColumn[] { numberCol1, numberCol2, integerCol1, integerCol2, stringCol1, stringCol2, objCol1 }; // common ancestors assertEquals(String.class, new CoalesceUnit(stringCol1, stringCol2).updateInputColumns(allColumns).getOutputDataType()); assertEquals(Number.class, new CoalesceUnit(numberCol1, numberCol2).updateInputColumns(allColumns).getOutputDataType()); assertEquals(Integer.class, new CoalesceUnit("int1", "int2").updateInputColumns(allColumns).getOutputDataType()); assertEquals(Number.class, new CoalesceUnit(numberCol1, integerCol2, integerCol1).updateInputColumns(allColumns) .getOutputDataType()); assertEquals(Number.class, new CoalesceUnit(integerCol2, integerCol1, numberCol1).updateInputColumns(allColumns) .getOutputDataType()); // no common ancestors assertEquals(Object.class, new CoalesceUnit(stringCol1, stringCol1, integerCol1).updateInputColumns(allColumns) .getOutputDataType()); assertEquals(Object.class, new CoalesceUnit(stringCol1, stringCol1, objCol1).updateInputColumns(allColumns).getOutputDataType()); assertEquals(Object.class, new CoalesceUnit(objCol1).updateInputColumns(allColumns).getOutputDataType()); } @Test public void testRefreshInputColumns() throws Exception { // original columns - col1 and col2 final InputColumn<?> col1 = new MockInputColumn<>("foo1", String.class); final InputColumn<?> col2 = new MockInputColumn<>("foo2", String.class); final InputColumn<?>[] allInputColumns1 = new InputColumn[] { col1, col2 }; // cloned columns - col3 and col4 final InputColumn<?> col3 = new MockInputColumn<>("foo1", String.class); final InputColumn<?> col4 = new MockInputColumn<>("foo2", String.class); final InputColumn<?>[] allInputColumns2 = new InputColumn[] { col3, col4 }; CoalesceUnit unit = new CoalesceUnit(allInputColumns1); Assert.assertArrayEquals(allInputColumns1, unit.getInputColumns()); unit = unit.updateInputColumns(allInputColumns2); Assert.assertArrayEquals(allInputColumns2, unit.getInputColumns()); } private <E> MockInputColumn<? extends E> createColumn(final String tableName, final String columnName, final Class<E> clazz) { return new MockInputColumn<>(columnName, clazz, new MutableColumn(columnName, new MutableTable(tableName))); } @Test public void testPathsVsNames() throws Exception { final InputColumn<?>[] colsA = { createColumn("a", "foo1", String.class), createColumn("a", "foo2", String.class) }; final InputColumn<?>[] colsB = { createColumn("b", "foo1", String.class), createColumn("b", "foo2", String.class) }; final InputColumn<?>[] mixedCols = { colsA[0], colsA[1], colsB[0], colsB[1] }; final CoalesceUnit namesCoalesceUnit = new CoalesceUnit("foo1", "foo2"); final CoalesceUnit pathsCoalesceUnit = new CoalesceUnit("b.foo1", "b.foo2"); // Pure legacy. Assert.assertArrayEquals(colsA, namesCoalesceUnit.updateInputColumns(colsA).getInputColumns()); // Pure path-based. Assert.assertArrayEquals(colsB, pathsCoalesceUnit.updateInputColumns(colsB).getInputColumns()); // Path columns on legacy names. Assert.assertArrayEquals(colsB, namesCoalesceUnit.updateInputColumns(colsB).getInputColumns()); // Mixed columns with correct path as well as incorrect path. Makes sure that the correct path is found. Assert.assertArrayEquals(colsB, pathsCoalesceUnit.updateInputColumns(mixedCols).getInputColumns()); expectedException.expect(IllegalStateException.class); pathsCoalesceUnit.updateInputColumns(colsA); } }