package org.smoothbuild.parse; import static java.util.Arrays.stream; import static java.util.stream.Collectors.toSet; import static org.smoothbuild.lang.message.CodeLocation.codeLocation; import static org.testory.Testory.given; import static org.testory.Testory.mock; import static org.testory.Testory.then; import static org.testory.Testory.thenReturned; import static org.testory.Testory.thenThrown; import static org.testory.Testory.when; import java.util.HashMap; import java.util.List; import java.util.Set; import org.junit.Test; import org.smoothbuild.cli.Console; import org.smoothbuild.lang.function.Functions; import org.smoothbuild.lang.function.base.Name; import com.google.common.collect.ImmutableList; public class DependencySorterTest { private final Name name1 = Name.name("name1"); private final Name name2 = Name.name("name2"); private final Name name3 = Name.name("name3"); private final Name name4 = Name.name("name4"); private final Name name5 = Name.name("name5"); private final Name name6 = Name.name("name6"); private HashMap<Name, Set<Dependency>> map; @Test public void linear_dependency() { given(map = new HashMap<>()); given(map).put(name3, dependencies(name4)); given(map).put(name1, dependencies(name2)); given(map).put(name4, dependencies()); given(map).put(name2, dependencies(name3)); when(() -> sortDependencies(map)); thenReturned(ImmutableList.of(name4, name3, name2, name1)); } @Test public void tree_dependency() { given(map = new HashMap<>()); given(map).put(name1, dependencies(name2, name3)); given(map).put(name2, dependencies(name4)); given(map).put(name3, dependencies(name5)); given(map).put(name4, dependencies()); given(map).put(name5, dependencies(name6)); given(map).put(name6, dependencies()); List<Name> list = sortDependencies(map); then(list.indexOf(name4) < list.indexOf(name2)); then(list.indexOf(name2) < list.indexOf(name1)); then(list.indexOf(name6) < list.indexOf(name5)); then(list.indexOf(name5) < list.indexOf(name3)); then(list.indexOf(name3) < list.indexOf(name1)); } @Test public void simple_recursion_is_logged_as_error() throws Exception { given(map = new HashMap<>()); given(map).put(name1, dependencies(name1)); when(() -> sortDependencies(map)); thenThrown(ParsingException.class); } @Test public void cycle_is_logged_as_error() throws Exception { given(map = new HashMap<>()); given(map).put(name1, dependencies(name2)); given(map).put(name2, dependencies(name3)); given(map).put(name3, dependencies(name1)); when(() -> sortDependencies(map)); thenThrown(ParsingException.class); } private static List<Name> sortDependencies(HashMap<Name, Set<Dependency>> map) { return DependencySorter.sortDependencies(new Functions(), map, mock(Console.class)); } private static Set<Dependency> dependencies(Name... names) { return stream(names).map((name) -> new Dependency(codeLocation(1), name)).collect(toSet()); } }