/*
* doomsday.c
* A program to test a function dayOfWeek which determines which
* day of the week a particular date falls on.
* (only for dates after the start of the Gregorian calendar).
*
* Program stub created by Richard Buckland on 17/03/14
* This program by Harry J E Day on 17/03/14
* Freely licensed under Creative Commons CC-BY-3.0
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define THURSDAY 0
#define FRIDAY 1
#define SATURDAY 2
#define SUNDAY 3
#define MONDAY 4
#define TUESDAY 5
#define WEDNESDAY 6
#define JAN 1
#define FEB 2
#define MAR 3
#define APR 4
#define MAY 5
#define JUN 6
#define JUL 7
#define AUG 8
#define SEP 9
#define OCT 10
#define NOV 11
#define DEC 12
#define TRUE 1
#define FALSE 0
#define DAYS_PER_WEEK 7
int dayOfWeek(int doomsday, int leapYear, int month, int day);
int getNearestDoomsdayDate(int leapYear, int month);
int daysBetween(int doomsdayDayOfMonth, int day);
int getDayFromDistance(int distance, int doomsday);
//Tests
void unitTestFeb(void);
void unitTestInvalidMonth1(void);
void unitTestInvalidMonth2(void);
void unitTestInvalidLeapYear(void);
void runUnitTests (void);
void testPrint(int testGroup);
int main(int argc, char *argv[]) {
runUnitTests();
return EXIT_SUCCESS;
}
// given the doomsday for a year, and whether or not it is a
// leap year, this function return the day of the week for any
// given month and day in the year.
// This function assumes that the month is a number from 1 to 12
// (inclusive). It also assumes that day will not be larger than the
// number of days in the given month (including the correct number for
// Febuary based on the value for leapYear).
int dayOfWeek(int doomsday, int leapYear, int month, int day) {
int dayOfWeek;
printf("%d %d %d %d \n", doomsday, leapYear, month, day);
//check valid input
assert(doomsday <= 6);
assert(doomsday >= 0);
assert(month <= 12);
assert(month > 0);
assert(leapYear < 2);
assert(leapYear >= 0);
assert(day > 0);
if((month == JAN) || (month == MAR) || (month ==MAY) ||
(month == JUL) || (month == AUG) || (month == OCT) || (month == DEC) ) {
assert(day <= 31);
} else if ((month == APR) || (month == JUN) || (month == SEP) ||
(month == NOV)) {
assert(day <= 30);
} else if(leapYear == TRUE) {
assert(day <= 29);
} else {
assert(day <= 28);
}
//Next we need to determine which doomsday we are calculating from
//(based on month & leap year)
int doomsdayDayOfMonth = getNearestDoomsdayDate(leapYear, month);
//Then calculate distance
int distance = daysBetween(doomsdayDayOfMonth, day);
//Finally, calculate what day
dayOfWeek = getDayFromDistance(distance, doomsday);
printf("%d\n",dayOfWeek);
return (dayOfWeek);
}
//determines the day of the month of the nearest doomsday to day
//It should be in the same month
//Universal Doomsdays: 14/3, 4/4, 9/5, 6/6, 11/7, 8/8, 5/9, 10/10, 7/11,
//12/12,
//Leapyear Doomsdays: 11/1, 29/2
//Common Year Doomsdays: 3/1, 28/2
int getNearestDoomsdayDate(int leapYear, int month) {
int dayOfMonth = -1;
//if it is in Jan or Feb use leapYear or Common Year days
if(month <= FEB) {
if(leapYear == TRUE) {
if(month == JAN) {
dayOfMonth = 11;
} else if (month == FEB) {
dayOfMonth = 29;
}
} else if (leapYear == FALSE) {
if(month == JAN) {
dayOfMonth = 3;
} else if (month == FEB) {
dayOfMonth = 28;
}
}
//otherwise check the other months
} else if(month == MAR) {
dayOfMonth = 14;
} else if(month == APR) {
dayOfMonth = 4;
} else if(month == MAY) {
dayOfMonth = 9;
} else if(month == JUN) {
dayOfMonth = 6;
} else if(month == JUL) {
dayOfMonth = 11;
} else if(month == AUG) {
dayOfMonth = 8;
} else if(month == SEP) {
dayOfMonth = 5;
} else if(month == OCT) {
dayOfMonth = 10;
} else if(month == NOV) {
dayOfMonth = 7;
} else if(month == DEC) {
dayOfMonth = 12;
}
return dayOfMonth;
}
//calculates the difference in days between doomsdayDayOfMonth and day
//Note: this does return negative values
int daysBetween(int doomsdayDayOfMonth, int day) {
return (day - doomsdayDayOfMonth) ;
}
//Calculates the day given the distance from doomsday of the current day
int getDayFromDistance(int distance, int doomsday) {
int day; //stores the day, which will be returned
if(distance > 0) {
day = (distance % 7) + doomsday;
} else if ((distance % (-7)) != 0) {
day = doomsday + (distance % (-7));
} else {
day = doomsday;
}
//clean up long distances, and negatives
if(day < 0) {
day = 7 + day;
} else if(day >= 7) {
day = day - 7;
}
return day;
}
//These should all work
void runUnitTests (void) {
printf ("Testing group 1\n");
assert (dayOfWeek (THURSDAY, FALSE, 4, 4) == THURSDAY);
assert (dayOfWeek (FRIDAY, FALSE, 6, 6) == FRIDAY);
assert (dayOfWeek (MONDAY, FALSE, 8, 8) == MONDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 10, 10) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 12) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 9, 5) == THURSDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 9) == FRIDAY);
assert (dayOfWeek (SUNDAY, FALSE, 7, 11) == SUNDAY);
assert (dayOfWeek (TUESDAY, FALSE, 11, 7) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 3, 7) == WEDNESDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 9, 25) == TUESDAY);
testPrint(1);
printf ("Testing group 2\n");
assert (dayOfWeek (THURSDAY, FALSE, 4, 5) == FRIDAY);
assert (dayOfWeek (SATURDAY, FALSE, 6, 5) == FRIDAY);
assert (dayOfWeek (MONDAY, FALSE, 8, 9) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 10, 9) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 20) == SATURDAY);
assert (dayOfWeek (THURSDAY, FALSE, 9, 9) == MONDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 5) == MONDAY);
assert (dayOfWeek (SUNDAY, FALSE, 7, 7) == WEDNESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 11, 11) == SATURDAY);
assert (dayOfWeek (THURSDAY, FALSE, 3, 30) == SATURDAY);
assert (dayOfWeek (FRIDAY, FALSE, 10, 21) == TUESDAY);
testPrint(2);
printf ("Testing group 3\n");
assert (dayOfWeek (TUESDAY, FALSE, 2, 28) == TUESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 2, 27) == MONDAY);
assert (dayOfWeek (THURSDAY, FALSE, 1, 5) == SATURDAY);
assert (dayOfWeek (THURSDAY, FALSE, 1, 3) == THURSDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 3, 27) == TUESDAY);
assert (dayOfWeek (MONDAY, TRUE, 1, 4) == MONDAY);
assert (dayOfWeek (MONDAY, FALSE, 1, 4) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 3, 21) == FRIDAY);
assert (dayOfWeek (SATURDAY, FALSE, 2, 1) == SUNDAY);
assert (dayOfWeek (SATURDAY, FALSE, 8, 14) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 4, 5) == FRIDAY);
assert (dayOfWeek (SUNDAY, FALSE, 1, 26) == TUESDAY);
testPrint(3);
printf ("Testing group 4\n");
assert (dayOfWeek (THURSDAY, TRUE, 2, 29) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 28) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, FALSE, 2, 28) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 7, 1) == MONDAY);
assert (dayOfWeek (THURSDAY, FALSE, 12, 18) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 2, 10) == MONDAY);
assert (dayOfWeek (SATURDAY, FALSE, 10, 21) == WEDNESDAY);
assert (dayOfWeek (MONDAY, FALSE, 3, 1) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 2, 26) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 2, 11) == TUESDAY);
testPrint(4);
printf ("Testing group 5\n");
assert (dayOfWeek (TUESDAY, TRUE, 2, 27) == SUNDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 22) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 1, 3) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 1, 4) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 1, 11) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 1) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 29) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 17) == SATURDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 18) == SUNDAY);
assert (dayOfWeek (THURSDAY, TRUE, 4, 4) == THURSDAY);
testPrint(5);
printf ("Testing group 6\n");
assert (dayOfWeek (FRIDAY, TRUE, 1, 1) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 29) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, FALSE, 3, 30) == SATURDAY);
assert (dayOfWeek (TUESDAY, TRUE, 4, 24) == MONDAY);
assert (dayOfWeek (THURSDAY, FALSE, 12, 31) == TUESDAY);
assert (dayOfWeek (SATURDAY, TRUE, 1, 5) == SUNDAY);
assert (dayOfWeek (MONDAY, TRUE, 10, 18) == TUESDAY);
assert (dayOfWeek (MONDAY, FALSE, 11, 12) == SATURDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 3, 7) == WEDNESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 3, 21) == SUNDAY);
assert (dayOfWeek (MONDAY, TRUE, 3, 15) == TUESDAY);
testPrint(6);
printf ("Testing group 7\n");
assert (dayOfWeek (MONDAY, TRUE, 2, 15) == MONDAY);
assert (dayOfWeek (MONDAY, TRUE, 1, 4) == MONDAY);
assert (dayOfWeek (MONDAY, TRUE, 4, 4) == MONDAY);
assert (dayOfWeek (MONDAY, TRUE, 2, 29) == MONDAY);
assert (dayOfWeek (MONDAY, FALSE, 2, 28) == MONDAY);
assert (dayOfWeek (MONDAY, TRUE, 3, 1) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 6, 6) == FRIDAY);
assert (dayOfWeek (TUESDAY, TRUE, 4, 1) == SATURDAY);
assert (dayOfWeek (TUESDAY, TRUE, 12, 25) == MONDAY);
assert (dayOfWeek (TUESDAY, FALSE, 4, 1) == SATURDAY);
testPrint(7);
printf ("Testing group 8\n");
assert (dayOfWeek (THURSDAY, TRUE, 3, 2) == SATURDAY);
assert (dayOfWeek (THURSDAY, FALSE, 1, 1) == TUESDAY);
assert (dayOfWeek (SATURDAY, TRUE, 10, 10) == SATURDAY);
assert (dayOfWeek (SATURDAY, FALSE, 3, 13) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 11, 4) == MONDAY);
assert (dayOfWeek (THURSDAY, FALSE, 7, 22) == MONDAY);
assert (dayOfWeek (FRIDAY, TRUE, 3, 15) == SATURDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 12) == MONDAY);
assert (dayOfWeek (FRIDAY, FALSE, 7, 2) == WEDNESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 1, 31) == SATURDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 6, 9) == SATURDAY);
testPrint(8);
printf ("Testing group 9\n");
assert (dayOfWeek (THURSDAY, TRUE, 1, 6) == SATURDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 6, 10) == SUNDAY);
assert (dayOfWeek (THURSDAY, TRUE, 10, 1) == TUESDAY);
assert (dayOfWeek (SATURDAY, TRUE, 2, 3) == MONDAY);
assert (dayOfWeek (FRIDAY, TRUE, 11, 29) == SATURDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 12) == FRIDAY);
assert (dayOfWeek (FRIDAY, TRUE, 3, 19) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, TRUE, 6, 6) == FRIDAY);
assert (dayOfWeek (TUESDAY, TRUE, 3, 14) == TUESDAY);
assert (dayOfWeek (TUESDAY, TRUE, 3, 15) == WEDNESDAY);
assert (dayOfWeek (TUESDAY, TRUE, 8 , 28) == MONDAY);
testPrint(9);
printf ("Testing group 10\n");
assert (dayOfWeek (THURSDAY, TRUE, 10, 3) == THURSDAY);
assert (dayOfWeek (THURSDAY, TRUE, 10, 4) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 7, 6) == SATURDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 10, 16) == TUESDAY);
assert (dayOfWeek (SUNDAY, FALSE, 2, 8) == MONDAY);
assert (dayOfWeek (TUESDAY, TRUE, 9, 30) == SATURDAY);
assert (dayOfWeek (MONDAY, TRUE, 1, 1) == FRIDAY);
assert (dayOfWeek (TUESDAY, TRUE, 9, 30) == SATURDAY);
assert (dayOfWeek (MONDAY, TRUE, 8, 31) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 4, 14) == SUNDAY);
assert (dayOfWeek (MONDAY, FALSE, 2, 9) == WEDNESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 9, 2) == THURSDAY);
testPrint(10);
printf ("Testing group 11: Different doomsdays, months, and days\n");
assert (dayOfWeek (SUNDAY, TRUE, 1, 20) == TUESDAY);
assert (dayOfWeek (MONDAY, TRUE, 2, 19) == FRIDAY);
assert (dayOfWeek (TUESDAY, TRUE, 3, 18) == SATURDAY);
assert (dayOfWeek (WEDNESDAY,TRUE, 4, 17) == TUESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 5, 16) == THURSDAY);
assert (dayOfWeek (FRIDAY, TRUE, 6, 15) == SUNDAY);
assert (dayOfWeek (SATURDAY, TRUE, 7, 14) == TUESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 8, 13) == FRIDAY);
assert (dayOfWeek (MONDAY, TRUE, 9, 12) == MONDAY);
assert (dayOfWeek (TUESDAY, TRUE, 10, 11) == WEDNESDAY);
assert (dayOfWeek (WEDNESDAY,TRUE, 11, 10) == SATURDAY);
assert (dayOfWeek (THURSDAY,TRUE, 12, 9) == MONDAY);
testPrint(11);
printf ("Testing group 12: tutor birthdays\n");
assert (dayOfWeek (SATURDAY, TRUE, 5, 15) == FRIDAY);
assert (dayOfWeek (THURSDAY, TRUE, 5, 26) == SUNDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 4, 1) == SUNDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 4, 1) == SUNDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 23) == FRIDAY);
testPrint(12);
printf ("Testing group 13: Tests for February dates on leap years specifically\n");
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 29) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, TRUE, 2, 29) == FRIDAY);
assert (dayOfWeek (FRIDAY, TRUE, 2, 28) == THURSDAY);
assert (dayOfWeek (SUNDAY, TRUE, 2, 29) == SUNDAY);
assert (dayOfWeek (SUNDAY, TRUE, 2, 27) == FRIDAY);
assert (dayOfWeek (MONDAY, TRUE, 2, 29) == MONDAY);
assert (dayOfWeek (TUESDAY, TRUE, 2, 20) == SUNDAY);
assert (dayOfWeek (MONDAY, TRUE, 3, 1) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 3, 28) == FRIDAY); // due date
testPrint(13);
printf ("Testing group 14\n");
assert (dayOfWeek (FRIDAY, FALSE, 6, 7) == SATURDAY);
assert (dayOfWeek (MONDAY, TRUE, 6, 6) == MONDAY);
assert (dayOfWeek (MONDAY, TRUE, 10, 11) == TUESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 7, 4) == TUESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 9, 6) == WEDNESDAY);
assert (dayOfWeek (SATURDAY, TRUE, 5, 5) == TUESDAY);
assert (dayOfWeek (MONDAY, FALSE, 5, 13) == FRIDAY);
assert (dayOfWeek (FRIDAY, FALSE, 3, 19) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 3, 24) == MONDAY);
assert (dayOfWeek (MONDAY, FALSE, 10, 4) == TUESDAY);
assert (dayOfWeek (THURSDAY, FALSE, 4, 28) == SUNDAY);
assert (dayOfWeek (FRIDAY, FALSE, 4, 21) == MONDAY);
testPrint(14);
printf ("Testing group 15\n");
assert (dayOfWeek (WEDNESDAY, TRUE, 1, 17) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 3) == FRIDAY);
assert (dayOfWeek (SUNDAY, TRUE, 1, 6) == TUESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 1, 28) == WEDNESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 2, 14) == SATURDAY);
assert (dayOfWeek (TUESDAY, TRUE, 12, 25) == MONDAY);
assert (dayOfWeek (TUESDAY, TRUE, 6, 17) == SATURDAY);
assert (dayOfWeek (TUESDAY, TRUE, 5, 9) == TUESDAY);
assert (dayOfWeek (TUESDAY, TRUE, 2, 9) == WEDNESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 3, 3) == SATURDAY);
assert (dayOfWeek (FRIDAY, TRUE, 10, 31) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 11, 1) == FRIDAY);
assert (dayOfWeek (TUESDAY, FALSE, 7, 5) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 30) == FRIDAY);
testPrint(15);
printf ("Testing group 16: extremities \n");
//1-4 Tests extremities of leapyears and non leapyears
//5-6 Tests the 2 leapyear affected months January and February
//7 Tests if you wrongly used the situational may doomsday
assert (dayOfWeek (WEDNESDAY, FALSE, 11, 1) == THURSDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 11, 27) == TUESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 1, 1) == MONDAY);
assert (dayOfWeek (THURSDAY, TRUE, 1, 27) == SATURDAY);
assert (dayOfWeek (SUNDAY, TRUE, 1, 16) == FRIDAY);
assert (dayOfWeek (SUNDAY, TRUE, 2, 16) == MONDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 2) == FRIDAY);
assert (dayOfWeek (SATURDAY, TRUE, 12, 26) == SATURDAY);
assert (dayOfWeek (FRIDAY, FALSE, 3, 22) == SATURDAY);
testPrint(16);
printf ("Testing group 17\n");
assert (dayOfWeek (FRIDAY, FALSE, 3, 29) == SATURDAY);
assert (dayOfWeek (MONDAY, TRUE, 1, 1) == FRIDAY);
assert (dayOfWeek (SUNDAY, TRUE, 2, 2) == MONDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 4, 19) == THURSDAY);
assert (dayOfWeek (TUESDAY, TRUE, 5, 14) == SUNDAY);
assert (dayOfWeek (THURSDAY, FALSE, 6, 18) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 7, 5) == SATURDAY);
assert (dayOfWeek (FRIDAY, FALSE, 4, 8) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 8, 4) == MONDAY);
assert (dayOfWeek (MONDAY, TRUE, 3, 30) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, FALSE, 5, 13) == MONDAY);
assert (dayOfWeek (SATURDAY, FALSE, 2, 9) == MONDAY);
assert (dayOfWeek(TUESDAY, FALSE, 7, 8 ) == SATURDAY);
assert (dayOfWeek(THURSDAY, FALSE, 4,26) == FRIDAY);
assert (dayOfWeek(SATURDAY, FALSE, 6, 13) == SATURDAY);
assert (dayOfWeek (TUESDAY, TRUE, 2, 3) == THURSDAY);
assert (dayOfWeek (FRIDAY, FALSE, 3, 28) == FRIDAY); // The day we have to submit the doomsday code
assert (dayOfWeek (SUNDAY, TRUE, 12, 31) == FRIDAY); //366th day of the year!
assert (dayOfWeek (FRIDAY, FALSE, 7, 3) == THURSDAY);
testPrint(17);
printf ("Testing group 18 - Series of TRUE cases\n");
assert (dayOfWeek (WEDNESDAY, TRUE, 3, 6) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 5, 1) == TUESDAY);
assert (dayOfWeek (FRIDAY, TRUE, 6, 28) == SATURDAY);
assert (dayOfWeek (FRIDAY, TRUE, 3, 5) == WEDNESDAY);
assert (dayOfWeek (TUESDAY, TRUE, 10, 7) == SATURDAY);
assert (dayOfWeek (THURSDAY, TRUE, 4, 9) == TUESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 4, 30) == TUESDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 2) == FRIDAY);
assert (dayOfWeek (SUNDAY, TRUE, 5, 11) == TUESDAY);
assert (dayOfWeek (SUNDAY, TRUE, 1, 1) == THURSDAY);
assert (dayOfWeek (MONDAY, TRUE, 1, 1) == FRIDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 29) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, TRUE, 2, 29) == FRIDAY);
assert (dayOfWeek (FRIDAY, TRUE, 2, 28) == THURSDAY);
assert (dayOfWeek (MONDAY, TRUE, 2, 29) == MONDAY);
assert (dayOfWeek (SUNDAY, TRUE, 2, 27) == FRIDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 6) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 12) == SUNDAY);
assert (dayOfWeek (SATURDAY, TRUE, 1, 5) == SUNDAY);
assert (dayOfWeek (SUNDAY, TRUE, 1, 21) == WEDNESDAY);
testPrint(18);
printf ("Testing group 19 - last day of each month\n");
assert (dayOfWeek (SUNDAY, FALSE, 1, 31) == SUNDAY);
assert (dayOfWeek (MONDAY, FALSE, 2, 28) == MONDAY);
assert (dayOfWeek (TUESDAY, FALSE, 3, 31) == FRIDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 4, 30) == MONDAY);
assert (dayOfWeek (THURSDAY, FALSE, 5, 31) == FRIDAY);
assert (dayOfWeek (FRIDAY, FALSE, 6, 30) == MONDAY);
assert (dayOfWeek (SATURDAY, FALSE, 7, 31) == FRIDAY);
assert (dayOfWeek (SUNDAY, FALSE, 8, 31) == TUESDAY);
assert (dayOfWeek (MONDAY, FALSE, 9, 30) == FRIDAY);
assert (dayOfWeek (TUESDAY, FALSE, 10, 31) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 11, 30) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 12, 31) == TUESDAY);
testPrint(19);
printf ("Testing group 20 - first day of each month\n");
assert (dayOfWeek (SUNDAY, FALSE, 1, 1) == FRIDAY);
assert (dayOfWeek (MONDAY, FALSE, 2, 1) == TUESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 3, 1) == WEDNESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 4, 1) == SUNDAY);
assert (dayOfWeek (THURSDAY, FALSE, 5, 1) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 6, 1) == SUNDAY);
assert (dayOfWeek (SATURDAY, FALSE, 7, 1) == WEDNESDAY);
assert (dayOfWeek (SUNDAY, FALSE, 8, 1) == SUNDAY);
assert (dayOfWeek (MONDAY, FALSE, 9, 1) == THURSDAY);
assert (dayOfWeek (TUESDAY, FALSE, 10, 1) == SUNDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 11, 1) == THURSDAY);
assert (dayOfWeek (THURSDAY, FALSE, 12, 1) == SUNDAY);
assert (dayOfWeek (TUESDAY, FALSE, 9, 27) == WEDNESDAY);
testPrint(20);
// tests how well you handle the modulo operator with negative numbers
// note: some compilers can't calculate the remainder of a negative #
assert (dayOfWeek (THURSDAY, FALSE, 2, 1) == FRIDAY);
assert (dayOfWeek (SATURDAY, TRUE, 6, 27) == SATURDAY);
assert (dayOfWeek (FRIDAY, TRUE, 2, 20) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 1) == MONDAY);
assert (dayOfWeek (FRIDAY, FALSE, 1, 1) == WEDNESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 12, 12) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, TRUE, 4, 27) == SUNDAY);
assert (dayOfWeek (MONDAY, TRUE, 3, 24) == THURSDAY);
assert (dayOfWeek (MONDAY, FALSE, 3, 24) == THURSDAY);
assert (dayOfWeek (THURSDAY, FALSE, 2, 17) == SUNDAY);
assert (dayOfWeek (THURSDAY, TRUE, 2, 17) == SATURDAY);
assert (dayOfWeek (SATURDAY, TRUE, 1, 21) == TUESDAY);
assert (dayOfWeek (FRIDAY, TRUE, 11, 29) == SATURDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 13) == SATURDAY);
printf ("All tests passed - You are Awesome!\n");
}
void testPrint(int testGroup) {
printf("Group %d has passed - you're awesome!\n",testGroup);
}
/*
* ---These Unit Tests Should cause assertion errors---
* This is to check that the program is not handling invalid input
* Consequently they are not called from main() in the submitted code as they
* are supposed to produce errors
*/
void unitTestFeb(void) {
dayOfWeek(THURSDAY,FALSE,2,29);
}
void unitTestInvalidMonth1(void) {
dayOfWeek(THURSDAY,FALSE,13,29);
}
void unitTestInvalidMonth2(void) {
dayOfWeek(THURSDAY,FALSE,-2,29);
}
void unitTestInvalidLeapYear(void) {
dayOfWeek(THURSDAY,3,1,2);
}
Download file:
doomsday.c
(21.6 KB)