package org.jctools.queues;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * Tests those methods that belong to {@link MpscArrayQueue} only and are therefore
 * not part of the standard {@link java.util.Queue} API.
 *
 * @author Ivan Valeriani
 */
public class MpscArrayQueueTest {

    private MpscArrayQueue<Integer> queue;

    @Before
    public void setUp() throws Exception {
        this.queue = new MpscArrayQueue<Integer>(16);
    }

    @After
    public void tearDown() throws Exception
    {
    }

    @Test
    public void testOfferWithThreshold() {
        int i;
        for (i = 0; i < 8; ++i) {
            //Offers succeed because current size is below the HWM.
            Assert.assertTrue(this.queue.offerIfBelowThreshold(i, 8));
        }
        //Not anymore, our offer got rejected.
        Assert.assertFalse(this.queue.offerIfBelowThreshold(i, 8));
        Assert.assertFalse(this.queue.offerIfBelowThreshold(i, 7));
        Assert.assertFalse(this.queue.offerIfBelowThreshold(i, 1));
        Assert.assertFalse(this.queue.offerIfBelowThreshold(i, 0));

        //Also, the threshold is dynamic and different levels can be set for
        //different task priorities.
        Assert.assertTrue(this.queue.offerIfBelowThreshold(i, 9));
        Assert.assertTrue(this.queue.offerIfBelowThreshold(i, 16));
    }

}
