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;

/**
 * @author Toshio Koide (t-koide@onlab.us)
 */
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));
    }
}
