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.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
12 import static org.junit.jupiter.api.Assertions.assertNotSame;
13 import static org.junit.jupiter.api.Assertions.assertSame;
15 import com.google.common.collect.ImmutableMap;
16 import java.util.Collections;
17 import java.util.HashMap;
18 import java.util.TreeMap;
19 import org.junit.jupiter.api.BeforeEach;
20 import org.junit.jupiter.api.Test;
22 class MapAdaptorTest {
23 private MapAdaptor adaptor;
27 adaptor = MapAdaptor.getInstance(true, 10, 5);
31 void testTreeToEmpty() {
32 final var input = new TreeMap<>();
34 // Converts the input into a hashmap;
35 final var snap = adaptor.takeSnapshot(input);
36 assertNotSame(input, snap);
37 assertInstanceOf(HashMap.class, snap);
39 final var opt1 = adaptor.optimize(input);
40 assertSame(ImmutableMap.of(), opt1);
42 final var opt2 = adaptor.optimize(snap);
43 assertSame(ImmutableMap.of(), opt2);
47 void testTreeToSingleton() {
48 final var input = new TreeMap<>();
51 final var snap = adaptor.takeSnapshot(input);
52 assertNotSame(input, snap);
53 assertInstanceOf(HashMap.class, snap);
54 assertEquals(input, snap);
56 final var opt1 = adaptor.optimize(input);
57 assertNotSame(input, opt1);
58 assertEquals(input, opt1);
59 assertEquals(Collections.singletonMap(null, null).getClass(), opt1.getClass());
60 final var snap1 = adaptor.takeSnapshot(opt1);
61 assertInstanceOf(HashMap.class, snap1);
62 assertEquals(input, snap1);
64 final var opt2 = adaptor.optimize(snap);
65 assertNotSame(snap, opt2);
66 assertEquals(input, opt2);
67 assertEquals(Collections.singletonMap(null, null).getClass(), opt2.getClass());
69 final var snap2 = adaptor.takeSnapshot(opt2);
70 assertNotSame(opt2, snap2);
71 assertInstanceOf(HashMap.class, snap2);
72 assertEquals(input, snap2);
76 void testTreeToTrie() {
77 final var input = new TreeMap<String, String>();
78 for (var c = 'a'; c <= 'z'; ++c) {
79 final var s = String.valueOf(c);
83 final var snap = adaptor.takeSnapshot(input);
84 assertInstanceOf(HashMap.class, snap);
85 assertEquals(input, snap);
87 final var opt1 = adaptor.optimize(input);
88 assertEquals(input, opt1);
89 assertEquals(ReadOnlyTrieMap.class, opt1.getClass());
91 final var snap2 = adaptor.takeSnapshot(opt1);
92 assertInstanceOf(ReadWriteTrieMap.class, snap2);
93 assertEquals(opt1, snap2);
94 assertEquals(26, snap2.size());
96 // snap2 and snap3 are independent
97 final var snap3 = adaptor.takeSnapshot(opt1);
100 assertEquals(25, snap2.size());
101 assertEquals(26, snap3.size());
105 assertEquals(25, snap2.size());
106 assertEquals(24, snap3.size());
108 snap2.put("foo", "foo");
109 snap2.put("bar", "baz");
110 snap3.put("bar", "baz");
111 assertEquals(27, snap2.size());
112 assertEquals(25, snap3.size());
116 void testTrieToHash() {
117 final var input = new TreeMap<String, String>();
118 for (char c = 'a'; c <= 'k'; ++c) {
119 final String s = String.valueOf(c);
123 // Translated to read-only
124 final var opt1 = adaptor.optimize(input);
125 assertEquals(input, opt1);
126 assertEquals(ReadOnlyTrieMap.class, opt1.getClass());
127 assertEquals(11, opt1.size());
129 // 11 elements -- should retain TrieMap
130 final var snap1 = adaptor.takeSnapshot(opt1);
131 assertEquals(ReadWriteTrieMap.class, snap1.getClass());
132 assertEquals(11, snap1.size());
134 for (var c = 'e'; c <= 'k'; ++c) {
135 final var s = String.valueOf(c);
139 // 4 elements: should revert to HashMap
140 assertEquals(4, snap1.size());
142 final var opt2 = adaptor.optimize(snap1);
143 assertEquals(snap1, opt2);
144 assertEquals(HashMap.class, opt2.getClass());
145 assertEquals(4, opt2.size());