/** * Copyright (c) 2009--2013 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.rhn.frontend.filter.test; import com.redhat.rhn.common.db.datasource.DataResult; import com.redhat.rhn.frontend.filter.TreeFilter; import com.redhat.rhn.testing.RhnBaseTestCase; import java.util.LinkedList; import java.util.List; /** * TreeFilterTest * @version $Rev$ */ public class TreeFilterTest extends RhnBaseTestCase { private DataResult main; private TreeFilter filter; public void setUp() throws Exception { super.setUp(); main = populate(); filter = new TreeFilter(); } private DataResult populate() { /** * Content Tree looks like this * * Aa1 Ba1 Ca1 Dd1 Da1 * / \ / \ / \ * Aa2 Ab4 Bb2 Bb6 Bb7 Bb8 * / / \ / \ * Aa3 Ac5 Ac6 Bb3 Aa4 * / \ * Bb4 Aa5 * / \ * Bb5 Aa6 */ String tree = "(Aa1,0) (Aa2,1) (Aa3,2) (Ab4,1) (Ac5,2) (Ac6,2)" + "(Ba1,0)(Bb2,1) (Bb3,2) (Bb4,3) (Bb5,4) (Bb6,1)" + "(Ca1,0) (Bb7,1) (Bb8,1) (Aa4,2) (Aa5,3) (Aa6,4)" + "(Dd1,0) (Da1,0)"; return makeDataResult(tree); } public void testEmptySearch() { //we search on "" as the search filter value // and expect everything to show up. DataResult dr = new DataResult(main); filter.filterData(dr, "", ""); assertEquals(main, dr); dr = new DataResult(main); filter.filterData(dr, "", "content"); assertEquals(main, dr); //now try an impossible search dr = new DataResult(main); filter.filterData(dr, "HAHAHAHAHAHAHAHA", "content"); assertTrue(dr.isEmpty()); } public void testRootElementSearch() { assertFilter("Aa1", "(Aa1, 0)"); assertFilter("Ba1", "(Ba1, 0)"); assertFilter("Ca1", "(Ca1, 0)"); assertFilter("Dd1", "(Dd1, 0)"); assertFilter("Da1", "(Da1, 0)"); } public void testSinglePathSearch() { assertFilter("Aa2", "(Aa1, 0) (Aa2,1)"); assertFilter("Ac6", "(Aa1, 0) (Ab4,1) (Ac6,2)"); assertFilter("Bb6", "(Ba1, 0) (Bb6,1)"); assertFilter("Bb5", "(Ba1, 0) (Bb2,1) (Bb3,2) (Bb4,3) (Bb5,4)"); assertFilter("Bb4", "(Ba1, 0) (Bb2,1) (Bb3,2) (Bb4,3)"); assertFilter("Bb3", "(Ba1, 0) (Bb2,1) (Bb3,2)"); assertFilter("Aa6", "(Ca1, 0) (Bb8,1) (Aa4,2) (Aa5,3) (Aa6,4)"); assertFilter("Aa5", "(Ca1, 0) (Bb8,1) (Aa4,2) (Aa5,3)"); assertFilter("Bb7", "(Ca1, 0) (Bb7,1)"); } public void testMultiPathSearch() { assertFilter("Aa", "(Aa1, 0) (Aa2,1) (Aa3,2)" + "(Ca1,0) (Bb8,1) (Aa4,2) (Aa5,3) (Aa6,4)"); assertFilter("Bb", "(Ba1, 0) (Bb2,1) (Bb3,2) (Bb4,3) (Bb5,4) (Bb6,1)" + "(Ca1,0) (Bb7,1) (Bb8,1)"); assertFilter("a", "(Aa1, 0) (Aa2,1) (Aa3,2) (Ab4,1) (Ac5,2) (Ac6,2) (Ba1,0)" + "(Ca1,0) (Bb8,1) (Aa4,2) (Aa5,3) (Aa6,4)" + "(Da1,0)"); assertFilter("b", "(Aa1, 0) (Ab4,1)" + "(Ba1, 0) (Bb2,1) (Bb3,2) (Bb4,3) (Bb5,4) (Bb6,1)" + "(Ca1,0) (Bb7,1) (Bb8,1)"); } private void assertFilter(String searchVal, String expected) { DataResult dr = new DataResult(main); filter.filterData(dr, searchVal, "content"); assertEquals(makeDataResult(expected), dr); } /** * Pass in an input string like "(content, depth) (content, depth)..." * and it returns a DataResult with a DepthAware Bean for each row.. * @param input Content String * @return DataResult of DepthAwareBeans */ private DataResult makeDataResult(String input) { List lst = new LinkedList(); //input = "(content,depth) (content,depth)" input = input.trim(); input = input.substring(1, input.length() - 1); String[] contents = input.split("\\)\\W*\\("); for (int i = 0; i < contents.length; i++) { //contents[i] = "(content,depth)" String val = contents[i].trim(); //val = "content,depth" String [] tuple = val.split(","); lst.add(DepthAwareBean.instance(tuple[0].trim(), Integer.parseInt(tuple[1].trim()))); } return new DataResult(lst); } }