Add a simple Hello library to demonstrate testing.
Add a crappy date/time CGI program to test against.
Add a patched version of Test::Time 0.04.

Makes it behave locally and adds gm/localtime.

I'll push it upstream.
Add Mouse
Vital pony software from CPAN.  DCANTRELL/Acme-Pony-1.1.2.tar.gz
Make the clock.cgi page a little more... interesting.
A basic compile test.
First try at testing using ok().

Fails.  Illustrates the need for diagnostics.
Rewrite using is().

Fails.  Shows diagnostic output.
Yay, now it works
Make hello() take arguments.

Test fails, protecting us from breaking backwards compat.  "Regression testing"
Unit tests become regression tests.

Hey, no warning!  We forgot to turn on strict & warnings.
Add Test::FailWarnings to turn uncaught warnings into failures.

Warnings (and anything to STDERR) are normally ignored by the test.

Warnings should either be expected (covered later) or turned into failures.
* One broken window rule
* Fills logs
* Hard to see when a "real" warning happens in the fog of "expected" warnings
* New devs need to be taught which warnings are "real" and which are "expected"
Add in some defaults to restore old behavior.

Fail!  We got the casing wrong.

Regression tests mean you get small details right.  Small details which you might
have forgotten about, or never knew.
And finally passing.
Test we can pass in arguments.

Pass.  Indent the function calls so they line up.
Add a Makefile for test and test coverage
Test that selections of defaults work.

Pass.  Trying each code path.
Good time to show off Devel::Cover.
Switch to basic data driven testing.

Now more tests can easily be added, all of the same form.
What about Unicode?

Always a fun thing to throw at a program.
What about undef and no arguments at all?

Popular choices to see how they behave.