[phobos] Split std.datetime in two?

Andrei Alexandrescu andrei at erdani.com
Fri Feb 11 00:56:58 PST 2011


On Feb 11, 2011, at 12:34 AM, Jonathan M Davis <jmdavisProg at gmx.com>  
wrote:

> On Thursday, February 10, 2011 15:00:50 spir wrote:
>> On 02/10/2011 11:02 PM, Andrei Alexandrescu wrote:
>>> On 2/10/11 3:44 PM, Don Clugston wrote:
>>>> (1) There has to be a maximum acceptable source file size.
>>>> Personally I start to feel uncomfortable above 2000 lines, and  
>>>> get an
>>>> uncontrollable urge to split at 5000 lines. That's just me, but I
>>>> suggest all modules should be short. And at 35000 lines,
>>>> std.datetime.length> short.max.
>>>
>>> Agreed.
>>>
>>>> (2) Actually, it seems that most of size actually comes because  
>>>> every
>>>> test is written 'by hand'. If they were done as arrays [parameter1,
>>>> parameter2, result]...
>>>> with a loop, they'd be a lot shorter. (I crunched down the
>>>> std.math.exp tests enormously by doing this). Looking at that  
>>>> module,
>>>> I get the feeling that there's been a lot of cut-and-paste.
>>>> It is a little disconcerting if D really cannot write unittesting  
>>>> code
>>>> concisely. If it really needs to be that big, that part of the
>>>> language needs more work; or we need more helper functions. Or  
>>>> both.
>>>
>>> Agreed. People will look at Phobos for inspiration in terms of  
>>> style and
>>> idioms. If they see they're looking at more than 2x the size of  
>>> the code
>>> for adding tests, probably they'd feel intimidated.
>>>
>>> Peeking at std.datetime's unittests, I confirm they are very  
>>> repetitive -
>>> essentially unrolled loops. I just set the bar somewhat halfway  
>>> and saw
>>> the following. I mean come on!
>>>
>>>
>>> Andrei
>>>
>>> assertThrown!DateTimeException(Date.fromISOString(""));
>>> assertThrown!DateTimeException(Date.fromISOString("990704"));
>>> assertThrown!DateTimeException(Date.fromISOString("0100704"));
>>> assertThrown!DateTimeException(Date.fromISOString("2010070"));
>>> assertThrown!DateTimeException(Date.fromISOString("2010070 "));
>>> [...]
>>
>> I'm interested in this example. I mean how can this happen? What we  
>> would
>> never do in regular (if only because we're lazy, and even copy 
>> +paste sucks
>> for more than a few repetitions), we happily do as soon as the / 
>> context/
>> is somehow different; eg unittests. Just like if unittest were not  
>> code.
>> I've read similar patterns in code by very high-level programmers.  
>> There
>> are even test-case generating tools that produce such code.
>
> Unit tests need to be simple. If they're more complicated, the risk  
> of getting
> them wrong goes up. Also, as Steve points out, determining _what_  
> failed can be
> a royal pain when you try and put something in a loop. Helper  
> functions help
> with that, but it's still a pain.

Not taking one femtosecond to believe that. The hard part is to get  
the unittest to fail. Once it fails, it is all trivial. Insert a  
writeln or use a debugger.

>
> Normal code can afford to be more complex - _especially_ if it's  
> well unit
> tested. But if you make complicated unit tests, then pretty soon you  
> have a
> major burden in making sure that your tests are correct rather than  
> your code.

I am now having a major burden finding the code that does work in a  
sea of chaff.

>
> In the case above, it's testing 5 things, so it's 5 lines. It's  
> simple and
> therefore less error prone. Unit tests really should favor  
> simplicity and
> correctness over reduced line count or increased cleverness.

All code should do that. This is a false choice. Good code must go  
inside unittest and outside unittest.

> The goal of unit
> testing code is inherently different from normal code. _That_ is why  
> unit testing
> code is written differently from normal code.

Not buying it. Unittest code is not exempt from simple good coding  
principles such as avoiding copy and paste.
>

Andrei


More information about the phobos mailing list