blob: 6328921f690526ab1a8ef0b965bb208c80f00b0e [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 complex.connectivity;
import com.sun.star.beans.XPropertySet;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.sdb.CommandType;
import com.sun.star.sdbc.SQLException;
import com.sun.star.util.Date;
import complexlib.ComplexTestCase;
import connectivity.tools.CsvDatabase;
import connectivity.tools.RowSet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class FlatFileAccess extends ComplexTestCase
{
public FlatFileAccess()
{
super();
}
@Override
public String[] getTestMethodNames()
{
return new String[] {
"testBasicAccess",
"testCalendarFunctions",
"testSortingByFunction"
};
}
@Override
public String getTestObjectName()
{
return "FlatFileAccess";
}
public void before() throws Exception
{
m_database = new CsvDatabase( (XMultiServiceFactory)param.getMSF() );
// proper settings
final XPropertySet dataSourceSettings = m_database.getDataSource().geSettings();
dataSourceSettings.setPropertyValue( "Extension", "csv" );
dataSourceSettings.setPropertyValue( "HeaderLine", Boolean.TRUE );
dataSourceSettings.setPropertyValue( "FieldDelimiter", " " );
m_database.store();
// write the table(s) for our test
final String tableLocation = m_database.getTableFileLocation().getAbsolutePath();
final PrintWriter tableWriter = new PrintWriter( new FileOutputStream( tableLocation + File.separatorChar + "dates.csv", false ) );
tableWriter.println( "ID date" );
tableWriter.println( "1 2013-01-01" );
tableWriter.println( "2 2012-02-02" );
tableWriter.println( "3 2011-03-03" );
tableWriter.close();
}
public void after()
{
}
private class EqualityDate extends Date
{
EqualityDate( short i_day, short i_month, short i_year )
{
super( i_day, i_month, i_year );
}
EqualityDate( Date i_date )
{
super( i_date.Day, i_date.Month, i_date.Year );
}
@Override
public boolean equals( Object i_compare )
{
if ( !( i_compare instanceof Date ) )
return false;
return Day == ((Date)i_compare).Day
&& Month == ((Date)i_compare).Month
&& Year == ((Date)i_compare).Year;
}
}
/**
* ensures simple SELECTs from our table(s) work, and deliver the expected results
*/
public void testBasicAccess()
{
testRowSetResults(
"SELECT * FROM \"dates\"",
new RowSetIntGetter(1),
new Integer[] { 1, 2, 3 },
"simple select", "wrong IDs"
);
testRowSetResults(
"SELECT * FROM \"dates\"",
new RowSetDateGetter( 2 ),
new EqualityDate[] { new EqualityDate( (short)1, (short)1, (short)2013 ),
new EqualityDate( (short)2, (short)2, (short)2012 ),
new EqualityDate( (short)3, (short)3, (short)2011 )
},
"simple select", "wrong dates"
);
testRowSetResults(
"SELECT \"date\", \"ID\" FROM \"dates\" ORDER BY \"ID\" DESC",
new RowSetIntGetter( 2 ),
new Integer[] { 3, 2, 1 },
"explicit column selection, sorted by IDs", "wrong IDs"
);
testRowSetResults(
"SELECT * FROM \"dates\" ORDER BY \"date\"",
new RowSetIntGetter( 1 ),
new Integer[] { 3, 2, 1 },
"sorted by date", "wrong IDs"
);
}
/**
* ensures the basic functionality for selecting calendar functions from a CSV table - this is a prerequisite for
* later tests.
*/
public void testCalendarFunctions()
{
// simple check for proper results of the calendar functions (DATE/MONTH)
// The * at the first position is crucial here - there was code which wrongly calculated
// column positions of function columns when * was present in the statement
testRowSetResults(
"SELECT \"dates\".*, YEAR( \"date\" ) FROM \"dates\"",
new RowSetIntGetter( 3 ),
new Integer[] { 2013, 2012, 2011 },
"YEAR function", "wrong calculated years"
);
testRowSetResults(
"SELECT \"dates\".*, MONTH( \"date\" ) FROM \"dates\"",
new RowSetIntGetter( 3 ),
new Integer[] { 1, 2, 3 },
"MONTH function", "wrong calculated months"
);
}
/**
* ensures that sorting by a function column works
*/
public void testSortingByFunction()
{
// most simple case: select a function, and sort by it
testRowSetResults(
"SELECT YEAR( \"date\" ) AS \"year\" FROM \"dates\" ORDER BY \"year\"",
new RowSetIntGetter(1),
new Integer[] { 2011, 2012, 2013 },
"single YEAR selection, sorted by years", "wrong calculated years"
);
// somewhat more "difficult" (this used to crash): Select all columns, plus a function, so the calculated
// column has a position greater than column count
testRowSetResults(
"SELECT \"dates\".*, YEAR( \"date\" ) AS \"year\" FROM \"dates\" ORDER BY \"year\" DESC",
new RowSetIntGetter(3),
new Integer[] { 2013, 2012, 2011 },
"extended YEAR selection, sorted by years", "wrong calculated years"
);
}
private interface RowSetValueGetter
{
public Object getValue( final RowSet i_rowSet ) throws SQLException;
}
private abstract class RowSetColumnValueGetter implements RowSetValueGetter
{
RowSetColumnValueGetter( final int i_columnIndex )
{
m_columnIndex = i_columnIndex;
}
protected final int m_columnIndex;
}
private class RowSetIntGetter extends RowSetColumnValueGetter
{
RowSetIntGetter( final int i_columnIndex )
{
super( i_columnIndex );
}
public Object getValue( final RowSet i_rowSet ) throws SQLException
{
return i_rowSet.getInt( m_columnIndex );
}
}
private class RowSetDateGetter extends RowSetColumnValueGetter
{
RowSetDateGetter( final int i_columnIndex )
{
super( i_columnIndex );
}
public Object getValue( final RowSet i_rowSet ) throws SQLException
{
return i_rowSet.getDate( m_columnIndex );
}
}
private <T> void testRowSetResults( String i_command, RowSetValueGetter i_getter,
T[] i_expectedValues, String i_context, String i_failureDesc )
{
RowSet rowSet = null;
try
{
rowSet = m_database.createRowSet( CommandType.COMMAND, i_command );
rowSet.execute();
List< T > values = new ArrayList< T >();
while ( rowSet.next() )
{
values.add( (T)i_getter.getValue( rowSet ) );
}
assureEquals( i_context + ": " + i_failureDesc, i_expectedValues, values.toArray(), true );
}
catch( final SQLException e )
{
failed( i_context + ": caught an exception: " + e.toString(), false );
}
finally
{
if ( rowSet != null )
rowSet.dispose();
}
}
private CsvDatabase m_database = null;
}