package test;

import static org.junit.Assert.*;
import org.junit.*;

import graph.CC;
import graph.Graph;

/**
 * Tests for connected components.
 * @author TrawlStars, Inc.
 *
 */
public class CCTest {
	
	@Before
	public void setUp() throws Exception {
		System.out.println("Setting up....");
	}
	
	@Test
	public void testId(){//Test to check if connected components have the same component ID
		int v = 11;
		Graph g = new Graph(v);
		g.addEdge(1,3);
		g.addEdge(9,8);
		g.addEdge(3, 8);
		g.addEdge(3, 9);
		g.addEdge(7, 4);
		g.addEdge(2, 4);
		g.addEdge(4, 6);
		g.addEdge(0, 5);
		CC cc = new CC(g);
		assertEquals(cc.id(4), cc.id(6));
		assertNotEquals(cc.id(3), cc.id(4));
	}
	
	@Test
	public void TestConnected(){//test to check if connected(x,y) connects correctly
		int v = 11;
		Graph g = new Graph(v);
		g.addEdge(1,3);
		g.addEdge(9,8);
		g.addEdge(3, 8);
		g.addEdge(3, 9);
		g.addEdge(7, 4);
		g.addEdge(2, 4);
		g.addEdge(4, 6);
		g.addEdge(0, 5);
		CC cc = new CC(g);
		assertEquals(cc.connected(0, 1), false);
		assertEquals(cc.connected(8, 9), true);
		assertNotEquals(cc.connected(0, 10), true);
		assertEquals(cc.connected(2, 7), true);
	}
	
	@Test
	public void testCluster(){//test if, after all the addEdge calls, the nodes are clustered correctly
		int v = 11;
		Graph g = new Graph(v);
		g.addEdge(1,3);
		g.addEdge(9,8);
		g.addEdge(3, 8);
		g.addEdge(3, 9);
		g.addEdge(7, 4);
		g.addEdge(2, 4);
		g.addEdge(4, 6);
		g.addEdge(0, 5);
		CC cc = new CC(g);
		assertEquals(cc.count(), 4); //4 sets of clusters
		g.addEdge(0, 9);
		CC cc1 = new CC(g);
		assertEquals(cc1.count(), 3);//3 sets of clusters
	}
	
	@Test
	public void testConnected2() {
		Graph g = new Graph(7);
		g.addEdge(4, 3);
		g.addEdge(2, 3);
		g.addEdge(1, 2);
		g.addEdge(0, 2);
		g.addEdge(5, 6);
		CC component = new CC(g);
		
		assert(component.connected(2, 0)); //true
		assert(component.connected(0,1)); //true
		assert(!component.connected(1, 5)); //false
	}
	
	@Test
	public void testComponentId2() {
		Graph g = new Graph(7);
		g.addEdge(4, 3);
		g.addEdge(2, 3);
		g.addEdge(1, 2);
		g.addEdge(0, 2);
		g.addEdge(5, 6);
		CC component = new CC(g);
		
		assert(component.id(0) == 0);
		assert(component.id(5) == 1);
		assert(component.id(6) == 1);
	}

}