///*
// * Copyright (C) 2014 Yevgeny Krasik
// *
// * 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.github.ykrasik.jaci.cli.internal.filesystem;
//
//import com.github.ykrasik.jaci.cli.exception.ParseException;
//import com.github.ykrasik.jerminal.internal.assist.AutoCompleteReturnValue;
//import com.github.ykrasik.jerminal.internal.assist.AutoCompleteType;
//import com.google.common.collect.ObjectArrays;
//import org.junit.Before;
//import org.junit.Test;
//
//import java.util.*;
//
//import static org.junit.Assert.assertEquals;
//import static org.junit.Assert.fail;
//
///**
// * @author Yevgeny Krasik
// */
//public class FileSystemAutoCompleteTest extends AbstractFileSystemTest {
// private static final String[] COMMANDS = { "c", "cmd1", "cmd2", "cmd2cmd", "cmf", "file" };
// private static final String[] GLOBAL_COMMANDS = { "g", "gl", "global", "globalCommand", "globalCommand2" };
//
// private List<String> expectedFiles;
// private List<String> expectedDirectories;
//
// @Override
// @Before
// public void setUp() {
// super.setUp();
//
// add("", COMMANDS);
// add("dir1", COMMANDS);
// add("dir1/dir2", COMMANDS);
//
// add("dir1/dir3", "cmd");
// add("dir1/dir3dir", "cmd");
// add("dir1/dib", "cmd");
// add("dir1/folder", "cmd");
//
// add("folder", "cmd");
//
// addGlobalCommands(GLOBAL_COMMANDS);
//
// this.expectedFiles = Collections.emptyList();
// this.expectedDirectories = Collections.emptyList();
// }
//
// // FIXME: Add current directory test
//
// @Test
// public void testAutoCompletePathEmptyPrefix() {
// // All commands and directories are possible with an empty prefix.
// expectFiles(ObjectArrays.concat(COMMANDS, GLOBAL_COMMANDS, String.class));
// expectDirectories("dir1", "folder");
// assertAutoCompletePath("", "");
//
// // Global commands no longer possible.
// expectFiles(COMMANDS);
// expectDirectories("dir2", "dir3", "dir3dir", "dib", "folder");
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/", "");
//
// expectDirectories();
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/", "");
// }
//
// @Test
// public void testAutoCompletePathPrefix1() {
// expectFiles("c", "cmd1", "cmd2", "cmd2cmd", "cmf");
// assertAutoCompletePathVariations("c");
// }
//
// @Test
// public void testAutoCompletePathPrefix2() {
// expectFiles("cmd1", "cmd2", "cmd2cmd", "cmf");
// assertAutoCompletePathVariations("cm");
// }
//
// @Test
// public void testAutoCompletePathPrefix3() {
// expectFiles("cmf");
// assertAutoCompletePathVariations("cmf");
// }
//
// @Test
// public void testAutoCompletePathPrefix4() {
// expectFiles("cmd1", "cmd2", "cmd2cmd");
// assertAutoCompletePathVariations("cmd");
// }
//
// @Test
// public void testAutoCompletePathPrefix5() {
// expectFiles("cmd1");
// assertAutoCompletePathVariations("cmd1");
// }
//
// @Test
// public void testAutoCompletePathPrefix6() {
// expectFiles("cmd2", "cmd2cmd");
// assertAutoCompletePathVariations("cmd2");
// }
//
// @Test
// public void testAutoCompletePathPrefix7() {
// expectFiles("cmd2cmd");
// assertAutoCompletePathVariations("cmd2c");
// }
//
// @Test
// public void testAutoCompletePathPrefix8() {
// expectFiles("cmd2cmd");
// assertAutoCompletePathVariations("cmd2cmd");
// }
//
// @Test
// public void testAutoCompletePathPrefix9() {
// expectFiles("file");
// expectDirectories("folder");
// assertAutoCompletePathWithAndWithoutDelimiter("f", "f");
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/f", "f");
//
// expectDirectories();
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/f", "f");
// }
//
// @Test
// public void testAutoCompletePathPrefix10() {
// expectDirectories("folder");
// assertAutoCompletePathWithAndWithoutDelimiter("fo", "fo");
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/fo", "fo");
//
// expectDirectories();
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/fo", "fo");
// }
//
// @Test
// public void testAutoCompletePathPrefix11() {
// expectFiles("file");
// assertAutoCompletePathVariations("fi");
// }
//
// @Test
// public void testAutoCompletePathPrefix12() {
// expectDirectories("dir1");
// assertAutoCompletePathWithAndWithoutDelimiter("d", "d");
//
// expectDirectories("dir2", "dir3", "dir3dir", "dib");
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/d", "d");
//
// expectDirectories();
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/d", "d");
// }
//
// @Test
// public void testAutoCompletePathInvalidPrefix() {
// // These are all invalid prefixes.
// assertAutoCompletePathVariations("cmd3");
// assertAutoCompletePathVariations("cmd2d");
// assertAutoCompletePathVariations("cmd2cmd1");
// assertAutoCompletePathVariations("e");
// }
//
// @Test
// public void testInvalidPath() {
// assertInvalidPath("dir/");
// assertInvalidPath("dir1/dir/");
// assertInvalidPath("dir1/dir2/d/");
// }
//
// @Test
// public void testAutoCompleteDirectory() {
// // FIXME: Implement.
// }
//
// private void expectFiles(String... files) {
// expectedFiles = Arrays.asList(files);
// }
//
// private void expectDirectories(String... directories) {
// expectedDirectories = Arrays.asList(directories);
// }
//
// private void assertAutoCompletePathVariations(String prefix) {
// assertAutoCompletePathWithAndWithoutDelimiter(prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("./" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/../" + prefix, prefix);
//
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("./dir1/" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/./" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/../" + prefix, prefix);
//
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("./dir1/dir2/" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/./dir2/" + prefix, prefix);
// assertAutoCompletePathWithAndWithoutDelimiter("dir1/dir2/./" + prefix, prefix);
// }
//
// private void assertAutoCompletePathWithAndWithoutDelimiter(String path, String prefix) {
// assertAutoCompletePath(path, prefix);
// assertAutoCompletePath('/' + path, prefix);
// }
//
// private void assertAutoCompletePath(String rawPath, String expectedPrefix) {
// try {
// final AutoCompleteReturnValue returnValue = internalFileSystem.autoCompletePath(rawPath);
// doAssertAutoComplete(returnValue, expectedPrefix);
// } catch (ParseException e) {
// throw new RuntimeException(e);
// }
// }
//
// private void assertAutoCompleteDirectory(String rawPath, String expectedPrefix) {
// try {
// final AutoCompleteReturnValue returnValue = internalFileSystem.autoCompletePathToDirectory(rawPath);
// doAssertAutoComplete(returnValue, expectedPrefix);
// } catch (ParseException e) {
// throw new RuntimeException(e);
// }
// }
//
// private void doAssertAutoComplete(AutoCompleteReturnValue returnValue, String expectedPrefix) {
// assertEquals(expectedPrefix, returnValue.getPrefix());
//
// final Map<String, AutoCompleteType> possibilities = returnValue.getPossibilities().toMap();
// assertAutoCompleteType(possibilities, expectedFiles, AutoCompleteType.COMMAND);
// assertAutoCompleteType(possibilities, expectedDirectories, AutoCompleteType.DIRECTORY);
//
// assertEquals("Not all expected autoComplete values are present", expectedFiles.size() + expectedDirectories.size(), possibilities.size());
// }
//
// private void assertAutoCompleteType(Map<String, AutoCompleteType> possibilities,
// List<String> expectedEntries,
// AutoCompleteType expectedType) {
// for (String expectedEntry : expectedEntries) {
// assertEquals(expectedType, possibilities.get(expectedEntry));
// }
// }
//
// private void assertInvalidPath(String path) {
// try {
// internalFileSystem.autoCompletePath(path);
// fail();
// } catch (ParseException ignored) { }
// }
//}