/*- ******************************************************************************* * Copyright (c) 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 * * Contributors: * Matthew Dickie - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.dawnsci.nexus.builder.impl; import static org.eclipse.dawnsci.nexus.test.util.NexusAssert.assertNexusTreesEqual; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.List; import org.eclipse.dawnsci.analysis.api.tree.TreeFile; import org.eclipse.dawnsci.hdf5.nexus.NexusFileFactoryHDF5; import org.eclipse.dawnsci.nexus.INexusFileFactory; import org.eclipse.dawnsci.nexus.NXobject; import org.eclipse.dawnsci.nexus.NexusException; import org.eclipse.dawnsci.nexus.ServiceHolder; import org.eclipse.dawnsci.nexus.TestUtils; import org.eclipse.dawnsci.nexus.builder.NexusBuilderFactory; import org.eclipse.dawnsci.nexus.builder.NexusEntryBuilder; import org.eclipse.dawnsci.nexus.builder.NexusEntryModification; import org.eclipse.dawnsci.nexus.builder.NexusFileBuilder; import org.eclipse.dawnsci.nexus.builder.NexusScanFile; import org.eclipse.dawnsci.nexus.test.util.NexusTestUtils; import org.eclipse.january.dataset.ILazyDataset; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public abstract class AbstractNexusFileBuilderTestBase { @Parameters(name="{index}: async={0}") public static Object[] data() { return new Object[] {true, false}; } @Parameter public boolean async; public static final String TEST_FILE_FOLDER = "testfiles/dawnsci/data/nexus/"; private static String testScratchDirectoryName; private String filePath; private String comparisonFilePath; private boolean pluginTest = false; private NexusBuilderFactory nexusBuilderFactory = null; @Before public void setUp() throws Exception { nexusBuilderFactory = getNexusBuilderFactory(); final String testClassName = getTestClassName(); String s = async ? "Async" : "Sync"; testScratchDirectoryName = TestUtils.generateDirectorynameFromClassname(testClassName) + s + "/"; TestUtils.makeScratchDirectory(testScratchDirectoryName); filePath = testScratchDirectoryName + getFilename(); comparisonFilePath = TEST_FILE_FOLDER + getFilename(); ServiceHolder.setNexusFileFactory(new NexusFileFactoryHDF5()); } protected NexusBuilderFactory getNexusBuilderFactory() { return new DefaultNexusBuilderFactory(); // overridden by plugin tests } protected INexusFileFactory getNexusFileFactory() { return new NexusFileFactoryHDF5(); // overridden by plugin tests } protected abstract String getTestClassName(); public void setPluginTest(boolean pluginTest) { this.pluginTest = pluginTest; } public boolean isPluginTest() { return pluginTest; } protected abstract String getFilename(); protected void checkNexusBuilderFactory(NexusBuilderFactory nexusBuilderFactory) { // do nothing, subclasses may override } @Test public void testBuildNexusFile() throws Exception { checkNexusBuilderFactory(nexusBuilderFactory); final NexusFileBuilder fileBuilder = nexusBuilderFactory.newNexusFileBuilder(filePath); final NexusEntryBuilder entryBuilder = fileBuilder.newEntry(); entryBuilder.addDefaultGroups(); List<NexusEntryModification> treeModifications = getNexusTreeModifications(); entryBuilder.modifyEntry(treeModifications); configureEntryModel(entryBuilder); addDataBuilder(entryBuilder); addApplicationDefinitions(entryBuilder); // save the nexus file NexusScanFile scanFile = fileBuilder.createFile(async); scanFile.openToWrite(); // compare with file in repository final TreeFile actualNexusTree = fileBuilder.getNexusTree(); TreeFile expectedNexusTree = NexusTestUtils.loadNexusFile(comparisonFilePath, true); assertNexusTreesEqual(expectedNexusTree, actualNexusTree); scanFile.close(); } protected void configureEntryModel(NexusEntryBuilder nexusEntryModel) throws NexusException { // do nothing, subclasses may override } protected void addApplicationDefinitions(NexusEntryBuilder nexusEntryModel) throws NexusException { // do nothing, subclasses may override } protected abstract List<NexusEntryModification> getNexusTreeModifications(); protected abstract void addDataBuilder(NexusEntryBuilder entryBuilder) throws NexusException; protected void assertNumChildNodes(NXobject parentNode, int numGroupNodes, int numDataNodes) { assertEquals(numGroupNodes, parentNode.getNumberOfGroupNodes()); assertEquals(numDataNodes, parentNode.getNumberOfDataNodes()); } protected ILazyDataset getDataset(NXobject group, String name, boolean loadedFromDisk) { if (loadedFromDisk) { return group.getDataset(name); } return group.getLazyWritableDataset(name); } protected void checkWriteableDataset(NXobject group, String name, int expectedRank, Class<?> expectedElementClass, boolean loadedFromDisk) { ILazyDataset dataset = getDataset(group, name, loadedFromDisk); assertNotNull(dataset); assertEquals(expectedRank, dataset.getRank()); assertEquals(expectedElementClass, dataset.getElementClass()); } }