Request for review : 7121314 : Behavior mismatch between AbstractCollection.toArray(T[] ) and its spec

David Holmes david.holmes at oracle.com
Sat Mar 10 12:42:01 UTC 2012


On 9/03/2012 11:39 PM, Ulf Zibis wrote:
> Nice work!
> Especially the saving of the sleep times.
>
> Regarding your Infrastructure:
> It is stated, that jtreg is able to process standard JUnit testcases, so
> IMHO there is no need to recode similar infrastructure.

I simply copied am existing test: AbstractCollection/ToString.java

> I think you could stay at name CollectionToArray, so Bug 7121314 would
> be one part of it, but additional testcases e.g. null-termination could
> be included too, and there would remain name space for e.g. ListToArray.

I assumed the test would be stored as AbstractCollection/ToArray.java

It could be expanded but there should be JCK tests for the basic properties.

> Additionally I think, we need to check + test, if all known inheritors
> of Collection/AbstractCollection behave same.

If any concrete collection overrides toArray - sure.

David
-----

> -Ulf
>
>
> Am 09.03.2012 12:20, schrieb David Holmes:
>> Here's a simple testcase that seems to work.
>>
>> David
>>
>> On 9/03/2012 7:53 PM, David Holmes wrote:
>>> Hi Sean,
>>>
>>> That seems to implement the required semantics.
>>>
>>> Minor style nit: }else{ -> } else {
>>>
>>> Not sure about the testcase ... Can size() not remove some elements
>>> directly but return the original size?
>>>
>>> David
>>
>>
>> /*
>> * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
>> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>> *
>> * This code is free software; you can redistribute it and/or modify it
>> * under the terms of the GNU General Public License version 2 only, as
>> * published by the Free Software Foundation.
>> *
>> * This code is distributed in the hope that it will be useful, but
>> WITHOUT
>> * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>> * version 2 for more details (a copy is included in the LICENSE file that
>> * accompanied this code).
>> *
>> * You should have received a copy of the GNU General Public License
>> version
>> * 2 along with this work; if not, write to the Free Software Foundation,
>> * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>> *
>> * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
>> * or visit www.oracle.com if you need additional information or have any
>> * questions.
>> */
>>
>> /*
>> * @test
>> * @bug 7121314
>> * @summary return the original array if the collection shrinks and
>> will fit
>> */
>>
>> import java.util.*;
>> import java.util.concurrent.*;
>>
>> public class ToArray {
>>
>> static final int excess = 2;
>> static final String[] keys = { "1", "2", "3", "4", "5" };
>> static final Object[] vals = { new Object(), new Object(), new Object(),
>> new Object(), new Object()
>> };
>>
>> static class TConcurrentHashMap<K, V> extends ConcurrentHashMap<K, V> {
>> public int size() {
>> int oldsize = super.size();
>> remove(keys[0]);
>> remove(keys[1]);
>> check(super.size() == oldsize-2);
>> return oldsize;
>> }
>> }
>>
>> private static void realMain(String[] args) {
>> TConcurrentHashMap<String, Object> map = new TConcurrentHashMap<>();
>> for (int i = 0; i < keys.length; i++)
>> map.put(keys[i], vals[i]);
>>
>> Object[] a = new Object[keys.length-1]; // appears too small
>> Object[] res = map.values().toArray(a);
>> check( res == a);
>> pass();
>> }
>>
>> //--------------------- Infrastructure ---------------------------
>> static volatile int passed = 0, failed = 0;
>> static void pass() { passed++; }
>> static void fail() { failed++; Thread.dumpStack(); }
>> static void fail(String msg) { System.out.println(msg); fail(); }
>> static void unexpected(Throwable t) { failed++; t.printStackTrace(); }
>> static void check(boolean cond) { if (cond) pass(); else fail(); }
>> static void equal(Object x, Object y) {
>> if (x == null ? y == null : x.equals(y)) pass();
>> else {System.out.println(x + " not equal to " + y); fail(); }}
>>
>> public static void main(String[] args) throws Throwable {
>> try { realMain(args); } catch (Throwable t) { unexpected(t); }
>>
>> System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
>> if (failed > 0) throw new Exception("Some tests failed");
>> }
>> }
>>



More information about the core-libs-dev mailing list