/* * Copyright (c) 2009-2012 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'jMonkeyEngine' nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package jme3test.app; import com.jme3.renderer.IDList; import java.util.*; public class TestIDList { static class StateCol { static Random rand = new Random(); Map<Integer, Object> objs = new HashMap<Integer, Object>(); public StateCol(){ // populate with free ids List<Integer> freeIds = new ArrayList(); for (int i = 0; i < 16; i++){ freeIds.add(i); } // create random int numStates = rand.nextInt(6) + 1; for (int i = 0; i < numStates; i++){ // remove a random id from free id list int idx = rand.nextInt(freeIds.size()); int id = freeIds.remove(idx); objs.put(id, new Object()); } } public void print(){ System.out.println("-----------------"); Set<Integer> keys = objs.keySet(); Integer[] keysArr = keys.toArray(new Integer[0]); Arrays.sort(keysArr); for (int i = 0; i < keysArr.length; i++){ System.out.println(keysArr[i]+" => "+objs.get(keysArr[i]).hashCode()); } } } static IDList list = new IDList(); static int boundSlot = 0; static Object[] slots = new Object[16]; static boolean[] enabledSlots = new boolean[16]; static void enable(int slot){ System.out.println("Enabled SLOT["+slot+"]"); if (enabledSlots[slot] == true){ System.err.println("FAIL! Extra state change"); } enabledSlots[slot] = true; } static void disable(int slot){ System.out.println("Disabled SLOT["+slot+"]"); if (enabledSlots[slot] == false){ System.err.println("FAIL! Extra state change"); } enabledSlots[slot] = false; } static void setSlot(int slot, Object val){ if (!list.moveToNew(slot)){ enable(slot); } if (slots[slot] != val){ System.out.println("SLOT["+slot+"] = "+val.hashCode()); slots[slot] = val; } } static void checkSlots(StateCol state){ for (int i = 0; i < 16; i++){ if (slots[i] != null && enabledSlots[i] == false){ System.err.println("FAIL! SLOT["+i+"] assigned, but disabled"); } if (slots[i] == null && enabledSlots[i] == true){ System.err.println("FAIL! SLOT["+i+"] enabled, but not assigned"); } Object val = state.objs.get(i); if (val != null){ if (slots[i] != val) System.err.println("FAIL! SLOT["+i+"] does not contain correct value"); if (!enabledSlots[i]) System.err.println("FAIL! SLOT["+i+"] is not enabled"); }else{ if (slots[i] != null) System.err.println("FAIL! SLOT["+i+"] is not set"); if (enabledSlots[i]) System.err.println("FAIL! SLOT["+i+"] is enabled"); } } } static void clearSlots(){ for (int i = 0; i < list.oldLen; i++){ int slot = list.oldList[i]; disable(slot); slots[slot] = null; } list.copyNewToOld(); // context.attribIndexList.print(); } static void setState(StateCol state){ state.print(); for (Map.Entry<Integer, Object> entry : state.objs.entrySet()){ setSlot(entry.getKey(), entry.getValue()); } clearSlots(); checkSlots(state); } public static void main(String[] args){ StateCol[] states = new StateCol[20]; for (int i = 0; i < states.length; i++) states[i] = new StateCol(); // shuffle would be useful here.. for (int i = 0; i < states.length; i++){ setState(states[i]); } } }