From 25cef4b0e52e3572f233713c83fdbedc3a4aa96b Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Thu, 19 Aug 2010 12:08:09 +0000 Subject: [PATCH] LMS-1707 refactoring: replace 'name' in places where label and code is used, FeatureTableBuilderTest added SVN: 17531 --- .../generic/server/FeatureTableBuilder.java | 13 +- .../server/TabularDataGraphServlet.java | 2 +- ...mageAnalysisMergedRowsReportingPlugin.java | 6 +- .../server/DssServiceRpcScreening.java | 2 +- .../server/FeatureTableBuilderTest.java | 204 ++++++++++++++++++ 5 files changed, 216 insertions(+), 11 deletions(-) create mode 100644 screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilderTest.java diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilder.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilder.java index 90f1f322c33..bdc5d700342 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilder.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilder.java @@ -154,16 +154,11 @@ public class FeatureTableBuilder return bundle; } - private CodeAndTitle getCodeAndLabel(final ImgFeatureDefDTO featureDefinition) - { - return new CodeAndTitle(featureDefinition.getCode(), featureDefinition.getLabel()); - } - /** * Returns all feature codes/labels found. If the feature code list in the constructor is not empty the * result will a list where the codes are a subset of this list. */ - public List<CodeAndTitle> getFeatureCodes() + public List<CodeAndTitle> getCodesAndLabels() { return new ArrayList<CodeAndTitle>(featureCodeLabelToIndexMap.keySet()); } @@ -238,4 +233,10 @@ public class FeatureTableBuilder row.setFeatureValues(valueArray); return row; } + + private CodeAndTitle getCodeAndLabel(final ImgFeatureDefDTO featureDefinition) + { + return new CodeAndTitle(featureDefinition.getCode(), featureDefinition.getLabel()); + } + } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java index 1cec3fbd9c1..041b34216ef 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java @@ -84,7 +84,7 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet final FeatureTableBuilder tableBuilder = new FeatureTableBuilder(dao, service); tableBuilder.addFeatureVectorsOfDataSet(dataSetCode); - List<CodeAndTitle> featureNames = tableBuilder.getFeatureCodes(); + List<CodeAndTitle> featureNames = tableBuilder.getCodesAndLabels(); int headerTokensLength = featureNames.size() + 3; headerTokens = new String[headerTokensLength]; headerTokens[0] = WELL_NAME_COLUMN; diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java index b97f743f8e8..2129aa7eaad 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java @@ -85,16 +85,16 @@ public class ImageAnalysisMergedRowsReportingPlugin extends AbstractDatastorePlu String dataSetCode = datasetDescription.getDatasetCode(); featureTableBuilder.addFeatureVectorsOfDataSet(dataSetCode); } - List<CodeAndTitle> featureNames = featureTableBuilder.getFeatureCodes(); + List<CodeAndTitle> codeAndLabels = featureTableBuilder.getCodesAndLabels(); List<FeatureTableRow> rows = featureTableBuilder.createFeatureTableRows(); SimpleTableModelBuilder builder = new SimpleTableModelBuilder(true); builder.addHeader(DATA_SET_CODE_TITLE); builder.addHeader(PLATE_IDENTIFIER_TITLE); builder.addHeader(ROW_TITLE); builder.addHeader(COLUMN_TITLE); - for (CodeAndTitle featureName : featureNames) + for (CodeAndTitle codeAndLabel : codeAndLabels) { - builder.addHeader(featureName.getTitle(), featureName.getCode()); + builder.addHeader(codeAndLabel.getTitle(), codeAndLabel.getCode()); } for (FeatureTableRow row : rows) { diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java index f21722530b8..5168ceb069e 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java @@ -250,7 +250,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements private List<String> getCodes(FeatureTableBuilder builder) { - List<CodeAndTitle> featureCodesAndLabels = builder.getFeatureCodes(); + List<CodeAndTitle> featureCodesAndLabels = builder.getCodesAndLabels(); List<String> codes = new ArrayList<String>(); for (CodeAndTitle codeAndTitle : featureCodesAndLabels) { diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilderTest.java new file mode 100644 index 00000000000..6f742a637c0 --- /dev/null +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/FeatureTableBuilderTest.java @@ -0,0 +1,204 @@ +/* + * Copyright 2010 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.dss.generic.server; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.testng.AssertJUnit; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.CodeAndTitle; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; +import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.Geometry; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.PlateUtils; +import ch.systemsx.cisd.openbis.plugin.screening.shared.dto.PlateFeatureValues; +import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImagingQueryDAO; +import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgContainerDTO; +import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgDatasetDTO; +import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgFeatureDefDTO; +import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgFeatureValuesDTO; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class FeatureTableBuilderTest extends AssertJUnit +{ + private static final int EXPERIMENT_ID = 42; + private static final String DATA_SET_CODE1 = "ds1"; + private static final String DATA_SET_CODE2 = "ds2"; + private static final String DATA_SET_CODE3 = "ds3"; + + private Mockery context; + + private IEncapsulatedOpenBISService service; + + private IImagingQueryDAO dao; + + @BeforeMethod + public void beforeMethod() + { + context = new Mockery(); + service = context.mock(IEncapsulatedOpenBISService.class); + dao = context.mock(IImagingQueryDAO.class); + } + + @AfterMethod + public final void tearDown() + { + // The following line of code should also be called at the end of each test method. + // Otherwise one do not known which test failed. + context.assertIsSatisfied(); + } + + @Test + public void testNoFiltering() + { + prepareAddFeatureVectors(1, null, "<A>a", "<B>b"); + prepareAddFeatureVectors(2, null, "<B>beta", "c"); + prepareAddFeatureVectors(3, null, "<B>b"); + + FeatureTableBuilder builder = createBuilder(); + builder.addFeatureVectorsOfDataSet(DATA_SET_CODE1); + builder.addFeatureVectorsOfDataSet(DATA_SET_CODE2); + builder.addFeatureVectorsOfDataSet(DATA_SET_CODE3); + List<CodeAndTitle> codesAndLabels = builder.getCodesAndLabels(); + List<FeatureTableRow> rows = builder.createFeatureTableRows(); + + assertEquals("[<A> a, <B> b, <B> beta, <C> c]", codesAndLabels.toString()); + assertFeatureTableRow(DATA_SET_CODE1, "A1", "db:/s/S1", "1.5, 11.5, NaN, NaN", rows.get(0)); + assertFeatureTableRow(DATA_SET_CODE1, "A2", "db:/s/S1", "0.5, 10.5, NaN, NaN", rows.get(1)); + assertFeatureTableRow(DATA_SET_CODE2, "A1", "db:/s/S2", "NaN, NaN, 2.5, 12.5", rows.get(2)); + assertFeatureTableRow(DATA_SET_CODE2, "A2", "db:/s/S2", "NaN, NaN, 1.5, 11.5", rows.get(3)); + assertFeatureTableRow(DATA_SET_CODE3, "A1", "db:/s/S3", "NaN, 3.5, NaN, NaN", rows.get(4)); + assertFeatureTableRow(DATA_SET_CODE3, "A2", "db:/s/S3", "NaN, 2.5, NaN, NaN", rows.get(5)); + assertEquals(6, rows.size()); + context.assertIsSatisfied(); + } + + @Test + public void testFiltering() + { + prepareAddFeatureVectors(1, "B", "<A>a", "b"); + prepareAddFeatureVectors(2, "B", "<B>beta", "c"); + prepareAddFeatureVectors(3, "B", "b"); + + FeatureTableBuilder builder = createBuilder("B"); + builder.addFeatureVectorsOfDataSet(DATA_SET_CODE1); + builder.addFeatureVectorsOfDataSet(DATA_SET_CODE2); + builder.addFeatureVectorsOfDataSet(DATA_SET_CODE3); + List<CodeAndTitle> codesAndLabels = builder.getCodesAndLabels(); + List<FeatureTableRow> rows = builder.createFeatureTableRows(); + + assertEquals("[<B> b, <B> beta]", codesAndLabels.toString()); + assertFeatureTableRow(DATA_SET_CODE1, "A1", "db:/s/S1", "11.5, NaN", rows.get(0)); + assertFeatureTableRow(DATA_SET_CODE1, "A2", "db:/s/S1", "10.5, NaN", rows.get(1)); + assertFeatureTableRow(DATA_SET_CODE2, "A1", "db:/s/S2", "NaN, 2.5", rows.get(2)); + assertFeatureTableRow(DATA_SET_CODE2, "A2", "db:/s/S2", "NaN, 1.5", rows.get(3)); + assertFeatureTableRow(DATA_SET_CODE3, "A1", "db:/s/S3", "3.5, NaN", rows.get(4)); + assertFeatureTableRow(DATA_SET_CODE3, "A2", "db:/s/S3", "2.5, NaN", rows.get(5)); + assertEquals(6, rows.size()); + context.assertIsSatisfied(); + } + + private void prepareAddFeatureVectors(final int dataSetID, final String filteredCodeOrNull, + final String... featureCodesAndLabels) + { + context.checking(new Expectations() + { + { + String dataSetCode = "ds" + dataSetID; + one(dao).tryGetDatasetByPermId(dataSetCode); + int containerId = dataSetID + 100; + ImgDatasetDTO dataSet = new ImgDatasetDTO(dataSetCode, null, null, containerId, false); + dataSet.setId(dataSetID); + will(returnValue(dataSet)); + + List<ImgFeatureDefDTO> defs = new ArrayList<ImgFeatureDefDTO>(); + Geometry geometry = Geometry.createFromCartesianDimensions(2, 1); + for (int i = 0; i < featureCodesAndLabels.length; i++) + { + String codeAndLabels = featureCodesAndLabels[i]; + CodeAndTitle codeAndTitle = new CodeAndTitle(codeAndLabels); + String title = codeAndTitle.getTitle(); + String code = codeAndTitle.getCode(); + if (filteredCodeOrNull == null || filteredCodeOrNull.equals(code)) + { + ImgFeatureDefDTO def = new ImgFeatureDefDTO(title, code, title, dataSetID); + def.setId(2 * dataSetID); + defs.add(def); + one(dao).getFeatureValues(def); + PlateFeatureValues values = new PlateFeatureValues(geometry); + values.setForWellLocation(dataSetID + 10 * i + 0.5f, 1, 1); + values.setForWellLocation(dataSetID + 10 * i - 0.5f, 1, 2); + will(returnValue(Arrays.asList(new ImgFeatureValuesDTO(0.0, 0.0, values, def.getId())))); + } + } + one(dao).listFeatureDefsByDataSetId(dataSetID); + will(returnValue(defs)); + + one(dao).getContainerById(containerId); + String samplePermID = "s" + containerId; + will(returnValue(new ImgContainerDTO(samplePermID, geometry.getNumberOfRows(), + geometry.getNumberOfColumns(), EXPERIMENT_ID))); + + one(service).tryToGetSampleIdentifier(samplePermID); + will(returnValue(new SampleIdentifier(new SpaceIdentifier("db", "s"), "S" + dataSetID))); + } + }); + } + + private void assertFeatureTableRow(String expectedDataSetCode, String expectedWell, + String expectedPlate, String expectedValues, FeatureTableRow row) + { + assertEquals(expectedDataSetCode, row.getDataSetCode()); + String rowLetter = + PlateUtils.translateRowNumberIntoLetterCode(row.getWellPosition().getWellRow()); + assertEquals(expectedWell, rowLetter + row.getWellPosition().getWellColumn()); + assertEquals(expectedPlate, row.getPlateIdentifier().toString()); + assertEquals(expectedValues, render(row.getFeatureValuesAsDouble())); + } + + private String render(double[] values) + { + StringBuilder builder = new StringBuilder(); + for (double value : values) + { + if (builder.length() > 0) + { + builder.append(", "); + } + builder.append(value); + } + return builder.toString(); + } + + private FeatureTableBuilder createBuilder(String... featureCodes) + { + return new FeatureTableBuilder(Arrays.asList(featureCodes), dao, service); + } + +} -- GitLab