public void TestPiping() { var shell = new Shell(o => o.ThrowOnError()); var kinds = Enum.GetValues(typeof(Kind)).Cast<Kind>(); foreach (var inKind in kinds) { foreach (var outKind in kinds.Where(k => k != Kind.String)) { dynamic input = this.CreateSinkOrSource(inKind, isOut: false); dynamic output = this.CreateSinkOrSource(outKind, isOut: true); var command = shell.Run("SampleCommand", "echo"); var tasks = new List<Task>(); if (input is TextReader) { tasks.Add(command.StandardInput.PipeFromAsync((TextReader)input)); } else { command = command < input; } if (output is TextWriter) { tasks.Add(command.StandardOutput.PipeToAsync((TextWriter)output)); } else { command = command > output; } tasks.Add(command.Task); Task.WaitAll(tasks.ToArray()); string result = this.Read(outKind, output); // MA: the output changes slightly if we are inputting as lines (adds a newline) and not outputting as lines result.ShouldEqual(Content + (inKind == Kind.Lines && outKind != Kind.Lines ? Environment.NewLine : string.Empty), inKind + " => " + outKind); } } }