/* * Copyright (c) 2012, 2014, 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. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * 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. */ package test.com.sun.javafx.css; import com.sun.javafx.css.BitSetShim; import com.sun.javafx.css.PseudoClassState; import com.sun.javafx.css.PseudoClassStateShim; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import javafx.collections.ObservableSet; import javafx.collections.SetChangeListener; import javafx.css.PseudoClass; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; /** * * @author dgrieve */ public class PseudoClassTest { public PseudoClassTest() { } @Before public void before() { PseudoClassStateShim.pseudoClassMap.clear(); PseudoClassStateShim.pseudoClasses.clear(); } @Test public void testGetState() { String pseudoClass = "xyzzy"; PseudoClass result = PseudoClass.getPseudoClass(pseudoClass); assertEquals(pseudoClass, result.getPseudoClassName()); } @Test public void testCreateStatesInstance() { PseudoClassState result = new PseudoClassState(); assertNotNull(result); } @Test public void testGetStateThrowsIllegalArgumentExceptionWithNullArg() { try { PseudoClass state = PseudoClass.getPseudoClass(null); fail(); } catch (IllegalArgumentException exception) { } } @Test public void testGetStateThrowsIllegalArgumentExceptionWithEmptyArg() { try { PseudoClass state = PseudoClass.getPseudoClass(" "); fail(); } catch (IllegalArgumentException exception) { } } @Test public void testState_getPseudoClass() { // no different than testing the getPseudoClassName method! String pseudoClass = "xyzzy"; PseudoClass result = PseudoClass.getPseudoClass(pseudoClass); assertEquals(pseudoClass, result.getPseudoClassName()); } @Test public void testState_toString() { String pseudoClass = "xyzzy"; PseudoClass result = PseudoClass.getPseudoClass(pseudoClass); assertEquals(pseudoClass, result.toString()); } @Test public void testPseudoClassState_add() { String pseudoClass = "xyzzy"; PseudoClass state = PseudoClass.getPseudoClass(pseudoClass); PseudoClassState states = new PseudoClassState(); BitSetShim.add(states, state); List stateList = new ArrayList(); Iterator iter = BitSetShim.iterator(states); while (iter.hasNext()) { stateList.add(iter.next()); } assertTrue(stateList.contains(state)); } @Test public void testPseudoClassState_add_multipleStates() { String[] pseudoClasses = new String[] { "one", "two", "three", "four", "five" }; PseudoClassState states = new PseudoClassState(); for (int n=0; n stateList = new ArrayList(); Iterator iter = BitSetShim.iterator(states); while (iter.hasNext()) { stateList.add(iter.next()); } for (int n=0; n states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(expected.length, states.size(), 0.000001); for (int n=0; n states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(0, states.size(), 0.000001); } @Test public void testPseudoClassState_retainAll_withNullArg() { PseudoClassState aStates = new PseudoClassState(); PseudoClassState bStates = null; BitSetShim.retainAll(aStates, bStates); List states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(0, states.size(), 0.000001); } @Test public void testPseudoClassState_retainAll_disjointYieldsEmpty() { String[] setA = new String[] { "zero", "one", "two", "three" }; PseudoClassState aStates = new PseudoClassState(); for(int n=0; n states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(expected.length, states.size(), 0.000001); for (int n=0; n states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(expected.length, states.size(), 0.000001); for (int n=0; n states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(0, states.size(), 0.000001); } @Test public void testPseudoClassState_addAll_withNullArgs() { PseudoClassState aStates = new PseudoClassState(); PseudoClassState bStates = null; BitSetShim.addAll(aStates, bStates); List states = new ArrayList(); Iterator iter = BitSetShim.iterator(aStates); while (iter.hasNext()) { states.add(iter.next()); } assertEquals(0, states.size(), 0.000001); } @Test public void testPseudoClassState_getPseudoClasses() { String[] pseudoClasses = new String[] { "zero", "one", "two", "three" }; List expected = new ArrayList(); PseudoClassState states = new PseudoClassState(); for(int n=0; n stateList = new ArrayList(); Iterator iter = BitSetShim.iterator(states); while (iter.hasNext()) { stateList.add(iter.next()); } assertTrue(expected.containsAll(stateList)); } @Test public void testPseudoClassState_toString() { String[] pseudoClasses = new String[] { "zero", "one", "two", "three" }; PseudoClassState states = new PseudoClassState(); for(int n=0; n stateList = new ArrayList(); Iterator iter = BitSetShim.iterator(states); while (iter.hasNext()) { stateList.add(iter.next()); } String expected = stateList.toString(); String result = states.toString(); assertEquals(expected, result); } @Test public void testPseudoClassState_iterator() { PseudoClass[] pseudoClasses = new PseudoClass[4]; PseudoClassState states = new PseudoClassState(); for (int n=0; n iter = BitSetShim.iterator(states); while(iter.hasNext()) { iterations += 1; assertTrue (iterations+">"+pseudoClasses.length, iterations <= pseudoClasses.length); PseudoClass pseudoClass = iter.next(); assertEquals (pseudoClass, pseudoClasses[iterations-1]); } assertTrue (pseudoClasses.length+"!="+iterations, pseudoClasses.length == iterations); } @Test public void testPseudoClassState_iterator_withLargeNumberOfPsuedoClasses() { PseudoClass[] pseudoClasses = new PseudoClass[Long.SIZE*3]; PseudoClassState states = new PseudoClassState(); for (int n=0; n iter = BitSetShim.iterator(states); while(iter.hasNext()) { iterations += 1; assertTrue (iterations+">"+pseudoClasses.length, iterations <= pseudoClasses.length); PseudoClass pseudoClass = iter.next(); assertEquals (pseudoClass, pseudoClasses[iterations-1]); } assertTrue (pseudoClasses.length+"!="+iterations, pseudoClasses.length == iterations); } @Test public void testPseudoClassState_iterator_remove() { PseudoClass[] pseudoClasses = new PseudoClass[4]; PseudoClassState states = new PseudoClassState(); for (int n=0; n iter = BitSetShim.iterator(states); while(iter.hasNext()) { ++iterations; if ((iterations % 2) == 0) { iter.remove(); --nPseudoClasses; assertFalse( BitSetShim.contains(states, pseudoClasses[iterations-1])); } } assertTrue (nPseudoClasses+"!="+BitSetShim.size(states), nPseudoClasses == BitSetShim.size(states)); } @Test public void testPseudoClassState_iterator_remove_withLargeNumberOfPseudoClasses() { PseudoClass[] pseudoClasses = new PseudoClass[Long.SIZE*3]; PseudoClassState states = new PseudoClassState(); for (int n=0; n iter = BitSetShim.iterator(states); while(iter.hasNext()) { ++iterations; if ((iterations % 2) == 0) { iter.remove(); --nPseudoClasses; assertFalse( BitSetShim.contains(states, pseudoClasses[iterations-1])); } } assertTrue (nPseudoClasses+"!="+BitSetShim.size(states), nPseudoClasses == BitSetShim.size(states)); } int nObservations = 0; @Test public void testObservablePseudoClass_listener_add() { final PseudoClass[] expectedObservations = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE") }; final int nObservationsExpected = expectedObservations.length; nObservations = 0; ObservableSet pseudoClasses = new PseudoClassState(); pseudoClasses.addListener((SetChangeListener.Change change) -> { if (change.wasAdded()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementAdded(); assertSame(expectedObservations[nObservations], observed); nObservations += 1; } else { fail(); } }); for (int n=0; n pseudoClasses = new PseudoClassState(); for (int n=0; n change) -> { if (change.wasRemoved()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementRemoved(); assertSame(expectedObservations[nObservations], observed); nObservations += 1; } else { fail(); } }); for (int n=0; n pseudoClasses = new PseudoClassState(); for (int n=0; n change) -> { if (change.wasRemoved()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementRemoved(); assertSame(expectedObservations[nObservations], observed); nObservations += 1; } else { fail(); } }); for (Iterator iter = pseudoClasses.iterator(); iter.hasNext();) { iter.remove(); }; assertEquals(nObservationsExpected, nObservations); } @Test public void testObservablePseudoClass_listener_addAll() { final PseudoClass[] expectedObservations = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE") }; final int nObservationsExpected = expectedObservations.length; nObservations = 0; Set pseudoClassesToAdd = new PseudoClassState(); for (int n=0; n pseudoClasses = new PseudoClassState(); pseudoClasses.addListener((SetChangeListener.Change change) -> { if (change.wasAdded()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementAdded(); assertSame(expectedObservations[nObservations], observed); nObservations += 1; } else { fail(); } }); pseudoClasses.addAll(pseudoClassesToAdd); assertEquals(nObservationsExpected, nObservations); } @Test public void testObservablePseudoClass_listener_removeAll() { final PseudoClass[] pseudoClassesToRemove = new PseudoClass[] { PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE") }; final PseudoClass[] pseudoClasses = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE"), PseudoClass.getPseudoClass("FOUR") }; final int nObservationsExpected = pseudoClassesToRemove.length; nObservations = 0; Set other = new PseudoClassState(); for (int n=0; n master = new PseudoClassState(); for (int n=0; n change) -> { if (change.wasRemoved()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementRemoved(); assertSame(pseudoClassesToRemove[nObservations], observed); nObservations += 1; } else { fail(); } }); master.removeAll(other); assertEquals(nObservationsExpected, nObservations); assertEquals(pseudoClasses.length-pseudoClassesToRemove.length, master.size()); } @Test public void testObservablePseudoClass_listener_retainAll() { final PseudoClass[] pseudoClassesToRetain = new PseudoClass[] { PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE") }; final PseudoClass[] removedPseudoClasses = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("FOUR") }; final PseudoClass[] pseudoClasses = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE"), PseudoClass.getPseudoClass("FOUR") }; final int nObservationsExpected = pseudoClassesToRetain.length; nObservations = 0; Set other = new PseudoClassState(); for (int n=0; n master = new PseudoClassState(); for (int n=0; n change) -> { if (change.wasRemoved()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementRemoved(); assertSame(removedPseudoClasses[nObservations], observed); nObservations += 1; } else { fail(); } }); master.retainAll(other); assertEquals(nObservationsExpected, nObservations); assertEquals(pseudoClassesToRetain.length, master.size()); } @Test public void testObservablePseudoClass_listener_clear() { final PseudoClass[] pseudoClasses = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE"), PseudoClass.getPseudoClass("FOUR") }; final int nObservationsExpected = pseudoClasses.length; nObservations = 0; ObservableSet master = new PseudoClassState(); for (int n=0; n change) -> { if (change.wasRemoved()) { assert (nObservations < nObservationsExpected); PseudoClass observed = change.getElementRemoved(); assertSame(pseudoClasses[nObservations], observed); nObservations += 1; } else { fail(); } }); master.clear(); assertEquals(nObservationsExpected, nObservations); assertTrue(master.isEmpty()); } @Test public void testObservablePseudoClass_listener_getSet_unmodifiable() { final ObservableSet master = new PseudoClassState(); master.addListener(new SetChangeListener() { @Override public void onChanged(SetChangeListener.Change change) { master.removeListener(this); try { ObservableSet set = change.getSet(); set.add(PseudoClass.getPseudoClass("TWO")); fail(); } catch (UnsupportedOperationException e) { // This is the exception we expect from an unmodifiable set } catch (Exception other) { fail(other.getMessage()); } } }); master.add(PseudoClass.getPseudoClass("ONE")); } @Test public void testRetainAllOfEmptySetResultsInEmptySet() { final PseudoClass[] pseudoClasses = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE"), PseudoClass.getPseudoClass("FOUR") }; Set setA = new PseudoClassState(); for (int n=0; n setB = new PseudoClassState(); assertTrue(setA.retainAll(setB)); assertArrayEquals(new long[0], BitSetShim.getBits((PseudoClassState)setA)); } @Test public void testRemoveAllOfSameSetResultsInEmptySet() { final PseudoClass[] pseudoClasses = new PseudoClass[] { PseudoClass.getPseudoClass("ONE"), PseudoClass.getPseudoClass("TWO"), PseudoClass.getPseudoClass("THREE"), PseudoClass.getPseudoClass("FOUR") }; Set setA = new PseudoClassState(); for (int n=0; n setA = new PseudoClassState(); for (int n=0; n setA = new PseudoClassState(); for (int n=0; n iterator = setA.iterator(); while (iterator.hasNext()) { iterator.remove(); } assertArrayEquals(new long[0], BitSetShim.getBits((PseudoClassState)setA)); } @Test public void testAddEmptyToEmptyResultsInEmptySet() { Set setA = new PseudoClassState(); Set setB = new PseudoClassState(); assertFalse(setA.addAll(setB)); assertArrayEquals(new long[0], BitSetShim.getBits((PseudoClassState)setA)); } }