To get things started, I created an InputRange and a function to test any InputRange. Compiling it:

    dmd inputrange -unittest -main -cov

shows 100% coverage.

-------------
struct InputRange(T : T[])
{
    this(T[] r)
    {
        this.r = r;
    }

    @property bool empty()
    {
        hasData = (r.length != 0);
        return !hasData;
    }

    @property T front()
    {
        assert(hasData);
        return r[0];
    }

    void popFront()
    {
        assert(hasData);
        r = r[1 .. $];
        hasData = false;
    }

  private:
    T[] r;
    bool hasData;
}

void testInputRange(R)(R r, int n)
{
    foreach (i; 0 .. n)
    {
        if (!r.empty)
        {
            if (i & 1)
            {
                auto e = r.front;
                auto e2 = r.front;
                assert(e == e2);
            }
            r.popFront();
        }
    }
}

unittest
{
    string s = "hello";
    auto r = InputRange!string(s);
    r.testInputRange(10);
}
-------------

Reply via email to