From 18d198f6b67633b8af1c6031a751a4d46d4c6d5b Mon Sep 17 00:00:00 2001 From: mrange Date: Thu, 3 May 2018 13:51:47 +0200 Subject: [PATCH] Node.Text optimization Reuses existing TextNode if available. --- Ooui/Node.cs | 8 ++++++++ Tests/NodeTests.cs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/Ooui/Node.cs b/Ooui/Node.cs index 4d9ad8c..d1d8960 100644 --- a/Ooui/Node.cs +++ b/Ooui/Node.cs @@ -35,6 +35,14 @@ namespace Ooui return sb.ToString (); } set { + if (Children.Count == 1) { + var textNode = Children[0] as TextNode; + if (textNode != null) { + textNode.Text = value; + return; + } + } + ReplaceAll (new TextNode (value ?? "")); } } diff --git a/Tests/NodeTests.cs b/Tests/NodeTests.cs index 20a480a..6050bed 100644 --- a/Tests/NodeTests.cs +++ b/Tests/NodeTests.cs @@ -1,4 +1,5 @@ using System; +using System.Text; #if NUNIT using NUnit.Framework; @@ -68,5 +69,48 @@ namespace Tests p.Receive (Message.Event (b.Id, "change", "please work")); Assert.AreEqual ("please work", b.Value); } + + [TestMethod] + public void Text () + { + var div = new Div (); + + // Log tracks all messages sent due to updates + var log = new StringBuilder (); + log.AppendLine (); + void Parent_MessageSent (Message obj) + { + log.AppendLine (obj.ToString ()); + } + div.MessageSent += Parent_MessageSent; + + var divId = div.Id; + + log.AppendLine ("#1 - Inserts new text node"); + div.Text = "Hello"; + + Assert.AreEqual (1, div.Children.Count); + var text = div.Children[0]; + var textId = text.Id; + + Assert.AreEqual ("Hello", div.Text); + Assert.AreEqual ("Hello", text.Text); + + log.AppendLine ("#2 - Sets text node text to There"); + div.Text = "There"; + Assert.AreEqual ("There", div.Text); + Assert.AreEqual ("There", text.Text); + + var expected = string.Format(@" +#1 - Inserts new text node +{{""m"":""call"",""id"":""{0}"",""k"":""insertBefore"",""v"":[""{1}"",null]}} +#2 - Sets text node text to There +{{""m"":""set"",""id"":""{1}"",""k"":""data"",""v"":""There""}} +", divId, textId).Replace ("\r\n", "\n"); + + var actual = log.ToString ().Replace ("\r\n", "\n"); + Assert.AreEqual (expected, actual); + } + } }