package importexport.exporting; import importexport.importing.ArffFileInfoExtractor; import importexport.importing.CSVBasedImporter; import importexport.importing.CSVFileInfoExtractor; import importexport.importing.Importer; import importexport.util.CSVFileInfo; import importexport.util.FileInfo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import junit.framework.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; import controller.Feature; import controller.SubspaceController; import db.Database; import db.DatabaseAccessException; import db.IncompatibleVersionException; import db.InvalidDriverException; public class FileInfoInjectorTest { private static final String RESPATH = "src/test/resources/"; private final String path = System.getProperty("java.io.tmpdir") + "/bsv_test"; private final String dbFile = this.path + "/database-importerTest.bsv"; private Database database = null; private SubspaceController subCon = null; private File arff = new File(path + "/injectorTest.arff"); private File csv = new File(path + "/injectorTest.csv"); private File ssd = new File(path + "/injectorTest.ssd"); /** * Set up a clean database before we do the testing on it. */ @Before public void setup() { // create workding dir (new File(this.path)).mkdirs(); // make sure the old file is deleted new File(this.dbFile).delete(); arff.delete(); csv.delete(); ssd.delete(); try { this.database = new Database(this.dbFile); this.subCon = new SubspaceController(database); arff.createNewFile(); csv.createNewFile(); } catch (IllegalArgumentException e) { Assert.fail("Database setup failed; path is invalid: " + e.getMessage()); } catch (InvalidDriverException e) { Assert.fail("Database setup failed; SQL driver is invalid: " + e.getMessage()); } catch (DatabaseAccessException e) { Assert.fail("Database setup failed; connection could not be created: " + e.getMessage()); } catch (IncompatibleVersionException e) { Assert.fail("Database setup failed; connection could not be created: " + e.getMessage()); } catch (IOException e) { Assert.fail(e.getClass().toString()); } } /** * Clean up, after testing. */ @After public void tearDown() { // shutdown try { this.database.shutdown(); this.subCon = null; } catch (DatabaseAccessException ex) { Assert.fail("Databus shutdown fail: " + ex.getMessage()); } // clean up database if (this.database != null) { Assert.assertEquals(true, new File(this.dbFile).delete()); } arff.delete(); csv.delete(); ssd.delete(); } private CSVFileInfo createFileInfo(final File f, FileInfoInjector injector) throws DatabaseAccessException { String relation = f.getName(); Feature[] features = this.subCon.getSubspaces()[0].getFeatures(); String[] featureNames = new String[features.length]; for (int i = 0; i < features.length; ++i) { featureNames[i] = features[i].getName(); } int fLODS = -1; if (injector instanceof CSVFileInfoInjector) { fLODS = 2; } else if (injector instanceof ArffFileInfoInjector) { fLODS = 4 + features.length; } return new CSVFileInfo(relation, featureNames, fLODS, ','); } @Test public void testInject1() { File nanarff = new File(RESPATH + "csv_arff_ssd_files/nantest.arff"); File nanssd = new File(RESPATH + "csv_arff_ssd_files/nantest.ssd"); ArffFileInfoExtractor extractor = new ArffFileInfoExtractor(); ArffFileInfoInjector injector = new ArffFileInfoInjector(); BufferedWriter bw = null; CSVFileInfo expected = new CSVFileInfo( "injectorTest.arff", new String[] { "var_0", "var_1", "class" }, 8, (char)0); CSVFileInfo info = null; Importer im = new CSVBasedImporter(database, extractor); try { bw = new BufferedWriter(new FileWriter(arff)); im.importFile(nanarff, nanssd); injector.injectFileInfo( bw, createFileInfo(arff, injector), subCon.getSubspaces()[0].getFeatures()); info = extractor.extractFileInfo(arff); } catch (Throwable t) { Assert.fail("Unexpected Throwable " + t.getClass() + " " +arff.toURI() + "\n\n" + info.getDelimiter()); } Assert.assertTrue("Wrong relation", expected.getName().equals(info.getName())); Assert.assertTrue("Wrong delimiter", expected.getDelimiter() == info.getDelimiter()); Assert.assertTrue("Wrong flods " + info.getFirstLineOfDataSegment(), expected.getFirstLineOfDataSegment() == info.getFirstLineOfDataSegment()); Assert.assertTrue("Wrong features", Arrays.deepEquals(expected.getFeatures(), info.getFeatures())); } @Test public void testInject2() { File nanarff = new File(RESPATH + "csv_arff_ssd_files/nantest.arff"); File nanssd = new File(RESPATH + "csv_arff_ssd_files/nantest.ssd"); ArffFileInfoExtractor extractor = new ArffFileInfoExtractor(); CSVFileInfoExtractor extractor2 = new CSVFileInfoExtractor(); CSVFileInfoInjector injector = new CSVFileInfoInjector(); BufferedWriter bw = null; CSVFileInfo expected = new CSVFileInfo( "injectorTest.csv", new String[] { "var_0", "var_1" }, 2, ','); CSVFileInfo info = null; Importer im = new CSVBasedImporter(database, extractor); try { bw = new BufferedWriter(new FileWriter(csv)); im.importFile(nanarff, nanssd); injector.injectFileInfo( bw, createFileInfo(csv, injector), subCon.getSubspaces()[0].getFeatures()); info = extractor2.extractFileInfo(csv); } catch (Throwable t) { Assert.fail("Unexpected Throwable " + t.getClass() + " " + csv.toURI() + "\n\n" + info.getDelimiter()); } Assert.assertTrue("Wrong relation " + info.getName() + " instead of " + expected.getName(), expected.getName().equals(info.getName())); Assert.assertTrue("Wrong delimiter", expected.getDelimiter() == info.getDelimiter()); Assert.assertTrue("Wrong flods " + info.getFirstLineOfDataSegment(), expected.getFirstLineOfDataSegment() == info.getFirstLineOfDataSegment()); Assert.assertTrue("Wrong features " + Arrays.deepToString(info.getFeatures()) + " instead of " + Arrays.deepToString(expected.getFeatures()), Arrays.deepEquals(expected.getFeatures(), info.getFeatures())); } @Test public void testCSVInjectorNOValidFileInfoType() { File nanarff = new File(RESPATH + "csv_arff_ssd_files/nantest.arff"); File nanssd = new File(RESPATH + "csv_arff_ssd_files/nantest.ssd"); ArffFileInfoExtractor extractor = new ArffFileInfoExtractor(); CSVFileInfoInjector injector = new CSVFileInfoInjector(); BufferedWriter bw = null; FileInfo info = new XFileInfo( this.path + "/injectorTest.csv", new String[] { "var_0", "var_1" }); Importer im = new CSVBasedImporter(database, extractor); try { bw = new BufferedWriter(new FileWriter(csv)); im.importFile(nanarff, nanssd); injector.injectFileInfo( bw, info, subCon.getSubspaces()[0].getFeatures()); BufferedReader br = new BufferedReader(new FileReader(csv)); String line = br.readLine(); Assert.assertTrue(line == null); } catch (Throwable t) { Assert.fail("Unexpected Throwable " + t.getClass()); } } @Test public void testArffInjectorNOValidFileInfoType() { File nanarff = new File(RESPATH + "csv_arff_ssd_files/nantest.arff"); File nanssd = new File(RESPATH + "csv_arff_ssd_files/nantest.ssd"); ArffFileInfoExtractor extractor = new ArffFileInfoExtractor(); ArffFileInfoInjector injector = new ArffFileInfoInjector(); BufferedWriter bw = null; FileInfo info = new XFileInfo( this.path + "/injectorTest.arff", new String[] { "var_0", "var_1" }); Importer im = new CSVBasedImporter(database, extractor); try { bw = new BufferedWriter(new FileWriter(arff)); im.importFile(nanarff, nanssd); injector.injectFileInfo( bw, info, subCon.getSubspaces()[0].getFeatures()); BufferedReader br = new BufferedReader(new FileReader(arff)); String line = br.readLine(); Assert.assertTrue(line == null); } catch (Throwable t) { Assert.fail("Unexpected Throwable " + t.getClass()); } } } class XFileInfo extends FileInfo { public XFileInfo(String relation, String[] featureSet) { super(relation, featureSet); } }