diff --git a/plugin/build.xml b/plugin/build.xml index 411312080..473c7077e 100644 --- a/plugin/build.xml +++ b/plugin/build.xml @@ -145,11 +145,7 @@ - - - - - + @@ -199,11 +195,7 @@ - - - - - + diff --git a/plugin/src/org/aavso/tools/vstar/external/lib/FitsTestData.java b/plugin/src/org/aavso/tools/vstar/external/lib/FitsTestData.java new file mode 100644 index 000000000..788461a25 --- /dev/null +++ b/plugin/src/org/aavso/tools/vstar/external/lib/FitsTestData.java @@ -0,0 +1,83 @@ +/** + * VStar: a statistical analysis tool for variable star data. + * Copyright (C) 2009 AAVSO (http://www.aavso.org/) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.aavso.tools.vstar.external.lib; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import nom.tam.fits.BinaryTableHDU; +import nom.tam.fits.Fits; +import nom.tam.fits.FitsException; +import nom.tam.fits.ImageHDU; + +/** + * Builds minimal in-memory FITS files for plugin self-tests. + */ +public final class FitsTestData { + + private FitsTestData() { + } + + /** + * Lightkurve-style FITS with Kepler telescope metadata and one valid row. + */ + public static byte[] createLightKurveKeplerFits() throws FitsException, IOException { + return createFits("Kepler", new String[] { "TIME", "FLUX", "FLUX_ERR" }, + new Object[] { new double[] { 0.5 }, new float[] { 1000f }, new float[] { 10f } }, + null, null); + } + + /** + * Kepler/TESS archive-style FITS with PDCSAP columns (corrected flux). + */ + public static byte[] createKeplerArchiveFits() throws FitsException, IOException { + String[] names = { "TIME", "COL1", "COL2", "SAP_FLUX", "SAP_FLUX_ERR", "COL5", "COL6", + "PDCSAP_FLUX", "PDCSAP_FLUX_ERR", "QUALITY" }; + Object[] cols = { new double[] { 0.5 }, new float[] { 0f }, new float[] { 0f }, + new float[] { 1000f }, new float[] { 10f }, new float[] { 0f }, new float[] { 0f }, + new float[] { 1000f }, new float[] { 10f }, new int[] { 0 } }; + return createFits("Kepler", names, cols, 2454833, 0.0); + } + + private static byte[] createFits(String telescope, String[] columnNames, Object[] columns, + Integer bjdRefInt, Double bjdRefFrac) throws FitsException, IOException { + Fits fits = new Fits(); + + nom.tam.fits.Data imageData = ImageHDU.encapsulate(new double[1][1]); + ImageHDU image = new ImageHDU(ImageHDU.manufactureHeader(imageData), imageData); + image.getHeader().addValue("TELESCOP", telescope, ""); + image.getHeader().addValue("OBJECT", "TEST", ""); + fits.addHDU(image); + + nom.tam.fits.Data tableData = BinaryTableHDU.encapsulate(columns); + BinaryTableHDU table = new BinaryTableHDU(BinaryTableHDU.manufactureHeader(tableData), tableData); + for (int i = 0; i < columnNames.length; i++) { + table.setColumnName(i, columnNames[i], ""); + } + if (bjdRefInt != null && bjdRefFrac != null) { + table.getHeader().addValue("BJDREFI", bjdRefInt.longValue(), ""); + table.getHeader().addValue("BJDREFF", bjdRefFrac.doubleValue(), ""); + } + fits.addHDU(table); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + fits.write(new DataOutputStream(out)); + return out.toByteArray(); + } +} diff --git a/plugin/src/org/aavso/tools/vstar/external/lib/GaiaObSourceBase.java b/plugin/src/org/aavso/tools/vstar/external/lib/GaiaObSourceBase.java index 60fb75d22..d5a38cbc6 100644 --- a/plugin/src/org/aavso/tools/vstar/external/lib/GaiaObSourceBase.java +++ b/plugin/src/org/aavso/tools/vstar/external/lib/GaiaObSourceBase.java @@ -34,7 +34,9 @@ import java.awt.Color; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; @@ -56,6 +58,7 @@ import org.aavso.tools.vstar.exception.ObservationValidationError; import org.aavso.tools.vstar.input.AbstractObservationRetriever; import org.aavso.tools.vstar.plugin.ObservationSourcePluginBase; +import org.aavso.tools.vstar.util.Tolerance; public abstract class GaiaObSourceBase extends ObservationSourcePluginBase { @@ -782,4 +785,75 @@ public String getSourceType() { } } + @Override + public Boolean test() { + setTestMode(true); + paramIgnoreFlags = true; + paramGaiaRelease = GaiaRelease.DR2; + + boolean success = true; + try { + success &= runGaiaFileTest(false); + success &= runGaiaFileTest(true); + } catch (Exception e) { + success = false; + } finally { + setTestMode(false); + } + return success; + } + + private boolean runGaiaFileTest(boolean transform) throws Exception { + paramTransform = transform; + + String header = "source_id,transit_id,band,time,mag,flux,flux_error,flux_over_error,rejected_by_photometry,rejected_by_variability,other_flags,solution_id\n"; + String[] lines; + if (transform) { + lines = new String[] { + header, + "1951343009975999744,1,BP,1000.0,11.0,1000.0,10.0,,FALSE,FALSE,0,1\n", + "1951343009975999744,1,G,1000.0,10.0,1000.0,10.0,,FALSE,FALSE,0,1\n", + "1951343009975999744,1,RP,1000.0,12.0,1000.0,10.0,,FALSE,FALSE,0,1\n" }; + } else { + lines = new String[] { + header, + "1951343009975999744,1,G,1000.0,10.0,1000.0,10.0,,FALSE,FALSE,0,1\n" }; + } + + StringBuffer content = new StringBuffer(); + for (String line : lines) { + content.append(line); + } + InputStream in = new ByteArrayInputStream(content.toString().getBytes()); + List streams = new ArrayList(); + streams.add(in); + setInputInfo(streams, "Gaia test"); + + GAIADR2FormatRetriever retriever = new GAIADR2FormatRetriever(transform, true, GaiaRelease.DR2); + retriever.getNumberOfRecords(); + retriever.retrieveObservations(); + + List gaiaObs = retriever.getValidObservations(); + if (!transform) { + boolean success = 1 == gaiaObs.size(); + ValidObservation ob = gaiaObs.get(0); + success &= gaiaGseries == ob.getBand(); + success &= Tolerance.areClose(2456197.5, ob.getJD(), 1e-6, true); + success &= Tolerance.areClose(10.0, ob.getMag(), 1e-6, true); + success &= "GaiaDR2 1951343009975999744".equals(ob.getName()); + success &= JDflavour.BJD == ob.getJDflavour(); + return success; + } + + boolean success = 3 == gaiaObs.size(); + success &= SeriesType.Johnson_V == gaiaObs.get(0).getBand(); + success &= SeriesType.Cousins_R == gaiaObs.get(1).getBand(); + success &= SeriesType.Cousins_I == gaiaObs.get(2).getBand(); + for (ValidObservation ob : gaiaObs) { + success &= ob.isTransformed(); + success &= Tolerance.areClose(2456197.5, ob.getJD(), 1e-6, true); + } + return success; + } + } diff --git a/plugin/src/org/aavso/tools/vstar/external/lib/ZTFObSourceBase.java b/plugin/src/org/aavso/tools/vstar/external/lib/ZTFObSourceBase.java index 7d5369dce..290c6349e 100644 --- a/plugin/src/org/aavso/tools/vstar/external/lib/ZTFObSourceBase.java +++ b/plugin/src/org/aavso/tools/vstar/external/lib/ZTFObSourceBase.java @@ -19,8 +19,11 @@ import java.awt.Color; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Locale; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -42,6 +45,7 @@ import org.aavso.tools.vstar.exception.ObservationValidationError; import org.aavso.tools.vstar.input.AbstractObservationRetriever; import org.aavso.tools.vstar.plugin.ObservationSourcePluginBase; +import org.aavso.tools.vstar.util.Tolerance; /** * @@ -321,4 +325,49 @@ public String getSourceType() { } } + @Override + public Boolean test() { + setTestMode(true); + + String[] lines = { + "oid\thjd\tmag\tmagerr\tcatflags\tfiltercode\texptime\tairmass\n", + "12345\t2458000.5\t12.5\t0.01\t0\tzg\t30\t1.2\n" }; + + boolean success = true; + + try { + StringBuffer content = new StringBuffer(); + for (String line : lines) { + content.append(line); + } + InputStream in = new ByteArrayInputStream(content.toString().getBytes()); + List streams = new ArrayList(); + streams.add(in); + setInputInfo(streams, "ZTF test"); + + ZTFFormatRetriever retriever = new ZTFFormatRetriever(); + retriever.getNumberOfRecords(); + retriever.retrieveObservations(); + + List ztfObs = retriever.getValidObservations(); + success &= 1 == ztfObs.size(); + + ValidObservation ob = ztfObs.get(0); + success &= "12345".equals(ob.getName()); + success &= Tolerance.areClose(2458000.5, ob.getJD(), 1e-6, true); + success &= Tolerance.areClose(12.5, ob.getMag(), 1e-6, true); + success &= Tolerance.areClose(0.01, ob.getMagnitude().getUncertainty(), 1e-6, true); + success &= ztfgSeries == ob.getBand(); + success &= JDflavour.HJD == ob.getJDflavour(); + success &= String.format(Locale.ENGLISH, "ZTF object %s", "12345") + .equals(retriever.getSourceName()); + } catch (Exception e) { + success = false; + } finally { + setTestMode(false); + } + + return success; + } + } diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/FlexibleTextFileFormatObservationSource.java b/plugin/src/org/aavso/tools/vstar/external/plugin/FlexibleTextFileFormatObservationSource.java index a94db25c3..302991222 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/FlexibleTextFileFormatObservationSource.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/FlexibleTextFileFormatObservationSource.java @@ -884,4 +884,42 @@ private boolean isNullOrEmpty(String s) { } } + + @Override + public Boolean test() { + setTestMode(true); + String[] lines = { + "#FIELDS=time,mag,magerr\n", + "#DELIM=comma\n", + "#DATE=JD\n", + "2450000,5.0,0.01\n" }; + + boolean success = true; + try { + StringBuffer content = new StringBuffer(); + for (String line : lines) { + content.append(line); + } + java.io.InputStream in = new java.io.ByteArrayInputStream(content.toString().getBytes()); + java.util.List streams = new java.util.ArrayList(); + streams.add(in); + setInputInfo(streams, "flex test"); + + AbstractObservationRetriever retriever = getObservationRetriever(); + retriever.getNumberOfRecords(); + retriever.retrieveObservations(); + + success &= 1 == retriever.getValidObservations().size(); + ValidObservation ob = retriever.getValidObservations().get(0); + success &= 2450000 == ob.getJD(); + success &= 5.0 == ob.getMag(); + success &= 0.01 == ob.getMagnitude().getUncertainty(); + success &= JDflavour.JD == ob.getJDflavour(); + } catch (Exception e) { + success = false; + } finally { + setTestMode(false); + } + return success; + } } \ No newline at end of file diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/HipparcosObservationSource.java b/plugin/src/org/aavso/tools/vstar/external/plugin/HipparcosObservationSource.java index 0b490f24b..d52c388fa 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/HipparcosObservationSource.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/HipparcosObservationSource.java @@ -30,6 +30,7 @@ import org.aavso.tools.vstar.input.AbstractObservationRetriever; import org.aavso.tools.vstar.plugin.InputType; import org.aavso.tools.vstar.plugin.ObservationSourcePluginBase; +import org.aavso.tools.vstar.util.Tolerance; //12/02/2018 C. Kotnik added name to observations so they can be //saved and reloaded from a file. /** @@ -209,4 +210,24 @@ private String getNextLine(BufferedReader reader, int lineNum) { return line; } } + + @Override + public Boolean test() { + setTestMode(true); + try { + String[] lines = { "JD\n", "10000|10.0|0|0\n" }; + AbstractObservationRetriever retriever = getTestRetriever(lines, "HIP test"); + if (retriever.getValidObservations().size() != 1) { + return false; + } + ValidObservation ob = retriever.getValidObservations().get(0); + // Epoch field is HT1-style offset: sample 10000 -> BJD 2450000 with this reader + return Tolerance.areClose(2450000.0, ob.getJD(), 1e-6, true) + && Tolerance.areClose(10.0, ob.getMag(), 1e-6, true); + } catch (Exception e) { + return false; + } finally { + setTestMode(false); + } + } } diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/JulianDateObservationsFilter.java b/plugin/src/org/aavso/tools/vstar/external/plugin/JulianDateObservationsFilter.java index 8825fb3d4..fbcea1158 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/JulianDateObservationsFilter.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/JulianDateObservationsFilter.java @@ -17,8 +17,11 @@ */ package org.aavso.tools.vstar.external.plugin; +import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import org.aavso.tools.vstar.data.Magnitude; import org.aavso.tools.vstar.data.ValidObservation; import org.aavso.tools.vstar.data.ValidObservation.JDflavour; import org.aavso.tools.vstar.plugin.CustomFilterPluginBase; @@ -55,4 +58,34 @@ public String getDocName() { return "https://github.com/AAVSO/VStar/wiki/Custom-Filter-Plug%E2%80%90ins#julian-date-observations-filter"; } + @Override + public Boolean test() { + setTestMode(true); + + List obs = new ArrayList(); + + ValidObservation jdOb = new ValidObservation(); + jdOb.setJD(2450000); + jdOb.setMagnitude(new Magnitude(5, 0)); + jdOb.setJDflavour(JDflavour.JD); + obs.add(jdOb); + + ValidObservation bjdOb = new ValidObservation(); + bjdOb.setJD(2450001); + bjdOb.setMagnitude(new Magnitude(6, 0)); + bjdOb.setJDflavour(JDflavour.BJD); + obs.add(bjdOb); + + filteredObs = new LinkedHashSet(); + Pair idPair = filter(obs); + + boolean success = filteredObs.size() == 1; + success &= filteredObs.contains(jdOb); + success &= "Julian Date Observations".equals(idPair.first); + success &= "Julian Date Observations".equals(idPair.second); + + setTestMode(false); + return success; + } + } diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/KeplerFITSObservationSource.java b/plugin/src/org/aavso/tools/vstar/external/plugin/KeplerFITSObservationSource.java index 9127639ae..a03bbda8e 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/KeplerFITSObservationSource.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/KeplerFITSObservationSource.java @@ -19,6 +19,8 @@ import java.awt.Color; import java.awt.Container; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -30,7 +32,10 @@ import javax.swing.JRadioButton; import org.aavso.tools.vstar.data.SeriesType; +import org.aavso.tools.vstar.data.ValidObservation; +import org.aavso.tools.vstar.external.lib.FitsTestData; import org.aavso.tools.vstar.external.lib.TESSObservationRetrieverBase; +import org.aavso.tools.vstar.util.Tolerance; import org.aavso.tools.vstar.input.AbstractObservationRetriever; import org.aavso.tools.vstar.plugin.InputType; import org.aavso.tools.vstar.plugin.ObservationSourcePluginBase; @@ -155,6 +160,10 @@ public List getAdditionalFileExtensions() { @Override public AbstractObservationRetriever getObservationRetriever() { + if (inTestMode()) { + loadRawData = false; + return new KeplerFITSObservationRetriever(loadRawData); + } // Dialog moved from retrieveObservations() where it invoked from non-UI thread // to this more natural place. // No annoying "No observations for the specified period" messages. @@ -382,5 +391,34 @@ protected void okAction() { } } } + + @Override + public Boolean test() { + setTestMode(true); + boolean success = true; + try { + byte[] fitsBytes = FitsTestData.createKeplerArchiveFits(); + InputStream in = new ByteArrayInputStream(fitsBytes); + List streams = new ArrayList(); + streams.add(in); + setInputInfo(streams, "kepler test"); + + KeplerFITSObservationRetriever retriever = new KeplerFITSObservationRetriever(false); + retriever.getNumberOfRecords(); + retriever.retrieveObservations(); + + List obs = retriever.getValidObservations(); + success &= 1 == obs.size(); + ValidObservation ob = obs.get(0); + success &= dataSeriesKepler == ob.getBand(); + success &= Tolerance.areClose(2454833.5, ob.getJD(), 1e-4, true); + success &= "TEST".equals(ob.getName()); + } catch (Exception e) { + success = false; + } finally { + setTestMode(false); + } + return success; + } } diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/LightKurveFITSObservationSource.java b/plugin/src/org/aavso/tools/vstar/external/plugin/LightKurveFITSObservationSource.java index fbee93638..a515534ce 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/LightKurveFITSObservationSource.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/LightKurveFITSObservationSource.java @@ -18,14 +18,19 @@ package org.aavso.tools.vstar.external.plugin; import java.awt.Color; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import org.aavso.tools.vstar.data.ValidObservation; import org.aavso.tools.vstar.data.SeriesType; +import org.aavso.tools.vstar.external.lib.FitsTestData; import org.aavso.tools.vstar.external.lib.TESSObservationRetrieverBase; import org.aavso.tools.vstar.input.AbstractObservationRetriever; import org.aavso.tools.vstar.plugin.InputType; import org.aavso.tools.vstar.plugin.ObservationSourcePluginBase; +import org.aavso.tools.vstar.util.Tolerance; import nom.tam.fits.BasicHDU; import nom.tam.fits.BinaryTableHDU; @@ -179,4 +184,33 @@ public String getSourceType() { } + @Override + public Boolean test() { + setTestMode(true); + boolean success = true; + try { + byte[] fitsBytes = FitsTestData.createLightKurveKeplerFits(); + InputStream in = new ByteArrayInputStream(fitsBytes); + List streams = new ArrayList(); + streams.add(in); + setInputInfo(streams, "lk test"); + + LightKurveFITSObservationRetriever retriever = new LightKurveFITSObservationRetriever(); + retriever.getNumberOfRecords(); + retriever.retrieveObservations(); + + List obs = retriever.getValidObservations(); + success &= 1 == obs.size(); + ValidObservation ob = obs.get(0); + success &= dataSeriesLightKurveKepler == ob.getBand(); + success &= Tolerance.areClose(2454833.5, ob.getJD(), 1e-4, true); + success &= "TEST".equals(ob.getName()); + } catch (Exception e) { + success = false; + } finally { + setTestMode(false); + } + return success; + } + } \ No newline at end of file diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/NSVSObservationSource.java b/plugin/src/org/aavso/tools/vstar/external/plugin/NSVSObservationSource.java index 472c75843..65e8e5774 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/NSVSObservationSource.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/NSVSObservationSource.java @@ -168,4 +168,27 @@ private boolean isEmpty(String str) { return str != null && "".equals(str.trim()); } } + + @Override + public Boolean test() { + setTestMode(true); + String[] lines = { + "MJD-50000\tmag\tmagerr\tflags\n", + "1000\t10.0\t0.01\t0\n" }; + + boolean success = true; + try { + AbstractObservationRetriever retriever = getTestRetriever(lines, "NSVS test"); + success &= 1 == retriever.getValidObservations().size(); + ValidObservation ob = retriever.getValidObservations().get(0); + success &= 2451000.5 == ob.getJD(); + success &= 10.0 == ob.getMag(); + success &= 0.01 == ob.getMagnitude().getUncertainty(); + } catch (Exception e) { + success = false; + } finally { + setTestMode(false); + } + return success; + } } diff --git a/plugin/src/org/aavso/tools/vstar/external/plugin/VeLaObservationTransformer.java b/plugin/src/org/aavso/tools/vstar/external/plugin/VeLaObservationTransformer.java index 9376579c1..03effd7b1 100644 --- a/plugin/src/org/aavso/tools/vstar/external/plugin/VeLaObservationTransformer.java +++ b/plugin/src/org/aavso/tools/vstar/external/plugin/VeLaObservationTransformer.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.Set; +import org.aavso.tools.vstar.data.DateInfo; import org.aavso.tools.vstar.data.Magnitude; import org.aavso.tools.vstar.data.SeriesType; import org.aavso.tools.vstar.data.ValidObservation; @@ -205,6 +206,10 @@ public boolean canBeRemoved() { * button was clicked and the VeLa code string. */ private Pair invokeDialog(VeLaInterpreter vela) { + if (inTestMode()) { + return new Pair(true, "do() : list { [magnitude + 1 uncertainty] }"); + } + VeLaDialog velaDialog = new VeLaDialog("Define VeLa function: do():list"); boolean ok = !velaDialog.isCancelled(); @@ -212,4 +217,61 @@ private Pair invokeDialog(VeLaInterpreter vela) { return new Pair(ok, code); } + + @Override + public Boolean test() { + setTestMode(true); + + ValidObservation ob = new ValidObservation(); + ob.setDateInfo(new DateInfo(2450000)); + ob.setMagnitude(new Magnitude(5.0, 0.01)); + ob.setBand(SeriesType.Visual); + + TestSeriesInfo provider = new TestSeriesInfo(ob); + IUndoableAction action = createAction(provider, provider.getVisibleSeries()); + + boolean success = action.execute(UndoableActionType.DO); + success &= 6.0 == ob.getMag(); + success &= 0.01 == ob.getMagnitude().getUncertainty(); + + setTestMode(false); + return success; + } + + private static class TestSeriesInfo implements ISeriesInfoProvider { + private final Set series; + private final List obs; + + TestSeriesInfo(ValidObservation ob) { + series = new java.util.HashSet(); + series.add(SeriesType.Visual); + obs = new ArrayList(); + obs.add(ob); + } + + @Override + public Set getVisibleSeries() { + return series; + } + + @Override + public int getSeriesCount() { + return series.size(); + } + + @Override + public Set getSeriesKeys() { + return series; + } + + @Override + public boolean seriesExists(SeriesType type) { + return series.contains(type); + } + + @Override + public List getObservations(SeriesType type) { + return obs; + } + } } diff --git a/plugin/test/org/aavso/tools/vstar/external/lib/ConvertHelperTest.java b/plugin/test/org/aavso/tools/vstar/external/lib/ConvertHelperTest.java new file mode 100644 index 000000000..e82dd4213 --- /dev/null +++ b/plugin/test/org/aavso/tools/vstar/external/lib/ConvertHelperTest.java @@ -0,0 +1,94 @@ +/** + * VStar: a statistical analysis tool for variable star data. + * Copyright (C) 2009 AAVSO (http://www.aavso.org/) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.aavso.tools.vstar.external.lib; + +import java.net.InetSocketAddress; +import java.util.Arrays; +import java.util.List; + +import org.aavso.tools.vstar.ui.mediator.StarInfo; +import org.aavso.tools.vstar.util.Pair; +import org.aavso.tools.vstar.util.coords.DecInfo; +import org.aavso.tools.vstar.util.coords.EpochType; +import org.aavso.tools.vstar.util.coords.RAInfo; + +import com.sun.net.httpserver.HttpServer; + +import junit.framework.TestCase; + +/** + * Unit tests for {@link ConvertHelper}. + */ +public class ConvertHelperTest extends TestCase { + + private String savedLocalServiceUrl; + + public ConvertHelperTest(String name) { + super(name); + } + + @Override + protected void setUp() { + savedLocalServiceUrl = ConvertHelper.localServiceURLstring; + } + + @Override + protected void tearDown() { + ConvertHelper.localServiceURLstring = savedLocalServiceUrl; + } + + public void testGetCoordinatesWhenPresent() { + RAInfo ra = new RAInfo(EpochType.J2000, 45.0); + DecInfo dec = new DecInfo(EpochType.J2000, 30.0); + StarInfo info = new StarInfo(null, "Test Star", null, null, null, null, null, null, ra, dec, null); + + Pair coords = ConvertHelper.getCoordinates(info); + + assertNotNull(coords); + assertSame(ra, coords.first); + assertSame(dec, coords.second); + } + + public void testAstroutilsUrlTemplate() { + assertTrue(ConvertHelper.URL_TEMPLATE.startsWith(ConvertHelper.ASTROUTILS_URL)); + assertTrue(ConvertHelper.URL_TEMPLATE.contains("FUNCTION=%s")); + } + + public void testGetConvertedListOfTimesLocalService() throws Exception { + HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + int port = server.getAddress().getPort(); + server.createContext("/convert", exchange -> { + byte[] response = "{\"bjd_tdb\":[2458001.5,2458002.5]}".getBytes("UTF-8"); + exchange.getResponseHeaders().add("Content-Type", "application/json"); + exchange.sendResponseHeaders(200, response.length); + exchange.getResponseBody().write(response); + exchange.close(); + }); + server.start(); + try { + ConvertHelper.localServiceURLstring = "http://127.0.0.1:" + port + "/convert"; + List times = Arrays.asList(2458000.0, 2458001.0); + List out = ConvertHelper.getConvertedListOfTimes(times, 45.0, 30.0, "utc2bjd"); + assertEquals(2, out.size()); + assertEquals(2458001.5, out.get(0), 1e-9); + assertEquals(2458002.5, out.get(1), 1e-9); + } finally { + server.stop(0); + } + } +} diff --git a/plugin/test/org/aavso/tools/vstar/external/plugin/AllTests.java b/plugin/test/org/aavso/tools/vstar/external/plugin/AllTests.java index b614cd4e8..8263c1104 100644 --- a/plugin/test/org/aavso/tools/vstar/external/plugin/AllTests.java +++ b/plugin/test/org/aavso/tools/vstar/external/plugin/AllTests.java @@ -20,6 +20,8 @@ import java.util.Locale; +import org.aavso.tools.vstar.external.lib.ConvertHelperTest; + import junit.framework.Test; import junit.framework.TestSuite; @@ -33,7 +35,9 @@ public static Test suite() { // $JUnit-BEGIN$ suite.addTestSuite(PluginTest.class); - suite.addTestSuite(PiecewiseLinearModelTest.class); + suite.addTestSuite(PiecewiseLinearModelTest.class); + suite.addTestSuite(ConvertHelperTest.class); + suite.addTestSuite(HipparcosLoadTest.class); // $JUnit-END$ return suite; diff --git a/plugin/test/org/aavso/tools/vstar/external/plugin/HipparcosLoadTest.java b/plugin/test/org/aavso/tools/vstar/external/plugin/HipparcosLoadTest.java new file mode 100644 index 000000000..0f0fa6924 --- /dev/null +++ b/plugin/test/org/aavso/tools/vstar/external/plugin/HipparcosLoadTest.java @@ -0,0 +1,30 @@ +package org.aavso.tools.vstar.external.plugin; + +import org.aavso.tools.vstar.data.ValidObservation; +import org.aavso.tools.vstar.input.AbstractObservationRetriever; +import org.aavso.tools.vstar.util.Tolerance; + +import junit.framework.TestCase; + +/** + * Loads Hipparcos sample data via {@link ObservationSourcePluginBase#getTestRetriever}. + */ +public class HipparcosLoadTest extends TestCase { + + private static class HipparcosTestAccess extends HipparcosObservationSource { + AbstractObservationRetriever load(String[] lines) throws Exception { + return getTestRetriever(lines, "HIP"); + } + } + + public void testLoadSampleLine() throws Exception { + HipparcosTestAccess plugin = new HipparcosTestAccess(); + AbstractObservationRetriever retriever = plugin + .load(new String[] { "JD\n", "10000|10.0|0|0\n" }); + assertEquals(0, retriever.getInvalidObservations().size()); + assertEquals(1, retriever.getValidObservations().size()); + ValidObservation ob = retriever.getValidObservations().get(0); + assertTrue(Tolerance.areClose(2450000.0, ob.getJD(), 1e-6, true)); + assertTrue(Tolerance.areClose(10.0, ob.getMag(), 1e-6, true)); + } +} diff --git a/plugin/test/org/aavso/tools/vstar/external/plugin/PiecewiseLinearModelTest.java b/plugin/test/org/aavso/tools/vstar/external/plugin/PiecewiseLinearModelTest.java index c9f25d9c9..2b5e661d7 100644 --- a/plugin/test/org/aavso/tools/vstar/external/plugin/PiecewiseLinearModelTest.java +++ b/plugin/test/org/aavso/tools/vstar/external/plugin/PiecewiseLinearModelTest.java @@ -23,6 +23,8 @@ import org.aavso.tools.vstar.data.DateInfo; import org.aavso.tools.vstar.data.Magnitude; import org.aavso.tools.vstar.data.ValidObservation; +import org.aavso.tools.vstar.exception.AlgorithmError; +import org.aavso.tools.vstar.external.lib.PiecewiseLinearModel; import org.aavso.tools.vstar.external.lib.PiecewiseLinearModel.LinearFunction; import org.aavso.tools.vstar.external.lib.PiecewiseLinearModel.PiecewiseLinearFunction; import org.aavso.tools.vstar.ui.model.plot.JDCoordSource; @@ -50,6 +52,17 @@ public void testLinearFunction() { assertTrue(Tolerance.areClose(m * 2459642 + function.yIntercept(), function.value(2459642), DELTA, true)); } + public void testPiecewiseLinearModelExecute() throws AlgorithmError { + List meanObs = getTestMeanObs(); + List obs = getTestObs(); + + PiecewiseLinearModel model = new PiecewiseLinearModel(obs, meanObs); + model.execute(); + + assertEquals(obs.size(), model.getFit().size()); + assertEquals(obs.size(), model.getResiduals().size()); + } + public void testPiecewiseLinearFunction() { double DELTA = 1e-6;