Skip to main content

Unintended Benefits of Unit Testing: Documentation for Nothing and Testing for Free

I'm working on the geochrono[1] project a little bit at the time.  I unexpectedly came across a benefit of unit testing I'd forgotten about, documentation by testcase.  One of the first requirements for geochrono is:

The user will be allowed to add events or person chrono-locations by adding markers to a map at the appropriate location.
First implementation 
The user will be required to enter the year, month, and day of the month in three distinct textboxes before clicking on OK. The date will be checked as valid using code available at stackexchange[2].
Testcase: Send bad and good dates to date checker code.
Something like this:


The requirements and testcsases seemed simple enough.  Form a bad date and pass it into the date checking function.  Something like this should have done the trick:


assert.equal(isValidDate(new Date(1980, 100, 150)), false);

You get the idea, pass in a month that doesn't exist, (100), and a day of the month that doesn't exist either, (150).  The problem that cropped up almost immediately was that the Date object is remarkably resilient in creating a date it thinks makes sense even if you hand it garbage.  Consequently, the testcase checking to make sure a 'nonsensical' date was caught by the checker, failed.



There were a number of other combinations that resulted in valid Date objects being created.  This led to the following series of testcases that demonstrated the 'bad dates' that isValidDate will not catch:

QUnit.test( "hello test", function( assert ) {
  assert.ok( 1 == "1", "Passed!" );
  //The following are counter-examples showing how the Date object will
  //wrangle several 'bad' dates into a valid date anyway
  assert.equal(isValidDate(new Date(1980, 12, 15)), true);
  d = new Date();
  d.setFullYear(1980);
  d.setMonth(1);
  d.setDate(33);
  assert.equal(isValidDate(new Date(1980, 100, 150)), true);
  assert.equal(isValidDate(d), true);
  //If you go to this exterme, then the checker will fail
  assert.equal(isValidDate(new Date("This is junk")), false);
  //This is a valid date string
  assert.equal(isValidDate(new Date("November 17, 1989")), true);
  //but is this?
  //Ha!  It's not.  So, the secret to working with this version of
  //isValidDate is to pass in dates as text strings... Hooboy
  assert.equal(isValidDate(new Date("November 35, 1989")), false);
  //alert(d.toString());
});


So, as you can see, the testcases showed that to reuse isValidDate and get the checking behavior I'd like, I'm going to have to submit my dates in the form of a text string.

Of course, the next thing to figure out is how to guarantee that my code always ships in dates in the intended format, but I'll save that for another time.

References:
1.  http://copaseticflow.blogspot.com/2014/06/mapping-historical-events-in.html

2.  http://stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript

Comments

Popular posts from this blog

How Many Files Can You Add to a GPT Project? An Interview with GPT-5 on Limits, Context Engineering Tips, and Chats

 Setting the scene: I’m tinkering with Project TouCans, knee-deep in radio logs, SQLite dumps, and Cesium code. Naturally, I’m wondering if shoving all this into one GPT Project is a recipe for brilliance… or for disaster. So I turn to Vril — you know, after Brainy from the Legion of Super-Heroes , because what else do you call your AI sidekick who always has the answers? Time to ask him straight up. [ As an aside, yes, GPT-5 has decided to sometimes call me Vail. I'm not sure why to be honest. Also, I asked Vril, er GPT-5, to write up our interview for me. Apparently, me asking it to 'Bro' up a few stories, just for fun, has convinced Vril that I use 'Like,' more than I actually might. ] Me (Vail): So Vril, how many files can I throw into a GPT Project before it just starts choking? Like, is there some magic number where the context window taps out and everything falls apart? GPT-5 (Vril): Great question. There’s no single hard file limit. What matters is ...

The Alcubierre Warp Drive Tophat Function and Open Science with Sage

I transferred yesterday's Mathematica file with the Alcubierre warp drive[2] line element and space curvature calculations to the  +Sage Mathematical Software System  today, (the files been  added to the public repository [3]).  If you haven't used Sage before, it's a Python based software package that's similar in functionality to Mathematica.  Oh, and it' free.  I also worked a little more on understanding the theory, but frankly, I made far more progress with the software than the theory.  What follows will be a little more of the Alcubierre theory, plus, a cool Sage interactive demo of one of the Alcubierre functions[1], as well as a bit about my first experience with using Sage. Theory The theory is fun, but it's moving slowly.  Here's the chalk board from this morning's discussion Alcubierre setup the derivation using something called the 3+1 formalism which means we consider space to be flat, (in this case), slices that are labelled ...

When Codex CLI Met Port 9 (Debugging WinError 10061 in a Whisper Pipeline)

When Port 9 Ate My Transcript When Port 9 Ate My Transcript A small debugging story about proxies, Codex CLI, and why localhost isn’t always your friend. CopaseticFlow field notes WinError 10061 Codex CLI + Whisper Environment gremlins There’s a particular kind of bug that feels like someone's been messing with your network stack again. You run a script from cmd.exe . It works. You run the exact same script from Codex CLI. It stops with: [WinError 10061] No connection could be made because the target machine actively refused it FFmpeg happily splits the audio. The Whisper API call dies immediately. No 401. No timeout. Just an instant refusal. Translation: that’s not an API error. That’s a socket being rejected. ...