blob: 6adee36889ffbb367190b9afd31601d5e1ebc817 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.cassandra.utils;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.assertj.core.api.Assertions;
import static org.assertj.core.api.Assertions.assertThat;
public class SimpleGraphTest
{
@Test
public void empty()
{
Assertions.assertThatThrownBy(() -> new SimpleGraph.Builder<String>().build())
.isInstanceOf(AssertionError.class)
.hasMessage("Edges empty");
}
/**
* If vertices have edges that form a circle this should not cause {@link SimpleGraph#findPaths(Object, Object)} to
* hang.
*/
@Test
public void recursive()
{
SimpleGraph<String> graph = of("A", "B",
"B", "C",
"C", "A");
// no paths to identity
assertThat(graph.findPaths("A", "A")).isEmpty();
assertThat(graph.findPaths("B", "B")).isEmpty();
assertThat(graph.findPaths("C", "C")).isEmpty();
assertThat(graph.findPaths("C", "B")).isEqualTo(Collections.singletonList(Arrays.asList("C", "A", "B")));
// all options return and don't have duplicate keys
for (String i : graph.vertices())
{
for (String j : graph.vertices())
{
List<List<String>> paths = graph.findPaths(i, j);
for (List<String> path : paths)
{
Map<String, Integer> distinct = countDistinct(path);
for (Map.Entry<String, Integer> e : distinct.entrySet())
assertThat(e.getValue()).describedAs("Duplicate vertex %s found; %s", e.getKey(), path).isEqualTo(1);
}
}
}
}
@Test
public void simple()
{
SimpleGraph<String> graph = of("A", "B",
"B", "C",
"C", "D");
assertThat(graph.findPaths("A", "B")).isEqualTo(Collections.singletonList(Arrays.asList("A", "B")));
assertThat(graph.findPaths("A", "C")).isEqualTo(Collections.singletonList(Arrays.asList("A", "B", "C")));
assertThat(graph.findPaths("B", "D")).isEqualTo(Collections.singletonList(Arrays.asList("B", "C", "D")));
assertThat(graph.hasEdge("A", "B")).isTrue();
assertThat(graph.hasEdge("C", "D")).isTrue();
assertThat(graph.hasEdge("B", "A")).isFalse();
assertThat(graph.hasEdge("C", "B")).isFalse();
}
private static <T> Map<T, Integer> countDistinct(List<T> list)
{
Map<T, Integer> map = new HashMap<>();
for (T t : list)
map.compute(t, (ignore, accum) -> accum == null ? 1 : accum + 1);
return map;
}
static <T> SimpleGraph<T> of(T... values)
{
assert values.length % 2 == 0: "graph requires even number of values, but given " + values.length;
SimpleGraph.Builder<T> builder = new SimpleGraph.Builder<>();
for (int i = 0; i < values.length; i = i + 2)
builder.addEdge(values[i], values[i + 1]);
return builder.build();
}
}