///*
// * Licensed to the Apache Software Foundation (ASF) under one or more
// * contributor license agreements. See the NOTICE file distributed with
// * this work for additional information regarding copyright ownership.
// * The ASF licenses this file to You under the Apache License, Version 2.0
// * (the "License"); you may not use this file except in compliance with
// * the License. You may obtain a copy of the License at
// *
// * http://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */
//package org.apache.commons.collections4.trie;
//
//import java.util.ConcurrentModificationException;
//import java.util.Iterator;
//import java.util.Map;
//import java.util.NoSuchElementException;
//import java.util.SortedMap;
//
//import junit.framework.Test;
//
//import org.apache.commons.collections4.BulkTest;
//import org.apache.commons.collections4.map.AbstractSortedMapTest;
//
//import org.junit.Assert;
//
///**
// * JUnit tests for the PatriciaTrie.
// *
// * @version $Id$
// * @since 4.0
// */
//public class PatriciaTrieTest<V> extends AbstractSortedMapTest<String, V> {
//
// public PatriciaTrieTest(final String testName) {
// super(testName);
// }
//
// public static Test suite() {
// return BulkTest.makeSuite(PatriciaTrieTest.class);
// }
//
// @Override
// public SortedMap<String, V> makeObject() {
// return new PatriciaTrie<V>();
// }
//
// @Override
// public boolean isAllowNullKey() {
// return false;
// }
//
// //-----------------------------------------------------------------------
//
// public void testPrefixMap() {
// final PatriciaTrie<String> trie = new PatriciaTrie<String>();
//
// final String[] keys = new String[]{"", "Albert", "Xavier", "XyZ", "Anna", "Alien", "Alberto", "Alberts", "Allie", "Alliese", "Alabama", "Banane", "Blabla", "Amber", "Ammun", "Akka", "Akko", "Albertoo", "Amma"};
//
// for (final String key : keys) {
// trie.put(key, key);
// }
//
// SortedMap<String, String> map;
// Iterator<String> iterator;
// Iterator<Map.Entry<String, String>> entryIterator;
// Map.Entry<String, String> entry;
//
// map = trie.prefixMap("Al");
// Assert.assertEquals(8, map.size());
// Assert.assertEquals("Alabama", map.firstKey());
// Assert.assertEquals("Alliese", map.lastKey());
// Assert.assertEquals("Albertoo", map.get("Albertoo"));
// Assert.assertNotNull(trie.get("Xavier"));
// Assert.assertNull(map.get("Xavier"));
// Assert.assertNull(trie.get("Alice"));
// Assert.assertNull(map.get("Alice"));
// iterator = map.values().iterator();
// Assert.assertEquals("Alabama", iterator.next());
// Assert.assertEquals("Albert", iterator.next());
// Assert.assertEquals("Alberto", iterator.next());
// Assert.assertEquals("Albertoo", iterator.next());
// Assert.assertEquals("Alberts", iterator.next());
// Assert.assertEquals("Alien", iterator.next());
// Assert.assertEquals("Allie", iterator.next());
// Assert.assertEquals("Alliese", iterator.next());
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("Albert");
// iterator = map.keySet().iterator();
// Assert.assertEquals("Albert", iterator.next());
// Assert.assertEquals("Alberto", iterator.next());
// Assert.assertEquals("Albertoo", iterator.next());
// Assert.assertEquals("Alberts", iterator.next());
// Assert.assertFalse(iterator.hasNext());
// Assert.assertEquals(4, map.size());
// Assert.assertEquals("Albert", map.firstKey());
// Assert.assertEquals("Alberts", map.lastKey());
// Assert.assertNull(trie.get("Albertz"));
// map.put("Albertz", "Albertz");
// Assert.assertEquals("Albertz", trie.get("Albertz"));
// Assert.assertEquals(5, map.size());
// Assert.assertEquals("Albertz", map.lastKey());
// iterator = map.keySet().iterator();
// Assert.assertEquals("Albert", iterator.next());
// Assert.assertEquals("Alberto", iterator.next());
// Assert.assertEquals("Albertoo", iterator.next());
// Assert.assertEquals("Alberts", iterator.next());
// Assert.assertEquals("Albertz", iterator.next());
// Assert.assertFalse(iterator.hasNext());
// Assert.assertEquals("Albertz", map.remove("Albertz"));
//
// map = trie.prefixMap("Alberto");
// Assert.assertEquals(2, map.size());
// Assert.assertEquals("Alberto", map.firstKey());
// Assert.assertEquals("Albertoo", map.lastKey());
// entryIterator = map.entrySet().iterator();
// entry = entryIterator.next();
// Assert.assertEquals("Alberto", entry.getKey());
// Assert.assertEquals("Alberto", entry.getValue());
// entry = entryIterator.next();
// Assert.assertEquals("Albertoo", entry.getKey());
// Assert.assertEquals("Albertoo", entry.getValue());
// Assert.assertFalse(entryIterator.hasNext());
// trie.put("Albertoad", "Albertoad");
// Assert.assertEquals(3, map.size());
// Assert.assertEquals("Alberto", map.firstKey());
// Assert.assertEquals("Albertoo", map.lastKey());
// entryIterator = map.entrySet().iterator();
// entry = entryIterator.next();
// Assert.assertEquals("Alberto", entry.getKey());
// Assert.assertEquals("Alberto", entry.getValue());
// entry = entryIterator.next();
// Assert.assertEquals("Albertoad", entry.getKey());
// Assert.assertEquals("Albertoad", entry.getValue());
// entry = entryIterator.next();
// Assert.assertEquals("Albertoo", entry.getKey());
// Assert.assertEquals("Albertoo", entry.getValue());
// Assert.assertFalse(entryIterator.hasNext());
// Assert.assertEquals("Albertoo", trie.remove("Albertoo"));
// Assert.assertEquals("Alberto", map.firstKey());
// Assert.assertEquals("Albertoad", map.lastKey());
// Assert.assertEquals(2, map.size());
// entryIterator = map.entrySet().iterator();
// entry = entryIterator.next();
// Assert.assertEquals("Alberto", entry.getKey());
// Assert.assertEquals("Alberto", entry.getValue());
// entry = entryIterator.next();
// Assert.assertEquals("Albertoad", entry.getKey());
// Assert.assertEquals("Albertoad", entry.getValue());
// Assert.assertFalse(entryIterator.hasNext());
// Assert.assertEquals("Albertoad", trie.remove("Albertoad"));
// trie.put("Albertoo", "Albertoo");
//
// map = trie.prefixMap("X");
// Assert.assertEquals(2, map.size());
// Assert.assertFalse(map.containsKey("Albert"));
// Assert.assertTrue(map.containsKey("Xavier"));
// Assert.assertFalse(map.containsKey("Xalan"));
// iterator = map.values().iterator();
// Assert.assertEquals("Xavier", iterator.next());
// Assert.assertEquals("XyZ", iterator.next());
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("An");
// Assert.assertEquals(1, map.size());
// Assert.assertEquals("Anna", map.firstKey());
// Assert.assertEquals("Anna", map.lastKey());
// iterator = map.keySet().iterator();
// Assert.assertEquals("Anna", iterator.next());
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("Ban");
// Assert.assertEquals(1, map.size());
// Assert.assertEquals("Banane", map.firstKey());
// Assert.assertEquals("Banane", map.lastKey());
// iterator = map.keySet().iterator();
// Assert.assertEquals("Banane", iterator.next());
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("Am");
// Assert.assertFalse(map.isEmpty());
// Assert.assertEquals(3, map.size());
// Assert.assertEquals("Amber", trie.remove("Amber"));
// iterator = map.keySet().iterator();
// Assert.assertEquals("Amma", iterator.next());
// Assert.assertEquals("Ammun", iterator.next());
// Assert.assertFalse(iterator.hasNext());
// iterator = map.keySet().iterator();
// map.put("Amber", "Amber");
// Assert.assertEquals(3, map.size());
// try {
// iterator.next();
// Assert.fail("CME expected");
// } catch (final ConcurrentModificationException expected) {}
// Assert.assertEquals("Amber", map.firstKey());
// Assert.assertEquals("Ammun", map.lastKey());
//
// map = trie.prefixMap("Ak\0");
// Assert.assertTrue(map.isEmpty());
//
// map = trie.prefixMap("Ak");
// Assert.assertEquals(2, map.size());
// Assert.assertEquals("Akka", map.firstKey());
// Assert.assertEquals("Akko", map.lastKey());
// map.put("Ak", "Ak");
// Assert.assertEquals("Ak", map.firstKey());
// Assert.assertEquals("Akko", map.lastKey());
// Assert.assertEquals(3, map.size());
// trie.put("Al", "Al");
// Assert.assertEquals(3, map.size());
// Assert.assertEquals("Ak", map.remove("Ak"));
// Assert.assertEquals("Akka", map.firstKey());
// Assert.assertEquals("Akko", map.lastKey());
// Assert.assertEquals(2, map.size());
// iterator = map.keySet().iterator();
// Assert.assertEquals("Akka", iterator.next());
// Assert.assertEquals("Akko", iterator.next());
// Assert.assertFalse(iterator.hasNext());
// Assert.assertEquals("Al", trie.remove("Al"));
//
// map = trie.prefixMap("Akka");
// Assert.assertEquals(1, map.size());
// Assert.assertEquals("Akka", map.firstKey());
// Assert.assertEquals("Akka", map.lastKey());
// iterator = map.keySet().iterator();
// Assert.assertEquals("Akka", iterator.next());
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("Ab");
// Assert.assertTrue(map.isEmpty());
// Assert.assertEquals(0, map.size());
// try {
// final Object o = map.firstKey();
// Assert.fail("got a first key: " + o);
// } catch (final NoSuchElementException nsee) {}
// try {
// final Object o = map.lastKey();
// Assert.fail("got a last key: " + o);
// } catch (final NoSuchElementException nsee) {}
// iterator = map.values().iterator();
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("Albertooo");
// Assert.assertTrue(map.isEmpty());
// Assert.assertEquals(0, map.size());
// try {
// final Object o = map.firstKey();
// Assert.fail("got a first key: " + o);
// } catch (final NoSuchElementException nsee) {}
// try {
// final Object o = map.lastKey();
// Assert.fail("got a last key: " + o);
// } catch (final NoSuchElementException nsee) {}
// iterator = map.values().iterator();
// Assert.assertFalse(iterator.hasNext());
//
// map = trie.prefixMap("");
// Assert.assertSame(trie, map); // stricter than necessary, but a good check
//
// map = trie.prefixMap("\0");
// Assert.assertTrue(map.isEmpty());
// Assert.assertEquals(0, map.size());
// try {
// final Object o = map.firstKey();
// Assert.fail("got a first key: " + o);
// } catch (final NoSuchElementException nsee) {}
// try {
// final Object o = map.lastKey();
// Assert.fail("got a last key: " + o);
// } catch (final NoSuchElementException nsee) {}
// iterator = map.values().iterator();
// Assert.assertFalse(iterator.hasNext());
// }
//
// public void testPrefixMapRemoval() {
// final PatriciaTrie<String> trie = new PatriciaTrie<String>();
//
// final String[] keys = new String[]{"Albert", "Xavier", "XyZ", "Anna", "Alien", "Alberto", "Alberts", "Allie", "Alliese", "Alabama", "Banane", "Blabla", "Amber", "Ammun", "Akka", "Akko", "Albertoo", "Amma"};
//
// for (final String key : keys) {
// trie.put(key, key);
// }
//
// SortedMap<String, String> map = trie.prefixMap("Al");
// Assert.assertEquals(8, map.size());
// Iterator<String> iter = map.keySet().iterator();
// Assert.assertEquals("Alabama", iter.next());
// Assert.assertEquals("Albert", iter.next());
// Assert.assertEquals("Alberto", iter.next());
// Assert.assertEquals("Albertoo", iter.next());
// Assert.assertEquals("Alberts", iter.next());
// Assert.assertEquals("Alien", iter.next());
// iter.remove();
// Assert.assertEquals(7, map.size());
// Assert.assertEquals("Allie", iter.next());
// Assert.assertEquals("Alliese", iter.next());
// Assert.assertFalse(iter.hasNext());
//
// map = trie.prefixMap("Ak");
// Assert.assertEquals(2, map.size());
// iter = map.keySet().iterator();
// Assert.assertEquals("Akka", iter.next());
// iter.remove();
// Assert.assertEquals(1, map.size());
// Assert.assertEquals("Akko", iter.next());
// if (iter.hasNext()) {
// Assert.fail("shouldn't have next (but was: " + iter.next() + ")");
// }
// Assert.assertFalse(iter.hasNext());
// }
//
// //-----------------------------------------------------------------------
//
// @Override
// public String getCompatibilityVersion() {
// return "4";
// }
//
//// public void testCreate() throws Exception {
//// resetEmpty();
//// writeExternalFormToDisk(
//// (java.io.Serializable) map,
//// "src/test/resources/data/test/PatriciaTrie.emptyCollection.version4.obj");
//// resetFull();
//// writeExternalFormToDisk(
//// (java.io.Serializable) map,
//// "src/test/resources/data/test/PatriciaTrie.fullCollection.version4.obj");
//// }
//}