public void DisposingWriter() { var countBefore = _cache.Count; using (TextWriter writer = new SpoolWriter()) { writer.Write("sending to the pool"); } var countBetween = _cache.Count; using (TextWriter writer = new SpoolWriter()) { writer.Write("taking and returning to pool"); } // force GC to ensure finalize doesn't push buffers into allocator again GC.Collect(); GC.WaitForPendingFinalizers(); var countAfter = _cache.Count; Assert.AreEqual(0, countBefore); Assert.AreEqual(1, countBetween); Assert.AreEqual(1, countAfter); }
/// <summary> /// Applies previously captured state delta to view, effectively replaying cached fragment /// </summary> /// <param name="memento">memento captured in previous begin/end calls</param> public void DoMemento(CacheMemento memento) { memento.SpoolOutput.WriteTo(_state.Output); foreach (var content in memento.Content) { // create named content if it doesn't exist TextWriter writer; if (_state.Content.TryGetValue(content.Key, out writer) == false) { writer = new SpoolWriter(); _state.Content.Add(content.Key, writer); } // and in any case apply the delta var originator = TextWriterOriginator.Create(writer); originator.DoMemento(content.Value); } // add recorded once deltas that were not yet in this subject's table var newItems = memento.OnceTable.Where(once => _state.OnceTable.ContainsKey(once.Key) == false); foreach (var once in newItems) { _state.OnceTable.Add(once.Key, once.Value); } }
public void AppendingOwnsBuffer() { var countBefore = _cache.Count; TextWriter writer1 = new SpoolWriter(); writer1.Write("hello"); TextWriter writer2 = new SpoolWriter(); writer2.Write("before"); writer2.Write(writer1); writer2.Write("after"); writer1.Write("world"); Assert.AreEqual("helloworld", writer1.ToString()); Assert.AreEqual("beforehelloafter", writer2.ToString()); var _first = typeof(SpoolWriter).GetField("_first", BindingFlags.NonPublic | BindingFlags.Instance); var _readonly = typeof(SpoolPage).GetField("_readonly", BindingFlags.NonPublic | BindingFlags.Instance); var _nonreusable = typeof(SpoolPage).GetField("_nonreusable", BindingFlags.NonPublic | BindingFlags.Instance); var pages1 = (SpoolPage)_first.GetValue(writer1); var pages2 = (SpoolPage)_first.GetValue(writer2); Assert.IsTrue((bool)_readonly.GetValue(pages1)); Assert.IsTrue((bool)_nonreusable.GetValue(pages1)); Assert.IsFalse((bool)_readonly.GetValue(pages1.Next)); Assert.IsFalse((bool)_nonreusable.GetValue(pages1.Next)); Assert.IsNull(pages1.Next.Next); Assert.IsTrue((bool)_readonly.GetValue(pages2)); Assert.IsFalse((bool)_nonreusable.GetValue(pages2)); Assert.IsTrue((bool)_readonly.GetValue(pages2.Next)); Assert.IsTrue((bool)_nonreusable.GetValue(pages2.Next)); Assert.IsFalse((bool)_readonly.GetValue(pages2.Next.Next)); Assert.IsFalse((bool)_nonreusable.GetValue(pages2.Next.Next)); Assert.IsNull(pages2.Next.Next.Next); var countBeforeCollect = _cache.Count; // ReSharper disable RedundantAssignment writer1 = null; writer2 = null; // ReSharper restore RedundantAssignment GC.Collect(); GC.WaitForPendingFinalizers(); var countAfterCollect = _cache.Count; Assert.AreEqual(0, countBefore); Assert.AreEqual(0, countBeforeCollect); Assert.AreEqual(3, countAfterCollect); }
public InlineBlockOutputScope(SparkViewBase sparkView, IResourceRegistry resourceRegistry) { _sparkView = sparkView; _resourceRegistry = resourceRegistry; _previousWriter = sparkView.Output; _blockWriter = new SpoolWriter(); _sparkView.Output = _blockWriter; }
public void ToStringCombinesResults() { TextWriter writer = new SpoolWriter(); writer.Write("hello"); writer.Write("world"); Assert.AreEqual("helloworld", writer.ToString()); }
public void WritingCharacters() { TextWriter writer = new SpoolWriter(); writer.Write('a'); writer.Write(new[] { 'b', 'c', 'd' }); writer.Write(new[] { 'x', 'e', 'f', 'g', 'x' }, 1, 3); Assert.AreEqual("abcdefg", writer.ToString()); }
public override void RenderView(TextWriter writer) { if (this._decorated != null) { SpoolWriter writer2 = new SpoolWriter(); this._decorated.RenderView(writer2); base.Content["view"] = writer2; } base.RenderView(writer); }
public void MultiplePagesCombinedResult() { TextWriter writer = new SpoolWriter(); for (int index = 0; index != 5000; ++index) { writer.Write(index); } Assert.AreEqual(_FiveThousandNumbers, writer.ToString()); }
public void StringReader_should_return_written_data() { var writer = new SpoolWriter(); writer.Write("Hello world"); var reader = new SpoolReader(writer); var content = reader.ReadToEnd(); Assert.That(content, Is.EqualTo("Hello world")); }
public IDisposable OutputScope(string name) { TextWriter writer; if (!_content.TryGetValue(name, out writer)) { writer = new SpoolWriter(); _content.Add(name, writer); } return new OutputScopeImpl(this, writer); }
public override void RenderView(System.IO.TextWriter writer) { if (_decorated != null) { var spooled = new SpoolWriter(); _decorated.RenderView(spooled); Content["view"] = spooled; } base.RenderView(writer); }
public IDisposable OutputScope(string name) { TextWriter writer; if (!Content.TryGetValue(name, out writer)) { writer = new SpoolWriter(); Content.Add(name, writer); } return(new OutputScopeImpl(this, writer)); }
public void Empty_and_null_writes_are_acceptable() { var writer = new SpoolWriter(); writer.Write("a"); writer.Write(""); writer.Write((string)null); writer.Write("b"); var reader = new SpoolReader(writer); var content = reader.ReadToEnd(); Assert.That(content, Is.EqualTo("ab")); }
public void Multiple_writes_are_combined() { var writer = new SpoolWriter(); writer.Write("Hello"); writer.Write(' '); writer.Write("World"); var reader = new SpoolReader(writer); var content = reader.ReadToEnd(); Assert.That(content, Is.EqualTo("Hello World")); }
public void StringWriterToSpoolWriter() { TextWriter writer1 = new StringWriter(); TextWriter writer2 = new SpoolWriter(); for (int index = 0; index != 5000; ++index) { writer1.Write(index); } writer2.Write("before"); writer1.WriteTo(writer2); writer2.Write("after"); Assert.AreEqual("before" + _FiveThousandNumbers + "after", writer2.ToString()); }
public void Render(ViewContext viewContext, TextWriter writer) { // generate view in memory var spoolWriter = new SpoolWriter(); _result.View.Render(viewContext, spoolWriter); // detect itext (or html) format of response XmlParser parser; using (var reader = GetXmlReader(spoolWriter)) { while (reader.Read() && reader.NodeType != XmlNodeType.Element) { // no-op } if (reader.NodeType == XmlNodeType.Element && reader.Name == "itext") { parser = new XmlParser(); } else { parser = new HtmlParser(); } } // Create a document processing context var document = new Document(); document.Open(); // associate output with response stream var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream); pdfWriter.CloseStream = false; // this is as close as we can get to being "success" before writing output // so set the content type now viewContext.HttpContext.Response.ContentType = "application/pdf"; // parse memory through document into output using (var reader = GetXmlReader(spoolWriter)) { parser.Go(document, reader); } pdfWriter.Close(); }
public void Peek_and_read_return_characters_and_advance_appropriately() { var writer = new SpoolWriter(); writer.Write("ab"); writer.Write("c"); var reader = new SpoolReader(writer); Assert.That(reader.Peek(), Is.EqualTo((int)'a')); Assert.That(reader.Read(), Is.EqualTo((int)'a')); Assert.That(reader.Peek(), Is.EqualTo((int)'b')); Assert.That(reader.Read(), Is.EqualTo((int)'b')); Assert.That(reader.Peek(), Is.EqualTo((int)'c')); Assert.That(reader.Read(), Is.EqualTo((int)'c')); Assert.That(reader.Peek(), Is.EqualTo(-1)); Assert.That(reader.Read(), Is.EqualTo(-1)); }
public void BeginMemento() { foreach (KeyValuePair <string, TextWriter> pair in this._state.Content) { TextWriterOriginator originator = TextWriterOriginator.Create(pair.Value); this._priorContent.Add(pair.Key, originator); originator.BeginMemento(); } this._priorOnceTable = this._state.OnceTable.ToDictionary <KeyValuePair <string, string>, string, string>(kv => kv.Key, kv => kv.Value); if (!this._state.Content.Any <KeyValuePair <string, TextWriter> >(kv => object.ReferenceEquals(kv.Value, this._state.Output))) { this._priorOutput = this._state.Output; this._spoolOutput = new SpoolWriter(); this._state.Output = this._spoolOutput; } }
/// <summary> /// Establishes original state for memento capturing purposes /// </summary> public void BeginMemento() { foreach (var content in _state.Content) { var writerOriginator = TextWriterOriginator.Create(content.Value); _priorContent.Add(content.Key, writerOriginator); writerOriginator.BeginMemento(); } _priorOnceTable = _state.OnceTable.ToDictionary(kv => kv.Key, kv => kv.Value); // capture current output also if it's not locked into a named output at the moment // this could be a case in view's output, direct to network, or various macro or content captures if (_state.Content.Any(kv => ReferenceEquals(kv.Value, _state.Output)) == false) { _priorOutput = _state.Output; _spoolOutput = new SpoolWriter(); _state.Output = _spoolOutput; } }
public void DoMemento(CacheMemento memento) { memento.SpoolOutput.WriteTo(this._state.Output); foreach (KeyValuePair <string, TextWriterMemento> pair in memento.Content) { TextWriter writer; if (!this._state.Content.TryGetValue(pair.Key, out writer)) { writer = new SpoolWriter(); this._state.Content.Add(pair.Key, writer); } TextWriterOriginator.Create(writer).DoMemento(pair.Value); } foreach (KeyValuePair <string, string> pair2 in from once in memento.OnceTable where !this._state.OnceTable.ContainsKey(once.Key) select once) { this._state.OnceTable.Add(pair2.Key, pair2.Value); } }
public void Render(ViewContext viewContext, TextWriter writer) { // generate view in memory var spoolWriter = new SpoolWriter(); _result.View.Render(viewContext, spoolWriter); // detect itext (or html) format of response XmlParser parser; using (var reader = GetXmlReader(spoolWriter)) { while (reader.Read() && reader.NodeType != XmlNodeType.Element) { // no-op } if (reader.NodeType == XmlNodeType.Element && reader.Name == "itext") parser = new XmlParser(); else parser = new HtmlParser(); } // Create a document processing context var document = new Document(); document.Open(); // associate output with response stream var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream); pdfWriter.CloseStream = false; // this is as close as we can get to being "success" before writing output // so set the content type now viewContext.HttpContext.Response.ContentType = "application/pdf"; // parse memory through document into output using (var reader = GetXmlReader(spoolWriter)) { parser.Go(document, reader); } pdfWriter.Close(); }
public void SpoolWriterOriginatorBuildsMementoWithChanges() { var writer = new SpoolWriter(); var originator = TextWriterOriginator.Create(writer); writer.Write("Alpha"); originator.BeginMemento(); writer.Write("B"); writer.Write("e"); writer.Write("t"); writer.Write("a"); var memento = originator.EndMemento(); writer.Write("Gamma"); var writer2 = new SpoolWriter(); writer2.Write("Delta"); TextWriterOriginator.Create(writer2).DoMemento(memento); writer2.Write("Epsilon"); Assert.That(writer.ToString(), Is.EqualTo("AlphaBetaGamma")); Assert.That(writer2.ToString(), Is.EqualTo("DeltaBetaEpsilon")); }
public void EncodingShouldBeUtf8ByDefault() { var writer = new SpoolWriter(); Assert.AreEqual(65001, writer.Encoding.CodePage); }
public SpoolWriterOriginator(SpoolWriter writer) { _writer = writer; }