package tap.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
import uk.ac.starlink.table.TableFormatException;
public class TestVOTableIterator {
public final static String directory = "./test/tap/data/";
public final static File dataVOTable = new File(directory + "testdata.vot");
public final static File binaryVOTable = new File(directory + "testdata_binary.vot");
public final static File emptyVOTable = new File(directory + "emptyset.vot");
public final static File emptyBinaryVOTable = new File(directory + "emptyset_binary.vot");
@Test
public void testWithNULL(){
try{
new VOTableIterator(null);
fail("The constructor should have failed, because: the given VOTable is NULL.");
}catch(Exception ex){
assertEquals(ex.getClass().getName(), "java.lang.NullPointerException");
}
}
@Test
public void testWithData(){
InputStream input = null;
TableIterator it = null;
try{
input = new BufferedInputStream(new FileInputStream(dataVOTable));
it = new VOTableIterator(input);
// TEST there is column metadata before starting the iteration:
assertTrue(it.getMetadata() != null);
final int expectedNbLines = 100, expectedNbColumns = 4;
int countLines = 0, countColumns = 0;
while(it.nextRow()){
// count lines:
countLines++;
// reset columns count:
countColumns = 0;
while(it.hasNextCol()){
it.nextCol();
// count columns
countColumns++;
// TEST the column type is set (not null):
assertTrue(it.getColType() != null);
}
// TEST that all columns have been read:
assertEquals(expectedNbColumns, countColumns);
}
// TEST that all lines have been read:
assertEquals(expectedNbLines, countLines);
}catch(Exception ex){
ex.printStackTrace(System.err);
fail("An exception occurs while reading a correct VOTable (containing some valid rows).");
}finally{
try{
if (input != null)
input.close();
}catch(IOException e){
e.printStackTrace();
}
if (it != null){
try{
it.close();
}catch(DataReadException dre){}
}
}
}
@Test
public void testWithBinary(){
InputStream input = null;
TableIterator it = null;
try{
input = new BufferedInputStream(new FileInputStream(binaryVOTable));
it = new VOTableIterator(input);
// TEST there is column metadata before starting the iteration:
assertTrue(it.getMetadata() != null);
final int expectedNbLines = 100, expectedNbColumns = 4;
int countLines = 0, countColumns = 0;
while(it.nextRow()){
// count lines:
countLines++;
// reset columns count:
countColumns = 0;
while(it.hasNextCol()){
it.nextCol();
// count columns
countColumns++;
// TEST the column type is set (not null):
assertTrue(it.getColType() != null);
}
// TEST that all columns have been read:
assertEquals(expectedNbColumns, countColumns);
}
// TEST that all lines have been read:
assertEquals(expectedNbLines, countLines);
}catch(Exception ex){
ex.printStackTrace(System.err);
fail("An exception occurs while reading a correct VOTable (containing some valid rows).");
}finally{
try{
if (input != null)
input.close();
}catch(IOException e){
e.printStackTrace();
}
if (it != null){
try{
it.close();
}catch(DataReadException dre){}
}
}
}
@Test
public void testWithEmptySet(){
InputStream input = null;
TableIterator it = null;
try{
input = new BufferedInputStream(new FileInputStream(emptyVOTable));
it = new VOTableIterator(input);
// TEST there is column metadata before starting the iteration:
assertTrue(it.getMetadata() != null);
int countLines = 0;
// count lines:
while(it.nextRow())
countLines++;
// TEST that no line has been read:
assertEquals(countLines, 0);
}catch(Exception ex){
ex.printStackTrace(System.err);
fail("An exception occurs while reading a correct VOTable (even if empty).");
}finally{
try{
if (input != null)
input.close();
}catch(IOException e){
e.printStackTrace();
}
if (it != null){
try{
it.close();
}catch(DataReadException dre){}
}
}
}
@Test
public void testWithEmptyBinarySet(){
InputStream input = null;
TableIterator it = null;
try{
input = new BufferedInputStream(new FileInputStream(emptyBinaryVOTable));
it = new VOTableIterator(input);
// TEST there is column metadata before starting the iteration:
assertTrue(it.getMetadata() != null);
int countLines = 0;
// count lines:
while(it.nextRow())
countLines++;
// TEST that no line has been read:
assertEquals(countLines, 0);
}catch(Exception ex){
ex.printStackTrace(System.err);
fail("An exception occurs while reading a correct binary VOTable (even if empty).");
}finally{
try{
if (input != null)
input.close();
}catch(IOException e){
e.printStackTrace();
}
if (it != null){
try{
it.close();
}catch(DataReadException dre){}
}
}
}
@Test
public void testWithNotAVotable(){
// CASE: Empty file!
File emptyFile = new File("test/tap/data/emptyFile");
InputStream input = null;
VOTableIterator it = null;
try{
// Create an empty file:
emptyFile.createNewFile();
// Prepare reading it:
input = new FileInputStream(emptyFile);
// Start the iteration:
it = new VOTableIterator(input);
// Try to read the data:
it.getMetadata();
fail("An exception was expected because the file is empty!");
}catch(IOException ioe){
ioe.printStackTrace();
fail("Another exception was expected here! (see the console for more details)");
}catch(DataReadException dre){
assertNotNull(dre.getCause());
assertEquals(TableFormatException.class, dre.getCause().getClass());
assertEquals("The input file is not a valid VOTable document! Cause: [l.1, c.1] Premature end of file.", dre.getMessage());
}finally{
// Close the input stream (if open):
if (input != null){
try{
input.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
// Close the iterator (if any):
if (it != null){
try{
it.close();
}catch(DataReadException dre){
dre.printStackTrace();
}
}
// Delete the temporary empty file (if exists):
if (emptyFile.exists())
emptyFile.delete();
}
// CASE: Neither empty nor a VOTable file!
File notAVotFile = new File("test/tap/db_testtools/db-test/create-db.sql");
input = null;
it = null;
try{
// Prepare reading it:
input = new FileInputStream(notAVotFile);
// Start the iteration:
it = new VOTableIterator(input);
// Try to read the data:
it.getMetadata();
fail("An exception was expected because the file is not a VOTable!");
}catch(IOException ioe){
ioe.printStackTrace();
fail("Another exception was expected here! (see the console for more details)");
}catch(DataReadException dre){
assertNotNull(dre.getCause());
assertEquals(TableFormatException.class, dre.getCause().getClass());
assertEquals("The input file is not a valid VOTable document! Cause: [l.2, c.1] Content is not allowed in prolog.", dre.getMessage());
}finally{
// Close the input stream (if open):
if (input != null){
try{
input.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
// Close the iterator (if any):
if (it != null){
try{
it.close();
}catch(DataReadException dre){
dre.printStackTrace();
}
}
}
// CASE: A VOTable with no field declared!
File notAValidVotableFile = new File("test/tap/data/testdata_no-field.vot");
input = null;
it = null;
try{
// Prepare reading it:
input = new FileInputStream(notAValidVotableFile);
// Start the iteration:
it = new VOTableIterator(input);
// Try to read the data:
it.getMetadata();
fail("An exception was expected because no FIELD is declared in this VOTable!");
}catch(IOException ioe){
ioe.printStackTrace();
fail("Another exception was expected here! (see the console for more details)");
}catch(DataReadException dre){
assertEquals("Unexpected VOTable document: no FIELD can be found!", dre.getMessage());
}finally{
// Close the input stream (if open):
if (input != null){
try{
input.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
// Close the iterator (if any):
if (it != null){
try{
it.close();
}catch(DataReadException dre){
dre.printStackTrace();
}
}
}
}
}