On Fri, 4 Mar 2022 02:27:53 GMT, Stuart Marks <sma...@openjdk.org> wrote:
>> XenoAmess has updated the pull request incrementally with one additional >> commit since the last revision: >> >> cast several float to double before calculation > > OK, I took a look at HashMapsPutAllOverAllocateTableTest.java. It's certainly > a good start at testing stuff in this area. However, I notice that > > test/jdk/java/util/HashMap/WhiteBoxResizeTest.java > > already exists and tests kind-of similar things. I think it would be > preferable to enhance this test with additional assertions since it already > has a bunch of machinery to inspect the various internals. It tests both > HashMap and LinkedHashMap, so I think it would be ok to add a WeakHashMap > test here as well. I note however that it relies on LinkedHashMap being a > subclass of HashMap, which WeakHashMap is not, and so there will be a certain > amount of messiness adding in the handling for WeakHashMap. > > Once this is in place though I think adding the additional test cases would > fit in well here. In particular, it should be possible to test the proper > table lengths for the copy-constructor and putAll cases (from your original > bug report) as well as the premature table expansion in WeakHashMap. > > This test could use some cleanup as well. For example, the > capacityTestInitialCapacity() method has a list of suppliers that it loops > over. This is probably better expressed as a data provider driving a test > method that tests one case. There's a bit of an art to setting this up. > TestNG wants each test case to be `Object[][]` which is kind of a pain if you > want to use a lambda. A trick is to have a method that returns `Object[]` > representing one test case, and have the parameters of this method provide > the target types for the lambdas. For example: > > Object[] testcase(String label, Supplier<Map<Integer,Integer>> s, > Consumer<Map<Integer,Integer>> c, int expectedCapacity) { > return new Object[] { label, s, c, expectedCapacity }; > } > > and then have the actual data provider just be a series of calls to this > method in an array literal: > > @DataProvider > public Object[][] allCases() { > return new Object[][] { > testcase("HMputAll", () -> new HashMap<>(), m -> m.putAll(MAP12), > 16), > testcase("WHMputAll", () -> new WeakHashMap<>(), m -> > m.putAll(MAP12), 16), > testcase("HMcopyctor", () -> new HashMap<>(MAP12), m -> { }, 16), > testcase("WHMcopyctor", () -> new WeakHashMap<>(MAP12), m -> { }, > 16), > }; > } > > This lets you write the lambdas without a cast that provides the target type. > > The test method calls the supplier, passes the map to the consumer, gets the > table length, and asserts that it's equal to the expected length. Note that > I've set this up with separate supplier and consumer in order to accommodate > both the copy constructor cases and the putAll cases. Finally, the label > string isn't used by the test method, but it's useful if one of the cases > fails. TestNG will print out the arguments of a failing case and the label > helps a lot here, as the string form of the lambda is basically > unintelligible. @stuart-marks done but cannot pass that test, because WeakHashMap have no such mechanism that do not create table[] when empty, only create it when first element exist, but HashMap do. ------------- PR: https://git.openjdk.java.net/jdk/pull/7431