/*
 * Copyright 2015 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.onlab.util;

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

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.lessThan;

public class FrequencyTest {

    private final Frequency frequency1 = Frequency.ofMHz(1000);
    private final Frequency sameFrequency1 = Frequency.ofMHz(1000);
    private final Frequency frequency2 = Frequency.ofGHz(1000);
    private final Frequency sameFrequency2 = Frequency.ofGHz(1000);
    private final Frequency moreSameFrequency2 = Frequency.ofTHz(1);
    private final Frequency frequency3 = Frequency.ofTHz(193.1);
    private final Frequency sameFrequency3 = Frequency.ofGHz(193100);

    /**
     * Tests immutability of Frequency.
     */
    @Test
    public void testImmutability() {
        ImmutableClassChecker.assertThatClassIsImmutable(Frequency.class);
    }

    /**
     * Tests equality of Frequency instances.
     */
    @Test
    public void testEquality() {
        new EqualsTester()
                .addEqualityGroup(frequency1, sameFrequency1)
                .addEqualityGroup(frequency2, sameFrequency2, moreSameFrequency2)
                .addEqualityGroup(frequency3, sameFrequency3)
                .testEquals();
    }

    /**
     * Tests the first object is less than the second object.
     */
    @Test
    public void testLessThan() {
        assertThat(frequency1, is(lessThan(frequency2)));
        assertThat(frequency1.isLessThan(frequency2), is(true));
    }

    @Test
    public void testGreaterThan() {
        assertThat(frequency2, is(greaterThan(frequency1)));
        assertThat(frequency2.isGreaterThan(frequency1), is(true));
    }

    /**
     * Tests add operation of two Frequencies.
     */
    @Test
    public void testAdd() {
        Frequency low = Frequency.ofMHz(100);
        Frequency high = Frequency.ofGHz(1);
        Frequency expected = Frequency.ofMHz(1100);

        assertThat(low.add(high), is(expected));
    }

    /**
     * Tests subtract operation of two Frequencies.
     */
    @Test
    public void testSubtract() {
        Frequency high = Frequency.ofGHz(1);
        Frequency low = Frequency.ofMHz(100);
        Frequency expected = Frequency.ofMHz(900);

        assertThat(high.subtract(low), is(expected));
    }

    /**
     * Tests multiply operation of Frequency.
     */
    @Test
    public void testMultiply() {
        Frequency frequency = Frequency.ofMHz(1000);
        long factor = 5;
        Frequency expected = Frequency.ofGHz(5);

        assertThat(frequency.multiply(5), is(expected));
    }
}
