1   /*
2    * Copyright 2005 [ini4j] Development Team
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.ini4j.addon;
18  
19  import java.util.Arrays;
20  import java.util.prefs.NodeChangeEvent;
21  import java.util.prefs.NodeChangeListener;
22  import java.util.prefs.PreferenceChangeEvent;
23  import java.util.prefs.PreferenceChangeListener;
24  import java.util.prefs.Preferences;
25  import junit.framework.Test;
26  import junit.framework.TestSuite;
27  import org.ini4j.AbstractTestBase;
28  import org.ini4j.IniPreferences;
29  
30  ///CLOVER:OFF
31  
32  /**
33   * JUnit test of PreferencesWrapper class.
34   */
35  public class PreferencesWrapperTest extends AbstractTestBase
36  {
37      public static final String DOC = "doc";
38      public static final String HAPPY = "happy";
39      
40      public static final String OPTION = "height";
41      
42      /**
43       * Instantiate test.
44       *
45       * @param testName name of the test
46       */
47      public PreferencesWrapperTest(String testName)
48      {
49          super(testName);
50      }
51      
52      /**
53       * Create test suite.
54       *
55       * @return new test suite
56       */
57      public static Test suite()
58      {
59          return new TestSuite(PreferencesWrapperTest.class);
60      }
61      
62      static class Listener implements PreferenceChangeListener, NodeChangeListener
63      {
64  	PreferenceChangeEvent pce;
65  	NodeChangeEvent nce;
66  	
67          @Override
68  	public void childAdded(NodeChangeEvent event)
69  	{
70  	    nce = event;
71  	}
72  	
73          @Override
74  	public void childRemoved(NodeChangeEvent event)
75  	{
76  	    nce = event;
77  	}
78  	
79          @Override
80  	public void preferenceChange(PreferenceChangeEvent event)
81  	{
82  	    pce = event;
83  	}
84      }
85      
86      /**
87       * Test of all methods.
88       *
89       * @throws Exception on error
90       */
91      public void testCalls() throws Exception
92      {
93  	String value;
94  	
95          Preferences root = new IniPreferences(loadDwarfs());
96  	Preferences toor = new PreferencesWrapper(root);
97  	
98  	Preferences peer = root.node(DOC);
99  	Preferences pref = new PreferencesWrapper(peer);
100 	
101 	value = root.node(HAPPY).get(OPTION, null);
102 	assertNotNull(value);
103 	
104 	// keys
105 	assertTrue(Arrays.equals(pref.keys(), peer.keys()));
106 	
107 	// put-get
108 	pref.put(OPTION, value);
109 	assertEquals(value, pref.get(OPTION, null));
110 	assertEquals(value, peer.get(OPTION, null));
111 	
112 	// remove
113 	pref.remove(OPTION);
114 	assertNull(pref.get(OPTION, null));
115 	pref.put(OPTION, value);
116 	
117 	// clear
118 	pref.clear();
119 	assertEquals(0, pref.keys().length);
120 	pref.put(OPTION, value);
121 	
122 	// putInt-getInt
123 	peer.remove(OPTION);
124 	pref.putInt(OPTION, 1);
125 	assertEquals(1, pref.getInt(OPTION, 0));
126 	assertEquals(1, peer.getInt(OPTION, 0));
127 	
128 	// putLong-getLong
129 	peer.remove(OPTION);
130 	pref.putLong(OPTION, 1L);
131 	assertEquals(1L, pref.getLong(OPTION, 0L));
132 	assertEquals(1L, peer.getLong(OPTION, 0L));
133         
134 	// putFloat-getFloat
135 	peer.remove(OPTION);
136 	pref.putFloat(OPTION, 1.0f);
137 	assertEquals(1.0f, pref.getFloat(OPTION, 1.0f));
138 	assertEquals(1.0f, peer.getFloat(OPTION, 1.0f));
139 	
140 	// putDouble-getDouble
141 	peer.remove(OPTION);
142 	pref.putDouble(OPTION, 1.0);
143 	assertEquals(1.0, pref.getDouble(OPTION, 1.0));
144 	assertEquals(1.0, peer.getDouble(OPTION, 1.0));
145 
146 	// putBoolean-getBoolean
147 	peer.remove(OPTION);
148 	pref.putBoolean(OPTION, true);
149 	assertTrue(pref.getBoolean(OPTION, false));
150 	assertTrue(peer.getBoolean(OPTION, false));
151 
152 	// putByteArray-getByteArray
153 	peer.remove(OPTION);
154 	pref.putByteArray(OPTION, OPTION.getBytes());
155 	assertTrue(Arrays.equals(OPTION.getBytes(), pref.getByteArray(OPTION, null)));
156 	assertTrue(Arrays.equals(OPTION.getBytes(), peer.getByteArray(OPTION, null)));
157 	
158 	// childrenNames
159 	assertTrue(Arrays.equals(root.childrenNames(), toor.childrenNames()));
160 	
161 	// parent
162 	assertEquals(peer.parent(), pref.parent());
163 	
164 	// node
165 	assertEquals(root.node(DOC), toor.node(DOC));
166 	
167 	assertTrue(toor.nodeExists(DOC));
168 	
169 	assertEquals(DOC, pref.name());
170 	
171 	assertEquals(peer.absolutePath(), pref.absolutePath());
172 	
173 	assertEquals(peer.isUserNode(), pref.isUserNode());
174 	
175 	assertEquals(peer.toString(), pref.toString());
176 	
177 	//pref.exportNode(System.out);
178 	//pref.exportSubtree(System.out);
179 	
180 	toor.flush();
181 	toor.sync();
182 	
183 	Listener listener = new Listener();
184 	
185 	toor.addNodeChangeListener(listener);
186 	pref.addPreferenceChangeListener(listener);
187 	
188 	pref.clear();
189 	pref.putInt(OPTION, 1);
190 	
191 	// XXX in some Java implementation (ie: Sun JDK 1.4) Preferences events 
192 	// generated on other thread, and should wait a bit for that thread.
193 	// Sorry, it makes this test very crazy.....
194 	Thread.sleep(1000);
195 	
196 	pref.removePreferenceChangeListener(listener);
197 	pref.putInt(OPTION+OPTION, 1);
198 	
199 	pref.removeNode();
200 	assertFalse(root.nodeExists(DOC));
201 	pref = toor.node(DOC);
202 	toor.removeNodeChangeListener(listener);
203 	toor.node(DOC+DOC);
204 
205 	assertEquals(OPTION, listener.pce.getKey());
206         // TODO find the reason, why nce is null ???
207         //assertNotNull(listener.nce);
208 	//assertEquals(DOC, listener.nce.getChild().name());
209     }
210     
211 }