using System; using System.Collections.Generic; using System.IO; using System.Linq; using DotnetStandardStreams; namespace DotnetStandardStreamsTests; public class FileTextSourceTests { private string _tempFilename = string.Empty; private void CleanupTempFile() { if (File.Exists(_tempFilename)) File.Delete(_tempFilename); } private void CreateInputFile() { _tempFilename = Path.GetTempFileName(); const string content = "1\r\n2\r\n\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n"; CleanupTempFile(); File.WriteAllText(_tempFilename, content); } private void CreateEmptyInputFile() { _tempFilename = Path.GetTempFileName(); CleanupTempFile(); File.WriteAllText(_tempFilename, string.Empty); } private void WrapFileTest(Action testCode, Action? explicitSourceCreation = null) { explicitSourceCreation ??= CreateInputFile; explicitSourceCreation(); try { ITextSource source = new FileTextSource(_tempFilename); source.Open(); try { testCode(source); } finally { source.Close(); } } finally { CleanupTempFile(); } } [Fact] public void CanReadAllFromFile() { WrapFileTest(static textSource => { List actual = textSource.ReadAll().ToList(); actual.Count.ShouldBe(10); actual.ShouldBe(["1", "2", "", "4", "5", "6", "7", "8", "9", "10"]); }); } [Fact] public void CanReadIndividualLinesFromFile() { WrapFileTest(static textSource => { string s; s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("1"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("2"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe(""); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("4"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("5"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("6"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("7"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("8"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("9"); s = textSource.Read(); textSource.Eof().ShouldBe(false); s.ShouldBe("10"); _ = textSource.Read(); textSource.Eof().ShouldBe(true); }); } [Fact] public void CanWhileLoopThroughFileNormally() { WrapFileTest(static textSource => { int lineCount = 0; _ = textSource.Read(); while (!textSource.Eof()) { lineCount++; _ = textSource.Read(); } lineCount.ShouldBe(10); }); } [Fact] public void CanReadAllThroughFileNormally() { WrapFileTest(static textSource => { List lines = textSource.ReadAll().ToList(); int lineCount = lines.Count; lineCount.ShouldBe(10); lines.ShouldBe(["1", "2", "", "4", "5", "6", "7", "8", "9", "10"]); }); } [Fact] public void CanWhileLoopThroughEmptyFile() { WrapFileTest( static textSource => { int lineCount = 0; _ = textSource.Read(); while (!textSource.Eof()) { lineCount++; _ = textSource.Read(); } lineCount.ShouldBe(0); }, CreateEmptyInputFile); } [Fact] public void CanReadAllThroughEmptyFile() { WrapFileTest(static textSource => { List lines = textSource.ReadAll().ToList(); int lineCount = lines.Count; lineCount.ShouldBe(0); }, CreateEmptyInputFile); } }