public async Task EolCrCrCrLf() { { var(bb, eol) = await MakeBucket("\r\n").ReadUntilEolAsync(BucketEol.AnyEol, 1); Assert.AreEqual(1, bb.Length); Assert.AreEqual(BucketEol.CRSplit, eol); } var r = MakeBucket("a", "t", "\r\r\r\ndo"); var total = ""; var state = new BucketEolState(); while (true) { var(bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|at[CR]|[CR]|[CRLF]|do[None]", total.Replace("\r", "/r/")); }
public async Task EolVariantsFull(BucketEol acceptableEols) { var opts = new[] { "\r", "\n", "\r\n", "\0", " " }; foreach (var c1 in opts) { foreach (var c2 in opts) { foreach (var c3 in opts) { foreach (var c4 in opts) { string tst = $"st{c1}{c2}{c3}{c4}do"; for (int n1 = 1; n1 < tst.Length - 2; n1++) { for (int n2 = n1 + 1; n2 < tst.Length - 1; n2++) { using var r = MakeBucket(tst.Substring(0, n1), tst.Substring(n1, n2 - n1), tst.Substring(n2)); var state = new BucketEolState(); var total = ""; var expected = Escape(tst.Insert(n2, "|").Insert(n1, "|")); while (true) { var(bb, eol) = await r.ReadUntilEolFullAsync(acceptableEols, state); if (bb.IsEof) { break; } var s = bb.ToASCIIString(); total += s; if (s.Length > 2 && 0 != (acceptableEols & BucketEol.LF) && s.LastIndexOf('\n', s.Length - 2) >= 0) { Assert.Fail($"Unexpected LF in test {expected}, result={Escape(total)}"); } if (s.Length > 2 && 0 != (acceptableEols & BucketEol.Zero) && s.LastIndexOf('\0', s.Length - 2) >= 0) { Assert.Fail($"Unexpected Zero in test {expected}, part={Escape(s)}"); } if (s.Length > 3 && 0 != (acceptableEols & BucketEol.CR) && s.LastIndexOf('\r', s.Length - 3) >= 0) { Assert.Fail($"Unexpected CR in test {expected}, part={Escape(s)}"); } } Assert.AreEqual(expected, Escape(total.Insert(n2, "|").Insert(n1, "|"))); } } } } } } }
public async Task EolCrCrCrCr() { var r = MakeBucket("\r\r\r\rdo"); var total = ""; var state = new BucketEolState(); while (true) { var(bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.CR, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|[CR]|[CR]|[CR]|[CR]|do[None]", total.Replace("\r", "/r/")); }
public async Task ReadEolsFull() { var(bb, eol) = await MakeBucket("abc\nabc").ReadUntilEolFullAsync(BucketEol.LF, new BucketEolState()); Assert.AreEqual(4, bb.Length); Assert.AreEqual("abc\n", bb.ToASCIIString()); Assert.AreEqual("abc", bb.ToASCIIString(eol)); Assert.AreEqual(BucketEol.LF, eol); (bb, eol) = await MakeBucket("abc\0abc").ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState()); Assert.AreEqual(4, bb.Length); Assert.AreEqual("abc", bb.ToASCIIString(eol)); Assert.AreEqual(BucketEol.Zero, eol); var b = MakeBucket("a", "b", "c", "\0a", "bc", "d\0a", "b", "c", "\0", "a"); (bb, eol) = await b.ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState()); Assert.AreEqual(4, bb.Length); Assert.AreEqual("abc", bb.ToASCIIString(eol)); Assert.AreEqual(BucketEol.Zero, eol); (bb, eol) = await b.ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState()); Assert.AreEqual(5, bb.Length); Assert.AreEqual("abcd", bb.ToASCIIString(eol)); Assert.AreEqual(BucketEol.Zero, eol); (bb, eol) = await b.ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState()); Assert.AreEqual(4, bb.Length); Assert.AreEqual("abc", bb.ToASCIIString(eol)); Assert.AreEqual(BucketEol.Zero, eol); var r = MakeBucket("a", "b", "c", "\0"); var total = ""; var state = new BucketEolState(); while (true) { (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.Zero, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(); if (eol != BucketEol.None) { total += "!"; } } Assert.AreEqual("abc\0", total.Replace("|", "").Replace("!", "")); Assert.AreEqual("|abc\0!", total); r = MakeBucket("a\r\nb\rcd\r", "\nefg\rhi\r\n", "j\r", "\rk"); total = ""; state = new BucketEolState(); while (true) { (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|a[CRLF]|b[CR]|cd[CRLF]|efg[CR]|hi[CRLF]|j[CR]|[CR]|k[None]", total.Replace("\r", "/r/")); r = MakeBucket("a\r"); total = ""; state = new BucketEolState(); while (true) { (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|a[CR]", total.Replace("\r", "/r/")); r = MakeBucket("H", "T", "T", "P", "/", "1", ".", "1", "\r", "\n", "a"); total = ""; state = new BucketEolState(); while (true) { (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|HTTP/1.1[CRLF]|a[None]", total.Replace("\r", "/r/")); r = MakeBucket("H", "T", "T", "P", "/", "1", ".", "1", "\r", "\n\n\r", "\0a\r", "\r\nc", "\r", "\r\n", "qq\r", "q\r", "\r", "\n"); total = ""; state = new BucketEolState(); while (true) { (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|HTTP/1.1[CRLF]|[LF]|[CR]|\0a[CR]|[CRLF]|c[CR]|[CRLF]|qq[CR]|q[CR]|[CRLF]", total.Replace("\r", "/r/")); r = MakeBucket("H", "T", "T", "P", "/", "1", ".", "1", "\r", "\n\n\r", "\0a\r", "\r\nc", "\r", "\r\n", "qq\r", "q\r", "\r\0\r", "\0"); total = ""; state = new BucketEolState(); while (true) { (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol | BucketEol.Zero, state); if (bb.IsEof) { break; } total += "|" + bb.ToASCIIString(eol) + $"[{eol}]"; } Assert.AreEqual("|HTTP/1.1[CRLF]|[LF]|[CR]|[Zero]|a[CR]|[CRLF]|c[CR]|[CRLF]|qq[CR]|q[CR]|[CR]|[Zero]|[CR]|[Zero]", total.Replace("\r", "/r/")); }