/*
* JBoss, Home of Professional Open Source
* Copyright 2016, JBoss Inc., and individual contributors as indicated
* by the @authors tag.
*
* 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.jboss.as.cli.completion.modules.test;
import org.jboss.as.cli.handlers.ModuleNameTabCompleter;
import org.jboss.as.cli.handlers.module.ModuleConfigImpl;
import org.jboss.staxmapper.FormattingXMLStreamWriter;
import org.junit.After;
import org.junit.Test;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
*
* @author Bartosz Spyrko-Smietanko
*/
public class ModuleNameTabCompleterTestCase {
public static final String MODULES_DIR = "test-modules";
private final ModuleNameTabCompleter completer =
ModuleNameTabCompleter.completer(new File(MODULES_DIR))
.excludeNonModuleFolders(true)
.includeSystemModules(true)
.build();
@After
public void tearDown() {
final File modules = new File(MODULES_DIR);
if (modules.exists()) {
remove(modules);
}
}
private void remove(File p) {
for (File child : p.listFiles()) {
if (child.isDirectory()) {
remove(child);
} else {
child.delete();
}
}
p.delete();
}
@Test
public void suggestAllFoldersIfBufferIsNull() throws Exception {
createModules("org", "com");
assertEquals(Arrays.asList("com", "org"), complete(null));
}
@Test
public void suggestAllFoldersIfBufferIsEmpty() throws Exception {
createModules("org", "com");
assertEquals(Arrays.asList("com", "org"), complete(""));
}
@Test
public void suggestOnlyMatchingFoldersIfBufferIsNotEmpty() throws Exception {
createModules("org", "foo", "foo2");
assertEquals(Arrays.asList("foo", "foo2"), complete("f"));
}
@Test
public void ignoreSystemFolder() throws Exception {
createModules("org", "com");
new File(MODULES_DIR + "/system/bar").mkdirs();
assertEquals(Arrays.asList("com", "org"), complete(null));
}
@Test
public void returnEmptyListIfNoMatchesFound() throws Exception {
createModules("com");
assertEquals(Collections.emptyList(), complete("foo"));
}
@Test
public void includeLayerModules() throws Exception {
createLayerModules("base", "org", "com");
assertEquals(Arrays.asList("com", "org"), complete(null));
}
@Test
public void includeAddonsModulesInSuggestions() throws Exception {
createAddonsModules("addon1", "org", "com");
assertEquals(Arrays.asList("com", "org"), complete(null));
}
@Test
public void suggestOnlyFirstPartOfTheModuleName() throws Exception {
createModules("com/module1", "com/module2");
assertEquals(Arrays.asList("com."), complete(null));
}
@Test
public void suggestOnlyFirstPartOfModulesMatchingBuffer() throws Exception {
createModules("com/module1", "com/module2", "org/foo");
assertEquals(Arrays.asList("com."), complete("co"));
}
@Test
public void suggestOnlyFirstModuleWhenHasNestedModulesAndBufferDoesntMatchExactly() throws Exception {
createModules("com/module1", "com/module1/module2");
assertEquals(Arrays.asList("com.module1"), complete("com.module"));
}
@Test
public void suggestBothMatchedModuleAndModuleWithSeparatorWhenHasNestedModuleAndBufferMatchesModule() throws Exception {
createModules("com/module1", "com/module1/module2");
assertEquals(Arrays.asList("com.module1", "com.module1."), complete("com.module1"));
}
@Test
public void suggestNestedFolderIfBufferEndsWithSeparator() throws Exception {
createModules("org/root");
createLayerModules("base", "org/layer");
assertEquals(Arrays.asList("org.layer", "org.root"), complete("org."));
}
@Test
public void includeModulesFromMultipleLayers() throws Exception {
createLayerModules("base", "layer1");
createLayerModules("another", "layer2");
assertEquals(Arrays.asList("layer1", "layer2"), complete(null));
}
@Test
public void ignoreDuplicatedFolderNames() throws Exception {
createLayerModules("base", "module");
createLayerModules("another", "module");
assertEquals(Arrays.asList("module"), complete(null));
}
@Test
public void escapeSpacesInFileNames() throws Exception {
createModules("module 1", "module 2");
assertEquals(Arrays.asList("module\\ 1", "module\\ 2"), complete(null));
}
@Test
public void moduleNamesExcludeSlotName() throws Exception {
createModules("foo/bar");
assertEquals(Collections.emptyList(), complete("foo.bar."));
}
@Test
public void ignorePatchesInLayers() throws Exception {
createPatchedModules(ModuleNameTabCompleter.LAYERS_DIR, "abc", "foo/bar");
assertEquals(Collections.emptyList(), complete(""));
}
@Test
public void ignorePatchesInAddons() throws Exception {
createPatchedModules(ModuleNameTabCompleter.ADDONS_DIR, "abc", "foo/bar");
assertEquals(Collections.emptyList(), complete(""));
}
@Test
public void excludeSystemModulesIfFlagIsSet() throws Exception {
createLayerModules("another", "module");
createModules("foo/bar");
ModuleNameTabCompleter completer = ModuleNameTabCompleter.completer(new File(MODULES_DIR))
.excludeNonModuleFolders(true)
.includeSystemModules(false)
.build();
assertEquals(Arrays.asList("foo."), completer.complete(""));
}
@Test
public void strictlyMatchNameUntilLastNamePart() throws Exception {
createModules("foo/bar", "faa/bar2");
assertEquals(Collections.emptyList(), complete("f."));
assertEquals(Collections.emptyList(), complete("f.b"));
}
private static void createModules(String... names) throws IOException, XMLStreamException {
doCreateModule(MODULES_DIR + "/", names);
}
private static void createLayerModules(String layerName, String... names) throws IOException, XMLStreamException {
doCreateModule(MODULES_DIR + "/" + ModuleNameTabCompleter.LAYERS_DIR + "/" + layerName + "/", names);
}
private static void createAddonsModules(String addonName, String... names) throws IOException, XMLStreamException {
doCreateModule(MODULES_DIR + "/" + ModuleNameTabCompleter.ADDONS_DIR + "/" + addonName + "/", names);
}
private static void createPatchedModules(String base, String baseName, String... names) throws IOException, XMLStreamException {
doCreateModule(MODULES_DIR + "/" + base + "/" + baseName + "/patches/", names);
}
private static void doCreateModule(String prefix, String[] names) throws IOException, XMLStreamException {
for (String name : names) {
new File(prefix + name + "/main").mkdirs();
final File file = new File(prefix + name + "/main/module.xml");
file.createNewFile();
try(FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8")) {
final FormattingXMLStreamWriter xmlWriter = new FormattingXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));
final ModuleConfigImpl moduleConfig = new ModuleConfigImpl(name.replace('/', '.'));
moduleConfig.writeContent(xmlWriter, moduleConfig);
}
}
}
private List<String> complete(String buffer) {
return completer.complete(buffer);
}
}