diff --git a/src/org/labkey/test/tests/component/GridPanelViewTest.java b/src/org/labkey/test/tests/component/GridPanelViewTest.java index 06f0ea3466..8cb9b1f3aa 100644 --- a/src/org/labkey/test/tests/component/GridPanelViewTest.java +++ b/src/org/labkey/test/tests/component/GridPanelViewTest.java @@ -79,7 +79,8 @@ public class GridPanelViewTest extends GridPanelBaseTest private static final String COL_STRING2 = "Str2"; private static final String COL_INT = "Int"; private static final String COL_BOOL = "Bool"; - public static final List TEXT_MULTI_CHOICE_LIST = randomTextChoice(10); + // Excluded semicolon due to GitHub Issue 1096 + public static final List TEXT_MULTI_CHOICE_LIST = randomTextChoice(10, ";"); public static final String COL_MULTITEXTCHOICE = "Multi Choice"; private static final boolean MULTI_CHOICE_ENABLED = WebTestHelper.getDatabaseType() == DatabaseType.PostgreSQL; diff --git a/src/org/labkey/test/util/TestDataGenerator.java b/src/org/labkey/test/util/TestDataGenerator.java index 7d7d9343c6..7b17d2d5f5 100644 --- a/src/org/labkey/test/util/TestDataGenerator.java +++ b/src/org/labkey/test/util/TestDataGenerator.java @@ -62,7 +62,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Random; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Function; @@ -178,7 +177,7 @@ else if (fieldDefinition.getType().equals(FieldDefinition.ColumnType.String)) else if (fieldDefinition.getType().equals(FieldDefinition.ColumnType.TextChoice)) { FieldDefinition.TextChoiceValidator validator = - (FieldDefinition.TextChoiceValidator) fieldDefinition.getValidators().get(0); + (FieldDefinition.TextChoiceValidator) fieldDefinition.getValidators().getFirst(); List textChoices = validator.getValues(); int textChoiceIndex = i % textChoices.size(); if (forGridInsert) @@ -432,10 +431,7 @@ private Map generateRow() final Map newRow = new CaseInsensitiveHashMap<>(); for (String columnName : _columns.keySet()) { - if (!_dataSuppliers.containsKey(columnName)) - { - _dataSuppliers.put(columnName, getDefaultDataSupplier(_columns.get(columnName))); - } + _dataSuppliers.computeIfAbsent(columnName, k -> getDefaultDataSupplier(_columns.get(k))); if (_autoGeneratedFields.contains(columnName)) { @@ -504,12 +500,18 @@ public static String randomString(int size) return randomString(size, null); } - public static List randomTextChoice(int size) + public static List randomTextChoice(int size, @Nullable String exclusion) { Set textChoices = new LinkedHashSet<>(); + int attempts = 0; + final int maxTries = Math.max(MAX_RANDOM_TRIES, size * 2); while (textChoices.size() < size) { - String generated = randomString(randomInt(1, 25), ";").trim(); + if (++attempts >= maxTries) + { + throw new IllegalStateException("Failed to generate " + size + " unique text choices after " + maxTries + " attempts"); + } + String generated = randomString(randomInt(1, 25), exclusion).trim(); if (!generated.isEmpty()) { textChoices.add(generated); @@ -518,6 +520,11 @@ public static List randomTextChoice(int size) return List.copyOf(textChoices); } + public static List randomTextChoice(int size) + { + return randomTextChoice(size, null); + } + public static String randomString(int size, @Nullable String exclusion) { return randomString(size, exclusion, CHARSET_STRING); @@ -532,13 +539,13 @@ public static String randomString(int size, @Nullable String exclusion, @Nullabl StringBuilder val = new StringBuilder(); for (int i=0; i> ro public static List shuffleSelect(List allFields) { - int randomSize = new Random().nextInt(allFields.size()) + 1; + int randomSize = ThreadLocalRandom.current().nextInt(allFields.size()) + 1; return shuffleSelect(allFields, randomSize); } @@ -1027,7 +1036,7 @@ public static List randomSelect(List allOptions, int selectCount) List selected = new ArrayList<>(); for (int i = 0; i < selectCount; i++) { - selected.add(allOptions.get(randomInt(0, allOptions.size()))); + selected.add(allOptions.get(randomInt(0, allOptions.size() - 1))); } return selected; }