/*
* The MIT License
*
* Copyright (c) 2009 The Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package htsjdk.samtools.metrics;
import htsjdk.samtools.SAMException;
import htsjdk.samtools.util.FormatUtil;
import htsjdk.samtools.util.Histogram;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Date;
/**
* Tests for the various classes in the metrics package. Constructs a MetricsFile,
* populates it with various items and then ensure that it can be written to disk
* and read back without altering any values.
*
* @author Tim Fennell
*/
public class MetricsFileTest {
public static enum TestEnum {One, Two, Three}
public static class TestMetric extends MetricBase implements Cloneable {
public String STRING_PROP;
public Date DATE_PROP;
public Short SHORT_PROP;
public Integer INTEGER_PROP;
public Long LONG_PROP;
public Float FLOAT_PROP;
public Double DOUBLE_PROP;
public TestEnum ENUM_PROP;
public Boolean BOOLEAN_PROP;
public short SHORT_PRIMITIVE;
public int INT_PRIMITIVE;
public long LONG_PRIMITIVE;
public float FLOAT_PRIMITIVE;
public double DOUBLE_PRIMITIVE;
public boolean BOOLEAN_PRIMITIVE;
public TestMetric clone() {
try { return (TestMetric) super.clone(); }
catch (CloneNotSupportedException cnse) { throw new SAMException("That's Unpossible!"); }
}
}
@Test
public void testWriteMetricsFile() throws Exception {
MetricsFile<TestMetric,Integer> file = new MetricsFile<TestMetric,Integer>();
TestMetric metric = new TestMetric();
metric.STRING_PROP = "Hello World";
metric.DATE_PROP = new FormatUtil().parseDate("2008-12-31");
metric.SHORT_PROP = 123;
metric.INTEGER_PROP = null;
metric.LONG_PROP = Long.MAX_VALUE;
metric.FLOAT_PROP = 456.789f;
metric.DOUBLE_PROP = 0.713487;
metric.ENUM_PROP = TestEnum.Two;
metric.BOOLEAN_PROP = false;
metric.SHORT_PRIMITIVE = 123;
metric.INT_PRIMITIVE = 919834781;
metric.LONG_PRIMITIVE = Long.MAX_VALUE - Integer.MAX_VALUE;
metric.FLOAT_PRIMITIVE = 0.55694f;
metric.DOUBLE_PRIMITIVE = 0.229233;
metric.BOOLEAN_PRIMITIVE = true;
file.addMetric(metric);
MetricsFile<TestMetric,Integer> file2 = writeThenReadBack(file);
Assert.assertEquals(file, file2);
// Now add some headers and run the test again
StringHeader stringHeader = new StringHeader();
stringHeader.setValue("Hello, I'm a String Header!");
file.addHeader(stringHeader);
VersionHeader version = new VersionHeader();
version.setVersionedItem("MetricsFileTest");
version.setVersionString("1.0");
file.addHeader(version);
version = new VersionHeader();
version.setVersionedItem("Nada");
version.setVersionString("0.0alpha1");
file.addHeader(version);
file2 = writeThenReadBack(file);
Assert.assertEquals(file, file2);
// Now add a Histogram and make sure it still works
Histogram<Integer> histo = new Histogram<Integer>();
histo.setBinLabel("small_number");
histo.setValueLabel("big_number");
histo.increment(1, 101);
histo.increment(2, 202);
histo.increment(3, 4000);
histo.increment(5, 123981);
histo.increment(1000, 10981982);
file.setHistogram(histo);
file2 = writeThenReadBack(file);
Assert.assertEquals(file, file2);
// And lastly add some more metrics rows to the file
TestMetric metric2 = metric.clone();
metric2.ENUM_PROP = TestEnum.One;
metric2.FLOAT_PROP = 0.998f;
metric2.STRING_PROP = "Wheeeee!";
file.addMetric(metric2);
metric2 = metric.clone();
metric2.ENUM_PROP = TestEnum.Three;
metric2.DOUBLE_PRIMITIVE = 1.299d;
file.addMetric(metric2);
file2 = writeThenReadBack(file);
Assert.assertEquals(file, file2);
}
/** Helper method to persist metrics to file and read them back again. */
private MetricsFile<TestMetric, Integer> writeThenReadBack(MetricsFile<TestMetric,Integer> in) throws Exception {
File f = File.createTempFile("test", ".metrics");
f.deleteOnExit();
FileWriter out = new FileWriter(f);
in.write(out);
MetricsFile<TestMetric,Integer> retval = new MetricsFile<TestMetric,Integer>();
retval.read(new FileReader(f));
return retval;
}
}