Canonical/Idiomatic in memory files

Walter Bright newshound2 at digitalmars.com
Tue May 28 22:33:39 PDT 2013


On 5/28/2013 9:47 PM, Russel Winder wrote:
> Looks like I am out of luck then. :-(

Not at all.

> The context is writing a small program that can be a filter or operate
> on files: actually it is the wc program. So it needs to work with opened
> files and stdin. That is fine (sort of). The issue comes when writing
> unit tests for the code: unit tests should not touch the file system, so
> I need a memory buffer backed std.stdio.File for the tests. A mock file
> in a sense.As noted earlier Go, Python, all JVM languages have such
> things, and it really needs to be part of D. If there really is nothing
> like this, I should add a JIRA issue and see if I can create a pull
> request later in the summer.

Coincidentally, I wrote a wc program a year ago:
-------------------------
import std.stdio, std.file, std.string, std.array, std.algorithm, std.typecons;
import lazysplit;

alias Tuple!(int, "lines", int, "words", int, "chars") Lwc;

void main(string[] args) {
     writeln("   lines   words   bytes file");

     auto total = args[1 .. args.length].wctotal();

     if (args.length > 2)
         writefln("--------------------------------------\n%8s%8s%8s total",
             total[0..3]);
}

auto wctotal(R)(R args) {
     Lwc total;
     foreach (arg; args) {
         auto t = arg.File().byLine(KeepTerminator.yes).wc();

         writefln("%8s%8s%8s %s", t[0..3], arg);

         foreach(i, v; t)
             total[i] += v;
     }
     return total;
}

auto wc(R)(R r) {
     Lwc t;
     foreach (line; r) {
         t.lines += 1;
         t.words += line.lazySplit().count();
         t.chars += line.length;
     }
     return t;
}
--------------------------------------

Just replace "arg.File().byLine(KeepTerminator.yes)" with a string filled with 
your mocked data.


More information about the Digitalmars-d mailing list