001/*
002 * Copyright 2005,2009 Ivan SZKIBA
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.ini4j;
017
018import org.ini4j.sample.Dwarf;
019import org.ini4j.sample.Dwarfs;
020
021import org.ini4j.spi.BeanAccess;
022import org.ini4j.spi.BeanTool;
023
024import org.ini4j.test.DwarfsData;
025import org.ini4j.test.Helper;
026import org.ini4j.test.TaleData;
027
028import static org.junit.Assert.assertArrayEquals;
029import static org.junit.Assert.assertEquals;
030import static org.junit.Assert.assertNotNull;
031import static org.junit.Assert.assertNull;
032import static org.junit.Assert.assertSame;
033import static org.junit.Assert.fail;
034
035import org.junit.Test;
036
037import java.util.prefs.Preferences;
038
039public class IniPreferencesTest extends Ini4jCase
040{
041    private static final String DUMMY = "dummy";
042
043    @Test public void testConstructor() throws Exception
044    {
045        Ini ini = Helper.newDwarfsIni();
046        IniPreferences prefs = new IniPreferences(ini);
047
048        assertSame(ini, prefs.getIni());
049        Helper.assertEquals(DwarfsData.dwarfs, ini.as(Dwarfs.class));
050        prefs = new IniPreferences(Helper.getResourceStream(Helper.DWARFS_INI));
051        Helper.assertEquals(DwarfsData.doc, newDwarf(prefs.node(Dwarfs.PROP_DOC)));
052        prefs = new IniPreferences(Helper.getResourceReader(Helper.DWARFS_INI));
053        Helper.assertEquals(DwarfsData.happy, newDwarf(prefs.node(Dwarfs.PROP_HAPPY)));
054        prefs = new IniPreferences(Helper.getResourceURL(Helper.DWARFS_INI));
055        Helper.assertEquals(DwarfsData.sleepy, newDwarf(prefs.node(Dwarfs.PROP_SLEEPY)));
056    }
057
058    @Test public void testMisc() throws Exception
059    {
060        Ini ini = new Ini();
061        IniPreferences prefs = new IniPreferences(ini);
062
063        // do nothing, but doesn't throw exception
064        prefs.sync();
065        prefs.flush();
066
067        // node & key count
068        assertEquals(0, prefs.keysSpi().length);
069        assertEquals(0, prefs.childrenNamesSpi().length);
070
071        // childNode for new and for existing section
072        assertNotNull(prefs.node(Dwarfs.PROP_DOC));
073        assertEquals(1, prefs.childrenNamesSpi().length);
074        ini.add(Dwarfs.PROP_HAPPY);
075        assertNotNull(prefs.node(Dwarfs.PROP_HAPPY));
076        assertEquals(2, prefs.childrenNamesSpi().length);
077
078        // SectionPreferences
079        IniPreferences.SectionPreferences sec = (IniPreferences.SectionPreferences) prefs.node(Dwarfs.PROP_DOC);
080
081        assertEquals(0, sec.childrenNamesSpi().length);
082
083        // do nothing, but doesn't throw exception
084        sec.sync();
085        sec.syncSpi();
086        sec.flush();
087        sec.flushSpi();
088
089        // empty
090        assertEquals(0, sec.keysSpi().length);
091
092        // add one key
093        sec.put(Dwarf.PROP_AGE, "87");
094        sec.flush();
095        assertEquals("87", sec.getSpi(Dwarf.PROP_AGE));
096
097        // has one key
098        assertEquals(1, sec.keysSpi().length);
099
100        // remove key
101        sec.remove(Dwarf.PROP_AGE);
102        sec.flush();
103
104        // has 0 key
105        assertEquals(0, sec.keysSpi().length);
106        sec.removeNode();
107        prefs.flush();
108        assertNull(ini.get(Dwarfs.PROP_DOC));
109    }
110
111    @Test public void testTaleTree() throws Exception
112    {
113        Ini ini = Helper.newTaleIni();
114        IniPreferences prefs = new IniPreferences(ini);
115        Preferences dwarfs = prefs.node(TaleData.PROP_DWARFS);
116
117        Helper.assertEquals(DwarfsData.doc, newDwarf(dwarfs.node(Dwarfs.PROP_DOC)));
118        assertArrayEquals(DwarfsData.dwarfNames, dwarfs.childrenNames());
119        assertEquals(1, prefs.childrenNames().length);
120    }
121
122    @Test public void testTree() throws Exception
123    {
124        Ini ini = new Ini();
125        IniPreferences prefs = new IniPreferences(ini);
126        IniPreferences.SectionPreferences sec = (IniPreferences.SectionPreferences) prefs.node(Dwarfs.PROP_DOC);
127        Preferences child = sec.node(DUMMY);
128
129        assertNotNull(child);
130        assertNotNull(sec.node(DUMMY));
131        assertNotNull(ini.get(Dwarfs.PROP_DOC).getChild(DUMMY));
132        assertEquals(1, prefs.childrenNames().length);
133    }
134
135    @SuppressWarnings("empty-statement")
136    @Test public void testUnsupported() throws Exception
137    {
138        Ini ini = new Ini();
139        IniPreferences prefs = new IniPreferences(ini);
140
141        try
142        {
143            prefs.getSpi(DUMMY);
144            fail();
145        }
146        catch (UnsupportedOperationException x)
147        {
148            ;
149        }
150
151        try
152        {
153            prefs.putSpi(DUMMY, DUMMY);
154            fail();
155        }
156        catch (UnsupportedOperationException x)
157        {
158            ;
159        }
160
161        try
162        {
163            prefs.removeNodeSpi();
164            fail();
165        }
166        catch (UnsupportedOperationException x)
167        {
168            ;
169        }
170
171        try
172        {
173            prefs.removeSpi(DUMMY);
174            fail();
175        }
176        catch (UnsupportedOperationException x)
177        {
178            ;
179        }
180    }
181
182    private Dwarf newDwarf(Preferences node)
183    {
184        return BeanTool.getInstance().proxy(Dwarf.class, new Access(node));
185    }
186
187    public static class Access implements BeanAccess
188    {
189        private final Preferences _node;
190
191        public Access(Preferences node)
192        {
193            _node = node;
194        }
195
196        public void propAdd(String propertyName, String value)
197        {
198            throw new UnsupportedOperationException("Not supported yet.");
199        }
200
201        public String propDel(String propertyName)
202        {
203            throw new UnsupportedOperationException("Not supported yet.");
204        }
205
206        public String propGet(String propertyName)
207        {
208            return _node.get(propertyName, null);
209        }
210
211        public String propGet(String propertyName, int index)
212        {
213            return (index == 0) ? propGet(propertyName) : null;
214        }
215
216        public int propLength(String propertyName)
217        {
218            return (propGet(propertyName) == null) ? 0 : 1;
219        }
220
221        public String propSet(String propertyName, String value)
222        {
223            throw new UnsupportedOperationException("Not supported yet.");
224        }
225
226        public String propSet(String propertyName, String value, int index)
227        {
228            throw new UnsupportedOperationException("Not supported yet.");
229        }
230    }
231}