
On 08/29/2011 03:58 PM, Brent Yorgey wrote:
No, this is not possible directly. You have several options. As someone else already suggested, one option is to declare p0, p3 in the global scope and then shadow them in any local scopes where you would like them to have different values. Another option might be to do something like this:
[test_volume1, test_volume2] = [ let p1 = (0, 0.5, 0) p2 = (2, 0, 0) in assertEqual "volume is correct" True (vol ~= (-1/3))
, assertEqual "volume is correct" True (vol ~= (1/3))
...
] where p0 = ... p3 = ...
However, this is a bit brittle if you ever want to reorder the tests or insert new tests, since you have to update the list of names and list of test bodies to stay in sync.
Also, am I correct in assuming the above is actually a stripped-down version of the real code? p0, p1, p2... etc. do not actually show up in the tests you have written at all.
Correct, these are trivial cases. There is one expensive function that I would like to avoid recomputing, but no simple examples I could give of it. This is actually the solution that kmc gave me on #haskell, but my home connection has been hurricaned and I haven't been able to reply. I wouldn't mind the list/tuple solution otherwise; but, this is the best I could come up with haddock-wise:
-- | Check the value of c0030 for tetrahedron0 belonging to the cube -- centered on (1,1,1) with a grid constructed from the trilinear -- values. See example one in the paper. test_trilinear_c0030 :: Assertion test_trilinear_c0030 = test_trilinear_c0030'
[test_trilinear_c0030'] = [test_trilinear_c0030''] where g = make_grid 1 trilinear cube = cube_at g 1 1 1 t = tetrahedron0 cube
test_trilinear_c0030'' :: Assertion test_trilinear_c0030'' = assertAlmostEqual "c0030 is correct" (c t 0 0 3 0) (17/8)
It /works/, but gives me that "what the hell is he doing.." feeling when re-reading my own code.