/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.brooklyn.util.collections;

import org.apache.brooklyn.util.collections.QuorumCheck;
import org.apache.brooklyn.util.collections.QuorumCheck.QuorumChecks;
import org.testng.Assert;
import org.testng.annotations.Test;

public class QuorumChecksTest {

    @Test
    public void testAll() {
        QuorumCheck q = QuorumChecks.all();
        Assert.assertTrue(q.isQuorate(2, 2));
        Assert.assertFalse(q.isQuorate(1, 2));
        Assert.assertTrue(q.isQuorate(0, 0));
    }
    
    @Test
    public void testAlwaysTrue() {
        QuorumCheck q = QuorumChecks.alwaysTrue();
        Assert.assertTrue(q.isQuorate(0, 2));
        Assert.assertTrue(q.isQuorate(1, 2));
        Assert.assertTrue(q.isQuorate(0, 0));
    }
    
    @Test
    public void testAtLeastOne() {
        QuorumCheck q = QuorumChecks.atLeastOne();
        Assert.assertTrue(q.isQuorate(2, 2));
        Assert.assertTrue(q.isQuorate(1, 2));
        Assert.assertFalse(q.isQuorate(0, 0));
    }
    
    @Test
    public void testAllAndAtLeastOne() {
        QuorumCheck q = QuorumChecks.atLeastOne();
        Assert.assertFalse(q.isQuorate(0, 2));
        Assert.assertTrue(q.isQuorate(1, 2));
        Assert.assertFalse(q.isQuorate(0, 0));
    }
    
    @Test
    public void testAtLeastOneUnlessEmpty() {
        QuorumCheck q = QuorumChecks.atLeastOneUnlessEmpty();
        Assert.assertFalse(q.isQuorate(0, 2));
        Assert.assertTrue(q.isQuorate(1, 2));
        Assert.assertTrue(q.isQuorate(0, 0));
    }
    
    @Test
    public void testAtLeastOneUnlessEmptyString() {
        QuorumCheck q = QuorumChecks.of("atLeastOneUnlessEmpty");
        Assert.assertFalse(q.isQuorate(0, 2));
        Assert.assertTrue(q.isQuorate(1, 2));
        Assert.assertTrue(q.isQuorate(0, 0));
    }
    
    @Test
    public void testLinearTwoPointsNeedMinTwo() {
        QuorumCheck q = QuorumChecks.of("[ [0,2], [1,2] ]");
        Assert.assertTrue(q.isQuorate(2, 2));
        Assert.assertTrue(q.isQuorate(2, 10));
        Assert.assertFalse(q.isQuorate(1, 1));
    }
    
    @Test
    public void testLinearNeedHalfToTenAndTenPercentAtHundred() {
        QuorumCheck q = QuorumChecks.of("[ [0,0], [10,5], [100,10], [200, 20] ]");
        Assert.assertTrue(q.isQuorate(2, 2));
        Assert.assertTrue(q.isQuorate(1, 2));
        Assert.assertTrue(q.isQuorate(0, 0));
        Assert.assertFalse(q.isQuorate(1, 10));
        Assert.assertTrue(q.isQuorate(6, 10));
        Assert.assertFalse(q.isQuorate(7, 50));
        Assert.assertTrue(q.isQuorate(8, 50));
        Assert.assertFalse(q.isQuorate(9, 100));
        Assert.assertTrue(q.isQuorate(11, 100));
        Assert.assertFalse(q.isQuorate(19, 200));
        Assert.assertTrue(q.isQuorate(21, 200));
        Assert.assertFalse(q.isQuorate(29, 300));
        Assert.assertTrue(q.isQuorate(31, 300));
    }
    
    @Test
    public void testConstantQuorum() {
        QuorumCheck q = QuorumChecks.of("2");
        Assert.assertTrue(q.isQuorate(2, 2));
        Assert.assertTrue(q.isQuorate(2, 10));
        Assert.assertFalse(q.isQuorate(1, 1));
    }     
}
