Commit 167998af authored by Marc Gravell's avatar Marc Gravell

more theory

parent 0d87e836
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Text;
using Xunit;
using Xunit.Abstractions;
......@@ -9,47 +10,31 @@ namespace StackExchange.Redis.Tests
public class Parse : TestBase
{
public Parse(ITestOutputHelper output) : base(output) { }
[Theory]
[InlineData("$4\r\nPING\r\n$4\r\nPONG\r\n$4\r\r", 2)]
public void ParseAsSingleChunk(string ascii, int expected)
{
ReadOnlySequence<byte> buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(ascii));
var reader = new BufferReader(buffer);
RawResult result;
int found = 0;
while(!(result = PhysicalConnection.TryParseResult(buffer, ref reader, false, null, false)).IsNull)
{
Writer.WriteLine($"{result} - {result.GetString()}");
found++;
}
Assert.Equal(expected, found);
}
class FragmentedSegment : ReadOnlySequenceSegment<byte>
{
public FragmentedSegment(long runningIndex, ReadOnlyMemory<byte> memory)
public static IEnumerable<object[]> GetTestData()
{
RunningIndex = runningIndex;
Memory = memory;
yield return new object[] { "$4\r\nPING\r\n$4\r\nPONG\r\n", 2 };
yield return new object[] { "$4\r\nPING\r\n$4\r\nPONG\r\n$4\r", 2 };
}
public new FragmentedSegment Next
[Theory]
[MemberData(nameof(GetTestData))]
public void ParseAsSingleChunk(string ascii, int expected)
{
get => (FragmentedSegment)base.Next;
set => base.Next = value;
}
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(ascii));
ProcessMessages(buffer, expected);
}
[Theory]
[InlineData("$4\r\nPING\r\n$4\r\nPONG\r\n$4\r\r", 2)]
public void ParseAsLotsOfChunks(string ascii, int messages)
[MemberData(nameof(GetTestData))]
public void ParseAsLotsOfChunks(string ascii, int expected)
{
var bytes = Encoding.ASCII.GetBytes(ascii);
FragmentedSegment chain = null, tail = null;
for(int i = 0; i < bytes.Length; i++)
FragmentedSegment<byte> chain = null, tail = null;
for (int i = 0; i < bytes.Length; i++)
{
var next = new FragmentedSegment(i, new ReadOnlyMemory<byte>(bytes, i, 1));
if(tail == null)
var next = new FragmentedSegment<byte>(i, new ReadOnlyMemory<byte>(bytes, i, 1));
if (tail == null)
{
chain = next;
}
......@@ -59,11 +44,14 @@ public void ParseAsLotsOfChunks(string ascii, int messages)
}
tail = next;
}
ReadOnlySequence<byte> buffer = new ReadOnlySequence<byte>(chain, 0, tail, 0);
Writer.WriteLine($"chain: {buffer.Length}");
var buffer = new ReadOnlySequence<byte>(chain, 0, tail, 0);
ProcessMessages(buffer, expected);
}
void ProcessMessages(ReadOnlySequence<byte> buffer, int expected)
{
Writer.WriteLine($"chain: {buffer.Length}");
var reader = new BufferReader(buffer);
RawResult result;
int found = 0;
......@@ -72,7 +60,22 @@ public void ParseAsLotsOfChunks(string ascii, int messages)
Writer.WriteLine($"{result} - {result.GetString()}");
found++;
}
Assert.Equal(messages, found);
Assert.Equal(expected, found);
}
class FragmentedSegment<T> : ReadOnlySequenceSegment<T>
{
public FragmentedSegment(long runningIndex, ReadOnlyMemory<T> memory)
{
RunningIndex = runningIndex;
Memory = memory;
}
public new FragmentedSegment<T> Next
{
get => (FragmentedSegment<T>)base.Next;
set => base.Next = value;
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment