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 static org.junit.Assert.assertArrayEquals;
019import static org.junit.Assert.assertEquals;
020import static org.junit.Assert.assertFalse;
021import static org.junit.Assert.assertNotNull;
022import static org.junit.Assert.assertNull;
023import static org.junit.Assert.assertTrue;
024
025import org.junit.Before;
026import org.junit.Test;
027
028import java.util.Arrays;
029import java.util.HashMap;
030import java.util.Map;
031import java.util.Map.Entry;
032import java.util.Set;
033
034public class BasicMultiMapTest extends Ini4jCase
035{
036    private static final String KEY1 = "key1";
037    private static final String KEY2 = "key2";
038    private static final String KEY3 = "key3";
039    private static final String VALUE1 = "value1";
040    private static final String VALUE2 = "value2";
041    private static final String VALUE3 = "value3";
042    private static final String[] VALUES = { VALUE1, VALUE2, VALUE3 };
043    private MultiMap<String, String> _map;
044
045    @Before @Override public void setUp() throws Exception
046    {
047        super.setUp();
048        _map = new BasicMultiMap<String, String>();
049    }
050
051    @Test public void testAdd()
052    {
053        _map.add(KEY1, VALUE1);
054        _map.add(KEY1, VALUE2);
055        _map.add(KEY1, VALUE3);
056        assertEquals(3, _map.length(KEY1));
057        _map.add(KEY1, VALUE3, 0);
058        assertEquals(4, _map.length(KEY1));
059        assertEquals(VALUE3, _map.get(KEY1, 0));
060        assertEquals(VALUE3, _map.get(KEY1, 3));
061        _map.clear();
062        assertTrue(_map.isEmpty());
063    }
064
065    @Test public void testAll()
066    {
067        _map.putAll(KEY1, Arrays.asList(VALUES));
068        assertEquals(VALUES.length, _map.length(KEY1));
069        String[] values = _map.getAll(KEY1).toArray(new String[] {});
070
071        assertArrayEquals(VALUES, values);
072    }
073
074    @Test public void testContainsValue()
075    {
076        _map.putAll(KEY1, Arrays.asList(VALUES));
077        assertTrue(_map.containsValue(VALUE1));
078        assertTrue(_map.containsValue(VALUE2));
079        assertTrue(_map.containsValue(VALUE3));
080        _map.clear();
081        _map.put(KEY2, VALUE1);
082        assertFalse(_map.containsValue(VALUE3));
083    }
084
085    @Test public void testEntrySet()
086    {
087        _map.putAll(KEY1, Arrays.asList(VALUES));
088        _map.put(KEY2, VALUE2);
089        _map.put(KEY3, VALUE3);
090        Set<Entry<String, String>> set = _map.entrySet();
091
092        assertNotNull(set);
093        assertEquals(3, set.size());
094        for (Entry<String, String> e : set)
095        {
096            if (e.getKey().equals(KEY1))
097            {
098                assertEquals(VALUES[2], e.getValue());
099                e.setValue(VALUES[1]);
100            }
101            else if (e.getKey().equals(KEY2))
102            {
103                assertEquals(VALUE2, e.getValue());
104                e.setValue(VALUE3);
105            }
106            else if (e.getKey().equals(KEY3))
107            {
108                assertEquals(VALUE3, e.getValue());
109                e.setValue(VALUE2);
110            }
111        }
112
113        assertEquals(VALUES[1], _map.get(KEY1));
114        assertEquals(VALUES.length, _map.length(KEY1));
115        assertEquals(VALUE3, _map.get(KEY2));
116        assertEquals(VALUE2, _map.get(KEY3));
117    }
118
119    @Test public void testGetEmpty()
120    {
121        assertNull(_map.get(KEY1));
122        assertNull(_map.get(KEY1, 1));
123    }
124
125    @Test public void testPut()
126    {
127        _map.put(KEY1, VALUE1);
128        _map.add(KEY1, VALUE2);
129        assertEquals(VALUE2, _map.get(KEY1, 1));
130        _map.put(KEY1, VALUE3, 1);
131        assertEquals(VALUE3, _map.get(KEY1, 1));
132        assertEquals(VALUE3, _map.get(KEY1));
133    }
134
135    @Test public void testPutAll()
136    {
137        _map.put(KEY1, VALUE1);
138        _map.put(KEY2, VALUE1);
139        _map.add(KEY2, VALUE2);
140        MultiMap<String, String> other = new BasicMultiMap<String, String>();
141
142        other.putAll(_map);
143        assertEquals(2, other.size());
144        assertEquals(2, other.length(KEY2));
145        assertEquals(1, other.length(KEY1));
146        assertEquals(VALUE1, _map.get(KEY1));
147        assertEquals(VALUE1, _map.get(KEY2, 0));
148        assertEquals(VALUE2, _map.get(KEY2, 1));
149        Map<String, String> regular = new HashMap<String, String>(_map);
150
151        _map.clear();
152        _map.putAll(regular);
153        assertEquals(regular.keySet(), _map.keySet());
154    }
155
156    @Test public void testRemove()
157    {
158        _map.add(KEY1, VALUE1);
159        _map.add(KEY2, VALUE1);
160        _map.add(KEY2, VALUE2);
161        _map.add(KEY3, VALUE1);
162        _map.add(KEY3, VALUE2);
163        _map.add(KEY3, VALUE3);
164        assertEquals(VALUE2, _map.get(KEY3, 1));
165        _map.remove(KEY3, 1);
166        assertEquals(VALUE3, _map.get(KEY3, 1));
167        _map.remove(KEY3, 1);
168        assertEquals(VALUE1, _map.get(KEY3));
169        _map.remove(KEY3, 0);
170        assertEquals(0, _map.length(KEY3));
171        assertFalse(_map.containsKey(KEY3));
172        _map.remove(KEY2);
173        assertFalse(_map.containsKey(KEY2));
174        _map.remove(KEY1);
175        assertFalse(_map.containsKey(KEY1));
176        assertEquals(0, _map.size());
177        assertTrue(_map.isEmpty());
178        assertNull(_map.remove(KEY1));
179        assertNull(_map.remove(KEY1, 1));
180    }
181
182    @Test public void testValues()
183    {
184        _map.put(KEY1, VALUE1);
185        _map.put(KEY2, VALUE2);
186        _map.add(KEY2, VALUE3);
187        String[] values = _map.values().toArray(new String[] {});
188
189        Arrays.sort(values);
190        assertArrayEquals(values, VALUES);
191    }
192}