The problem
The date June 10th 1960 is special because when we write it in the following format, the month times the day equals the year:
- 6/10/60
Write a program that asks the user to enter a month (in numeric form), a day, and a two-digit year. The program should then determine whether the day times the month is equal to the year; if so, it should display a message indicating that the date is magic. Otherwise, it should display a message indicating that the date is not magic.
Breaking it down
public static void main(String[] args) {
// Create a Scanner object for keyboard input.
Scanner keyboard = new Scanner(System.in);
// Ask user for input
System.out.print("Enter date in mm/dd/yyyy format:");
String dateAsString = keyboard.next();
// close stream
keyboard.close();
// Parse string to date
LocalDate date = LocalDate.parse(dateAsString,
DateTimeFormatter.ofPattern("MM/dd/yyyy"));
// check date and display output
if (magicDate(date)) {
System.out.println("That date is magic!");
} else {
System.out.println("Sorry, nothing magic about that date...");
}
}
/**
* Method will check if a date is magic define by month * date = last two
* digets of year
*
* @param date
* @return true if the date is magic
*/
public static boolean magicDate(LocalDate date) {
int month = date.getMonth().getValue();
int day = date.getDayOfMonth();
int year = date.getYear();
String yearAsString = String.valueOf(year);
String lastTwoDigits = "0";
if (yearAsString.length() == 4) {
lastTwoDigits = yearAsString.substring(2);
}
return (month * day) == Integer.parseInt(lastTwoDigits);
}
Output
Enter date in mm/dd/yyyy format:06/10/1960
That date is magic!
Unit tests
@Test
public void test_magic_date() {
boolean magicDate = MagicDates.magicDate(LocalDate.of(1960, Month.JUNE,
10));
assertTrue(magicDate);
}
@Test
public void test_magic_not_date() {
boolean magicDate = MagicDates.magicDate(LocalDate.of(1961, Month.JUNE,
11));
assertFalse(magicDate);
}
Level Up
- Modify the unit to have mutliple dates using junit parameterized test
- Validate the date to be in correct MM/dd/yyyy format