// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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 com.google.collide.client.search;
import com.google.collide.client.util.PathUtil;
import com.google.collide.client.workspace.FileTreeModel;
import com.google.collide.client.workspace.FileTreeNode;
import com.google.collide.client.workspace.MockOutgoingController;
import com.google.collide.dto.DirInfo;
import com.google.collide.json.shared.JsonArray;
import com.google.common.collect.ImmutableList;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.regexp.shared.RegExp;
/**
* Tests to ensure the search file indexer returns correct results
*/
public class TreeWalkFileNameSearchImplTest extends GWTTestCase {
@Override
public String getModuleName() {
return SearchTestUtils.BUILD_MODULE_NAME;
}
private RegExp regex(String query) {
return RegExp.compile(query, "i");
}
public void testNoMatches() {
FileNameSearch indexer = TreeWalkFileNameSearchImpl.create();
// Setup the file tree model with the simple tree (a list of hello files)
FileTreeModel model = getFileTree(buildSimpleTree());
indexer.setFileTreeModel(model);
// Verify no matches
JsonArray<PathUtil> results = indexer.getMatches(regex("nothello"), 5);
assertEquals(0, results.size());
}
public void testMaxResults() {
FileNameSearch indexer = TreeWalkFileNameSearchImpl.create();
// Setup the file tree model with the simple tree (a list of hello files)
FileTreeModel model = getFileTree(buildSimpleTree());
indexer.setFileTreeModel(model);
// Verify no matches
JsonArray<PathUtil> results = indexer.getMatches(regex("hello"), 2);
assertEquals(2, results.size());
results = indexer.getMatches(regex("hello"), 3);
assertEquals(3, results.size());
results = indexer.getMatches(regex("hello"), FileNameSearch.RETURN_ALL_RESULTS);
assertEquals(4, results.size());
}
public void testCorrectMatchesFound() {
FileNameSearch indexer = TreeWalkFileNameSearchImpl.create();
// Setup the file tree model with the simple tree (a list of hello files)
FileTreeModel model = getFileTree(buildComplexTree());
indexer.setFileTreeModel(model);
// Verify correct matches
JsonArray<PathUtil> results = indexer.getMatches(regex("world"), 2);
assertEquals(2, results.size());
assertContainsPaths(ImmutableList.of("/src/world.js", "/src/world.html"), results);
results = indexer.getMatches(regex("data"), 4);
assertEquals(1, results.size());
assertEquals("data.txt", results.get(0).getBaseName());
}
public void testSameFileNames() {
FileNameSearch indexer = TreeWalkFileNameSearchImpl.create();
// Setup the file tree model with the simple tree (a list of hello files)
FileTreeModel model = getFileTree(buildComplexTree());
indexer.setFileTreeModel(model);
// Verify that two results are returned from two different directories
JsonArray<PathUtil> results = indexer.getMatches(regex("hello"), 2);
assertEquals(2, results.size());
// Returns the proper two files
assertContainsPaths(ImmutableList.of("/hello.js", "/src/hello.html"), results);
}
public void testFindFilesRelativeToPath() {
FileNameSearch indexer = TreeWalkFileNameSearchImpl.create();
// Setup the file tree model with the simple tree (a list of hello files)
FileTreeModel model = getFileTree(buildComplexTree());
indexer.setFileTreeModel(model);
// Verify that two results are returned from two different directories
JsonArray<PathUtil> results =
indexer.getMatchesRelativeToPath(new PathUtil("/src"), regex("hello"), 2);
assertEquals(1, results.size());
// Returns the proper two files
assertContainsPaths(ImmutableList.of("/src/hello.html"), results);
}
public void testNoCrashWithInvalidModel() {
FileNameSearch indexer = TreeWalkFileNameSearchImpl.create();
// Check null filetree
indexer.setFileTreeModel(null);
JsonArray<PathUtil> results = indexer.getMatches(regex("haha"), 4);
assertEquals(0, results.size());
// Crap file tree so we can test no crashing
FileTreeModel model = new FileTreeModel(new MockOutgoingController());
indexer.setFileTreeModel(model);
results = indexer.getMatches(regex("haha"), 4);
assertEquals(0, results.size());
}
/**
* Verifies that all values in the {@code actual} array are present in the
* {@code expected}. Also checks that arrays are the same length
*/
private void assertContainsPaths(ImmutableList<String> expected, JsonArray<PathUtil> actual) {
assertEquals(expected.size(), actual.size());
for (int i = 0; i < actual.size(); i++) {
if (!expected.contains(actual.get(i).getPathString())) {
fail("Actual contains " + actual.get(i).getPathString()
+ " which is not present in expected");
}
}
}
/**
* Creates a file tree model given a directory structure
*/
private FileTreeModel getFileTree(DirInfo dir) {
FileTreeNode root = FileTreeNode.transform(dir);
FileTreeModel model = new FileTreeModel(new MockOutgoingController());
model.replaceNode(PathUtil.WORKSPACE_ROOT, root, "1");
return model;
}
private final native DirInfo buildSimpleTree() /*-{
return {
// Root node is magic
nodeType : @com.google.collide.dto.TreeNodeInfo::DIR_TYPE,
id : "1",
originId : "1",
name : "root",
files : [
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "5",
originId : "5",
name : "hello.js",
rootId : "2",
path : "/hello.js",
size : "1234"
},
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "6",
originId : "6",
name : "hello2.js",
rootId : "2",
path : "/hello2.js",
size : "1234"
},
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "7",
originId : "7",
name : "hello3.js",
rootId : "2",
path : "/hello3.js",
size : "1234"
},
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "8",
originId : "8",
name : "hello4.js",
rootId : "2",
path : "/hello4.js",
size : "1234"
}
],
isComplete : true,
subDirectories : []
};
}-*/;
public final native DirInfo buildComplexTree() /*-{
return {
// Root node is magic
nodeType : @com.google.collide.dto.TreeNodeInfo::DIR_TYPE,
id : "1",
originId : "1",
name : "root",
files : [
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "5",
originId : "5",
name : "hello.js",
rootId : "2",
path : "/hello.js",
size : "1234"
}
],
isComplete : true,
subDirectories : [
{
nodeType : @com.google.collide.dto.TreeNodeInfo::DIR_TYPE,
id : "2",
originId : "2",
name : "src",
path : "/src",
files : [
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "7",
originId : "7",
name : "world.js",
rootId : "2",
path : "/src/world.js",
size : "1234"
},
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "3",
originId : "3",
name : "hello.html",
rootId : "2",
path : "/src/hello.html",
size : "1234"
},
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "8",
originId : "8",
name : "world.html",
rootId : "2",
path : "/src/world.html",
size : "1234"
}
],
isComplete : true,
subDirectories : []
},
{
nodeType : @com.google.collide.dto.TreeNodeInfo::DIR_TYPE,
id : "4",
originId : "4",
name : "res",
path : "/res",
files : [
{
nodeType : @com.google.collide.dto.TreeNodeInfo::FILE_TYPE,
id : "6",
originId : "5",
name : "data.txt",
rootId : "4",
path : "/res/data.txt",
size : "1234"
}
],
isComplete : true,
subDirectories : []
}
]
};
}-*/;
}