/*
 *  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.tools.ant.types.selectors;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.Parameter;
import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;


/**
 * Tests Date Selectors.
 *
 */
public class DateSelectorTest {

    @Rule
    public final BaseSelectorRule selectorRule = new BaseSelectorRule();


    /**
     * Test the code that validates the selector.
     */
    @Test
    public void testValidate() {
        DateSelector s = new DateSelector();
        try {
            s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]);
            fail("DateSelector did not check for required fields");
        } catch (BuildException be1) {
            assertEquals("You must provide a datetime or the number of "
                    + "milliseconds.", be1.getMessage());
        }

        s = new DateSelector();
        s.setDatetime("01/01/1969 01:01 AM");
        try {
            s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]);
            fail("DateSelector did not check for Datetime being in the "
                    + "allowable range");
        } catch (BuildException be2) {
            assertEquals("Date of 01/01/1969 01:01 AM results in negative "
                    + "milliseconds value relative to epoch (January 1, "
                    + "1970, 00:00:00 GMT).", be2.getMessage());
        }

        s = new DateSelector();
        s.setDatetime("this is not a date");
        try {
            s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]);
            fail("DateSelector did not check for Datetime being in a "
                    + "valid format");
        } catch (BuildException be3) {
            assertEquals("Date of this is not a date"
                        + " Cannot be parsed correctly. It should be in"
                        + " 'MM/dd/yyyy hh:mm a' format.", be3.getMessage());
        }

        s = new DateSelector();
        Parameter param = new Parameter();
        param.setName("garbage in");
        param.setValue("garbage out");
        Parameter[] params = new Parameter[1];
        params[0] = param;
        s.setParameters(params);
        try {
            s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]);
            fail("DateSelector did not check for valid parameter element");
        } catch (BuildException be4) {
            assertEquals("Invalid parameter garbage in", be4.getMessage());
        }

        s = new DateSelector();
        param = new Parameter();
        param.setName("millis");
        param.setValue("garbage out");
        params[0] = param;
        s.setParameters(params);
        try {
            s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]);
            fail("DateSelector did not check for valid millis parameter");
        } catch (BuildException be5) {
            assertEquals("Invalid millisecond setting garbage out",
                    be5.getMessage());
        }

        s = new DateSelector();
        param = new Parameter();
        param.setName("granularity");
        param.setValue("garbage out");
        params[0] = param;
        s.setParameters(params);
        try {
            s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]);
            fail("DateSelector did not check for valid granularity parameter");
        } catch (BuildException be6) {
            assertEquals("Invalid granularity setting garbage out",
                    be6.getMessage());
        }

    }

    /**
     * Tests to make sure that the selector is selecting files correctly.
     */
    @Test
    public void testSelectionBehaviour() {
        DateSelector s;
        String results;

        DateSelector.TimeComparisons before = new
                DateSelector.TimeComparisons();
        before.setValue("before");
        DateSelector.TimeComparisons equal = new
                DateSelector.TimeComparisons();
        equal.setValue("equal");
        DateSelector.TimeComparisons after = new
                DateSelector.TimeComparisons();
        after.setValue("after");


        s = new DateSelector();
        s.setDatetime("10/10/1999 1:45 PM");
        s.setWhen(before);
        results = selectorRule.selectionString(s);
        assertEquals("TFFFFFFFFFFT", results);

        s = new DateSelector();
        s.setDatetime("10/10/1999 1:45 PM");
        s.setWhen(before);
        s.setCheckdirs(true);
        results = selectorRule.selectionString(s);
        assertEquals("FFFFFFFFFFFF", results);

        s = new DateSelector();
        s.setDatetime("10/10/1999 1:45 PM");
        s.setWhen(after);
        results = selectorRule.selectionString(s);
        assertEquals("TTTTTTTTTTTT", results);

        s = new DateSelector();
        s.setDatetime("11/21/2001 4:54 AM");
        s.setWhen(before);
        results = selectorRule.selectionString(s);
        assertEquals("TFTFFFFFFFFT", results);

        s = new DateSelector();
        s.setDatetime("11/21/2001 4:55 AM");

        long milliseconds = s.getMillis();
        s.setWhen(equal);
        results = selectorRule.selectionString(s);
        assertEquals("TTFFTFFFTTTT", results);

        s = new DateSelector();
        s.setMillis(milliseconds);
        s.setWhen(equal);
        results = selectorRule.selectionString(s);
        assertEquals("TTFFTFFFTTTT", results);

        s = new DateSelector();
        s.setDatetime("11/21/2001 4:56 AM");
        s.setWhen(after);
        results = selectorRule.selectionString(s);
        assertEquals("TFFTFTTTFFFT", results);

        s = new DateSelector();
        Parameter param1 = new Parameter();
        Parameter param2 = new Parameter();
        param1.setName("datetime");
        param1.setValue("11/21/2001 4:56 AM");
        param2.setName("when");
        param2.setValue("after");
        Parameter[] params = {param1,param2};
        s.setParameters(params);
        results = selectorRule.selectionString(s);
        assertEquals("TFFTFTTTFFFT", results);

        s = new DateSelector();
        long testtime = selectorRule.getMirrorFiles()[5].lastModified();
        s.setMillis(testtime);
        s.setWhen(after);
        s.setGranularity(2);

        // setup the modified timestamp to match what the test needs, although be aware that the 3rd and 4th
        // files don't exist so can't be changed, so don't try and loop over them
        for (int i = 1; i <=2; i++) {
            Assume.assumeTrue("Cannot setup file times for test", selectorRule.getMirrorFiles()[i].setLastModified(testtime - (3*60*60*100)));
        }


        results = selectorRule.mirrorSelectionString(s);
        assertEquals("TFFFFTTTTTTT", results);

        s = new DateSelector();
        testtime = selectorRule.getMirrorFiles()[6].lastModified();
        s.setMillis(testtime);
        s.setWhen(before);
        s.setGranularity(2);
        for (int i = 7; i <= 10; i++) {
            Assume.assumeTrue("Cannot setup file times for test", selectorRule.getMirrorFiles()[i].setLastModified(testtime + (3*60*60*100)));
        }

        results = selectorRule.mirrorSelectionString(s);
        assertEquals("TTTTTTTFFFFT", results);

    }

}
