diff --git a/src/tests/junit/org/apache/tools/ant/types/selectors/DateSelectorTest.java b/src/tests/junit/org/apache/tools/ant/types/selectors/DateSelectorTest.java
index 7eb9501..e622be1 100644
--- a/src/tests/junit/org/apache/tools/ant/types/selectors/DateSelectorTest.java
+++ b/src/tests/junit/org/apache/tools/ant/types/selectors/DateSelectorTest.java
@@ -1,229 +1,229 @@
-/*
- *  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);
-
-    }
-
-}
+/*
+ *  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);
+
+    }
+
+}
