package com.gdh.test;

import java.util.TreeSet;

import org.junit.Assert;
import org.junit.Test;

import com.gdh.main.Configuration;
import com.gdh.main.Group;
import com.gdh.main.Node;

@SuppressWarnings("PMD.AvoidUsingHardCodedIP")
public class GroupNodeTest {
    private static final String ip1 = "1.1.1.1";
    private static final String port1 = "3000";
    private static final String port2 = "3001";

    @Test
    public void testNodeGroupEquality() {
        Node n1 = new Node(ip1, port1);
        Node n2 = new Node(null, port1);
        Node n3 = new Node(ip1, null);

        Assert.assertFalse(n1.equals(n2));
        Assert.assertFalse(n1.equals(n3));
        
        Group g1 = new Group(new Configuration(), n1);
        Group g2 = g1;
        Group g3 = null;
        
        Assert.assertTrue(g1.equals(g2));
        Assert.assertFalse(g1.equals(g3));
    }
    
    @Test
    public void testSameGroup() {
        Node n1 = new Node(ip1, port1);
        Node n2 = new Node(ip1, port2);
        Node n3 = new Node("2.2.2.2", port1);

        Group g1 = new Group(new Configuration(), n1, n2, n3);
        Group g2 = new Group(new Configuration(), n2, n3, n1);
        Assert.assertFalse(n1.equals(n2));
        Assert.assertFalse(n1.equals(n3));
        Assert.assertTrue(g1.hashCode() == g2.hashCode());
        Assert.assertTrue(g1.equals(g2));
        Assert.assertTrue(g1.getActiveNode().equals(g2.getActiveNode()));
    }

    @Test
    public void testSimilarGroup() {
        Node n1 = new Node(ip1, port1);
        Node n2 = new Node(ip1, port2);

        Node n3 = new Node(ip1, port1);
        Node n4 = new Node(ip1, port2);

        TreeSet<Node> set = new TreeSet<>();
        TreeSet<Node> set2 = new TreeSet<>();
        set.add(n1);
        set.add(n2);
        set2.add(n3);
        set2.add(n4);
        Group g1 = new Group(new Configuration(), n1, n2, n3, n4);
        Group g2 = new Group(new Configuration(), n1, n2, n3, n4);
        Assert.assertTrue(n1.equals(n3));
        Assert.assertTrue(g1.hashCode() == g2.hashCode());
        Assert.assertTrue(g1.equals(g2));
    }

    @Test
    public void testDifferentGroup() {
        Node n1 = new Node(ip1, port1);
        Node n2 = new Node(ip1, port2);

        Node n3 = new Node(ip1, port1);
        Node n4 = new Node(ip1, "3002");

        TreeSet<Node> set = new TreeSet<>();
        TreeSet<Node> set2 = new TreeSet<>();
        set.add(n1);
        set.add(n2);
        set2.add(n3);
        set2.add(n4);
        Group g1 = new Group(new Configuration(), n1, n2);
        Group g2 = new Group(new Configuration(), n3, n4);
        Assert.assertTrue(n1.equals(n3));
        Assert.assertTrue(g1.hashCode() != g2.hashCode());
        Assert.assertTrue(!g1.equals(g2));
    }
}