package com.marginallyclever.makelangelo; import java.util.prefs.AbstractPreferences; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import org.junit.Assert; import org.junit.Test; import com.marginallyclever.util.MarginallyCleverPreferences; import com.marginallyclever.util.PreferencesHelper; import com.marginallyclever.util.UnitTestHelper; /** * Created on 5/25/15. * * @author Peter Colapietro * @since v7.1.4 */ public class PreferencesHelperTest<A extends AbstractPreferences> { /** * */ @SuppressWarnings("deprecation") private final A preferenceNode = PreferencesHelper.getPreferenceNode(PreferencesHelper.MakelangeloPreferenceKey.LEGACY_MAKELANGELO_ROOT); /** * */ private final MarginallyCleverPreferences marginallyCleverJsonPreferenceNode = new MarginallyCleverPreferences(preferenceNode, "JSON"); /** * @throws Exception */ @org.junit.After public void tearDown() throws Exception { marginallyCleverJsonPreferenceNode.removeNode(); } @Test public void testMachineConfigurationNames() throws BackingStoreException { final String thisMethodsName = Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX].getMethodName(); System.out.println("start: " + PreferencesHelperTest.class.getName() + "#"+ thisMethodsName); final Preferences machinesPreferenceNode = PreferencesHelper.getPreferenceNode(PreferencesHelper.MakelangeloPreferenceKey.MACHINES); System.out.println("node name: " + machinesPreferenceNode.name()); final String[] childrenPreferenceNodeNames = machinesPreferenceNode.childrenNames(); for (String childNodeName : childrenPreferenceNodeNames) { System.out.println("child node name: "+ childNodeName); final boolean isMachineNameAnInteger = UnitTestHelper.isInteger(childNodeName); Assert.assertTrue(isMachineNameAnInteger); //Machine configurations numbered -1 and below should not exist. final boolean isMachineNameLessThanZero = Integer.parseInt(childNodeName) < 0; //Assert.assertFalse(isMachineNameLessThanZero); if(isMachineNameLessThanZero) { System.out.println("REMOVED"); machinesPreferenceNode.remove(childNodeName); } } machinesPreferenceNode.flush(); System.out.println("end: "+ thisMethodsName); } /** * Over engineered. There are <a href="http://stackoverflow.com/a/442773">pitfalls</a> to this method of getting a * {@code StackTraceElement}'s index which this method does not address. I make a best guess based upon development * environment testing. * * @see <a href="http://stackoverflow.com/a/8592871">Getting the name of the current executing method</a> */ private static final int CLIENT_CODE_STACK_INDEX; static { /* Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5, and 1.6. In my tests I had to modify to get to work in 1.7 and 1.8. */ int i = 0; for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { /* original placement of increment via SO i++; */ if (ste.getClassName().equals(PreferencesHelperTest.class.getName())) { break; } i++;//My placement of increment via environmental testing. } CLIENT_CODE_STACK_INDEX = i; } }