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