/*
 * Copyright 2016 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.incubator.net.key;

import com.google.common.testing.EqualsTester;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;

/**
 * Test class for DeviceDeyId.
 */
public class DeviceKeyIdTest {

    final String deviceKeyIdValue1 = "DeviceKeyId1";
    final String deviceKeyIdValue2 = "DeviceKeyId2";

    /**
     * Checks that the DeviceKeyId class is immutable.
     */
    @Test
    public void testImmutability() {
        assertThatClassIsImmutable(DeviceKeyId.class);
    }

    /**
     * Checks the construction of a DeviceKeyId object throws an
     * IllegalArgumentException when the input identifier is null.
     */
    @Test(expected = NullPointerException.class)
    public void testConstructionUsingNullId() {
        DeviceKeyId.deviceKeyId(null);
    }

    /**
     * Checks the construction of a DeviceKeyId object.
     */
    @Test
    public void testConstruction() {
        DeviceKeyId deviceKeyId = DeviceKeyId.deviceKeyId(deviceKeyIdValue1);
        assertNotNull("The deviceKeyId should not be null.", deviceKeyId);
        assertEquals("The id should match the expected value.",
                     deviceKeyIdValue1, deviceKeyId.id());
    }

    /**
     * Tests the equality of device key identifiers.
     */
    @Test
    public void testEquality() {
        DeviceKeyId deviceKeyId1 = DeviceKeyId.deviceKeyId(deviceKeyIdValue1);
        DeviceKeyId deviceKeyId2 = DeviceKeyId.deviceKeyId(deviceKeyIdValue1);
        DeviceKeyId deviceKeyId3 = DeviceKeyId.deviceKeyId(deviceKeyIdValue2);

        new EqualsTester().addEqualityGroup(deviceKeyId1, deviceKeyId2)
                .addEqualityGroup(deviceKeyId3)
                .testEquals();
    }
}
