/*
* Copyright (c) 2012 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package uk.ac.diamond.scisoft.analysis.io;
import static org.junit.Assert.assertTrue;
import java.io.FileNotFoundException;
import org.eclipse.dawnsci.analysis.api.io.IDataHolder;
import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException;
import org.eclipse.january.dataset.Comparisons;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DatasetUtils;
import org.eclipse.january.dataset.Maths;
import org.junit.BeforeClass;
import org.junit.Test;
import uk.ac.diamond.scisoft.analysis.IOTestUtils;
/**
* Test for JPEGLoader and JPEGSaver
*/
public class JPEGTest {
static String testScratchDirectoryName = null;
Dataset data;
DataHolder dh = new DataHolder();
DataHolder dhLoad = new DataHolder();
int sizex = 500, sizey = 500, range = sizex * sizey;
double abserr = 2.0; // maximum permitted absolute error (remember that JPEGs are lossy)
/**
* Creates an empty directory for use by test code.
*
* @throws Exception if the test fails
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
testScratchDirectoryName = IOTestUtils.generateDirectorynameFromClassname(JPEGTest.class.getCanonicalName());
IOTestUtils.makeScratchDirectory(testScratchDirectoryName);
}
/**
* Test Loader
*/
public JPEGTest() {
}
/**
* This method takes a data set that has been created above and saves it as a JPEG file, then loads and verifies it.
*
* @throws Exception if the test fails
*/
@Test
public void testSaveFile() throws Exception {
String filePath = "testSaveFile.jpg";
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 255, range, Dataset.INT16);
data.setShape(sizex, sizey);
dha.addDataset("testing data", data);
new JPEGScaledSaver(testScratchDirectoryName + filePath).saveFile(dha);
DataHolder dhb = new JPEGLoader(testScratchDirectoryName + filePath).loadFile();
Dataset x = dhb.getDataset(0);
Number min = x.min();
Number ptp = x.peakToPeak();
x = Maths.multiply(Maths.subtract(x, min), data.max().doubleValue()/ptp.doubleValue());
assertTrue("Saved and loaded datasets are not equal", Comparisons.allTrue(Comparisons.almostEqualTo(x, data, 1e-5, 2)));
}
/**
* Test to see if the saver can save and reload using LoaderFactory.
*
* @throws Exception if the test fails
*/
@Test
public void testLoaderFactory() throws Exception {
String filePath = "testLoaderFactory.jpg";
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 255, range, Dataset.INT16);
data.setShape(sizex, sizey);
dha.addDataset("testing data", data);
new JPEGScaledSaver(testScratchDirectoryName + filePath).saveFile(dha);
final IDataHolder dh = LoaderFactory.getData(testScratchDirectoryName + filePath, null);
if (dh==null || dh.getNames().length<1) throw new Exception();
}
/**
* Test to see if the saver can save many images
*
* @throws ScanFileHolderException
*/
@Test
public void manyImages() throws ScanFileHolderException {
String filePath = "manyImages.jpg";
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 255, range, Dataset.INT16);
data.setShape(sizex, sizey);
for (int i = 0; i < 5; i++) {
dha.addDataset("testing data " + i, data);
}
new JPEGSaver(testScratchDirectoryName + "ManyImages" + filePath).saveFile(dha);
}
/**
* Test to see if the saver can save many scaled images
*
* @throws ScanFileHolderException
*/
@Test
public void manyImagesScaled() throws ScanFileHolderException {
String filePath = "manyImagesScaled.jpg";
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 250000, range, Dataset.INT32);
data.setShape(sizex, sizey);
for (int i = 0; i < 5; i++) {
dha.addDataset("testing data " + i, data);
}
new JPEGScaledSaver(testScratchDirectoryName + "ManyImagesScaled" + filePath).saveFile(dha);
}
/**
* Test loading and saving for unscaled data
*
* @throws ScanFileHolderException
* @throws ScanFileHolderException
*/
@Test
public void compareDataset() throws ScanFileHolderException {
String filePath = "compareDataset.jpg";
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 255, range, Dataset.INT16);
data.setShape(sizex, sizey);
dha.addDataset("testing data", data);
new JPEGSaver(testScratchDirectoryName + filePath).saveFile(dha);
DataHolder dhb = new JPEGLoader(testScratchDirectoryName + filePath).loadFile();
Dataset x = dhb.getDataset(0);
Number min = x.min();
Number ptp = x.peakToPeak();
x = Maths.multiply(Maths.subtract(x, min), data.max().doubleValue()/ptp.doubleValue());
assertTrue("Saved and loaded datasets are not equal", Comparisons.allTrue(Comparisons.almostEqualTo(x, data, 1e-5, 2)));
}
/**
* Compares loaded and saved data set (scaled)
*
* @throws ScanFileHolderException
*/
@Test
public void compareScaledDataset() throws ScanFileHolderException {
String filePath = "compareScaledDataset.jpg";
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 250000, range, Dataset.FLOAT32);
data.setShape(sizex, sizey);
dha.addDataset("testing data", data);
new JPEGScaledSaver(testScratchDirectoryName + filePath).saveFile(dha);
DataHolder dhb = new JPEGLoader(testScratchDirectoryName + filePath).loadFile();
Dataset x = DatasetUtils.norm(data);
x.imultiply(255);
assertTrue("Saved and loaded datasets are not equal", Comparisons.allTrue(Comparisons.almostEqualTo(x, dhb.getDataset(0), 1e-5, 2)));
}
/**
* Test to see if the loader and saver can deal with a file name without suffix
*
* @throws Exception if the test fails
*/
@Test
public void noEnding() throws Exception {
DataHolder dha = new DataHolder();
data = DatasetFactory.createLinearSpace(0, 250000, range, Dataset.FLOAT32);
data.setShape(sizex, sizey);
dha.addDataset("testing data", data);
new JPEGScaledSaver(testScratchDirectoryName + "noEnding.jpg").saveFile(dha);
dh = new JPEGLoader(testScratchDirectoryName + "noEnding").loadFile();
new JPEGScaledSaver(testScratchDirectoryName + "noEnding1").saveFile(dh);
}
/**
* Test to see if the loader and saver can deal with a file with an incorrect file name
*
* @throws Exception if the test fails
*/
@Test
public void incorrectEnding() throws Exception {
String filePath = "incorrectEnding.txt";
String filePath1 = "incorrectEnding1.txt";
data = DatasetFactory.createLinearSpace(0, 126, range, Dataset.INT8);
data.setShape(sizex, sizey);
DataHolder dha = new DataHolder();
dha.addDataset("testing data", data);
new JPEGScaledSaver(testScratchDirectoryName + filePath).saveFile(dha);
new JPEGSaver(testScratchDirectoryName + filePath1).saveFile(dha);
dh = new JPEGLoader(testScratchDirectoryName + filePath).loadFile();
dh = new JPEGLoader(testScratchDirectoryName + filePath1).loadFile();
}
/**
* Test to see what happens when the file is missing
*
* @throws ScanFileHolderException if the file couldn't be loaded
*/
@Test
public void testNoFile() throws ScanFileHolderException {
try {
dh = new JPEGLoader(testScratchDirectoryName + "NoFile.jpeg").loadFile();
} catch (ScanFileHolderException e) {
if (!(e.getCause() instanceof FileNotFoundException))
throw e;
}
}
}