[InlineData(65)] // Create many pages before clear public void Clear_ResetsBackingBufferAndIndex(int valuesToWrite) { // Arrange var buffer = new ViewBuffer(new TestViewBufferScope(), "some-name", pageSize: 32); // Act for (var i = 0; i < valuesToWrite; i++) { buffer.AppendHtml("Hello"); } buffer.Clear(); buffer.AppendHtml("world"); // Assert Assert.Equal(1, buffer.Count); var page = buffer[0]; Assert.Equal(1, page.Count); Assert.Equal("world", page.Buffer[0].Value); }
public void MoveTo_ViewBuffer_TakesPage_IfOriginalIsEmpty() { // Arrange var scope = new TestViewBufferScope(); var original = new ViewBuffer(scope, "original", pageSize: 4); var other = new ViewBuffer(scope, "other", pageSize: 4); other.AppendHtml("Hi"); var page = other[0]; // Act other.MoveTo(original); // Assert Assert.Equal(0, other.Count); // Page was taken Assert.Equal(1, original.Count); Assert.Same(page, original[0]); }
public async Task Write_WritesDataTypes_AfterFlush() { // Arrange var expected = new object[] { "True", "3", "18446744073709551615", "Hello world", "3.14", "2.718", "m" }; var buffer = new ViewBuffer(new TestViewBufferScope(), "some-name", pageSize: 4); var writer = new ViewBufferTextWriter(buffer, Encoding.UTF8); // Act await writer.FlushAsync(); writer.Write(true); writer.Write(3); writer.Write(ulong.MaxValue); writer.Write(new TestClass()); writer.Write(3.14); writer.Write(2.718m); writer.Write('m'); // Assert Assert.Equal(expected, GetValues(buffer)); }
public void MoveTo_FlattensAndClears() { // Arrange var buffer = new ViewBuffer(new TestViewBufferScope(), "some-name", pageSize: 4); var nestedItems = new List <object>(); var nested = new HtmlContentBuilder(nestedItems); nested.AppendHtml("Hello"); buffer.AppendHtml(nested); var destinationItems = new List <object>(); var destination = new HtmlContentBuilder(destinationItems); // Act buffer.MoveTo(destination); // Assert Assert.Empty(nestedItems); Assert.Equal(0, buffer.Count); Assert.Equal("Hello", Assert.IsType <HtmlString>(destinationItems[0]).Value); }
public async Task Write_WritesStringValues_ToUnbufferedStream_WhenNotBuffering() { // Arrange var inner = new Mock <TextWriter>(); var buffer = new ViewBuffer(new TestViewBufferScope(), "some-name", pageSize: 4); var writer = new ViewBufferTextWriter(buffer, Encoding.UTF8, new HtmlTestEncoder(), inner.Object); // Act await writer.FlushAsync(); writer.Write("a"); writer.WriteLine("ab"); await writer.WriteAsync("ef"); await writer.WriteLineAsync("gh"); // Assert inner.Verify(v => v.Write("a"), Times.Once()); inner.Verify(v => v.WriteLine("ab"), Times.Once()); inner.Verify(v => v.WriteAsync("ef"), Times.Once()); inner.Verify(v => v.WriteLineAsync("gh"), Times.Once()); }
private void MoveTo(ViewBuffer destination) { for (var i = 0; i < Count; i++) { var page = this[i]; var destinationPage = destination.Count == 0 ? null : destination[destination.Count - 1]; // If the source page is less or equal to than half full, let's copy it's content to the destination // page if possible. var isLessThanHalfFull = 2 * page.Count <= page.Capacity; if (isLessThanHalfFull && destinationPage != null && destinationPage.Capacity - destinationPage.Count >= page.Count) { // We have room, let's copy the items. Array.Copy( sourceArray: page.Buffer, sourceIndex: 0, destinationArray: destinationPage.Buffer, destinationIndex: destinationPage.Count, length: page.Count); destinationPage.Count += page.Count; // Now we can return the source page, and it can be reused in the scope of this request. Array.Clear(page.Buffer, 0, page.Count); _bufferScope.ReturnSegment(page.Buffer); } else { // Otherwise, let's just add the source page to the other buffer. destination.AddPage(page); } } Clear(); }
public async Task Write_WritesStringBuffer() { // Arrange var newLine = Environment.NewLine; var input1 = "Hello"; var input2 = "from"; var input3 = "ASP"; var input4 = ".Net"; var buffer = new ViewBuffer(new TestViewBufferScope(), "some-name", pageSize: 4); var writer = new ViewBufferTextWriter(buffer, Encoding.UTF8); // Act writer.Write(input1); writer.WriteLine(input2); await writer.WriteAsync(input3); await writer.WriteLineAsync(input4); // Assert var actual = GetValues(buffer); Assert.Equal <object>(new[] { input1, input2, newLine, input3, input4, newLine }, actual); }
public void MoveTo_ViewBuffer_CopiesItems_IfCurrentPageHasRoom() { // Arrange var scope = new TestViewBufferScope(); var original = new ViewBuffer(scope, "original", pageSize: 4); var other = new ViewBuffer(scope, "other", pageSize: 4); for (var i = 0; i < 2; i++) { original.AppendHtml($"original-{i}"); } // With two items, this is half full so we try to copy the items. for (var i = 0; i < 2; i++) { other.AppendHtml($"other-{i}"); } var page = other[0]; // Act other.MoveTo(original); // Assert Assert.Equal(0, other.Count); // Other is cleared Assert.Contains(page.Buffer, scope.ReturnedBuffers); // Buffer was returned Assert.Equal(1, original.Count); Assert.Collection( original[0].Buffer, item => Assert.Equal("original-0", item.Value), item => Assert.Equal("original-1", item.Value), item => Assert.Equal("other-0", item.Value), item => Assert.Equal("other-1", item.Value)); }