package org.onlab.packet;

import org.junit.Test;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;
import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;

/**
 * Tests for class {@link Ip4Prefix}.
 */
public class Ip4PrefixTest {
    /**
     * Tests the immutability of {@link Ip4Prefix}.
     */
    @Test
    public void testImmutable() {
        assertThatClassIsImmutable(Ip4Prefix.class);
    }

    /**
     * Tests default class constructor.
     */
    @Test
    public void testDefaultConstructor() {
        Ip4Prefix ip4prefix = new Ip4Prefix();
        assertThat(ip4prefix.toString(), is("0.0.0.0/0"));
    }

    /**
     * Tests valid class copy constructor.
     */
    @Test
    public void testCopyConstructor() {
        Ip4Prefix fromAddr = new Ip4Prefix("1.2.3.0/24");
        Ip4Prefix ip4prefix = new Ip4Prefix(fromAddr);
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        fromAddr = new Ip4Prefix("0.0.0.0/0");
        ip4prefix = new Ip4Prefix(fromAddr);
        assertThat(ip4prefix.toString(), is("0.0.0.0/0"));

        fromAddr = new Ip4Prefix("255.255.255.255/32");
        ip4prefix = new Ip4Prefix(fromAddr);
        assertThat(ip4prefix.toString(), is("255.255.255.255/32"));
    }

    /**
     * Tests invalid class copy constructor for a null object to copy from.
     */
    @Test(expected = NullPointerException.class)
    public void testInvalidConstructorNullObject() {
        Ip4Prefix fromAddr = null;
        Ip4Prefix ip4prefix = new Ip4Prefix(fromAddr);
    }

    /**
     * Tests valid class constructor for an address and prefix length.
     */
    @Test
    public void testConstructorForAddressAndPrefixLength() {
        Ip4Prefix ip4prefix =
            new Ip4Prefix(new Ip4Address("1.2.3.0"), (short) 24);
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        ip4prefix = new Ip4Prefix(new Ip4Address("1.2.3.4"), (short) 24);
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        ip4prefix = new Ip4Prefix(new Ip4Address("1.2.3.5"), (short) 32);
        assertThat(ip4prefix.toString(), is("1.2.3.5/32"));

        ip4prefix = new Ip4Prefix(new Ip4Address("0.0.0.0"), (short) 0);
        assertThat(ip4prefix.toString(), is("0.0.0.0/0"));

        ip4prefix =
            new Ip4Prefix(new Ip4Address("255.255.255.255"), (short) 32);
        assertThat(ip4prefix.toString(), is("255.255.255.255/32"));
    }

    /**
     * Tests valid class constructor for a string.
     */
    @Test
    public void testConstructorForString() {
        Ip4Prefix ip4prefix = new Ip4Prefix("1.2.3.0/24");
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        ip4prefix = new Ip4Prefix("1.2.3.4/24");
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        ip4prefix = new Ip4Prefix("1.2.3.5/32");
        assertThat(ip4prefix.toString(), is("1.2.3.5/32"));

        ip4prefix = new Ip4Prefix("0.0.0.0/0");
        assertThat(ip4prefix.toString(), is("0.0.0.0/0"));

        ip4prefix = new Ip4Prefix("255.255.255.255/32");
        assertThat(ip4prefix.toString(), is("255.255.255.255/32"));
    }

    /**
     * Tests invalid class constructor for a null string.
     */
    @Test(expected = NullPointerException.class)
    public void testInvalidConstructorNullString() {
        String fromString = null;
        Ip4Prefix ip4prefix = new Ip4Prefix(fromString);
    }

    /**
     * Tests invalid class constructor for an empty string.
     */
    @Test(expected = IllegalArgumentException.class)
    public void testInvalidConstructors() {
        // Check constructor for invalid ID: empty string
        Ip4Prefix ip4prefix = new Ip4Prefix("");
    }

    /**
     * Tests getting the value of an address.
     */
    @Test
    public void testGetValue() {
        Ip4Prefix ip4prefix = new Ip4Prefix("1.2.3.0/24");
        assertThat(ip4prefix.getAddress(), equalTo(new Ip4Address("1.2.3.0")));
        assertThat(ip4prefix.getPrefixLen(), is((short) 24));

        ip4prefix = new Ip4Prefix("0.0.0.0/0");
        assertThat(ip4prefix.getAddress(), equalTo(new Ip4Address("0.0.0.0")));
        assertThat(ip4prefix.getPrefixLen(), is((short) 0));

        ip4prefix = new Ip4Prefix("255.255.255.255/32");
        assertThat(ip4prefix.getAddress(),
                   equalTo(new Ip4Address("255.255.255.255")));
        assertThat(ip4prefix.getPrefixLen(), is((short) 32));
    }

    /**
     * Tests equality of {@link Ip4Address}.
     */
    @Test
    public void testEquality() {
        Ip4Prefix addr1net = new Ip4Prefix("1.2.3.0/24");
        Ip4Prefix addr2net = new Ip4Prefix("1.2.3.0/24");
        assertThat(addr1net, is(addr2net));

        addr1net = new Ip4Prefix("1.2.3.0/24");
        addr2net = new Ip4Prefix("1.2.3.4/24");
        assertThat(addr1net, is(addr2net));

        addr1net = new Ip4Prefix("0.0.0.0/0");
        addr2net = new Ip4Prefix("0.0.0.0/0");
        assertThat(addr1net, is(addr2net));

        addr1net = new Ip4Prefix("255.255.255.255/32");
        addr2net = new Ip4Prefix("255.255.255.255/32");
        assertThat(addr1net, is(addr2net));
    }

    /**
     * Tests non-equality of {@link Ip4Address}.
     */
    @Test
    public void testNonEquality() {
        Ip4Prefix addr1net = new Ip4Prefix("1.2.0.0/16");
        Ip4Prefix addr2net = new Ip4Prefix("1.3.0.0/16");
        Ip4Prefix addr3net = new Ip4Prefix("1.3.0.0/24");
        Ip4Prefix addr4net = new Ip4Prefix("0.0.0.0/0");
        Ip4Prefix addr5net = new Ip4Prefix("255.255.255.255/32");
        assertThat(addr1net, is(not(addr2net)));
        assertThat(addr3net, is(not(addr2net)));
        assertThat(addr4net, is(not(addr2net)));
        assertThat(addr5net, is(not(addr2net)));
    }

    /**
     * Tests object string representation.
     */
    @Test
    public void testToString() {
        Ip4Prefix ip4prefix = new Ip4Prefix("1.2.3.0/24");
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        ip4prefix = new Ip4Prefix("1.2.3.4/24");
        assertThat(ip4prefix.toString(), is("1.2.3.0/24"));

        ip4prefix = new Ip4Prefix("0.0.0.0/0");
        assertThat(ip4prefix.toString(), is("0.0.0.0/0"));

        ip4prefix = new Ip4Prefix("255.255.255.255/32");
        assertThat(ip4prefix.toString(), is("255.255.255.255/32"));
    }
}
