Why Ruby?

Nick Sabalausky a at a.a
Mon Dec 13 10:02:44 PST 2010


"Ary Borenszweig" <ary at esperanto.org.ar> wrote in message 
news:ie5ek1$2bn5$1 at digitalmars.com...
> Well, about a year ago I started programming in dynamic languages like 
> python and
> Ruby. I did very little of python and a lot in Ruby. At first I thought 
> "Hm, it
> must be really hard to program without autocompletion, static type 
> verification,
> etc.". Soon I found out I was wrong.
>
> First, in Ruby it's very easy to test the code. And you can do crazy 
> things like
> what I mention in here (
> http://weblogs.manas.com.ar/ary/2010/04/15/quick-way-to-test-many-values-in-ruby/ )
>
> [[1, 1], [4, 2], [9, 3]].each do |input, output|
>  test "sqrt #{input}"
>    assert_equal output, sqrt(input)
>  end
> end
>
> and the good thing is that if it fails for a specific input/output pair it 
> is
> treated as a different test, so you can clearly see which input/output 
> pair
> failed. I can see you can do the same in D with string mixins, probably 
> putting
> all the code between do/end in a string... :-(
>

That's why I refuse to use assert in unittests, and use a non-fatal 
alternative instead. There isn't a chance in hell I'm replacing:

------------------------------------------
unittest
{
    /*
    A few lines
    of setup
    for foo
    */

    assert(foo(/*arg set 1*/) == /*answer 1*/);
    assert(foo(/*arg set 2*/) == /*answer 2*/);
    assert(foo(/*arg set 3*/) == /*answer 3*/);
    assert(foo(/*arg set 4*/) == /*answer 4*/);
    assert(foo(/*arg set 5*/) == /*answer 5*/);

    /*
    A few lines
    of setup
    for bar
    */

    assert(bar(/*arg set 1*/) == /*answer 1*/);
    assert(bar(/*arg set 2*/) == /*answer 2*/);
    assert(bar(/*arg set 3*/) == /*answer 3*/);
    assert(bar(/*arg set 4*/) == /*answer 4*/);
    assert(bar(/*arg set 5*/) == /*answer 5*/);
}
------------------------------------------

...With this god-awful mess, or any equally-bad mixin-based alternative, 
just to get the damn thing to run all my tests:
------------------------------------------
/*
The declarations needed by
foo's unittests here
*/
void setupUnittestFoo()
{
    /*
    A few lines
    of setup
    for foo
    */
}

unittest { setupUnittestFoo() }
unittest { assert(foo(/*arg set 1*/) == /*answer 1*/); }
unittest { assert(foo(/*arg set 2*/) == /*answer 2*/); }
unittest { assert(foo(/*arg set 3*/) == /*answer 3*/); }
unittest { assert(foo(/*arg set 4*/) == /*answer 4*/); }
unittest { assert(foo(/*arg set 5*/) == /*answer 5*/); }

/*
The declarations needed by
bar's unittests here
*/
void setupUnittestBar()
{
    /*
    A few lines
    of setup
    for bar
    */
}

unittest { setupUnittestBar() }
unittest { assert(bar(/*arg set 1*/) == /*answer 1*/); }
unittest { assert(bar(/*arg set 2*/) == /*answer 2*/); }
unittest { assert(bar(/*arg set 3*/) == /*answer 3*/); }
unittest { assert(bar(/*arg set 4*/) == /*answer 4*/); }
unittest { assert(bar(/*arg set 5*/) == /*answer 5*/); }

------------------------------------------





More information about the Digitalmars-d mailing list