116 lines
4.3 KiB
Java
116 lines
4.3 KiB
Java
/*******************************************************************************
|
|
* Copyright (c) 2013 IBM Corporation.
|
|
* All rights reserved. This program and the accompanying materials
|
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
* which accompanies this distribution, and is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html
|
|
*
|
|
* Contributors:
|
|
* IBM Corporation - initial API and implementation
|
|
*******************************************************************************/
|
|
package com.ibm.wala.core.tests.basic;
|
|
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
|
|
import org.junit.Assert;
|
|
import org.junit.Test;
|
|
|
|
import com.ibm.wala.util.collections.HashMapFactory;
|
|
import com.ibm.wala.util.graph.Graph;
|
|
import com.ibm.wala.util.graph.NumberedGraph;
|
|
import com.ibm.wala.util.graph.impl.DelegatingNumberedGraph;
|
|
import com.ibm.wala.util.graph.impl.NodeWithNumberedEdges;
|
|
import com.ibm.wala.util.graph.traverse.WelshPowell;
|
|
import com.ibm.wala.util.graph.traverse.WelshPowell.ColoredVertices;
|
|
|
|
public class WelshPowellTest {
|
|
|
|
public static <T> void assertColoring(Graph<T> G, Map<T,Integer> colors, boolean fullColor) {
|
|
for(T n : G) {
|
|
for(Iterator<T> ss = G.getSuccNodes(n); ss.hasNext(); ) {
|
|
T succ = ss.next();
|
|
if (!fullColor && (!colors.containsKey(n) || !colors.containsKey(succ)) ) {
|
|
continue;
|
|
}
|
|
Assert.assertTrue(n + " and succ: " + succ + " have same color: " + colors.get(n).intValue(), colors.get(n).intValue() != colors.get(succ).intValue());
|
|
}
|
|
for(Iterator<T> ps = G.getPredNodes(n); ps.hasNext(); ) {
|
|
T pred = ps.next();
|
|
if (!fullColor && (!colors.containsKey(n) || !colors.containsKey(pred)) ) {
|
|
continue;
|
|
}
|
|
Assert.assertTrue(n + " and pred: " + pred + " have same color:" + colors.get(n).intValue(), colors.get(n).intValue() != colors.get(pred).intValue());
|
|
}
|
|
}
|
|
}
|
|
|
|
private class TypedNode<T> extends NodeWithNumberedEdges {
|
|
private final T data;
|
|
|
|
private TypedNode(T data) {
|
|
this.data = data;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return data.toString();
|
|
}
|
|
}
|
|
|
|
private <T> NumberedGraph<TypedNode<T>> buildGraph(T[][] data) {
|
|
DelegatingNumberedGraph<TypedNode<T>> G = new DelegatingNumberedGraph<>();
|
|
Map<T,TypedNode<T>> nodes = HashMapFactory.make();
|
|
for (T[] element : data) {
|
|
TypedNode<T> n = new TypedNode<>(element[0]);
|
|
nodes.put(element[0], n);
|
|
G.addNode(n);
|
|
}
|
|
for (T[] element : data) {
|
|
for(int j = 1; j < element.length; j++) {
|
|
G.addEdge(nodes.get(element[0]), nodes.get(element[j]));
|
|
}
|
|
}
|
|
|
|
return G;
|
|
}
|
|
|
|
@Test
|
|
public void testOne() {
|
|
NumberedGraph<TypedNode<Integer>> G =
|
|
buildGraph(new Integer[][]{
|
|
new Integer[]{1, 6, 7, 8},
|
|
new Integer[]{2, 5, 7, 8},
|
|
new Integer[]{3, 5, 6, 8},
|
|
new Integer[]{4, 7, 6, 5},
|
|
new Integer[]{5, 2, 4, 3},
|
|
new Integer[]{6, 3, 1, 4},
|
|
new Integer[]{7, 1, 2, 4},
|
|
new Integer[]{8, 1, 2, 3}});
|
|
ColoredVertices<TypedNode<Integer>> colors = new WelshPowell<TypedNode<Integer>>().color(G);
|
|
System.err.println(colors.getColors());
|
|
assertColoring(G, colors.getColors(), true);
|
|
Assert.assertTrue(colors.getNumColors() <= 4);
|
|
}
|
|
|
|
@Test
|
|
public void testTwo() {
|
|
NumberedGraph<TypedNode<String>> G =
|
|
buildGraph(new String[][] {
|
|
new String[]{"poly1", "poly2", "star1", "poly5"},
|
|
new String[]{"poly2", "poly1", "star2", "poly3"},
|
|
new String[]{"poly3", "poly2", "star3", "poly4"},
|
|
new String[]{"poly4", "poly3", "star4", "poly5"},
|
|
new String[]{"poly5", "poly4", "star5", "poly1"},
|
|
new String[]{"star1", "poly1", "star3", "star4"},
|
|
new String[]{"star2", "poly2", "star4", "star5"},
|
|
new String[]{"star3", "poly3", "star1", "star5"},
|
|
new String[]{"star4", "poly4", "star1", "star2"},
|
|
new String[]{"star5", "poly5", "star2", "star3"}});
|
|
ColoredVertices<TypedNode<String>> colors = new WelshPowell<TypedNode<String>>().color(G);
|
|
System.err.println(colors.getColors());
|
|
assertColoring(G, colors.getColors(), true);
|
|
Assert.assertTrue(colors.getNumColors() == 3);
|
|
}
|
|
}
|