| // 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.events.Location; | 
 | 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 org.junit.Test; | 
 | import org.junit.runner.RunWith; | 
 | import org.junit.runners.JUnit4; | 
 |  | 
 | import java.util.Comparator; | 
 | import java.util.List; | 
 | import java.util.Set; | 
 |  | 
 | /** | 
 |  * 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 String getName() { | 
 |       return null; | 
 |     } | 
 |  | 
 |     @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 getVisibility() { | 
 |       return null; | 
 |     } | 
 |  | 
 |     @Override | 
 |     public boolean isConfigurable() { | 
 |       return true; | 
 |     } | 
 |   } | 
 |  | 
 |   @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"))); | 
 |   } | 
 | } |