/* * Copyright 2016 Christoph Böhme * Copyright 2013, 2014 Deutsche Nationalbibliothek * * Licensed 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.culturegraph.mf.commons.tries; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; /** * Tests for class {@link WildcardTrie} * * @author Markus Michael Geipel * */ public final class WildcardTrieTest { private static final String ABC = "abc"; private static final String CCB = "ccb"; private static final String AAQBB = "aa?bb"; private static final String A_STAR_B = "a*b"; private static final String A_STAR_BC = "a*bc"; private static final String AA_STAR_BB = "aa*bb"; private static final String STAR_B = "*b"; private static final String A_STAR = "a*"; private static final String AACBB = "aacbb"; private static final String AABB = "aabb"; private static final String AB = "ab"; private static final String NOT_FOUND_BY = " not found by "; private static final String FOUND_BY = " found by "; private WildcardTrie<String> trie; @Before public void createSystemUnderTest() { trie = new WildcardTrie<>(); } @Test public void testWithQWildcard() { assertTrue(trie.get("").isEmpty()); assertTrue(trie.get("x").isEmpty()); trie.put(ABC, ABC); assertTrue(trie.get(ABC).contains(ABC)); trie.put(AAQBB, AAQBB); assertTrue(trie.get(AACBB).contains(AAQBB)); assertTrue(trie.get(AABB).isEmpty()); trie.put(AABB, AABB); assertTrue(trie.get(AABB).contains(AABB)); assertTrue(trie.get(AABB).size() == 1); trie.put(AACBB, AACBB); assertTrue(trie.get(AACBB).contains(AACBB)); assertTrue(trie.get(AACBB).contains(AAQBB)); } @Test public void testWithStarWildcard() { trie.put(A_STAR_B, A_STAR_B); assertTrue(AACBB + NOT_FOUND_BY + A_STAR_B, trie.get(AACBB).contains(A_STAR_B)); assertTrue(AABB + NOT_FOUND_BY + A_STAR_B, trie.get(AABB).contains(A_STAR_B)); assertTrue(AB + NOT_FOUND_BY + A_STAR_B, trie.get(AB).contains(A_STAR_B)); assertTrue(ABC + FOUND_BY + A_STAR_B, trie.get(ABC).isEmpty()); assertTrue(CCB + FOUND_BY + A_STAR_B, trie.get(CCB).isEmpty()); trie.put(AABB, AABB); assertTrue(trie.get(AABB).contains(AABB)); assertEquals(2, trie.get(AABB).size()); trie.put(AACBB, AACBB); assertTrue(trie.get(AACBB).contains(AACBB)); assertTrue(trie.get(AACBB).contains(A_STAR_B)); } @Test public void testWithTrailingStarWildcard() { trie.put(A_STAR, A_STAR); assertTrue(AACBB + NOT_FOUND_BY + A_STAR, trie.get(AACBB).contains(A_STAR)); assertTrue(AABB + NOT_FOUND_BY + A_STAR, trie.get(AABB).contains(A_STAR)); assertTrue(AB + NOT_FOUND_BY + A_STAR, trie.get(AB).contains(A_STAR)); assertTrue(ABC + NOT_FOUND_BY + A_STAR_B, trie.get(ABC).contains(A_STAR)); assertTrue(CCB + FOUND_BY + A_STAR_B, trie.get(CCB).isEmpty()); trie.put(AABB, AABB); assertTrue(trie.get(AABB).contains(AABB)); assertEquals(2, trie.get(AABB).size()); trie.put(AACBB, AACBB); assertTrue(trie.get(AACBB).contains(AACBB)); assertTrue(trie.get(AACBB).contains(A_STAR)); } @Test public void testWithInitialStarWildcard() { trie.put(STAR_B, STAR_B); assertTrue(AACBB + NOT_FOUND_BY + STAR_B, trie.get(AACBB).contains(STAR_B)); assertTrue(AABB + NOT_FOUND_BY + STAR_B, trie.get(AABB).contains(STAR_B)); assertTrue(ABC + FOUND_BY + A_STAR_B, trie.get(ABC).isEmpty()); assertTrue(CCB + NOT_FOUND_BY + A_STAR_B, trie.get(CCB).contains(STAR_B)); trie.put(AABB, AABB); assertTrue(trie.get(AABB).contains(AABB)); assertEquals(2, trie.get(AABB).size()); trie.put(AACBB, AACBB); assertTrue(trie.get(AACBB).contains(AACBB)); assertTrue(trie.get(AACBB).contains(STAR_B)); } @Test public void testWithMultipleStarWildcards() { trie.put(STAR_B, STAR_B); trie.put(A_STAR, A_STAR); trie.put(A_STAR_B, A_STAR_B); assertEquals(3, trie.get(AACBB).size()); trie.put(AA_STAR_BB, AA_STAR_BB); assertEquals(4, trie.get(AACBB).size()); assertEquals(3, trie.get(AB).size()); assertEquals(1, trie.get(CCB).size()); assertEquals(3, trie.get("acb").size()); } @Test public void testOverlapWithWildcard() { trie.put(ABC, ABC); trie.put(A_STAR_BC, A_STAR_BC); assertEquals(2, trie.get(ABC).size()); assertEquals(1, trie.get("abbc").size()); } @Test public void testEmptyKey() { trie.put("", ABC); assertEquals(1, trie.get("").size()); } @Test public void testWithOrAndWildcard() { final String key = ABC + WildcardTrie.OR_STRING + CCB; trie.put(key, ""); assertTrue(ABC + NOT_FOUND_BY + key, trie.get(ABC).contains("")); assertTrue(CCB + NOT_FOUND_BY + key, trie.get(CCB).contains("")); assertTrue(AABB + FOUND_BY + key, trie.get(AABB).isEmpty()); assertTrue(AB + FOUND_BY + key, trie.get(AB).isEmpty()); } }