package edu.washington.escience.myria.operator; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import com.google.common.collect.ImmutableList; import edu.washington.escience.myria.Schema; import edu.washington.escience.myria.Type; import edu.washington.escience.myria.column.Column; import edu.washington.escience.myria.column.builder.ColumnBuilder; import edu.washington.escience.myria.column.builder.ColumnFactory; import edu.washington.escience.myria.column.builder.IntColumnBuilder; import edu.washington.escience.myria.column.builder.StringColumnBuilder; import edu.washington.escience.myria.storage.TupleBatch; public class RenameTest { /** * The original schema of the TupleBatch to be renamed. */ private static final Schema originalSchema = Schema.of( ImmutableList.of(Type.STRING_TYPE, Type.INT_TYPE), ImmutableList.of("string", "int")); /** * The original TupleBatch. */ private static TupleBatch originalTuples; /** * The original data; */ private static List<Column<?>> originalData; /** * The number of tuples to build. */ private static final int TUPLES_TO_BUILD = 100; @BeforeClass public static void setup() { List<ColumnBuilder<?>> dataBuilder = ColumnFactory.allocateColumns(originalSchema); for (int i = 0; i < TUPLES_TO_BUILD; ++i) { ((StringColumnBuilder) dataBuilder.get(0)).appendString("val" + i); ((IntColumnBuilder) dataBuilder.get(1)).appendInt(i); } ImmutableList.Builder<Column<?>> dataColumnBuilder = new ImmutableList.Builder<Column<?>>(); for (ColumnBuilder<?> builder : dataBuilder) { dataColumnBuilder.add(builder.build()); } originalData = dataColumnBuilder.build(); originalTuples = new TupleBatch(originalSchema, originalData); } @SuppressWarnings("deprecation") @Test public void testTupleBatch() { /* Sanity check originalTuples */ assertEquals(originalSchema, originalTuples.getSchema()); assertEquals(TUPLES_TO_BUILD, originalTuples.numTuples()); /* Do the renaming using TupleBatch.rename() */ final List<String> newNames = ImmutableList.of("stringNew", "intNew"); final TupleBatch renamed = originalTuples.rename(newNames); /* Verify the renamed TB's schema */ assertEquals(originalSchema.getColumnTypes(), renamed.getSchema().getColumnTypes()); assertEquals(newNames, renamed.getSchema().getColumnNames()); /* Verify the renamed TB's size */ assertEquals(originalTuples.numColumns(), renamed.numColumns()); assertEquals(originalTuples.numTuples(), renamed.numTuples()); /* Verify the renamed TB's data */ for (int row = 0; row < renamed.numTuples(); ++row) { for (int column = 0; column < renamed.numColumns(); ++column) { assertEquals(originalTuples.getObject(column, row), renamed.getObject(column, row)); } } } @Test(expected = IllegalArgumentException.class) public void testTupleBatchTooManyColumns() { /* Sanity check originalTuples */ assertEquals(originalSchema, originalTuples.getSchema()); assertEquals(TUPLES_TO_BUILD, originalTuples.numTuples()); /* Do the renaming using TupleBatch.rename() */ final List<String> newNames = ImmutableList.of("stringNew", "intNew", "badExtraColumn"); originalTuples.rename(newNames); } @Test(expected = IllegalArgumentException.class) public void testTupleBatchTooFewColumns() { /* Sanity check originalTuples */ assertEquals(originalSchema, originalTuples.getSchema()); assertEquals(TUPLES_TO_BUILD, originalTuples.numTuples()); /* Do the renaming using TupleBatch.rename() */ final List<String> newNames = ImmutableList.of("onlyOneColumn"); originalTuples.rename(newNames); } @Test(expected = NullPointerException.class) public void testTupleBatchNull() { /* Sanity check originalTuples */ assertEquals(originalSchema, originalTuples.getSchema()); assertEquals(TUPLES_TO_BUILD, originalTuples.numTuples()); /* Do the renaming using TupleBatch.rename() */ originalTuples.rename(null); } }