////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2017 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
////////////////////////////////////////////////////////////////////////////////

package com.puppycrawl.tools.checkstyle.filters;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

import nl.jqno.equalsverifier.EqualsVerifier;

/** Tests CsvFilter. */
public class CsvFilterTest {
    @Test
    public void testDecideSingle() {
        final IntFilter filter = new CsvFilter("0");
        assertFalse("less than", filter.accept(-1));
        assertTrue("equal", filter.accept(0));
        assertFalse("greater than", filter.accept(1));
    }

    @Test
    public void testDecidePair() {
        final IntFilter filter = new CsvFilter("0, 2");
        assertFalse("less than", filter.accept(-1));
        assertTrue("equal 0", filter.accept(0));
        assertFalse("greater than", filter.accept(1));
        assertTrue("equal 2", filter.accept(2));
    }

    @Test
    public void testDecideRange() {
        final IntFilter filter = new CsvFilter("0-2");
        assertFalse("less than", filter.accept(-1));
        assertTrue("equal 0", filter.accept(0));
        assertTrue("equal 1", filter.accept(1));
        assertTrue("equal 2", filter.accept(2));
        assertFalse("greater than", filter.accept(3));
    }

    @Test
    public void testDecideEmptyRange() {
        final IntFilter filter = new CsvFilter("2-0");
        assertFalse("less than", filter.accept(-1));
        assertFalse("equal 0", filter.accept(0));
        assertFalse("equal 1", filter.accept(1));
        assertFalse("equal 2", filter.accept(2));
        assertFalse("greater than", filter.accept(3));
    }

    @Test
    public void testDecideRangePlusValue() {
        final IntFilter filter = new CsvFilter("0-2, 10");
        assertFalse("less than", filter.accept(-1));
        assertTrue("equal 0", filter.accept(0));
        assertTrue("equal 1", filter.accept(1));
        assertTrue("equal 2", filter.accept(2));
        assertFalse("greater than", filter.accept(3));
        assertTrue("equal 10", filter.accept(10));
    }

    @Test
    public void testEmptyChain() {
        final CsvFilter filter = new CsvFilter("");
        assertFalse("0", filter.accept(0));
    }

    @Test
    public void testOneFilter() {
        final CsvFilter filter = new CsvFilter("");
        filter.addFilter(new IntMatchFilter(0));
        assertTrue("0", filter.accept(0));
        assertFalse("1", filter.accept(1));
    }

    @Test
    public void testMultipleFilter() {
        final CsvFilter filter = new CsvFilter("");
        filter.addFilter(new IntMatchFilter(0));
        filter.addFilter(new IntRangeFilter(0, 2));
        assertTrue("0", filter.accept(0));
        assertTrue("1", filter.accept(1));
        filter.addFilter(new IntRangeFilter(3, 4));
        assertTrue("0 is in [3,4]", filter.accept(0));
    }

    @Test
    public void testGetFilters() {
        final CsvFilter filter = new CsvFilter("");
        filter.addFilter(new IntMatchFilter(0));
        assertEquals("size is the same", 1, filter.getFilters().size());
    }

    @Test
    public void testEqualsAndHashCode() {
        EqualsVerifier.forClass(CsvFilter.class).usingGetClass().verify();
    }
}
