diff --git a/src/org/labkey/test/components/domain/DomainFieldRow.java b/src/org/labkey/test/components/domain/DomainFieldRow.java index 5261edb788..03a1d597b1 100644 --- a/src/org/labkey/test/components/domain/DomainFieldRow.java +++ b/src/org/labkey/test/components/domain/DomainFieldRow.java @@ -770,7 +770,7 @@ public DomainFieldRow clickRemoveOntologyConcept() public void setAllowMultipleSelections(Boolean allowMultipleSelections) { WebDriverWrapper.waitFor(() -> elementCache().allowMultipleSelectionsCheckbox.isDisplayed(), - "Allow Multiple Selections checkbox did not become visible", 2000); + "Allow Multiple Selections checkbox did not become visible", 1000); elementCache().allowMultipleSelectionsCheckbox.set(allowMultipleSelections); } diff --git a/src/org/labkey/test/pages/assay/AssayRunsPage.java b/src/org/labkey/test/pages/assay/AssayRunsPage.java index 48f679da12..a90d4f7950 100644 --- a/src/org/labkey/test/pages/assay/AssayRunsPage.java +++ b/src/org/labkey/test/pages/assay/AssayRunsPage.java @@ -113,6 +113,12 @@ public void clickEditAssayDesign() elementCache().manageMenu.doMenuAction("Edit Assay Design"); } + public AssayImportPage clickImportData() + { + clickAndWait(Locator.linkWithText("Import Data")); + return new AssayImportPage(getDriver()); + } + @Override protected ElementCache newElementCache() { diff --git a/src/org/labkey/test/util/data/TestArrayDataUtils.java b/src/org/labkey/test/util/data/TestArrayDataUtils.java index e878d2e790..c11fc3f12a 100644 --- a/src/org/labkey/test/util/data/TestArrayDataUtils.java +++ b/src/org/labkey/test/util/data/TestArrayDataUtils.java @@ -2,11 +2,13 @@ import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; import org.labkey.remoteapi.query.Filter; import java.io.IOException; import java.io.StringReader; +import java.io.StringWriter; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; @@ -45,19 +47,35 @@ public static Map> filterMap(Map map, List isMatch(entry.getValue(), searchValues, filterType)) .collect(Collectors.toMap( Map.Entry::getKey, - e -> e.getValue().stream() - // Standard alphabetical sort that accounts for symbols and numbers. - // But uppercase letters are positioned before lowercase letters. - .sorted(Comparator - .comparing((String s) -> s.substring(0, 1).toLowerCase()) - .thenComparing(s -> s.substring(0, 1)) - .thenComparing(s -> s)) - .collect(Collectors.toList()), + e -> sortValues(e.getValue()), (e1, e2) -> e1, LinkedHashMap::new )); } + /** + * Standard alphabetical sort that accounts for symbols and numbers. + * Uppercase letters are positioned before lowercase letters. + */ + public static List sortValues(List values) + { + return values.stream() + .filter(s -> !s.isEmpty()) + .sorted(Comparator + .comparing((String s) -> s.substring(0, 1).toLowerCase()) + .thenComparing(s -> s.substring(0, 1)) + .thenComparing(s -> s)) + .collect(Collectors.toList()); + } + + /** + * Sorts values alphabetically and joins them with the given separator. + */ + public static String sortAndJoin(List values, String separator) + { + return String.join(separator, sortValues(values)); + } + public static Map prepareMapForCheck(Map> map) { return map.entrySet().stream() @@ -87,6 +105,21 @@ public static List parseMultiValueText(String multiValueString) throws I } } + public static String formatMultiValueText(List values) + { + CSVFormat format = CSVFormat.RFC4180; + StringWriter stringWriter = new StringWriter(); + try (CSVPrinter printer = new CSVPrinter(stringWriter, format)) + { + printer.printRecord(values); + } + catch (IOException e) + { + throw new RuntimeException("Failed to format multi-value text", e); + } + return stringWriter.toString().trim(); + } + private static boolean isMatch(List actualValues, List searchValues, Filter.Operator type) { return switch (type)