/*
* Copyright (c) 2007-2010 Concurrent, Inc. All Rights Reserved.
*
* Project and contact information: http://www.cascading.org/
*
* This file is part of the Cascading project.
*
* Cascading is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cascading 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cascading. If not, see <http://www.gnu.org/licenses/>.
*/
package cascading.tuple;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Date;
import cascading.CascadingTestCase;
public class TupleTest extends CascadingTestCase
{
private Tuple tuple;
public TupleTest()
{
super( "tuple tests" );
}
@Override
protected void setUp() throws Exception
{
super.setUp();
tuple = new Tuple();
tuple.add( "a" );
tuple.add( "b" );
tuple.add( "c" );
tuple.add( "d" );
tuple.add( "d" );
}
public void testHas()
{
assertEquals( "not equal: tuple.size()", 5, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "a", tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 1 )", "b", tuple.get( 1 ) );
}
public void testGet()
{
Tuple aTuple = tuple.get( new int[]{0} );
assertEquals( "not equal: aTuple.size()", 1, aTuple.size() );
assertEquals( "not equal: aTuple.get( 0 )", "a", aTuple.get( 0 ) );
assertEquals( "not equal: tuple.size()", 5, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "a", tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 1 )", "b", tuple.get( 1 ) );
}
public void testGetNull()
{
Tuple aTuple = tuple.get( (int[]) null );
assertEquals( "not equal: aTuple.size()", 5, aTuple.size() );
assertEquals( "not equal: aTuple.get( 0 )", "a", aTuple.get( 0 ) );
assertEquals( "not equal: aTuple.get( 1 )", "b", aTuple.get( 1 ) );
assertEquals( "not equal: tuple.size()", 5, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "a", tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 1 )", "b", tuple.get( 1 ) );
}
public void testRemove()
{
Tuple aTuple = tuple.remove( new int[]{0} );
assertEquals( "not equal: aTuple.size()", 1, aTuple.size() );
assertEquals( "not equal: aTuple.get( 0 )", "a", aTuple.get( 0 ) );
assertEquals( "not equal: tuple.size()", 4, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "b", tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 1 )", "c", tuple.get( 1 ) );
}
public void testRemove2()
{
Tuple aTuple = tuple.remove( new int[]{2, 4} );
assertEquals( "not equal: aTuple.size()", 2, aTuple.size() );
assertEquals( "not equal: aTuple.get( 0 )", "c", aTuple.get( 0 ) );
assertEquals( "not equal: tuple.size()", 3, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "a", tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 1 )", "b", tuple.get( 1 ) );
assertEquals( "not equal: tuple.get( 1 )", "d", tuple.get( 2 ) );
}
public void testLeave()
{
Tuple aTuple = tuple.leave( new int[]{0} );
assertEquals( "not equal: tuple.size()", 1, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "a", tuple.get( 0 ) );
assertEquals( "not equal: aTuple.size()", 4, aTuple.size() );
assertEquals( "not equal: aTuple.get( 0 )", "b", aTuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 1 )", "c", aTuple.get( 1 ) );
}
public void testExtractSet()
{
Tuple aTuple = tuple.extract( new int[]{0} );
assertEquals( "not equal: aTuple.size()", 1, aTuple.size() );
assertEquals( "not equal: aTuple.get( 0 )", "a", aTuple.get( 0 ) );
assertEquals( "not equal: tuple.size()", 5, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", null, tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 0 )", "b", tuple.get( 1 ) );
assertEquals( "not equal: tuple.get( 1 )", "c", tuple.get( 2 ) );
tuple.set( new int[]{0}, new Tuple( "A" ) );
assertEquals( "not equal: tuple.size()", 5, tuple.size() );
assertEquals( "not equal: tuple.get( 0 )", "A", tuple.get( 0 ) );
assertEquals( "not equal: tuple.get( 0 )", "b", tuple.get( 1 ) );
assertEquals( "not equal: tuple.get( 1 )", "c", tuple.get( 2 ) );
}
public void testEqualPrimitive()
{
assertEquals( "not equal: tuple", new Tuple( 1 ), new Tuple( 1 ) );
assertEquals( "not equal: tuple", new Tuple( "1" ), new Tuple( "1" ) );
assertEquals( "not equal: tuple", new Tuple( 1, 2 ), new Tuple( 1, 2 ) );
assertEquals( "not equal: tuple", new Tuple( "1", 2 ), new Tuple( "1", 2 ) );
}
public void testEqual()
{
Tuple aTuple = new Tuple( tuple );
assertEquals( "not equal: tuple", aTuple, tuple );
aTuple.remove( new int[]{0} );
assertNotSame( "equal: tuple", aTuple, tuple );
aTuple = new Tuple( tuple, "a" );
Tuple bTuple = new Tuple( tuple, "a" );
assertEquals( "not equal: tuple", aTuple, bTuple );
aTuple = new Tuple( "a", new Tuple( tuple ), "a" ); // test new instances
bTuple = new Tuple( "a", new Tuple( tuple ), "a" );
assertEquals( "not equal: tuple", aTuple, bTuple );
assertEquals( "not equal: hash code", aTuple.hashCode(), bTuple.hashCode() );
}
public void testCompare()
{
Tuple aTuple = new Tuple( "a" );
Tuple bTuple = new Tuple( "b" );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) < 0 );
assertTrue( "not less than: bTuple < aTuple", bTuple.compareTo( aTuple ) > 0 );
aTuple.add( "b" );
assertTrue( "not greater than: aTuple > bTuple", aTuple.compareTo( bTuple ) > 0 );
aTuple = new Tuple( bTuple, "a" );
assertTrue( "not greater than: aTuple > bTuple", aTuple.compareTo( bTuple ) > 0 );
bTuple = new Tuple( bTuple, "b" );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) < 0 );
}
public void testCompare2()
{
Tuple aTuple = new Tuple( "Just My Luck", "ClaudiaPuig", "3.0", "LisaRose", "3.0" );
Tuple bTuple = new Tuple( "Just My Luck", "ClaudiaPuig", "3.0", "LisaRose", "3.0" );
assertEquals( "not equal: aTuple", bTuple, aTuple );
assertTrue( "not equal than: aTuple = bTuple", aTuple.compareTo( bTuple ) == 0 );
bTuple = new Tuple( "Just My Luck", "ClaudiaPuig", "3.0", "LisaRose", "2.0" );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) > 0 );
assertTrue( "not less than: bTuple > aTuple", bTuple.compareTo( aTuple ) < 0 );
}
public void testCompare3()
{
Tuple aTuple = new Tuple( "Just My Luck", "ClaudiaPuig", 3.0, "LisaRose", 3.0 );
Tuple bTuple = new Tuple( "Just My Luck", "ClaudiaPuig", 3.0, "LisaRose", 3.0 );
assertEquals( "not equal: aTuple", bTuple, aTuple );
assertTrue( "not equal than: aTuple = bTuple", aTuple.compareTo( bTuple ) == 0 );
bTuple = new Tuple( "Just My Luck", "ClaudiaPuig", 3.0, "LisaRose", 2.0 );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) > 0 );
assertTrue( "not less than: bTuple > aTuple", bTuple.compareTo( aTuple ) < 0 );
}
public void testCompare4()
{
Tuple aTuple = new Tuple( "Just My Luck", "ClaudiaPuig", null, "LisaRose", null );
Tuple bTuple = new Tuple( "Just My Luck", "ClaudiaPuig", null, "LisaRose", null );
assertEquals( "not equal: aTuple", bTuple, aTuple );
assertTrue( "not equal than: aTuple = bTuple", aTuple.compareTo( bTuple ) == 0 );
bTuple = new Tuple( "Just My Luck", "ClaudiaPuig", null, "Z", null );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) == "LisaRose".compareTo( "Z" ) );
assertTrue( "not less than: bTuple > aTuple", bTuple.compareTo( aTuple ) == "Z".compareTo( "LisaRose" ) );
}
public void testPairCompare()
{
TuplePair aTuple = new TuplePair( new Tuple( "Just My Luck", "ClaudiaPuig", 3.0, "LisaRose", 3.0 ), new Tuple( "a" ) );
TuplePair bTuple = new TuplePair( new Tuple( "Just My Luck", "ClaudiaPuig", 3.0, "LisaRose", 3.0 ), new Tuple( "a" ) );
assertEquals( "not equal: aTuple", bTuple, aTuple );
assertTrue( "not equal than: aTuple = bTuple", aTuple.compareTo( bTuple ) == 0 );
bTuple = new TuplePair( new Tuple( "Just My Luck", "ClaudiaPuig", 2.0, "LisaRose", 3.0 ), new Tuple( "a" ) );
assertTrue( "not less than: aTuple > bTuple", aTuple.compareTo( bTuple ) > 0 );
assertTrue( "not less than: bTuple < aTuple", bTuple.compareTo( aTuple ) < 0 );
bTuple = new TuplePair( new Tuple( "Just My Luck", "ClaudiaPuig", 3.0, "LisaRose", 3.0 ), new Tuple( "b" ) );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) < 0 );
assertTrue( "not less than: bTuple > aTuple", bTuple.compareTo( aTuple ) > 0 );
}
public void testCompareNull()
{
Tuple aTuple = new Tuple( "a", null, "c" );
Tuple bTuple = new Tuple( "a", "b", null );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) < 0 );
assertTrue( "not less than: bTuple < aTuple", bTuple.compareTo( aTuple ) > 0 );
}
public void testParse()
{
assertTuple( new Tuple( 0 ) );
assertTuple( new Tuple( 0, 1 ) );
assertTuple( new Tuple( "value" ) );
assertTuple( new Tuple( "value", "value" ) );
assertTuple( new Tuple( "value", "value", "value" ) );
assertTuple( new Tuple( "value", "value", 0 ) );
assertTuple( new Tuple( "value", "value", -1 ) );
assertTuple( new Tuple( "value", "value", 66.9900d ) );
}
private void assertTuple( Tuple value )
{
assertEquals( "not same tuple: " + value.print(), value, Tuple.parse( value.print() ) );
// assertEquals( "not same tuple: "+ value.print(), value, Tuple.parse( value.toString() ) );
}
public void testWritableCompareReadWrite() throws IOException
{
Tuple aTuple = new Tuple( new TestWritableComparable( "Just My Luck" ), "ClaudiaPuig", "3.0", "LisaRose", "3.0", true );
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
TupleOutputStream dataOutputStream = new TupleOutputStream( byteArrayOutputStream );
dataOutputStream.writeTuple( aTuple );
dataOutputStream.flush();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray() );
TupleInputStream dataInputStream = new TupleInputStream( byteArrayInputStream );
Tuple newTuple = new Tuple();
dataInputStream.readTuple( newTuple );
assertEquals( aTuple, newTuple );
}
public void testWritableCompare()
{
Tuple aTuple = new Tuple( new TestWritableComparable( "Just My Luck" ), "ClaudiaPuig", "3.0", "LisaRose", "3.0" );
Tuple bTuple = new Tuple( new TestWritableComparable( "Just My Luck" ), "ClaudiaPuig", "3.0", "LisaRose", "3.0" );
assertEquals( "not equal: aTuple", bTuple, aTuple );
assertTrue( "not equal than: aTuple = bTuple", aTuple.compareTo( bTuple ) == 0 );
bTuple = new Tuple( new TestWritableComparable( "Just My Luck" ), "ClaudiaPuig", "3.0", "LisaRose", "2.0" );
assertTrue( "not less than: aTuple < bTuple", aTuple.compareTo( bTuple ) > 0 );
}
public void testCoerce()
{
Date date = new Date();
Tuple tuple = new Tuple( "1", null, date, date );
Tuple results = Tuples.coerce( tuple, new Class[]{int.class, boolean.class, Date.class, String.class} );
assertEquals( results.get( 0 ), 1 );
assertEquals( results.get( 1 ), false );
assertEquals( results.get( 2 ), date );
assertEquals( results.get( 3 ), date.toString() );
}
}