2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.util;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotSame;
12 import static org.junit.Assert.assertSame;
13 import static org.junit.Assert.assertTrue;
15 import java.util.Collections;
16 import java.util.HashMap;
18 import java.util.TreeMap;
20 import org.junit.Before;
21 import org.junit.Test;
23 public class MapAdaptorTest {
24 private MapAdaptor adaptor;
28 adaptor = MapAdaptor.getInstance(true, 10, 5);
32 public void testTreeToEmpty() {
33 final Map<String, String> input = new TreeMap<>();
35 // Converts the input into a hashmap;
36 final Map<?, ?> snap = adaptor.takeSnapshot(input);
37 assertNotSame(input, snap);
38 assertTrue(snap instanceof HashMap);
40 final Map<?, ?> opt1 = adaptor.optimize(input);
41 assertSame(Collections.EMPTY_MAP, opt1);
43 final Map<?, ?> opt2 = adaptor.optimize(snap);
44 assertSame(Collections.EMPTY_MAP, opt2);
48 public void testTreeToSingleton() {
49 final Map<String, String> input = new TreeMap<>();
52 final Map<?, ?> snap = adaptor.takeSnapshot(input);
53 assertNotSame(input, snap);
54 assertTrue(snap instanceof HashMap);
55 assertEquals(input, snap);
57 final Map<?, ?> opt1 = adaptor.optimize(input);
58 assertNotSame(input, opt1);
59 assertEquals(input, opt1);
60 assertEquals(Collections.singletonMap(null, null).getClass(), opt1.getClass());
61 final Map<?, ?> snap1 = adaptor.takeSnapshot(opt1);
62 assertTrue(snap1 instanceof HashMap);
63 assertEquals(input, snap1);
65 final Map<?, ?> opt2 = adaptor.optimize(snap);
66 assertNotSame(snap, opt2);
67 assertEquals(input, opt2);
68 assertEquals(Collections.singletonMap(null, null).getClass(), opt2.getClass());
70 final Map<?, ?> snap2 = adaptor.takeSnapshot(opt2);
71 assertNotSame(opt2, snap2);
72 assertTrue(snap2 instanceof HashMap);
73 assertEquals(input, snap2);
77 public void testTreeToTrie() {
78 final Map<String, String> input = new TreeMap<>();
79 for (char c = 'a'; c <= 'z'; ++c) {
80 final String s = String.valueOf(c);
84 final Map<String, String> snap = adaptor.takeSnapshot(input);
85 assertTrue(snap instanceof HashMap);
86 assertEquals(input, snap);
88 final Map<String, String> opt1 = adaptor.optimize(input);
89 assertEquals(input, opt1);
90 assertEquals(ReadOnlyTrieMap.class, opt1.getClass());
92 final Map<String, String> snap2 = adaptor.takeSnapshot(opt1);
93 assertTrue(snap2 instanceof ReadWriteTrieMap);
94 assertEquals(opt1, snap2);
95 assertEquals(26, snap2.size());
97 // snap2 and snap3 are independent
98 final Map<String, String> snap3 = adaptor.takeSnapshot(opt1);
101 assertEquals(25, snap2.size());
102 assertEquals(26, snap3.size());
106 assertEquals(25, snap2.size());
107 assertEquals(24, snap3.size());
109 snap2.put("foo", "foo");
110 snap2.put("bar", "baz");
111 snap3.put("bar", "baz");
112 assertEquals(27, snap2.size());
113 assertEquals(25, snap3.size());
117 public void testTrieToHash() {
118 final Map<String, String> input = new TreeMap<>();
119 for (char c = 'a'; c <= 'k'; ++c) {
120 final String s = String.valueOf(c);
124 // Translated to read-only
125 final Map<String, String> opt1 = adaptor.optimize(input);
126 assertEquals(input, opt1);
127 assertEquals(ReadOnlyTrieMap.class, opt1.getClass());
128 assertEquals(11, opt1.size());
130 // 11 elements -- should retain TrieMap
131 final Map<String, String> snap1 = adaptor.takeSnapshot(opt1);
132 assertEquals(ReadWriteTrieMap.class, snap1.getClass());
133 assertEquals(11, snap1.size());
135 for (char c = 'e'; c <= 'k'; ++c) {
136 final String s = String.valueOf(c);
140 // 4 elements: should revert to HashMap
141 assertEquals(4, snap1.size());
143 final Map<String, String> opt2 = adaptor.optimize(snap1);
144 assertEquals(snap1, opt2);
145 assertEquals(HashMap.class, opt2.getClass());
146 assertEquals(4, opt2.size());