If Statement Returning True for Wrong Statement












1















Wrote a simple little app to check what period it is a display it with Javascript. Works great for the most part - but at certain times it will display the next period instead of the current one.




  1. How do I test it without waiting and manually checking?

  2. I'd obviously like to figure out why it displays the wrong period


Edit: If the time is 15:06 (3:06PM) it will display the last else statement instead of the second to last one



Code:



var now = '';

//Set Periods
//Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
var periods = [
['Before School', 5.00, 7.59],
['First', 8.00, 8.49, 8.50, 8.54],
['Second', 8.55, 9.44, 9.45, 9.49],
['Third', 9.50, 10.39, 10.40, 10.44],
['Fourth', 10.45, 11.34, 11.35, 11.39],
['Fifth', 11.40, 12.29, 12.30, 12.34],
['Sixth', 12.35, 13.24, 13.25, 13.29],
['Seventh', 13.30, 14.19, 14.20, 14.24],
['Eighth', 14.25, 15.15]
];

//Display Period
function displayPeriod() {
if (now >= periods[0][1] && now <= periods[0][2]) {
document.getElementById('period').innerHTML = ('School has not started yet');
} else if (now >= periods[1][1] && now <= periods[1][2]) {
document.getElementById('period').innerHTML = ('1st');
} else if (now >= periods[1][3] && now <= periods[1][4]) {
document.getElementById('period').innerHTML = ('1st Passing');
} else if (now >= periods[2][1] && now <= periods[2][2]) {
document.getElementById('period').innerHTML = ('2nd');
} else if (now >= periods[2][3] && now <= periods[2][4]) {
document.getElementById('period').innerHTML = ('2nd Passing');
} else if (now > periods[3][1] && now <= periods[3][2]) {
document.getElementById('period').innerHTML = ('3rd');
} else if (now >= periods[3][3] && now <= periods[3][4]) {
document.getElementById('period').innerHTML = ('3rd Passing');
} else if (now >= periods[4][1] && now <= periods[4][2]) {
document.getElementById('period').innerHTML = ('4th');
} else if (now >= periods[4][3] && now <= periods[4][4]) {
document.getElementById('period').innerHTML = ('4th Passing');
} else if (now >= periods[5][1] && now <= periods[5][2]) {
document.getElementById('period').innerHTML = ('5th');
} else if (now >= periods[5][3] && now <= periods[5][4]) {
document.getElementById('period').innerHTML = ('5th Passing');
} else if (now >= periods[6][1] && now <= periods[6][2]) {
document.getElementById('period').innerHTML = ('6th');
} else if (now >= periods[6][3] && now <= periods[6][4]) {
document.getElementById('period').innerHTML = ('6th Passing');
} else if (now >= periods[7][1] && now <= periods[7][2]) {
document.getElementById('period').innerHTML = ('7th');
} else if (now >= periods[7][3] && now <= periods[7][4]) {
document.getElementById('period').innerHTML = ('7th Passing');
} else if (now >= periods[8][1] && now <= periods[8][2]) {
document.getElementById('period').innerHTML = ('8th');
} else {
document.getElementById('period').innerHTML = ('School is done for the day.');
}
}


//Check Time
function startTime() {
var today = new Date();
now = today.getHours() + '.' + today.getMinutes();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
m = checkTime(m);
s = checkTime(s);

displayPeriod();

var t = setTimeout(startTime, 500);
}

function checkTime(i) {
if (i < 10) {
i = '0' + i
}; // add zero in front of numbers < 10
return i;
}









share|improve this question

























  • Is v ar now = "" a copy/paste error, or is it an error in your actual code?

    – Jack Bashford
    Nov 14 '18 at 2:14











  • copy and paste error

    – Velibor Nikolic
    Nov 14 '18 at 2:17











  • Can you state the exact time where it displays the wrong period?

    – Andreas
    Nov 14 '18 at 2:29











  • var today = new Date(); today.setHours(15,02 , 0);

    – Velibor Nikolic
    Nov 14 '18 at 2:36
















1















Wrote a simple little app to check what period it is a display it with Javascript. Works great for the most part - but at certain times it will display the next period instead of the current one.




  1. How do I test it without waiting and manually checking?

  2. I'd obviously like to figure out why it displays the wrong period


Edit: If the time is 15:06 (3:06PM) it will display the last else statement instead of the second to last one



Code:



var now = '';

//Set Periods
//Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
var periods = [
['Before School', 5.00, 7.59],
['First', 8.00, 8.49, 8.50, 8.54],
['Second', 8.55, 9.44, 9.45, 9.49],
['Third', 9.50, 10.39, 10.40, 10.44],
['Fourth', 10.45, 11.34, 11.35, 11.39],
['Fifth', 11.40, 12.29, 12.30, 12.34],
['Sixth', 12.35, 13.24, 13.25, 13.29],
['Seventh', 13.30, 14.19, 14.20, 14.24],
['Eighth', 14.25, 15.15]
];

//Display Period
function displayPeriod() {
if (now >= periods[0][1] && now <= periods[0][2]) {
document.getElementById('period').innerHTML = ('School has not started yet');
} else if (now >= periods[1][1] && now <= periods[1][2]) {
document.getElementById('period').innerHTML = ('1st');
} else if (now >= periods[1][3] && now <= periods[1][4]) {
document.getElementById('period').innerHTML = ('1st Passing');
} else if (now >= periods[2][1] && now <= periods[2][2]) {
document.getElementById('period').innerHTML = ('2nd');
} else if (now >= periods[2][3] && now <= periods[2][4]) {
document.getElementById('period').innerHTML = ('2nd Passing');
} else if (now > periods[3][1] && now <= periods[3][2]) {
document.getElementById('period').innerHTML = ('3rd');
} else if (now >= periods[3][3] && now <= periods[3][4]) {
document.getElementById('period').innerHTML = ('3rd Passing');
} else if (now >= periods[4][1] && now <= periods[4][2]) {
document.getElementById('period').innerHTML = ('4th');
} else if (now >= periods[4][3] && now <= periods[4][4]) {
document.getElementById('period').innerHTML = ('4th Passing');
} else if (now >= periods[5][1] && now <= periods[5][2]) {
document.getElementById('period').innerHTML = ('5th');
} else if (now >= periods[5][3] && now <= periods[5][4]) {
document.getElementById('period').innerHTML = ('5th Passing');
} else if (now >= periods[6][1] && now <= periods[6][2]) {
document.getElementById('period').innerHTML = ('6th');
} else if (now >= periods[6][3] && now <= periods[6][4]) {
document.getElementById('period').innerHTML = ('6th Passing');
} else if (now >= periods[7][1] && now <= periods[7][2]) {
document.getElementById('period').innerHTML = ('7th');
} else if (now >= periods[7][3] && now <= periods[7][4]) {
document.getElementById('period').innerHTML = ('7th Passing');
} else if (now >= periods[8][1] && now <= periods[8][2]) {
document.getElementById('period').innerHTML = ('8th');
} else {
document.getElementById('period').innerHTML = ('School is done for the day.');
}
}


//Check Time
function startTime() {
var today = new Date();
now = today.getHours() + '.' + today.getMinutes();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
m = checkTime(m);
s = checkTime(s);

displayPeriod();

var t = setTimeout(startTime, 500);
}

function checkTime(i) {
if (i < 10) {
i = '0' + i
}; // add zero in front of numbers < 10
return i;
}









share|improve this question

























  • Is v ar now = "" a copy/paste error, or is it an error in your actual code?

    – Jack Bashford
    Nov 14 '18 at 2:14











  • copy and paste error

    – Velibor Nikolic
    Nov 14 '18 at 2:17











  • Can you state the exact time where it displays the wrong period?

    – Andreas
    Nov 14 '18 at 2:29











  • var today = new Date(); today.setHours(15,02 , 0);

    – Velibor Nikolic
    Nov 14 '18 at 2:36














1












1








1








Wrote a simple little app to check what period it is a display it with Javascript. Works great for the most part - but at certain times it will display the next period instead of the current one.




  1. How do I test it without waiting and manually checking?

  2. I'd obviously like to figure out why it displays the wrong period


Edit: If the time is 15:06 (3:06PM) it will display the last else statement instead of the second to last one



Code:



var now = '';

//Set Periods
//Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
var periods = [
['Before School', 5.00, 7.59],
['First', 8.00, 8.49, 8.50, 8.54],
['Second', 8.55, 9.44, 9.45, 9.49],
['Third', 9.50, 10.39, 10.40, 10.44],
['Fourth', 10.45, 11.34, 11.35, 11.39],
['Fifth', 11.40, 12.29, 12.30, 12.34],
['Sixth', 12.35, 13.24, 13.25, 13.29],
['Seventh', 13.30, 14.19, 14.20, 14.24],
['Eighth', 14.25, 15.15]
];

//Display Period
function displayPeriod() {
if (now >= periods[0][1] && now <= periods[0][2]) {
document.getElementById('period').innerHTML = ('School has not started yet');
} else if (now >= periods[1][1] && now <= periods[1][2]) {
document.getElementById('period').innerHTML = ('1st');
} else if (now >= periods[1][3] && now <= periods[1][4]) {
document.getElementById('period').innerHTML = ('1st Passing');
} else if (now >= periods[2][1] && now <= periods[2][2]) {
document.getElementById('period').innerHTML = ('2nd');
} else if (now >= periods[2][3] && now <= periods[2][4]) {
document.getElementById('period').innerHTML = ('2nd Passing');
} else if (now > periods[3][1] && now <= periods[3][2]) {
document.getElementById('period').innerHTML = ('3rd');
} else if (now >= periods[3][3] && now <= periods[3][4]) {
document.getElementById('period').innerHTML = ('3rd Passing');
} else if (now >= periods[4][1] && now <= periods[4][2]) {
document.getElementById('period').innerHTML = ('4th');
} else if (now >= periods[4][3] && now <= periods[4][4]) {
document.getElementById('period').innerHTML = ('4th Passing');
} else if (now >= periods[5][1] && now <= periods[5][2]) {
document.getElementById('period').innerHTML = ('5th');
} else if (now >= periods[5][3] && now <= periods[5][4]) {
document.getElementById('period').innerHTML = ('5th Passing');
} else if (now >= periods[6][1] && now <= periods[6][2]) {
document.getElementById('period').innerHTML = ('6th');
} else if (now >= periods[6][3] && now <= periods[6][4]) {
document.getElementById('period').innerHTML = ('6th Passing');
} else if (now >= periods[7][1] && now <= periods[7][2]) {
document.getElementById('period').innerHTML = ('7th');
} else if (now >= periods[7][3] && now <= periods[7][4]) {
document.getElementById('period').innerHTML = ('7th Passing');
} else if (now >= periods[8][1] && now <= periods[8][2]) {
document.getElementById('period').innerHTML = ('8th');
} else {
document.getElementById('period').innerHTML = ('School is done for the day.');
}
}


//Check Time
function startTime() {
var today = new Date();
now = today.getHours() + '.' + today.getMinutes();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
m = checkTime(m);
s = checkTime(s);

displayPeriod();

var t = setTimeout(startTime, 500);
}

function checkTime(i) {
if (i < 10) {
i = '0' + i
}; // add zero in front of numbers < 10
return i;
}









share|improve this question
















Wrote a simple little app to check what period it is a display it with Javascript. Works great for the most part - but at certain times it will display the next period instead of the current one.




  1. How do I test it without waiting and manually checking?

  2. I'd obviously like to figure out why it displays the wrong period


Edit: If the time is 15:06 (3:06PM) it will display the last else statement instead of the second to last one



Code:



var now = '';

//Set Periods
//Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
var periods = [
['Before School', 5.00, 7.59],
['First', 8.00, 8.49, 8.50, 8.54],
['Second', 8.55, 9.44, 9.45, 9.49],
['Third', 9.50, 10.39, 10.40, 10.44],
['Fourth', 10.45, 11.34, 11.35, 11.39],
['Fifth', 11.40, 12.29, 12.30, 12.34],
['Sixth', 12.35, 13.24, 13.25, 13.29],
['Seventh', 13.30, 14.19, 14.20, 14.24],
['Eighth', 14.25, 15.15]
];

//Display Period
function displayPeriod() {
if (now >= periods[0][1] && now <= periods[0][2]) {
document.getElementById('period').innerHTML = ('School has not started yet');
} else if (now >= periods[1][1] && now <= periods[1][2]) {
document.getElementById('period').innerHTML = ('1st');
} else if (now >= periods[1][3] && now <= periods[1][4]) {
document.getElementById('period').innerHTML = ('1st Passing');
} else if (now >= periods[2][1] && now <= periods[2][2]) {
document.getElementById('period').innerHTML = ('2nd');
} else if (now >= periods[2][3] && now <= periods[2][4]) {
document.getElementById('period').innerHTML = ('2nd Passing');
} else if (now > periods[3][1] && now <= periods[3][2]) {
document.getElementById('period').innerHTML = ('3rd');
} else if (now >= periods[3][3] && now <= periods[3][4]) {
document.getElementById('period').innerHTML = ('3rd Passing');
} else if (now >= periods[4][1] && now <= periods[4][2]) {
document.getElementById('period').innerHTML = ('4th');
} else if (now >= periods[4][3] && now <= periods[4][4]) {
document.getElementById('period').innerHTML = ('4th Passing');
} else if (now >= periods[5][1] && now <= periods[5][2]) {
document.getElementById('period').innerHTML = ('5th');
} else if (now >= periods[5][3] && now <= periods[5][4]) {
document.getElementById('period').innerHTML = ('5th Passing');
} else if (now >= periods[6][1] && now <= periods[6][2]) {
document.getElementById('period').innerHTML = ('6th');
} else if (now >= periods[6][3] && now <= periods[6][4]) {
document.getElementById('period').innerHTML = ('6th Passing');
} else if (now >= periods[7][1] && now <= periods[7][2]) {
document.getElementById('period').innerHTML = ('7th');
} else if (now >= periods[7][3] && now <= periods[7][4]) {
document.getElementById('period').innerHTML = ('7th Passing');
} else if (now >= periods[8][1] && now <= periods[8][2]) {
document.getElementById('period').innerHTML = ('8th');
} else {
document.getElementById('period').innerHTML = ('School is done for the day.');
}
}


//Check Time
function startTime() {
var today = new Date();
now = today.getHours() + '.' + today.getMinutes();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
m = checkTime(m);
s = checkTime(s);

displayPeriod();

var t = setTimeout(startTime, 500);
}

function checkTime(i) {
if (i < 10) {
i = '0' + i
}; // add zero in front of numbers < 10
return i;
}






javascript






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 2:43







Velibor Nikolic

















asked Nov 14 '18 at 2:07









Velibor NikolicVelibor Nikolic

13411




13411













  • Is v ar now = "" a copy/paste error, or is it an error in your actual code?

    – Jack Bashford
    Nov 14 '18 at 2:14











  • copy and paste error

    – Velibor Nikolic
    Nov 14 '18 at 2:17











  • Can you state the exact time where it displays the wrong period?

    – Andreas
    Nov 14 '18 at 2:29











  • var today = new Date(); today.setHours(15,02 , 0);

    – Velibor Nikolic
    Nov 14 '18 at 2:36



















  • Is v ar now = "" a copy/paste error, or is it an error in your actual code?

    – Jack Bashford
    Nov 14 '18 at 2:14











  • copy and paste error

    – Velibor Nikolic
    Nov 14 '18 at 2:17











  • Can you state the exact time where it displays the wrong period?

    – Andreas
    Nov 14 '18 at 2:29











  • var today = new Date(); today.setHours(15,02 , 0);

    – Velibor Nikolic
    Nov 14 '18 at 2:36

















Is v ar now = "" a copy/paste error, or is it an error in your actual code?

– Jack Bashford
Nov 14 '18 at 2:14





Is v ar now = "" a copy/paste error, or is it an error in your actual code?

– Jack Bashford
Nov 14 '18 at 2:14













copy and paste error

– Velibor Nikolic
Nov 14 '18 at 2:17





copy and paste error

– Velibor Nikolic
Nov 14 '18 at 2:17













Can you state the exact time where it displays the wrong period?

– Andreas
Nov 14 '18 at 2:29





Can you state the exact time where it displays the wrong period?

– Andreas
Nov 14 '18 at 2:29













var today = new Date(); today.setHours(15,02 , 0);

– Velibor Nikolic
Nov 14 '18 at 2:36





var today = new Date(); today.setHours(15,02 , 0);

– Velibor Nikolic
Nov 14 '18 at 2:36












3 Answers
3






active

oldest

votes


















0














You can test the function by inputting the current time through startTime() function. You can comment out the setTimeout if you only want to test a specific function. You can check that the output for 15.06 is correct too.






var now = '';

//Set Periods
//Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
var periods = [
['Before School', 5.00, 7.59],
['First', 8.00, 8.49, 8.50, 8.54],
['Second', 8.55, 9.44, 9.45, 9.49],
['Third', 9.50, 10.39, 10.40, 10.44],
['Fourth', 10.45, 11.34, 11.35, 11.39],
['Fifth', 11.40, 12.29, 12.30, 12.34],
['Sixth', 12.35, 13.24, 13.25, 13.29],
['Seventh', 13.30, 14.19, 14.20, 14.24],
['Eighth', 14.25, 15.15]
];

//Display Period
function displayPeriod() {
console.log(now)
if (now >= periods[0][1] && now <= periods[0][2]) {
console.log('School has not started yet');
} else if (now >= periods[1][1] && now <= periods[1][2]) {
console.log('1st');
} else if (now >= periods[1][3] && now <= periods[1][4]) {
console.log('1st Passing');
} else if (now >= periods[2][1] && now <= periods[2][2]) {
console.log('2nd');
} else if (now >= periods[2][3] && now <= periods[2][4]) {
console.log('2nd Passing');
} else if (now > periods[3][1] && now <= periods[3][2]) {
console.log('3rd');
} else if (now >= periods[3][3] && now <= periods[3][4]) {
console.log('3rd Passing');
} else if (now >= periods[4][1] && now <= periods[4][2]) {
console.log('4th');
} else if (now >= periods[4][3] && now <= periods[4][4]) {
console.log('4th Passing');
} else if (now >= periods[5][1] && now <= periods[5][2]) {
console.log('5th');
} else if (now >= periods[5][3] && now <= periods[5][4]) {
console.log('5th Passing');
} else if (now >= periods[6][1] && now <= periods[6][2]) {
console.log('6th');
} else if (now >= periods[6][3] && now <= periods[6][4]) {
console.log('6th Passing');
} else if (now >= periods[7][1] && now <= periods[7][2]) {
console.log('7th');
} else if (now >= periods[7][3] && now <= periods[7][4]) {
console.log('7th Passing');
} else if (now >= periods[8][1] && now <= periods[8][2]) {
console.log('8th');
} else {
console.log('School is done for the day.');
}
}


//Check Time
function startTime(hours, minutes, seconds) {
var today = new Date();
var h = hours != null ? hours : today.getHours(); // use current time if input is empty
var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
m = checkTime(m);
s = checkTime(s);
now = h + '.' + m; // move it here to correspond with input

displayPeriod();

// var t = setTimeout(startTime, 500);
}

function checkTime(i) {
if (i < 10) {
i = '0' + i
}; // add zero in front of numbers < 10
return i;
}

startTime();
startTime(15, 6, 0);








share|improve this answer


























  • This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

    – cybersam
    Nov 14 '18 at 2:45













  • Edited to include the working example

    – Andreas
    Nov 14 '18 at 3:02



















0














You should check time (add zero in front of numbers < 10) before set now variable



function startTime() {
var today = new Date();
var h = checkTime(today.getHours());
var m = checkTime(today.getMinutes());

now = h + '.' + m;
displayPeriod();

var t = setTimeout(startTime, 500);
}





share|improve this answer































    0














    Where your problem is:



    Your startTime function is setting now like this:



    now = today.getHours() + '.' + today.getMinutes();


    It's then calculating zero-padded hour and minute values, but these are not used!



    So, instead of representing nine minutes past eight as "9.08", it is using "9.8".



    How to test your code



    You probably want to learn about unit testing, but that is too big a topic to go over here.



    Some of the prinicpals of writing testable code can be applied here, though.



    First, separate logic from updating UI (or DOM), by refactoring your DisplayPeriod function to return a string value instead of modifying the DOM:



    function displayPeriod() {
    if (now >= periods[0][1] && now <= periods[0][2]) {
    return 'School has not started yet';
    } else if (now >= periods[1][1] && now <= periods[1][2]) {
    return '1st';
    } else if (now >= periods[1][3] && now <= periods[1][4]) {
    return '1st Passing';
    } else if (now >= periods[2][1] && now <= periods[2][2]) {
    return '2nd';

    // (Snip)

    } else {
    return 'School is done for the day.';
    }
    }


    This method would then be used by another method which updates the DOM.



    Second, allow for injection of dependencies. E.g. You have an implicit dependency on the system clock via the Date() constructor. If you refactor StartTime to accept a date, then your test code can pass in whichever date values it needs to test different cases:



    // Note that bugs in this method have not been fixed!
    function startTime(today) {
    now = today.getHours() + '.' + today.getMinutes();
    var h = today.getHours();
    var m = today.getMinutes();
    var s = today.getSeconds();
    m = checkTime(m);
    s = checkTime(s);

    // Commented out, as interfers with testing (should be moved to DOM setting method).
    // var t = setTimeout(startTime, 500);
    }


    Third, use a test framework to run various scenarios and check expected and actual results. Here's a poor man's test case and test execution script:



    function TestCase(time, expectedResult) {
    startTime(time)
    var result = displayPeriod();
    if (result == expectedResult) {
    console.log("Passed for " + time)
    } else {
    console.log("Failed for " + time + "(" + result + ")");
    }
    }

    for (minute = 0; minute < 50; minute++) {
    time = new Date(2018, 11, 14, 8, minute);
    TestCase(time, "1st");
    }





    share|improve this answer

























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292187%2fif-statement-returning-true-for-wrong-statement%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      0














      You can test the function by inputting the current time through startTime() function. You can comment out the setTimeout if you only want to test a specific function. You can check that the output for 15.06 is correct too.






      var now = '';

      //Set Periods
      //Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
      var periods = [
      ['Before School', 5.00, 7.59],
      ['First', 8.00, 8.49, 8.50, 8.54],
      ['Second', 8.55, 9.44, 9.45, 9.49],
      ['Third', 9.50, 10.39, 10.40, 10.44],
      ['Fourth', 10.45, 11.34, 11.35, 11.39],
      ['Fifth', 11.40, 12.29, 12.30, 12.34],
      ['Sixth', 12.35, 13.24, 13.25, 13.29],
      ['Seventh', 13.30, 14.19, 14.20, 14.24],
      ['Eighth', 14.25, 15.15]
      ];

      //Display Period
      function displayPeriod() {
      console.log(now)
      if (now >= periods[0][1] && now <= periods[0][2]) {
      console.log('School has not started yet');
      } else if (now >= periods[1][1] && now <= periods[1][2]) {
      console.log('1st');
      } else if (now >= periods[1][3] && now <= periods[1][4]) {
      console.log('1st Passing');
      } else if (now >= periods[2][1] && now <= periods[2][2]) {
      console.log('2nd');
      } else if (now >= periods[2][3] && now <= periods[2][4]) {
      console.log('2nd Passing');
      } else if (now > periods[3][1] && now <= periods[3][2]) {
      console.log('3rd');
      } else if (now >= periods[3][3] && now <= periods[3][4]) {
      console.log('3rd Passing');
      } else if (now >= periods[4][1] && now <= periods[4][2]) {
      console.log('4th');
      } else if (now >= periods[4][3] && now <= periods[4][4]) {
      console.log('4th Passing');
      } else if (now >= periods[5][1] && now <= periods[5][2]) {
      console.log('5th');
      } else if (now >= periods[5][3] && now <= periods[5][4]) {
      console.log('5th Passing');
      } else if (now >= periods[6][1] && now <= periods[6][2]) {
      console.log('6th');
      } else if (now >= periods[6][3] && now <= periods[6][4]) {
      console.log('6th Passing');
      } else if (now >= periods[7][1] && now <= periods[7][2]) {
      console.log('7th');
      } else if (now >= periods[7][3] && now <= periods[7][4]) {
      console.log('7th Passing');
      } else if (now >= periods[8][1] && now <= periods[8][2]) {
      console.log('8th');
      } else {
      console.log('School is done for the day.');
      }
      }


      //Check Time
      function startTime(hours, minutes, seconds) {
      var today = new Date();
      var h = hours != null ? hours : today.getHours(); // use current time if input is empty
      var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
      var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
      m = checkTime(m);
      s = checkTime(s);
      now = h + '.' + m; // move it here to correspond with input

      displayPeriod();

      // var t = setTimeout(startTime, 500);
      }

      function checkTime(i) {
      if (i < 10) {
      i = '0' + i
      }; // add zero in front of numbers < 10
      return i;
      }

      startTime();
      startTime(15, 6, 0);








      share|improve this answer


























      • This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

        – cybersam
        Nov 14 '18 at 2:45













      • Edited to include the working example

        – Andreas
        Nov 14 '18 at 3:02
















      0














      You can test the function by inputting the current time through startTime() function. You can comment out the setTimeout if you only want to test a specific function. You can check that the output for 15.06 is correct too.






      var now = '';

      //Set Periods
      //Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
      var periods = [
      ['Before School', 5.00, 7.59],
      ['First', 8.00, 8.49, 8.50, 8.54],
      ['Second', 8.55, 9.44, 9.45, 9.49],
      ['Third', 9.50, 10.39, 10.40, 10.44],
      ['Fourth', 10.45, 11.34, 11.35, 11.39],
      ['Fifth', 11.40, 12.29, 12.30, 12.34],
      ['Sixth', 12.35, 13.24, 13.25, 13.29],
      ['Seventh', 13.30, 14.19, 14.20, 14.24],
      ['Eighth', 14.25, 15.15]
      ];

      //Display Period
      function displayPeriod() {
      console.log(now)
      if (now >= periods[0][1] && now <= periods[0][2]) {
      console.log('School has not started yet');
      } else if (now >= periods[1][1] && now <= periods[1][2]) {
      console.log('1st');
      } else if (now >= periods[1][3] && now <= periods[1][4]) {
      console.log('1st Passing');
      } else if (now >= periods[2][1] && now <= periods[2][2]) {
      console.log('2nd');
      } else if (now >= periods[2][3] && now <= periods[2][4]) {
      console.log('2nd Passing');
      } else if (now > periods[3][1] && now <= periods[3][2]) {
      console.log('3rd');
      } else if (now >= periods[3][3] && now <= periods[3][4]) {
      console.log('3rd Passing');
      } else if (now >= periods[4][1] && now <= periods[4][2]) {
      console.log('4th');
      } else if (now >= periods[4][3] && now <= periods[4][4]) {
      console.log('4th Passing');
      } else if (now >= periods[5][1] && now <= periods[5][2]) {
      console.log('5th');
      } else if (now >= periods[5][3] && now <= periods[5][4]) {
      console.log('5th Passing');
      } else if (now >= periods[6][1] && now <= periods[6][2]) {
      console.log('6th');
      } else if (now >= periods[6][3] && now <= periods[6][4]) {
      console.log('6th Passing');
      } else if (now >= periods[7][1] && now <= periods[7][2]) {
      console.log('7th');
      } else if (now >= periods[7][3] && now <= periods[7][4]) {
      console.log('7th Passing');
      } else if (now >= periods[8][1] && now <= periods[8][2]) {
      console.log('8th');
      } else {
      console.log('School is done for the day.');
      }
      }


      //Check Time
      function startTime(hours, minutes, seconds) {
      var today = new Date();
      var h = hours != null ? hours : today.getHours(); // use current time if input is empty
      var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
      var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
      m = checkTime(m);
      s = checkTime(s);
      now = h + '.' + m; // move it here to correspond with input

      displayPeriod();

      // var t = setTimeout(startTime, 500);
      }

      function checkTime(i) {
      if (i < 10) {
      i = '0' + i
      }; // add zero in front of numbers < 10
      return i;
      }

      startTime();
      startTime(15, 6, 0);








      share|improve this answer


























      • This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

        – cybersam
        Nov 14 '18 at 2:45













      • Edited to include the working example

        – Andreas
        Nov 14 '18 at 3:02














      0












      0








      0







      You can test the function by inputting the current time through startTime() function. You can comment out the setTimeout if you only want to test a specific function. You can check that the output for 15.06 is correct too.






      var now = '';

      //Set Periods
      //Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
      var periods = [
      ['Before School', 5.00, 7.59],
      ['First', 8.00, 8.49, 8.50, 8.54],
      ['Second', 8.55, 9.44, 9.45, 9.49],
      ['Third', 9.50, 10.39, 10.40, 10.44],
      ['Fourth', 10.45, 11.34, 11.35, 11.39],
      ['Fifth', 11.40, 12.29, 12.30, 12.34],
      ['Sixth', 12.35, 13.24, 13.25, 13.29],
      ['Seventh', 13.30, 14.19, 14.20, 14.24],
      ['Eighth', 14.25, 15.15]
      ];

      //Display Period
      function displayPeriod() {
      console.log(now)
      if (now >= periods[0][1] && now <= periods[0][2]) {
      console.log('School has not started yet');
      } else if (now >= periods[1][1] && now <= periods[1][2]) {
      console.log('1st');
      } else if (now >= periods[1][3] && now <= periods[1][4]) {
      console.log('1st Passing');
      } else if (now >= periods[2][1] && now <= periods[2][2]) {
      console.log('2nd');
      } else if (now >= periods[2][3] && now <= periods[2][4]) {
      console.log('2nd Passing');
      } else if (now > periods[3][1] && now <= periods[3][2]) {
      console.log('3rd');
      } else if (now >= periods[3][3] && now <= periods[3][4]) {
      console.log('3rd Passing');
      } else if (now >= periods[4][1] && now <= periods[4][2]) {
      console.log('4th');
      } else if (now >= periods[4][3] && now <= periods[4][4]) {
      console.log('4th Passing');
      } else if (now >= periods[5][1] && now <= periods[5][2]) {
      console.log('5th');
      } else if (now >= periods[5][3] && now <= periods[5][4]) {
      console.log('5th Passing');
      } else if (now >= periods[6][1] && now <= periods[6][2]) {
      console.log('6th');
      } else if (now >= periods[6][3] && now <= periods[6][4]) {
      console.log('6th Passing');
      } else if (now >= periods[7][1] && now <= periods[7][2]) {
      console.log('7th');
      } else if (now >= periods[7][3] && now <= periods[7][4]) {
      console.log('7th Passing');
      } else if (now >= periods[8][1] && now <= periods[8][2]) {
      console.log('8th');
      } else {
      console.log('School is done for the day.');
      }
      }


      //Check Time
      function startTime(hours, minutes, seconds) {
      var today = new Date();
      var h = hours != null ? hours : today.getHours(); // use current time if input is empty
      var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
      var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
      m = checkTime(m);
      s = checkTime(s);
      now = h + '.' + m; // move it here to correspond with input

      displayPeriod();

      // var t = setTimeout(startTime, 500);
      }

      function checkTime(i) {
      if (i < 10) {
      i = '0' + i
      }; // add zero in front of numbers < 10
      return i;
      }

      startTime();
      startTime(15, 6, 0);








      share|improve this answer















      You can test the function by inputting the current time through startTime() function. You can comment out the setTimeout if you only want to test a specific function. You can check that the output for 15.06 is correct too.






      var now = '';

      //Set Periods
      //Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
      var periods = [
      ['Before School', 5.00, 7.59],
      ['First', 8.00, 8.49, 8.50, 8.54],
      ['Second', 8.55, 9.44, 9.45, 9.49],
      ['Third', 9.50, 10.39, 10.40, 10.44],
      ['Fourth', 10.45, 11.34, 11.35, 11.39],
      ['Fifth', 11.40, 12.29, 12.30, 12.34],
      ['Sixth', 12.35, 13.24, 13.25, 13.29],
      ['Seventh', 13.30, 14.19, 14.20, 14.24],
      ['Eighth', 14.25, 15.15]
      ];

      //Display Period
      function displayPeriod() {
      console.log(now)
      if (now >= periods[0][1] && now <= periods[0][2]) {
      console.log('School has not started yet');
      } else if (now >= periods[1][1] && now <= periods[1][2]) {
      console.log('1st');
      } else if (now >= periods[1][3] && now <= periods[1][4]) {
      console.log('1st Passing');
      } else if (now >= periods[2][1] && now <= periods[2][2]) {
      console.log('2nd');
      } else if (now >= periods[2][3] && now <= periods[2][4]) {
      console.log('2nd Passing');
      } else if (now > periods[3][1] && now <= periods[3][2]) {
      console.log('3rd');
      } else if (now >= periods[3][3] && now <= periods[3][4]) {
      console.log('3rd Passing');
      } else if (now >= periods[4][1] && now <= periods[4][2]) {
      console.log('4th');
      } else if (now >= periods[4][3] && now <= periods[4][4]) {
      console.log('4th Passing');
      } else if (now >= periods[5][1] && now <= periods[5][2]) {
      console.log('5th');
      } else if (now >= periods[5][3] && now <= periods[5][4]) {
      console.log('5th Passing');
      } else if (now >= periods[6][1] && now <= periods[6][2]) {
      console.log('6th');
      } else if (now >= periods[6][3] && now <= periods[6][4]) {
      console.log('6th Passing');
      } else if (now >= periods[7][1] && now <= periods[7][2]) {
      console.log('7th');
      } else if (now >= periods[7][3] && now <= periods[7][4]) {
      console.log('7th Passing');
      } else if (now >= periods[8][1] && now <= periods[8][2]) {
      console.log('8th');
      } else {
      console.log('School is done for the day.');
      }
      }


      //Check Time
      function startTime(hours, minutes, seconds) {
      var today = new Date();
      var h = hours != null ? hours : today.getHours(); // use current time if input is empty
      var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
      var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
      m = checkTime(m);
      s = checkTime(s);
      now = h + '.' + m; // move it here to correspond with input

      displayPeriod();

      // var t = setTimeout(startTime, 500);
      }

      function checkTime(i) {
      if (i < 10) {
      i = '0' + i
      }; // add zero in front of numbers < 10
      return i;
      }

      startTime();
      startTime(15, 6, 0);








      var now = '';

      //Set Periods
      //Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
      var periods = [
      ['Before School', 5.00, 7.59],
      ['First', 8.00, 8.49, 8.50, 8.54],
      ['Second', 8.55, 9.44, 9.45, 9.49],
      ['Third', 9.50, 10.39, 10.40, 10.44],
      ['Fourth', 10.45, 11.34, 11.35, 11.39],
      ['Fifth', 11.40, 12.29, 12.30, 12.34],
      ['Sixth', 12.35, 13.24, 13.25, 13.29],
      ['Seventh', 13.30, 14.19, 14.20, 14.24],
      ['Eighth', 14.25, 15.15]
      ];

      //Display Period
      function displayPeriod() {
      console.log(now)
      if (now >= periods[0][1] && now <= periods[0][2]) {
      console.log('School has not started yet');
      } else if (now >= periods[1][1] && now <= periods[1][2]) {
      console.log('1st');
      } else if (now >= periods[1][3] && now <= periods[1][4]) {
      console.log('1st Passing');
      } else if (now >= periods[2][1] && now <= periods[2][2]) {
      console.log('2nd');
      } else if (now >= periods[2][3] && now <= periods[2][4]) {
      console.log('2nd Passing');
      } else if (now > periods[3][1] && now <= periods[3][2]) {
      console.log('3rd');
      } else if (now >= periods[3][3] && now <= periods[3][4]) {
      console.log('3rd Passing');
      } else if (now >= periods[4][1] && now <= periods[4][2]) {
      console.log('4th');
      } else if (now >= periods[4][3] && now <= periods[4][4]) {
      console.log('4th Passing');
      } else if (now >= periods[5][1] && now <= periods[5][2]) {
      console.log('5th');
      } else if (now >= periods[5][3] && now <= periods[5][4]) {
      console.log('5th Passing');
      } else if (now >= periods[6][1] && now <= periods[6][2]) {
      console.log('6th');
      } else if (now >= periods[6][3] && now <= periods[6][4]) {
      console.log('6th Passing');
      } else if (now >= periods[7][1] && now <= periods[7][2]) {
      console.log('7th');
      } else if (now >= periods[7][3] && now <= periods[7][4]) {
      console.log('7th Passing');
      } else if (now >= periods[8][1] && now <= periods[8][2]) {
      console.log('8th');
      } else {
      console.log('School is done for the day.');
      }
      }


      //Check Time
      function startTime(hours, minutes, seconds) {
      var today = new Date();
      var h = hours != null ? hours : today.getHours(); // use current time if input is empty
      var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
      var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
      m = checkTime(m);
      s = checkTime(s);
      now = h + '.' + m; // move it here to correspond with input

      displayPeriod();

      // var t = setTimeout(startTime, 500);
      }

      function checkTime(i) {
      if (i < 10) {
      i = '0' + i
      }; // add zero in front of numbers < 10
      return i;
      }

      startTime();
      startTime(15, 6, 0);





      var now = '';

      //Set Periods
      //Slot 1+2 are periods - slots 3+4 are passing times inbetween periods
      var periods = [
      ['Before School', 5.00, 7.59],
      ['First', 8.00, 8.49, 8.50, 8.54],
      ['Second', 8.55, 9.44, 9.45, 9.49],
      ['Third', 9.50, 10.39, 10.40, 10.44],
      ['Fourth', 10.45, 11.34, 11.35, 11.39],
      ['Fifth', 11.40, 12.29, 12.30, 12.34],
      ['Sixth', 12.35, 13.24, 13.25, 13.29],
      ['Seventh', 13.30, 14.19, 14.20, 14.24],
      ['Eighth', 14.25, 15.15]
      ];

      //Display Period
      function displayPeriod() {
      console.log(now)
      if (now >= periods[0][1] && now <= periods[0][2]) {
      console.log('School has not started yet');
      } else if (now >= periods[1][1] && now <= periods[1][2]) {
      console.log('1st');
      } else if (now >= periods[1][3] && now <= periods[1][4]) {
      console.log('1st Passing');
      } else if (now >= periods[2][1] && now <= periods[2][2]) {
      console.log('2nd');
      } else if (now >= periods[2][3] && now <= periods[2][4]) {
      console.log('2nd Passing');
      } else if (now > periods[3][1] && now <= periods[3][2]) {
      console.log('3rd');
      } else if (now >= periods[3][3] && now <= periods[3][4]) {
      console.log('3rd Passing');
      } else if (now >= periods[4][1] && now <= periods[4][2]) {
      console.log('4th');
      } else if (now >= periods[4][3] && now <= periods[4][4]) {
      console.log('4th Passing');
      } else if (now >= periods[5][1] && now <= periods[5][2]) {
      console.log('5th');
      } else if (now >= periods[5][3] && now <= periods[5][4]) {
      console.log('5th Passing');
      } else if (now >= periods[6][1] && now <= periods[6][2]) {
      console.log('6th');
      } else if (now >= periods[6][3] && now <= periods[6][4]) {
      console.log('6th Passing');
      } else if (now >= periods[7][1] && now <= periods[7][2]) {
      console.log('7th');
      } else if (now >= periods[7][3] && now <= periods[7][4]) {
      console.log('7th Passing');
      } else if (now >= periods[8][1] && now <= periods[8][2]) {
      console.log('8th');
      } else {
      console.log('School is done for the day.');
      }
      }


      //Check Time
      function startTime(hours, minutes, seconds) {
      var today = new Date();
      var h = hours != null ? hours : today.getHours(); // use current time if input is empty
      var m = minutes != null ? minutes : today.getMinutes(); // use current time if input is empty
      var s = seconds != null ? seconds : today.getSeconds(); // use current time if input is empty
      m = checkTime(m);
      s = checkTime(s);
      now = h + '.' + m; // move it here to correspond with input

      displayPeriod();

      // var t = setTimeout(startTime, 500);
      }

      function checkTime(i) {
      if (i < 10) {
      i = '0' + i
      }; // add zero in front of numbers < 10
      return i;
      }

      startTime();
      startTime(15, 6, 0);






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Nov 14 '18 at 2:57

























      answered Nov 14 '18 at 2:27









      AndreasAndreas

      1,8632918




      1,8632918













      • This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

        – cybersam
        Nov 14 '18 at 2:45













      • Edited to include the working example

        – Andreas
        Nov 14 '18 at 3:02



















      • This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

        – cybersam
        Nov 14 '18 at 2:45













      • Edited to include the working example

        – Andreas
        Nov 14 '18 at 3:02

















      This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

      – cybersam
      Nov 14 '18 at 2:45







      This seems to be a suggestion for how to debug the issue, and not an actual answer? If so, this should be turned into a condensed comment under the question.

      – cybersam
      Nov 14 '18 at 2:45















      Edited to include the working example

      – Andreas
      Nov 14 '18 at 3:02





      Edited to include the working example

      – Andreas
      Nov 14 '18 at 3:02













      0














      You should check time (add zero in front of numbers < 10) before set now variable



      function startTime() {
      var today = new Date();
      var h = checkTime(today.getHours());
      var m = checkTime(today.getMinutes());

      now = h + '.' + m;
      displayPeriod();

      var t = setTimeout(startTime, 500);
      }





      share|improve this answer




























        0














        You should check time (add zero in front of numbers < 10) before set now variable



        function startTime() {
        var today = new Date();
        var h = checkTime(today.getHours());
        var m = checkTime(today.getMinutes());

        now = h + '.' + m;
        displayPeriod();

        var t = setTimeout(startTime, 500);
        }





        share|improve this answer


























          0












          0








          0







          You should check time (add zero in front of numbers < 10) before set now variable



          function startTime() {
          var today = new Date();
          var h = checkTime(today.getHours());
          var m = checkTime(today.getMinutes());

          now = h + '.' + m;
          displayPeriod();

          var t = setTimeout(startTime, 500);
          }





          share|improve this answer













          You should check time (add zero in front of numbers < 10) before set now variable



          function startTime() {
          var today = new Date();
          var h = checkTime(today.getHours());
          var m = checkTime(today.getMinutes());

          now = h + '.' + m;
          displayPeriod();

          var t = setTimeout(startTime, 500);
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 14 '18 at 3:08









          Tài Dương DanhTài Dương Danh

          1




          1























              0














              Where your problem is:



              Your startTime function is setting now like this:



              now = today.getHours() + '.' + today.getMinutes();


              It's then calculating zero-padded hour and minute values, but these are not used!



              So, instead of representing nine minutes past eight as "9.08", it is using "9.8".



              How to test your code



              You probably want to learn about unit testing, but that is too big a topic to go over here.



              Some of the prinicpals of writing testable code can be applied here, though.



              First, separate logic from updating UI (or DOM), by refactoring your DisplayPeriod function to return a string value instead of modifying the DOM:



              function displayPeriod() {
              if (now >= periods[0][1] && now <= periods[0][2]) {
              return 'School has not started yet';
              } else if (now >= periods[1][1] && now <= periods[1][2]) {
              return '1st';
              } else if (now >= periods[1][3] && now <= periods[1][4]) {
              return '1st Passing';
              } else if (now >= periods[2][1] && now <= periods[2][2]) {
              return '2nd';

              // (Snip)

              } else {
              return 'School is done for the day.';
              }
              }


              This method would then be used by another method which updates the DOM.



              Second, allow for injection of dependencies. E.g. You have an implicit dependency on the system clock via the Date() constructor. If you refactor StartTime to accept a date, then your test code can pass in whichever date values it needs to test different cases:



              // Note that bugs in this method have not been fixed!
              function startTime(today) {
              now = today.getHours() + '.' + today.getMinutes();
              var h = today.getHours();
              var m = today.getMinutes();
              var s = today.getSeconds();
              m = checkTime(m);
              s = checkTime(s);

              // Commented out, as interfers with testing (should be moved to DOM setting method).
              // var t = setTimeout(startTime, 500);
              }


              Third, use a test framework to run various scenarios and check expected and actual results. Here's a poor man's test case and test execution script:



              function TestCase(time, expectedResult) {
              startTime(time)
              var result = displayPeriod();
              if (result == expectedResult) {
              console.log("Passed for " + time)
              } else {
              console.log("Failed for " + time + "(" + result + ")");
              }
              }

              for (minute = 0; minute < 50; minute++) {
              time = new Date(2018, 11, 14, 8, minute);
              TestCase(time, "1st");
              }





              share|improve this answer






























                0














                Where your problem is:



                Your startTime function is setting now like this:



                now = today.getHours() + '.' + today.getMinutes();


                It's then calculating zero-padded hour and minute values, but these are not used!



                So, instead of representing nine minutes past eight as "9.08", it is using "9.8".



                How to test your code



                You probably want to learn about unit testing, but that is too big a topic to go over here.



                Some of the prinicpals of writing testable code can be applied here, though.



                First, separate logic from updating UI (or DOM), by refactoring your DisplayPeriod function to return a string value instead of modifying the DOM:



                function displayPeriod() {
                if (now >= periods[0][1] && now <= periods[0][2]) {
                return 'School has not started yet';
                } else if (now >= periods[1][1] && now <= periods[1][2]) {
                return '1st';
                } else if (now >= periods[1][3] && now <= periods[1][4]) {
                return '1st Passing';
                } else if (now >= periods[2][1] && now <= periods[2][2]) {
                return '2nd';

                // (Snip)

                } else {
                return 'School is done for the day.';
                }
                }


                This method would then be used by another method which updates the DOM.



                Second, allow for injection of dependencies. E.g. You have an implicit dependency on the system clock via the Date() constructor. If you refactor StartTime to accept a date, then your test code can pass in whichever date values it needs to test different cases:



                // Note that bugs in this method have not been fixed!
                function startTime(today) {
                now = today.getHours() + '.' + today.getMinutes();
                var h = today.getHours();
                var m = today.getMinutes();
                var s = today.getSeconds();
                m = checkTime(m);
                s = checkTime(s);

                // Commented out, as interfers with testing (should be moved to DOM setting method).
                // var t = setTimeout(startTime, 500);
                }


                Third, use a test framework to run various scenarios and check expected and actual results. Here's a poor man's test case and test execution script:



                function TestCase(time, expectedResult) {
                startTime(time)
                var result = displayPeriod();
                if (result == expectedResult) {
                console.log("Passed for " + time)
                } else {
                console.log("Failed for " + time + "(" + result + ")");
                }
                }

                for (minute = 0; minute < 50; minute++) {
                time = new Date(2018, 11, 14, 8, minute);
                TestCase(time, "1st");
                }





                share|improve this answer




























                  0












                  0








                  0







                  Where your problem is:



                  Your startTime function is setting now like this:



                  now = today.getHours() + '.' + today.getMinutes();


                  It's then calculating zero-padded hour and minute values, but these are not used!



                  So, instead of representing nine minutes past eight as "9.08", it is using "9.8".



                  How to test your code



                  You probably want to learn about unit testing, but that is too big a topic to go over here.



                  Some of the prinicpals of writing testable code can be applied here, though.



                  First, separate logic from updating UI (or DOM), by refactoring your DisplayPeriod function to return a string value instead of modifying the DOM:



                  function displayPeriod() {
                  if (now >= periods[0][1] && now <= periods[0][2]) {
                  return 'School has not started yet';
                  } else if (now >= periods[1][1] && now <= periods[1][2]) {
                  return '1st';
                  } else if (now >= periods[1][3] && now <= periods[1][4]) {
                  return '1st Passing';
                  } else if (now >= periods[2][1] && now <= periods[2][2]) {
                  return '2nd';

                  // (Snip)

                  } else {
                  return 'School is done for the day.';
                  }
                  }


                  This method would then be used by another method which updates the DOM.



                  Second, allow for injection of dependencies. E.g. You have an implicit dependency on the system clock via the Date() constructor. If you refactor StartTime to accept a date, then your test code can pass in whichever date values it needs to test different cases:



                  // Note that bugs in this method have not been fixed!
                  function startTime(today) {
                  now = today.getHours() + '.' + today.getMinutes();
                  var h = today.getHours();
                  var m = today.getMinutes();
                  var s = today.getSeconds();
                  m = checkTime(m);
                  s = checkTime(s);

                  // Commented out, as interfers with testing (should be moved to DOM setting method).
                  // var t = setTimeout(startTime, 500);
                  }


                  Third, use a test framework to run various scenarios and check expected and actual results. Here's a poor man's test case and test execution script:



                  function TestCase(time, expectedResult) {
                  startTime(time)
                  var result = displayPeriod();
                  if (result == expectedResult) {
                  console.log("Passed for " + time)
                  } else {
                  console.log("Failed for " + time + "(" + result + ")");
                  }
                  }

                  for (minute = 0; minute < 50; minute++) {
                  time = new Date(2018, 11, 14, 8, minute);
                  TestCase(time, "1st");
                  }





                  share|improve this answer















                  Where your problem is:



                  Your startTime function is setting now like this:



                  now = today.getHours() + '.' + today.getMinutes();


                  It's then calculating zero-padded hour and minute values, but these are not used!



                  So, instead of representing nine minutes past eight as "9.08", it is using "9.8".



                  How to test your code



                  You probably want to learn about unit testing, but that is too big a topic to go over here.



                  Some of the prinicpals of writing testable code can be applied here, though.



                  First, separate logic from updating UI (or DOM), by refactoring your DisplayPeriod function to return a string value instead of modifying the DOM:



                  function displayPeriod() {
                  if (now >= periods[0][1] && now <= periods[0][2]) {
                  return 'School has not started yet';
                  } else if (now >= periods[1][1] && now <= periods[1][2]) {
                  return '1st';
                  } else if (now >= periods[1][3] && now <= periods[1][4]) {
                  return '1st Passing';
                  } else if (now >= periods[2][1] && now <= periods[2][2]) {
                  return '2nd';

                  // (Snip)

                  } else {
                  return 'School is done for the day.';
                  }
                  }


                  This method would then be used by another method which updates the DOM.



                  Second, allow for injection of dependencies. E.g. You have an implicit dependency on the system clock via the Date() constructor. If you refactor StartTime to accept a date, then your test code can pass in whichever date values it needs to test different cases:



                  // Note that bugs in this method have not been fixed!
                  function startTime(today) {
                  now = today.getHours() + '.' + today.getMinutes();
                  var h = today.getHours();
                  var m = today.getMinutes();
                  var s = today.getSeconds();
                  m = checkTime(m);
                  s = checkTime(s);

                  // Commented out, as interfers with testing (should be moved to DOM setting method).
                  // var t = setTimeout(startTime, 500);
                  }


                  Third, use a test framework to run various scenarios and check expected and actual results. Here's a poor man's test case and test execution script:



                  function TestCase(time, expectedResult) {
                  startTime(time)
                  var result = displayPeriod();
                  if (result == expectedResult) {
                  console.log("Passed for " + time)
                  } else {
                  console.log("Failed for " + time + "(" + result + ")");
                  }
                  }

                  for (minute = 0; minute < 50; minute++) {
                  time = new Date(2018, 11, 14, 8, minute);
                  TestCase(time, "1st");
                  }






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 14 '18 at 3:31

























                  answered Nov 14 '18 at 3:02









                  ErgwunErgwun

                  8,76944269




                  8,76944269






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292187%2fif-statement-returning-true-for-wrong-statement%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Xamarin.iOS Cant Deploy on Iphone

                      Glorious Revolution

                      Dulmage-Mendelsohn matrix decomposition in Python