/*
* Licensed 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.f1x.util.parse;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
public class Test_TimeOfDayParser {
@Test
public void testBadCasesTime() {
assertBad("");
assertBad(":");
assertBad(":10");
assertBad(":10 am");
assertBad("10 amABC");
// extra : character
assertBad("1:");
assertBad("1: am");
assertBad("11:");
assertBad("11: am");
assertBad("1:1:");
assertBad("1:1:am");
assertBad("11:11:");
assertBad("11:11:am");
assertBad("1:1:1:");
assertBad("1:1:1: am");
assertBad("11:11:11:");
assertBad("11:11:11: am");
// h/m/s exceed max allowed
assertBad("24:00:00");
assertBad("00:60:00");
assertBad("00:00:60");
// illegal am-pm hours
assertBad("00:00 am");
assertBad("00:00 pm");
assertBad("13:00 pm");
assertBad("13:00 am");
// maximum two digits per group
assertBad("001:01:01");
assertBad("01:001:01");
assertBad("01:01:001");
// no trailing/leading spaces and space separators
assertBad(" 11:11:11");
assertBad("11: 11:11");
assertBad("11:11: 11");
assertBad("11:11:11 ");
// unterminated string
assertBad("1:");
assertBad("1:1:");
assertBad("1:1:1 ");
assertBad("1:1:1 a");
assertBad("-1:01:01");
assertBad("01:-1:01");
assertBad("01:01:-1");
}
@Test
public void testOneDigitCasesTime() {
assertTimeParsed("00:00:00", 0);
assertTimeParsed("00:01:00", 1 * 60_000);
assertTimeParsed("01:01:00", 1 * 60 * 60_000 + 1 * 60_000);
assertTimeParsed("00:00:01", 1000);
assertTimeParsed("00:01:01", 1 * 60_000 + 1000);
assertTimeParsed("01:01:01", 1 * 60 * 60_000 + 1 * 60_000 + 1000);
assertTimeParsed("00:00:00.000", 0);
assertTimeParsed("00:01:00.000", 1 * 60_000);
assertTimeParsed("01:01:00.000", 1 * 60 * 60_000 + 1 * 60_000);
assertTimeParsed("00:00:01.000", 1000);
assertTimeParsed("00:01:01.000", 1 * 60_000 + 1000);
assertTimeParsed("01:01:01.000", 1 * 60 * 60_000 + 1 * 60_000 + 1000);
assertTimeParsed("00:00:00.001", 1);
assertTimeParsed("00:01:00.001", 1 * 60_000 + 1);
assertTimeParsed("01:01:00.001", 1 * 60 * 60_000 + 1 * 60_000 + 1);
assertTimeParsed("00:00:01.001", 1000 + 1);
assertTimeParsed("00:01:01.001", 1 * 60_000 + 1000 + 1);
assertTimeParsed("01:01:01.001", 1 * 60 * 60_000 + 1 * 60_000 + 1000 + 1);
assertTimeParsed("00:00:00.321", 321);
assertTimeParsed("00:01:00.321", 1 * 60_000 + 321);
assertTimeParsed("01:01:00.321", 1 * 60 * 60_000 + 1 * 60_000 + 321);
assertTimeParsed("00:00:01.321", 1000 + 321);
assertTimeParsed("00:01:01.321", 1 * 60_000 + 1000 + 321);
assertTimeParsed("01:01:01.321", 1 * 60 * 60_000 + 1 * 60_000 + 1000 + 321);
}
@Test
public void testMilitaryFormatTime() {
assertTimeParsed("01:00:00", 1 * 60 * 60_000);
assertTimeParsed("12:00:00", 12 * 60 * 60_000);
assertTimeParsed("12:03:00", 12 * 60 * 60_000 + 3 * 60_000);
assertTimeParsed("12:34:00", 12 * 60 * 60_000 + 34 * 60_000);
assertTimeParsed("12:34:05", 12 * 60 * 60_000 + 34 * 60_000 + 5000);
assertTimeParsed("12:34:56", 12 * 60 * 60_000 + 34 * 60_000 + 56000);
assertTimeParsed("01:00:00.000", 1 * 60 * 60_000);
assertTimeParsed("12:00:00.000", 12 * 60 * 60_000);
assertTimeParsed("12:03:00.000", 12 * 60 * 60_000 + 3 * 60_000);
assertTimeParsed("12:34:00.000", 12 * 60 * 60_000 + 34 * 60_000);
assertTimeParsed("12:34:05.000", 12 * 60 * 60_000 + 34 * 60_000 + 5000);
assertTimeParsed("12:34:56.000", 12 * 60 * 60_000 + 34 * 60_000 + 56000);
}
// private static int standardParse(String value) {
//
// StringTokenizer t = new StringTokenizer(value, ":", false);
//
// int numTokens = t.countTokens();
// int seconds = 0;
//
// if (numTokens > 2)
// seconds += Integer.parseInt(t.nextToken()) * 3600;
//
// if (numTokens > 1)
// seconds += Integer.parseInt(t.nextToken()) * 60
// + Integer.parseInt(t.nextToken());
// else if (numTokens > 0)
// seconds += Integer.parseInt(t.nextToken()) * 60;
//
// return seconds;
// }
private static void assertTimeParsed(String input, int expectedSeconds) {
try {
byte [] inputBytes = input.getBytes();
int actualSeconds = TimeOfDayParser.parseTimeOfDay(wrap(inputBytes), 1, inputBytes.length);
Assert.assertEquals("Number of seconds in '" + input + '\'',expectedSeconds, actualSeconds);
} catch (NumberFormatException ex) {
Assert.fail("Parsing of '" + input + "' failed with message [" + ex.getMessage() + ']');
}
}
private static byte[] wrap(byte[] valueBytes) {
//to make it more interesting
byte [] result = new byte[valueBytes.length + 2];
Arrays.fill(result, 0, result.length, (byte) '9');
System.arraycopy(valueBytes, 0, result, 1, valueBytes.length);
return result;
}
private static void assertBad(String input) {
try {
byte [] inputBytes = input.getBytes();
TimeOfDayParser.parseTimeOfDay(inputBytes, 0, inputBytes.length);
Assert.fail("Expected to detect a problem in time string \"" + input + '"');
} catch (Exception expected) {
}
}
}