/*- * Copyright 2015 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.peakfinding; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.eclipse.dawnsci.analysis.api.peakfinding.IPeakFinderParameter; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import uk.ac.diamond.scisoft.analysis.peakfinding.peakfinders.DummyPeakFinder; import uk.ac.diamond.scisoft.analysis.peakfinding.peakfinders.PeakFinderParameter; public class PeakFindingDataTest { private static IPeakFindingService peakFindServ; private IPeakFindingData peakFindData; private String dummyID = DummyPeakFinder.class.getName(); @BeforeClass public static void setupNonOSGiService() throws Exception { peakFindServ = (IPeakFindingService)Activator.getService(IPeakFindingService.class); //Grab the all the PeakFinders in u.a.d.s.a.peakfinding.peakfinders peakFindServ.addPeakFindersByClass(peakFindServ.getClass().getClassLoader(), "uk.ac.diamond.scisoft.analysis.peakfinding.peakfinders"); } @Before public void createPeakFindData() { peakFindData = new PeakFindingData(peakFindServ); } @After public void disposePeakFindData() { peakFindData = null; } @Rule public ExpectedException thrower = ExpectedException.none(); @Test public void testActivateDeactivatePeakFinders() throws Exception { //Resources for test boolean gotDummy; assertFalse(peakFindData.hasActivePeakFinders()); peakFindData.activatePeakFinder(dummyID); gotDummy = searchForPFID(dummyID); assertTrue(gotDummy); assertTrue(peakFindData.hasActivePeakFinders()); peakFindData.deactivatePeakFinder(dummyID); gotDummy = searchForPFID(dummyID); assertFalse(gotDummy); assertFalse(peakFindData.hasActivePeakFinders()); } private boolean searchForPFID(String pfID) { boolean gotPFID = false; Set<String> activePFs = (Set<String>) peakFindData.getActivePeakFinders(); Iterator<String> pfIter = activePFs.iterator(); while (pfIter.hasNext()) { String currID = pfIter.next(); if (currID.equals(pfID)) gotPFID = true; } return gotPFID; } @Test public void testHasData() throws Exception { //No data assertFalse(peakFindData.hasData()); //Only xData set peakFindData.setData(DatasetFactory.createRange(0, 10, 1, Dataset.FLOAT32), null); assertFalse(peakFindData.hasData()); //yData initialised to 0 length dataset peakFindData.setData(DatasetFactory.createRange(0, 10, 1, Dataset.FLOAT32), DatasetFactory.zeros(new int[]{0}, Dataset.FLOAT32)); assertFalse(peakFindData.hasData()); //Should be correct peakFindData.setData(DatasetFactory.createRange(0, 10, 1, Dataset.FLOAT32), DatasetFactory.createRange(0, 10, 1, Dataset.FLOAT32)); assertTrue(peakFindData.hasData()); } @Test public void testGetPeakFinderParameters() throws Exception { peakFindData.activatePeakFinder(dummyID); //Test getting all the parameters Map<String, Map<String,IPeakFinderParameter>> allPFParams = peakFindData.getAllPFParameters(); assertTrue(allPFParams.containsKey(dummyID)); Map<String,IPeakFinderParameter> dummyPFParams = allPFParams.get(dummyID); assertTrue(dummyPFParams.containsKey("testParamA")); IPeakFinderParameter currParam = dummyPFParams.get("testParamA"); assertEquals(currParam.getValue(), 123.456); assertTrue(dummyPFParams.containsKey("testParamB")); //Test getting parameter by name Number namedParamValue = peakFindData.getPFParameterValueByName(dummyID, "testParamB"); assertEquals(namedParamValue, 123); } @Test public void testSetPeakFinderParameters() throws Exception { peakFindData.activatePeakFinder(dummyID); //Set all the parameters at once Map<String, IPeakFinderParameter> newpfParams = new TreeMap<String, IPeakFinderParameter>(); Set<String> pfParamNames = peakFindData.getPFParameterNamesByPeakFinder(dummyID); assertEquals(pfParamNames.size(), 2); List<Number> pfNewParamValues = new ArrayList<Number>(Arrays.asList(654.321, 321)); Iterator<String> pfParamNamesIter = pfParamNames.iterator(); Iterator<Number> pfNewParamValuesIter = pfNewParamValues.iterator(); while (pfParamNamesIter.hasNext()) { String currParamName = pfParamNamesIter.next(); Number currParamValue = pfNewParamValuesIter.next(); Boolean currParamIsInt = peakFindData.getPFParameterIsIntByName(dummyID, currParamName); newpfParams.put(currParamName, new PeakFinderParameter(currParamName, currParamIsInt, currParamValue)); } peakFindData.setPFParametersByPeakFinder(dummyID, newpfParams); Map<String, IPeakFinderParameter> dummyPFParams = peakFindData.getPFParametersByPeakFinder(dummyID); assertEquals(654.321, dummyPFParams.get("testParamA").getValue()); assertEquals(321, dummyPFParams.get("testParamB").getValue()); peakFindData.setPFParameterByName(dummyID, "testParamA", 987.654); Double testParamAVal = (Double)peakFindData.getPFParameterValueByName(dummyID, "testParamA"); assertEquals(testParamAVal, (Double)987.654); } /* * The next tests check exceptions are thrown when IPeakFindingData is not * populated correctly */ @Test public void testUnregisteredPeakFinderException() throws Exception { thrower.expect(NullPointerException.class); thrower.expectMessage("not registered"); peakFindData.activatePeakFinder("badger"); } @Test public void testActivateException() throws Exception { thrower.expect(IllegalArgumentException.class); thrower.expectMessage("already set active"); peakFindData.activatePeakFinder(dummyID); peakFindData.activatePeakFinder(dummyID); } @Test public void testDeactivateException() throws Exception { thrower.expect(IllegalArgumentException.class); thrower.expectMessage("not set active"); peakFindData.deactivatePeakFinder(dummyID); peakFindData.deactivatePeakFinder(dummyID); } @Test public void testNoPFForParamsException() throws Exception { thrower.expect(NullPointerException.class); thrower.expectMessage("never been activated"); peakFindData.getPFParametersByPeakFinder(dummyID+"badger"); } @Test public void testNoParamInPeakFinderException() throws Exception { thrower.expect(NullPointerException.class); thrower.expectMessage("No parameter name "); peakFindData.activatePeakFinder(dummyID); peakFindData.getPFParameterByName(dummyID, "totallyFakeParameter"); } @Test public void testParameterAsDoubleException() throws Exception { thrower.expect(IllegalArgumentException.class); thrower.expectMessage("should be an Integer"); peakFindData.activatePeakFinder(dummyID); peakFindData.setPFParameterByName(dummyID, "testParamB", 111.222); } /* * The next tests check exceptions are thrown on data which changes * following a PeakFindinService.findPeaks(IPeakFindingData) run */ @Test public void testGetPeaksBeforeFindPeaksException() throws Exception { thrower.expect(NullPointerException.class); thrower.expectMessage("findPeaks"); peakFindData.getPeaks(); } @Test public void testGetPeakByPeakFinderBeforeFindPeaksException() throws Exception { thrower.expect(NullPointerException.class); thrower.expectMessage("findPeaks"); peakFindData.getPeaks(dummyID); } }