blob: 89318075aad274ada68ee9096fa4761fcbdc0f9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013-2019 Pivotal Software, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.text.quicksearch.tests;
import static org.eclipse.text.quicksearch.internal.core.priority.PriorityFunction.PRIORITY_DEFAULT;
import static org.eclipse.text.quicksearch.internal.core.priority.PriorityFunction.PRIORITY_IGNORE;
import static org.junit.Assert.assertEquals;
import org.eclipse.core.runtime.Path;
import org.eclipse.text.quicksearch.internal.core.priority.PrioriTree;
import org.junit.Before;
import org.junit.Test;
public class PrioriTreeTest {
PrioriTree tree;
@Before
public void setUp() throws Exception {
tree = PrioriTree.create();
}
@Test
public void testWithEmptyTree() {
//In the empty tree most paths are assigned 'DEFAULT' priority.
checkPriority(PRIORITY_DEFAULT, "/");
checkPriority(PRIORITY_DEFAULT, "/foo/bar/zor");
//Paths with ignored extensions should be 'ignored'.
checkPriority(PRIORITY_IGNORE, "/foo/muck.zip");
checkPriority(PRIORITY_IGNORE, "/muck.jar");
checkPriority(PRIORITY_IGNORE, "/images/muck.jpg");
//Names starting with ignored prefix should be ignored
checkPriority(PRIORITY_IGNORE, "/project/.git");
//Some specific names are also to be ignored
checkPriority(PRIORITY_IGNORE, "/project/target");
checkPriority(PRIORITY_IGNORE, "/project/build");
}
@Test
public void testSinglePathSet() {
setPriority("/foo/bar/zor", 100.0);
//Path itself should have the set priority
checkPriority(100.0, "/foo/bar/zor");
//Also the parent paths should have been set automatically
checkPriority(100.0, "/foo/bar");
checkPriority(100.0, "/foo");
checkPriority(100.0, "/");
//Things not on the paths should still be 'default'
checkPriority(PRIORITY_DEFAULT, "/other/bar");
checkPriority(PRIORITY_DEFAULT, "/other");
//The things nested underneath the set path also get assigned implicitly ...
checkPriority(100.0, "/foo/bar/zor/nested");
checkPriority(100.0, "/foo/bar/zor/nested/deeper");
// ... unless they are 'ignored'. Ignored paths are never converted to non-ignored.
checkPriority(PRIORITY_IGNORE, "/foo/bar/zor/nested/big.zip");
}
@Test
public void testSetOverlappingPaths() {
setPriority("/shared/foo", 50.0);
setPriority("/shared/bar", 100.0);
tree.dump();
checkPriority(50.0, "/shared/foo");
checkPriority(100.0, "/shared/bar");
//Shared section of path should get highest priority of both
checkPriority(100.0, "/");
checkPriority(100.0, "/shared");
//Disjoint paths remain default
checkPriority(PRIORITY_DEFAULT, "/other");
}
/**
* Similar to testSetOverlappingPaths but order of
* priority set operations is reversed. The result should
* be the same.
*/
@Test
public void testSetOverlappingPaths2() {
setPriority("/shared/bar", 100.0);
setPriority("/shared/foo", 50.0);
checkPriority(50.0, "/shared/foo");
checkPriority(100.0, "/shared/bar");
//Shared section of path should get highest priority of both
checkPriority(100.0, "/");
checkPriority(100.0, "/shared");
//Disjoint paths remain default
checkPriority(PRIORITY_DEFAULT, "/other");
}
/**
* Need support for setting priority of an entire subtree.
*/
@Test
public void testSetTreePriority() {
setPriority("/promoted", 100.0);
//Stuff not in the raised subtree should be unchanged
checkPriority(PRIORITY_DEFAULT, "/unrelated");
//Stuff in the raised subtree should be affected.
checkPriority(100.0, "/promoted");
checkPriority(100.0, "/promoted/sub");
checkPriority(100.0, "/promoted/sub/sub");
//But... ignored stuff should never be made searchable even in a raised subtree.
checkPriority(PRIORITY_IGNORE, "/promoted/big.zip");
}
/**
* Check that setting priotity of a tree raises children priority also if those
* children already had a priority assigned before.
*/
@Test
public void testSetTreePriority2() {
setPriority("/promoted/sub/sub", 50.0);
checkPriority(50.0, "/promoted");
checkPriority(50.0, "/promoted/sub");
checkPriority(50.0, "/promoted/sub/sub");
checkPriority(PRIORITY_DEFAULT, "/promoted/other");
setPriority("/promoted", 100.0);
//Stuff not in the raised subtree should be unchanged
checkPriority(PRIORITY_DEFAULT, "/unrelated");
//Stuff in the raised subtree should be affected.
checkPriority(100.0, "/promoted");
checkPriority(100.0, "/promoted/sub");
checkPriority(100.0, "/promoted/sub/sub");
checkPriority(100.0, "/promoted/other");
//But... ignored stuff should never be made searchable even in a raised subtree.
checkPriority(PRIORITY_IGNORE, "/promoted/sub/big.zip");
checkPriority(PRIORITY_IGNORE, "/promoted/other/big.zip");
}
private void setPriority(String pathStr, double pri) {
tree.setPriority(new Path(pathStr), pri);
}
private void checkPriority(double expected, String pathStr) {
assertEquals(pathStr,
expected, tree.priority(new MockResource(pathStr)), 0);
}
}