I'm not a huge fan of these arbitrary breaks inside code. The 80 column length rule is for DDoc. This style makes it hard to read. This is *much* clearer to me (IMO), and more compact to boot (locality usually helps clarity)

```D
unittest
{
    debug(string) printf("string.indexOf(startIdx).unittest\n");

    foreach (S; TypeTuple!(string, wstring, dstring))
    {
        assert(indexOf(cast(S)null,  cast(dchar)'a', 1) == -1);
        assert(indexOf(to!S("def"),  cast(dchar)'a', 1) == -1);
        assert(indexOf(to!S("abba"), cast(dchar)'a', 1) ==  3);
        assert(indexOf(to!S("def"),  cast(dchar)'f', 1) ==  2);

        assert((to!S("def")).indexOf(cast(dchar)'a',  1, CaseSensitive.no) == -1);
        assert(indexOf(to!S("def"),  cast(dchar)'a',  1, CaseSensitive.no) == -1);
        assert(indexOf(to!S("def"),  cast(dchar)'a', 12, CaseSensitive.no) == -1);
        assert(indexOf(to!S("AbbA"), cast(dchar)'a',  2, CaseSensitive.no) ==  3);
        assert(indexOf(to!S("def"),  cast(dchar)'F',  2, CaseSensitive.no) ==  2);

        S sPlts = "Mars: the fourth Rock (Planet) from the Sun.";
        assert(indexOf("def", cast(char)'f',  cast(uint)2, CaseSensitive.no) ==  2);
        assert(indexOf(sPlts, cast(char)'P',           12, CaseSensitive.no) == 23);
        assert(indexOf(sPlts, cast(char)'R', cast(ulong)1, CaseSensitive.no) ==  2);
    }

    foreach(cs; EnumMembers!CaseSensitive)
    {
        assert(indexOf("hello\U00010143\u0100\U00010143"c, '\u0100', 2, cs) == 9);
        assert(indexOf("hello\U00010143\u0100\U00010143"w, '\u0100', 3, cs) == 7);
        assert(indexOf("hello\U00010143\u0100\U00010143"d, '\u0100', 6, cs) == 6);
    }
}
```
You don't have to be as OCD as me with alignment, the goal is to have a clear picture of the test quickly. Having each test on two lines does not make it clear.