/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * 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 com.alibaba.dubbo.common.utils;

import static org.hamcrest.CoreMatchers.allOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.junit.matchers.JUnitMatchers.containsString;

import org.junit.Test;

/**
 * @author ding.lid
 */
public class AtomicPositiveIntegerTest {
    AtomicPositiveInteger i1 = new AtomicPositiveInteger();

    AtomicPositiveInteger i2 = new AtomicPositiveInteger(127);

    AtomicPositiveInteger i3 = new AtomicPositiveInteger(Integer.MAX_VALUE);

    @Test
    public void test_get() throws Exception {
        assertEquals(0, i1.get());
        assertEquals(127, i2.get());
        assertEquals(Integer.MAX_VALUE, i3.get());
    }

    @Test
    public void test_set() throws Exception {
        i1.set(100);
        assertEquals(100, i1.get());

        try {
            i1.set(-1);
            fail();
        } catch (IllegalArgumentException expected) {
            assertThat(expected.getMessage(),
                    allOf(containsString("new value"), containsString("< 0")));
        }
    }

    @Test
    public void test_getAndIncrement() throws Exception {
        int get = i1.getAndIncrement();
        assertEquals(0, get);
        assertEquals(1, i1.get());

        get = i2.getAndIncrement();
        assertEquals(127, get);
        assertEquals(128, i2.get());

        get = i3.getAndIncrement();
        assertEquals(Integer.MAX_VALUE, get);
        assertEquals(0, i3.get());
    }

    @Test
    public void test_getAndDecrement() throws Exception {
        int get = i1.getAndDecrement();
        assertEquals(0, get);
        assertEquals(Integer.MAX_VALUE, i1.get());

        get = i2.getAndDecrement();
        assertEquals(127, get);
        assertEquals(126, i2.get());

        get = i3.getAndDecrement();
        assertEquals(Integer.MAX_VALUE, get);
        assertEquals(Integer.MAX_VALUE - 1, i3.get());
    }

    @Test
    public void test_incrementAndGet() throws Exception {
        int get = i1.incrementAndGet();
        assertEquals(1, get);
        assertEquals(1, i1.get());

        get = i2.incrementAndGet();
        assertEquals(128, get);
        assertEquals(128, i2.get());

        get = i3.incrementAndGet();
        assertEquals(0, get);
        assertEquals(0, i3.get());
    }

    @Test
    public void test_decrementAndGet() throws Exception {
        int get = i1.decrementAndGet();
        assertEquals(Integer.MAX_VALUE, get);
        assertEquals(Integer.MAX_VALUE, i1.get());

        get = i2.decrementAndGet();
        assertEquals(126, get);
        assertEquals(126, i2.get());

        get = i3.decrementAndGet();
        assertEquals(Integer.MAX_VALUE - 1, get);
        assertEquals(Integer.MAX_VALUE - 1, i3.get());
    }

    @Test
    public void test_getAndSet() throws Exception {
        int get = i1.getAndSet(100);
        assertEquals(0, get);
        assertEquals(100, i1.get());

        try {
            i1.getAndSet(-1);
        } catch (IllegalArgumentException expected) {
            assertThat(expected.getMessage(),
                    allOf(containsString("new value"), containsString("< 0")));
        }
    }

    @Test
    public void test_getAndAnd() throws Exception {
        int get = i1.getAndAdd(3);
        assertEquals(0, get);
        assertEquals(3, i1.get());

        get = i2.getAndAdd(3);
        assertEquals(127, get);
        assertEquals(127 + 3, i2.get());

        get = i3.getAndAdd(3);
        assertEquals(Integer.MAX_VALUE, get);
        assertEquals(2, i3.get());
    }


    @Test
    public void test_addAndGet() throws Exception {
        int get = i1.addAndGet(3);
        assertEquals(3, get);
        assertEquals(3, i1.get());

        get = i2.addAndGet(3);
        assertEquals(127 + 3, get);
        assertEquals(127 + 3, i2.get());

        get = i3.addAndGet(3);
        assertEquals(2, get);
        assertEquals(2, i3.get());
    }
}