From 35d89f8ab11a495ade7d25719e367b903127a4fa Mon Sep 17 00:00:00 2001 From: blowfish Date: Tue, 19 Sep 2017 21:10:40 -0700 Subject: [PATCH] Extract PrettyPrint --- .../Extensions/ConfigNodeExtensions.cs | 42 ++++++ ModuleManager/MMPatchLoader.cs | 56 +------- .../Extensions/ConfigNodeExtensionsTest.cs | 132 ++++++++++++++++++ 3 files changed, 175 insertions(+), 55 deletions(-) diff --git a/ModuleManager/Extensions/ConfigNodeExtensions.cs b/ModuleManager/Extensions/ConfigNodeExtensions.cs index 5174b356..55d900f0 100644 --- a/ModuleManager/Extensions/ConfigNodeExtensions.cs +++ b/ModuleManager/Extensions/ConfigNodeExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Text; namespace ModuleManager.Extensions { @@ -26,5 +27,46 @@ public static ConfigNode DeepCopy(this ConfigNode from) } return to; } + + public static void PrettyPrint(this ConfigNode node, ref StringBuilder sb, string indent) + { + if (sb == null) throw new ArgumentNullException(nameof(sb)); + if (indent == null) indent = string.Empty; + if (node == null) + { + sb.Append(indent + ""); + return; + } + sb.AppendFormat("{0}{1}\n{2}{{\n", indent, node.name ?? "", indent); + string newindent = indent + " "; + if (node.values == null) + { + sb.AppendFormat("{0}\n", newindent); + } + else + { + foreach (ConfigNode.Value value in node.values) + { + if (value == null) + sb.AppendFormat("{0}\n", newindent); + else + sb.AppendFormat("{0}{1} = {2}\n", newindent, value.name ?? "", value.value ?? ""); + } + } + + if (node.nodes == null) + { + sb.AppendFormat("{0}\n", newindent); + } + else + { + foreach (ConfigNode subnode in node.nodes) + { + subnode.PrettyPrint(ref sb, newindent); + } + } + + sb.AppendFormat("{0}}}\n", indent); + } } } diff --git a/ModuleManager/MMPatchLoader.cs b/ModuleManager/MMPatchLoader.cs index 3826161e..fc469574 100644 --- a/ModuleManager/MMPatchLoader.cs +++ b/ModuleManager/MMPatchLoader.cs @@ -2247,7 +2247,7 @@ private string PrettyConfig(UrlDir.UrlConfig config) { if (config.config != null) { - PrettyConfig(config.config, ref sb, " "); + config.config.PrettyPrint(ref sb, " "); } else { @@ -2262,60 +2262,6 @@ private string PrettyConfig(UrlDir.UrlConfig config) return sb.ToString(); } - private void PrettyConfig(ConfigNode node, ref StringBuilder sb, string indent) - { - sb.AppendFormat("{0}{1}\n{2}{{\n", indent, node.name ?? "NULL", indent); - string newindent = indent + " "; - if (node.values != null) - { - foreach (ConfigNode.Value value in node.values) - { - if (value != null) - { - try - { - sb.AppendFormat("{0}{1} = {2}\n", newindent, value.name ?? "null", value.value ?? "null"); - } - catch (Exception) - { - logger.Error("value.name.Length=" + value.name.Length); - logger.Error("value.name.IsNullOrEmpty=" + string.IsNullOrEmpty(value.name)); - logger.Error("n " + value.name); - logger.Error("v " + value.value); - throw; - } - } - else - { - sb.AppendFormat("{0} Null value\n", newindent); - } - } - } - else - { - sb.AppendFormat("{0} Null values\n", newindent); - } - if (node.nodes != null) - { - foreach (ConfigNode subnode in node.nodes) - { - if (subnode != null) - { - PrettyConfig(subnode, ref sb, newindent); - } - else - { - sb.AppendFormat("{0} Null Subnode\n", newindent); - } - } - } - else - { - sb.AppendFormat("{0} Null nodes\n", newindent); - } - sb.AppendFormat("{0}}}\n", indent); - } - //FindConfigNodeIn finds and returns a ConfigNode in src of type nodeType. //If nodeName is not null, it will only find a node of type nodeType with the value name=nodeName. //If nodeTag is not null, it will only find a node of type nodeType with the value name=nodeName and tag=nodeTag. diff --git a/ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs b/ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs index 5587b488..e63e54a2 100644 --- a/ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs +++ b/ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs @@ -1,4 +1,5 @@ using System; +using System.Text; using Xunit; using TestUtils; using ModuleManager.Extensions; @@ -142,5 +143,136 @@ public void TestDeepCopy() Assert.Equal(0, innerNode2.nodes[0].values.Count); Assert.Equal(0, innerNode2.nodes[0].nodes.Count); } + + [Fact] + public void TestPrettyPrint() + { + ConfigNode node = new TestConfigNode("SOME_NODE") + { + { "abc", "def" }, + { "ghi", "jkl" }, + new TestConfigNode("INNER_NODE_1") + { + { "mno", "pqr" }, + new TestConfigNode("INNER_INNER_NODE_1"), + }, + new TestConfigNode("INNER_NODE_2") + { + { "stu", "vwx" }, + new TestConfigNode("INNER_INNER_NODE_2"), + }, + }; + + string expected = @" +XXSOME_NODE +XX{ +XX abc = def +XX ghi = jkl +XX INNER_NODE_1 +XX { +XX mno = pqr +XX INNER_INNER_NODE_1 +XX { +XX } +XX } +XX INNER_NODE_2 +XX { +XX stu = vwx +XX INNER_INNER_NODE_2 +XX { +XX } +XX } +XX} +".TrimStart().Replace("\r", null); + + StringBuilder sb = new StringBuilder(); + node.PrettyPrint(ref sb, "XX"); + + Assert.Equal(expected, sb.ToString()); + } + + [Fact] + public void TestPrettyPrint__NullNode() + { + ConfigNode node = null; + StringBuilder sb = new StringBuilder(); + node.PrettyPrint(ref sb, "XX"); + Assert.Equal("XX", sb.ToString()); + } + + [Fact] + public void TestPrettyPrint__NullStringBuilder() + { + ConfigNode node = new ConfigNode("NODE"); + StringBuilder sb = null; + Assert.Throws(delegate + { + node.PrettyPrint(ref sb, "XX"); + }); + } + + [Fact] + public void TestPrettyPrint__NullIndent() + { + ConfigNode node = new TestConfigNode() + { + { "abc", "def" }, + { "ghi", "jkl" }, + new TestConfigNode("INNER_NODE") + { + { "mno", "pqr" }, + }, + }; + + node.name = null; + + string expected = @" + +{ + abc = def + ghi = jkl + INNER_NODE + { + mno = pqr + } +} +".TrimStart().Replace("\r", null); + + StringBuilder sb = new StringBuilder(); + node.PrettyPrint(ref sb, null); + Assert.Equal(expected, sb.ToString()); + } + + [Fact] + public void TestPrettyPrint__NullName() + { + ConfigNode node = new TestConfigNode() + { + { "abc", "def" }, + { "ghi", "jkl" }, + new TestConfigNode("INNER_NODE") + { + { "mno", "pqr" }, + }, + }; + + node.name = null; + + string expected = @" +XX +XX{ +XX abc = def +XX ghi = jkl +XX INNER_NODE +XX { +XX mno = pqr +XX } +XX} +".TrimStart().Replace("\r", null); + + StringBuilder sb = new StringBuilder(); + node.PrettyPrint(ref sb, "XX"); + Assert.Equal(expected, sb.ToString()); + } } }