doomsday.c - OpenLearning
/*
 *  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)

Comments

Chat