package net.onrc.onos.core.intent;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.HashSet;

import org.junit.Test;

/**
 * Unit tests for Intent.
 */
public class IntentTest {
    @Test
    public void testCreateIntent() {
        Intent intent = new Intent("id");
        assertEquals("id", intent.getId());
        assertEquals(Intent.IntentState.CREATED, intent.getState());
    }

    @Test
    public void testCreateIntentWithState() {
        Intent intent = new Intent("id", Intent.IntentState.INST_REQ);
        assertEquals("id", intent.getId());
        assertEquals(Intent.IntentState.INST_REQ, intent.getState());
    }

    @Test
    public void testSetState() {
        Intent intent = new Intent("id");

        intent.setState(Intent.IntentState.INST_REQ);
        assertEquals(Intent.IntentState.INST_REQ, intent.getState());

        intent.setState(Intent.IntentState.DEL_REQ);
        assertEquals(Intent.IntentState.DEL_REQ, intent.getState());
    }

    @Test
    public void testEquals() {
        Intent intent1 = new Intent("id1");
        Intent intent2 = new Intent("id1");
        Intent intent3 = new Intent("id2");
        Intent intent4 = new Intent("id2");

        assertEquals(intent1, intent2);
        assertEquals(intent3, intent4);

        assertFalse(intent1.equals(intent3));
        assertFalse(intent3.equals(intent1));

        intent1.setState(Intent.IntentState.INST_ACK);
        intent2.setState(Intent.IntentState.INST_NACK);
        assertEquals(intent1, intent2);
    }

    @Test
    public void testHashCode() {
        Intent intent1 = new Intent("id1");
        intent1.setState(Intent.IntentState.INST_ACK);
        Intent intent2 = new Intent("id1");
        intent2.setState(Intent.IntentState.INST_NACK);
        Intent intent3 = new Intent("id2");
        Intent intent4 = new Intent("id2");

        HashSet<Intent> intents = new HashSet<>();
        intents.add(intent1);
        intents.add(intent2);
        intents.add(intent3);
        intents.add(intent4);

        assertEquals(2, intents.size());
        assertTrue(intents.contains(intent1));
        assertTrue(intents.contains(intent2));
        assertTrue(intents.contains(intent3));
        assertTrue(intents.contains(intent4));
    }
}
