package gdsc.smlm.ij.plugins; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import org.apache.commons.math3.random.RandomGenerator; import org.apache.commons.math3.random.Well19937c; import org.junit.Assert; import org.junit.Test; import gdsc.core.ij.Utils; import gdsc.smlm.ij.plugins.ConfigurationTemplate.TemplateResource; import gdsc.smlm.ij.settings.GlobalSettings; import ij.IJ; import ij.ImagePlus; import ij.process.FloatProcessor; public class ConfigurationTemplateTest { @Test public void canLoadResourceTemplates() { canLoadResourceTemplates(true, true); } @Test public void canLoadAllMandatoryResourceTemplates() { canLoadResourceTemplates(true, false); } @Test public void canLoadAllOptionalResourceTemplates() { canLoadResourceTemplates(false, true); } private void canLoadResourceTemplates(boolean loadMandatory, boolean loadOptional) { ConfigurationTemplate.clearTemplates(); // Load others if (loadMandatory ^ loadOptional) { TemplateResource[] templates = ConfigurationTemplate.listTemplates(!loadMandatory, !loadOptional); ConfigurationTemplate.loadTemplates(templates); } String[] before = ConfigurationTemplate.getTemplateNames(false); TemplateResource[] templates = ConfigurationTemplate.listTemplates(loadMandatory, loadOptional); ConfigurationTemplate.loadTemplates(templates); String[] after = ConfigurationTemplate.getTemplateNames(false); checkLoaded(String.format("Mandatory=%b, Optional=%b", loadMandatory, loadOptional), templates, before, after); } private void checkLoaded(String test, TemplateResource[] templates, String[] before, String[] after) { // Subtract the before from the after HashSet<String> set = new HashSet<String>(Arrays.asList(after)); set.removeAll(Arrays.asList(before)); Assert.assertEquals("Loaded incorrect number", set.size(), templates.length); // Check all have been loaded for (TemplateResource template : templates) { if (set.contains(template.name)) { System.out.println(test + " loaded: " + template); continue; } Assert.assertTrue(test + " could not load: " + template, false); } } @Test public void canListTemplateNameInOrder() { ConfigurationTemplate.clearTemplates(); String[] names = new String[10]; for (int i = 0; i < names.length; i++) { String name = "Test" + i; names[i] = name; ConfigurationTemplate.saveTemplate(name, new GlobalSettings(), null); } Assert.assertArrayEquals(names, ConfigurationTemplate.getTemplateNames()); } @Test public void canLoadTemplateImageFromFile() throws IOException { ConfigurationTemplate.clearTemplates(); Assert.assertEquals(0, ConfigurationTemplate.getTemplateNamesWithImage().length); // Create a dummy image int size = 20; float[] pixels = new float[size * size]; RandomGenerator r = new Well19937c(); for (int i = pixels.length; i-- > 0;) pixels[i] = r.nextFloat(); ImagePlus imp = new ImagePlus("test", new FloatProcessor(size, size, pixels)); File tmpFile = File.createTempFile("tmp", ".tif"); tmpFile.deleteOnExit(); IJ.save(imp, tmpFile.getPath()); String name = "canLoadTemplateImageFromFile"; File file = new File(Utils.replaceExtension(tmpFile.getPath(), ".xml")); ConfigurationTemplate.saveTemplate(name, new GlobalSettings(), file); Assert.assertEquals(1, ConfigurationTemplate.getTemplateNamesWithImage().length); ImagePlus imp2 = ConfigurationTemplate.getTemplateImage(name); Assert.assertNotNull(imp2); float[] data = (float[]) imp2.getProcessor().toFloat(0, null).getPixels(); Assert.assertArrayEquals(pixels, data, 0); } @Test public void canLoadTemplateImageFromResources() throws IOException { // This test requires that the system resources does have at least one template with an image ConfigurationTemplate.clearTemplates(); ConfigurationTemplate.loadTemplates(ConfigurationTemplate.listTemplates(true, true)); String[] names = ConfigurationTemplate.getTemplateNamesWithImage(); if (names.length == 0) return; ImagePlus imp2 = ConfigurationTemplate.getTemplateImage(names[0]); Assert.assertNotNull(imp2); float[] data = (float[]) imp2.getProcessor().toFloat(0, null).getPixels(); // Check data is not zero for (int i = 0; i < data.length; i++) { if (data[i] != 0) { // Check another pixel is different for (int j = i + 1; j < data.length; j++) { if (data[i] != data[j]) return; } } } Assert.fail("Data is invalid"); } }