1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
import org.junit.Test;
import java.util.Random;
import java.util.stream.IntStream;
import static org.junit.Assert.assertEquals;
public class TimeFormatterTest {
private static final String[] cardinals = new String[]{
"one","two","three","four","five","six","seven","eight","nine","ten",
"eleven","twelve","thirteen","fourteen","quarter","sixteen","seventeen","eighteen","nineteen","twenty"
};
private static final Random random = new Random(System.currentTimeMillis());
private String format(int h, int m) {
boolean is24format = random.nextBoolean();
boolean isAm = random.nextBoolean();
String extraSpace = random.nextBoolean() ? " " : "";
String a = "";
if (is24format) {
if (!isAm) h += 12;
if (h == 24) h = 0;
} else {
a = extraSpace + (isAm ? "am" : "pm");
}
return String.format("%02d:%02d%s", h, m, a);
}
private String calcMinutes(int m) {
StringBuilder minutes = new StringBuilder();
if (m <= 20) {
minutes.append(cardinals[m-1]);
} else {
String hyphenated = String.join("-", cardinals[19], cardinals[m-21]);
minutes.append(hyphenated);
}
minutes.append(m == 15 ? "" : (" minute" + (m == 1 ? "" : "s")));
return minutes.toString();
}
@Test
public void basicTests() {
assertEquals("twenty-eight minutes past five", TimeFormatter.toHumanTime("05:28 pm"));
assertEquals("twelve o'clock", TimeFormatter.toHumanTime("12:00"));
assertEquals("quarter to four", TimeFormatter.toHumanTime("03:45am"));
assertEquals("quarter past seven", TimeFormatter.toHumanTime("07:15"));
assertEquals("half past eleven", TimeFormatter.toHumanTime("23:30"));
assertEquals("one minute past twelve", TimeFormatter.toHumanTime("00:01"));
assertEquals("nine minutes to six", TimeFormatter.toHumanTime("17:51"));
}
@Test
public void shouldTranslateCorrectlyTimeStrings() {
IntStream.rangeClosed(1,12).forEach(hour -> {
String translatedHour = cardinals[hour-1];
String expectedFull = translatedHour + " o'clock";
assertEquals(expectedFull, TimeFormatter.toHumanTime(format(hour, 0)));
String expectedPastQuarter = "quarter past " + translatedHour;
assertEquals(expectedPastQuarter, TimeFormatter.toHumanTime(format(hour, 15)));
String expectedHalf = "half past " + translatedHour;
assertEquals(expectedHalf, TimeFormatter.toHumanTime(format(hour, 30)));
String translatedNextHour = cardinals[hour%12];
String expectedToQuarter = "quarter to " + translatedNextHour;
assertEquals(expectedToQuarter, TimeFormatter.toHumanTime(format(hour, 45)));
// minutes past ...[hour]
IntStream.of(1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29)
.mapToObj(m -> {
String minutes = calcMinutes(m);
return new Object[]{minutes + " past " + cardinals[hour-1], m};
})
.forEachOrdered(expected ->
assertEquals(expected[0], TimeFormatter.toHumanTime(format(hour, (Integer)expected[1])))
);
// minutes to ...[nextHour]
IntStream.of(31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59)
.mapToObj(m -> {
String minutes = calcMinutes(60-m);
return new Object[]{minutes + " to " + cardinals[hour%12], m};
})
.forEachOrdered(expected ->
assertEquals(expected[0], TimeFormatter.toHumanTime(format(hour, (Integer)expected[1])))
);
});
}
}
|