The code below works as is with memory mapped files' casted opSlice's.

However, I can't figure out how to test it with simple arrays.
Its unittest fails.

Question:
How to implement the function correctly?
Otherwise what is the correct way to test it?

Thank you.

Code:
----------------
Range2 caesarCipher(Range1, Range2)(Range1 input, Range2 output, int shift)
        if (isInputRange!Range1 && isOutputRange!(Range2, ubyte))
{
        auto rotAb = lowercase.dtext.dup; // rotated alphabet

shift %= lowercase.length.to!int; // bring the shift within the length of the alphabet

        if (shift < 0)
                bringToFront(rotAb[0 .. $ + shift], rotAb[$ + shift .. $]);
        else
                bringToFront(rotAb[0 .. shift], rotAb[shift .. $]);

        foreach (i, ref o; output)
        {
                const char c = input[i];

                if (isAlpha(c))
                        if (isUpper(c))
                                o = 
toUpper(rotAb[lowercase.countUntil(toLower(c))]).to!ubyte;
                        else
                                o = rotAb[lowercase.countUntil(c)].to!ubyte;
                else
                        o = c;
        }

        return output;
}

unittest
{
        ubyte[] uba;

assert(caesarCipher("Exxego ex srgi!", uba, -56).to!string == "Attack at once!");
}

Reply via email to