/* * Copyright (c) 2015, 2016, 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 8066070 * @run testng/othervm AddNonComparable */ import java.util.*; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.PriorityBlockingQueue; import java.util.function.BiConsumer; import java.util.function.Supplier; import static org.testng.Assert.*; import org.testng.annotations.Test; public class AddNonComparable { static void test(Queue queue, Supplier supplier, BiConsumer, Exception> checker) { Exception x = null; try { queue.add(supplier.get()); } catch(Exception e) { x = e; } checker.accept(queue, x); } @Test public void queues() { // Queues test(new PriorityQueue<>(), NonComparable::new, (q, e) -> { assertEquals(q.size(), 0); assertTrue(e instanceof ClassCastException); }); test(new PriorityQueue<>(), AComparable::new, (q, e) -> { assertEquals(q.size(), 1); assertTrue(e == null); }); test(new PriorityBlockingQueue<>(), NonComparable::new, (q, e) -> { assertEquals(q.size(), 0); assertTrue(e instanceof ClassCastException); }); test(new PriorityBlockingQueue<>(), AComparable::new, (q, e) -> { assertEquals(q.size(), 1); assertTrue(e == null); }); } static void test(SortedSet set, Supplier supplier, BiConsumer, Exception> checker) { Exception x = null; try { set.add(supplier.get()); } catch(Exception e) { x = e; } checker.accept(set, x); } @Test public void sets() { // Sets test(new TreeSet<>(), NonComparable::new, (s, e) -> { assertEquals(s.size(), 0); assertTrue(e instanceof ClassCastException); }); test(new TreeSet<>(), AComparable::new, (s, e) -> { assertEquals(s.size(), 1); assertTrue(e == null); }); test(new ConcurrentSkipListSet<>(), NonComparable::new, (s,e) -> { assertEquals(s.size(), 0); assertTrue(e instanceof ClassCastException); } ); test(new ConcurrentSkipListSet<>(), AComparable::new, (s, e) -> { assertEquals(s.size(), 1); assertTrue(e == null); }); } static void test(SortedMap map, Supplier supplier, BiConsumer, Exception> checker) { Exception x = null; try { map.put(supplier.get(), null); } catch(Exception e) { x = e; } checker.accept(map, x); } @Test public void maps() { // Maps test(new TreeMap<>(), NonComparable::new, (m,e) -> { assertEquals(m.size(), 0); assertTrue(e instanceof ClassCastException); } ); test(new TreeMap<>(), AComparable::new, (m,e) -> { assertEquals(m.size(), 1); assertTrue(e == null); } ); test(new ConcurrentSkipListMap<>(), NonComparable::new, (s,e) -> { assertEquals(s.size(), 0); assertTrue(e instanceof ClassCastException); } ); test(new ConcurrentSkipListMap<>(), AComparable::new, (s,e) -> { assertEquals(s.size(), 1); assertTrue(e == null); } ); } static class NonComparable { } static class AComparable implements Comparable { @Override public int compareTo(AComparable v) { return 0; } } }