blob: cb36ef38ccf40cf7e09994feb1712aaa13ddc7c6 [file] [log] [blame]
// Copyright 2015 The Bazel Authors. 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.devtools.build.lib.graph;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.License;
import com.google.devtools.build.lib.packages.License.DistributionType;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleVisibility;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetData;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import net.starlark.java.syntax.Location;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Test for {@link Digraph}.
*/
@RunWith(JUnit4.class)
public class DigraphTest {
class FakeTarget implements Target {
private final Label label;
FakeTarget(Label label) {
this.label = label;
}
@Override
public Label getLabel() {
return label;
}
@Override
public Package getPackage() {
return null;
}
@Override
public String getTargetKind() {
return null;
}
@Override
public Rule getAssociatedRule() {
return null;
}
@Override
public License getLicense() {
return null;
}
@Override
public Location getLocation() {
return null;
}
@Override
public Set<DistributionType> getDistributions() {
return null;
}
@Override
public RuleVisibility getRawVisibility() {
return null;
}
@Override
public boolean isConfigurable() {
return true;
}
@Override
public TargetData reduceForSerialization() {
throw new UnsupportedOperationException();
}
}
@Test
public void testStableOrdering() throws Exception {
Digraph<Target> digraph = new Digraph<>();
FakeTarget a = new FakeTarget(Label.create("pkg", "a"));
FakeTarget b = new FakeTarget(Label.create("pkg", "b"));
FakeTarget c = new FakeTarget(Label.create("pkg", "c"));
FakeTarget d = new FakeTarget(Label.create("pkg", "d"));
FakeTarget e = new FakeTarget(Label.create("pkg", "e"));
FakeTarget f = new FakeTarget(Label.create("pkg", "f"));
FakeTarget g = new FakeTarget(Label.create("pkg", "g"));
// f
// / | | \
// c g e d
// / \
// a b
digraph.addEdge(f, c);
digraph.addEdge(f, g);
digraph.addEdge(d, a);
digraph.addEdge(d, b);
digraph.addEdge(f, e);
digraph.addEdge(f, d);
// Get them back in topological and, within a valid topological ordering, alphabetical order.
Comparator<Target> comparator = new Comparator<Target>() {
@Override
public int compare(Target o1, Target o2) {
return o1.getLabel().compareTo(o2.getLabel()) * -1;
}
};
// Unwrap the Label from the Node<Target>, to make the final assert prettier.
Function<? super Node<Target>, Label> unwrap =
new Function<Node<Target>, Label>() {
@Override
public Label apply(Node<Target> node) {
return node.getLabel().getLabel();
}
};
List<Label> nodes = Lists.transform(digraph.getTopologicalOrder(comparator), unwrap);
assertThat(nodes)
.containsExactlyElementsIn(
ImmutableList.of(
Label.create("pkg", "f"),
Label.create("pkg", "c"),
Label.create("pkg", "d"),
Label.create("pkg", "a"),
Label.create("pkg", "b"),
Label.create("pkg", "e"),
Label.create("pkg", "g")));
}
}