OK, I have now added (and pushed to the repo) a unit testing framework in the tests subdirectory. It is mostly compatible with the unit testing framework of Racket. You can execute it with:
cd tests ./run-unit-tests.scm
The unit tests are in the unit-tests directory. I took your trigtests.scm file and chopped it up into smaller unit tests in the unit-tests/03-number directory. What I notice is that the functions are not tested to the same level of detail:
% wc tests/unit-tests/03-number/* 26 96 606 tests/unit-tests/03-number/#.scm 14 44 338 tests/unit-tests/03-number/acos.scm 11 29 212 tests/unit-tests/03-number/acosh.scm 18 54 415 tests/unit-tests/03-number/asin.scm 18 54 432 tests/unit-tests/03-number/asinh.scm 18 54 418 tests/unit-tests/03-number/atan.scm 18 54 429 tests/unit-tests/03-number/atanh.scm 5 10 67 tests/unit-tests/03-number/cos.scm 5 10 68 tests/unit-tests/03-number/cosh.scm 11 26 219 tests/unit-tests/03-number/log.scm 9 20 143 tests/unit-tests/03-number/sin.scm 9 20 145 tests/unit-tests/03-number/sinh.scm 13 35 232 tests/unit-tests/03-number/sqrt.scm 9 20 143 tests/unit-tests/03-number/tan.scm 9 20 145 tests/unit-tests/03-number/tanh.scm 193 546 4012 total
For example cos and cosh have a single test for the special value 0, whereas there are 8 tests for asin. That is not very thorough testing.
Moreover, it is important to check that the primitive functions raise exceptions correctly. To give you an idea I have added unit tests for fx+ and fl+. Here's the unit test for fx+:
(check-eqv? (fx+ 11 33) 44) (check-eqv? (fx+ 11 -11) 0) (check-eqv? (fx+ 11 -33) -22) (check-eqv? (fx+ -11 33) 22)
(check-eqv? (fx+) 0) (check-eqv? (fx+ 11) 11) (check-eqv? (fx+ 11 22) 33) (check-eqv? (fx+ 11 22 33) 66) (check-eqv? (fx+ 11 22 33 44) 110)
(check-exn type-exception? (lambda () (fx+ 1/2))) (check-exn type-exception? (lambda () (fx+ 1/2 9))) (check-exn type-exception? (lambda () (fx+ 9 1/2))) (check-exn type-exception? (lambda () (fx+ 1/2 3 9))) (check-exn type-exception? (lambda () (fx+ 3 1/2 9))) (check-exn type-exception? (lambda () (fx+ 3 9 1/2)))
(check-exn fixnum-overflow-exception? (lambda () (fx+ ##max-fixnum 1))) (check-exn fixnum-overflow-exception? (lambda () (fx+ ##min-fixnum -1)))
Do you think you could expand your unit tests to cover more cases?
Marc
On Dec 10, 2013, at 4:10 PM, Bradley Lucier lucier@math.purdue.edu wrote:
On 12/10/2013 12:10 PM, Marc Feeley wrote:
On Dec 10, 2013, at 11:45 AM, Bradley Lucier lucier@math.purdue.edu wrote:
Thanks for the comments.
On 12/10/2013 09:38 AM, Marc Feeley wrote: What is missing for this patch is a bunch of unit tests. Each of the new inlined primitives should be tested for precision (after all, that is why they were added, so unit tests should verify this). Later. I promise. :-)
Not good enough! If I don't take a hard line on this one, things will slip. But I can help you!
From now on, patches for new functionality will have to come with appropriate unit tests. Unit tests for existing features will have to be added too.
Oh great and powerful Oz, I bring you the broom of the Wicked Witch of the East ... No, no, that can't be right, let's see ...
I offer you 63 unit tests (including all branch cuts and special values) in supplication that you might accept my good patch.
Brad <trigtests.scm>