This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-collections.git
The following commit(s) were added to refs/heads/master by this push: new 06f7b6fbb [COLLECTIONS-811] Integrate Guava Testlib tests for Apache Commons Collections (#301) 06f7b6fbb is described below commit 06f7b6fbb42fd86d78d1e027c07898ae3854df39 Author: Bruno P. Kinoshita <ki...@users.noreply.github.com> AuthorDate: Tue Jun 7 09:14:43 2022 +1200 [COLLECTIONS-811] Integrate Guava Testlib tests for Apache Commons Collections (#301) * [COLLECTIONS-811] Integrate Guava Testlib tests for Apache Commons Collections * [COLLECTIONS-811] Add tests for Lists too, thanks to @ben-manes --- pom.xml | 6 + src/changes/changes.xml | 3 + .../commons/collections4/GuavaTestlibTest.java | 125 +++++++++++++++++++++ 3 files changed, 134 insertions(+) diff --git a/pom.xml b/pom.xml index 9b993a7e9..cd58814c9 100644 --- a/pom.xml +++ b/pom.xml @@ -524,6 +524,12 @@ <version>1.15</version> <optional>true</optional> </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava-testlib</artifactId> + <version>31.1-jre</version> + <scope>test</scope> + </dependency> </dependencies> <distributionManagement> diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 6d2dadae4..e8e1057c4 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -143,6 +143,9 @@ <action dev="ggregory" type="add"> Add github/codeql-action. </action> + <action issue="COLLECTIONS-811" dev="kinow" type="add" due-to="Ben Manes"> + Integrate Guava testlib tests. + </action> <!-- UPDATE --> <action type="update" dev="kinow" due-to="Dependabot, Gary Gregory"> Bump actions/setup-java from 1.4.0 to 3 #174 #177 #186 #224 #298. diff --git a/src/test/java/org/apache/commons/collections4/GuavaTestlibTest.java b/src/test/java/org/apache/commons/collections4/GuavaTestlibTest.java new file mode 100644 index 000000000..78685ea50 --- /dev/null +++ b/src/test/java/org/apache/commons/collections4/GuavaTestlibTest.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.commons.collections4; + +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +import org.apache.commons.collections4.list.TreeList; +import org.apache.commons.collections4.map.HashedMap; +import org.apache.commons.collections4.map.LRUMap; +import org.apache.commons.collections4.map.LinkedMap; +import org.apache.commons.collections4.map.ReferenceMap; + +import com.google.common.collect.testing.ListTestSuiteBuilder; +import com.google.common.collect.testing.MapTestSuiteBuilder; +import com.google.common.collect.testing.TestStringListGenerator; +import com.google.common.collect.testing.TestStringMapGenerator; +import com.google.common.collect.testing.features.CollectionFeature; +import com.google.common.collect.testing.features.CollectionSize; +import com.google.common.collect.testing.features.Feature; +import com.google.common.collect.testing.features.ListFeature; +import com.google.common.collect.testing.features.MapFeature; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * This test uses Google's Guava Testlib testing libraries to validate the + * contract of collection classes in Commons Collections. This was introduced + * after COLLECTIONS-802, where the issue reported was found with Testlib. + * + * @since 4.5.0 + * @see <a href="https://github.com/google/guava/tree/master/guava-testlib">https://github.com/google/guava/tree/master/guava-testlib</a> + * @see <a href="https://issues.apache.org/jira/browse/COLLECTIONS-802">https://issues.apache.org/jira/browse/COLLECTIONS-802</a> + */ +public final class GuavaTestlibTest extends TestCase { + + public static Test suite() { + TestSuite test = new TestSuite(); + // Map + test.addTest(suiteMap("HashedMap", HashedMap::new)); + test.addTest(suiteMap("LinkedMap", LinkedMap::new)); + test.addTest(suiteMap("LRUMap", LRUMap::new)); + test.addTest(suiteMap("ReferenceMap", ReferenceMap::new)); + // List + test.addTest(suiteList("TreeList", TreeList::new)); + // TODO: In COLLECTIONS-811 we enabled the list tests for TreeList, but these other two types did not + // pass the tests. Someone needs to confirm if it is a bug in the code, or we need to change the + // test features. + // test.addTest(suiteList("GrowthList", GrowthList::new, CollectionFeature.SERIALIZABLE)); + // test.addTest(suiteList("CursorableLinkedList", CursorableLinkedList::new, CollectionFeature.SERIALIZABLE)); + return test; + } + + /** + * Programmatically create a JUnit (3, 4) Test Suite for Guava testlib tests with Maps. + * @param name name of the test + * @param factory factory to create new Maps + * @return a JUnit 3, 4 Test Suite + */ + private static Test suiteMap(String name, Supplier<Map<String, String>> factory) { + return MapTestSuiteBuilder.using(new TestStringMapGenerator() { + @Override + protected Map<String, String> create(Map.Entry<String, String>[] entries) { + Map<String, String> map = factory.get(); + for (Map.Entry<String, String> entry : entries) { + map.put(entry.getKey(), entry.getValue()); + } + return map; + } + }) + .named(name) + .withFeatures( + CollectionSize.ANY, MapFeature.GENERAL_PURPOSE, + MapFeature.ALLOWS_ANY_NULL_QUERIES, CollectionFeature.SUPPORTS_ITERATOR_REMOVE) + .createTestSuite(); + } + + /** + * Programmatically create a JUnit (3, 4) Test Suite for Guava testlib tests with Lists. + * @param name name of the test + * @param factory factory to create new Lists + * @param features test features used in the tests + * @return a JUnit 3, 4 Test Suite + */ + private static Test suiteList(String name, Supplier<List<String>> factory, Feature<?>... features) { + final ListTestSuiteBuilder<String> suite = ListTestSuiteBuilder.using(new TestStringListGenerator() { + @Override + protected List<String> create(String[] elements) { + List<String> list = factory.get(); + for (String element : elements) { + list.add(element); + } + return list; + } + }) + .named(name) + .withFeatures( + CollectionSize.ANY, + ListFeature.GENERAL_PURPOSE, + ListFeature.REMOVE_OPERATIONS, + CollectionFeature.ALLOWS_NULL_VALUES, + CollectionFeature.DESCENDING_VIEW, + CollectionFeature.SUBSET_VIEW); + suite.withFeatures(features); + return suite.createTestSuite(); + } +}