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");
  }
}

Reply via email to