From 40bd65379768f99ec28bffe2691ba43c78c9e9c4 Mon Sep 17 00:00:00 2001 From: Ron Martin Date: Sat, 10 Sep 2022 15:44:24 -0400 Subject: Support converting deprecated inner text with embedded comments Fixes 6847 --- src/wix/WixToolset.Converters/ConversionLab.cs | 91 ++++++ src/wix/WixToolset.Converters/WixConverter.cs | 190 +++++++++---- .../WixToolsetTest.Converters/ConditionFixture.cs | 306 ++++++++++++++++++++- .../UtilExtensionFixture.cs | 69 ++++- 4 files changed, 581 insertions(+), 75 deletions(-) create mode 100644 src/wix/WixToolset.Converters/ConversionLab.cs (limited to 'src') diff --git a/src/wix/WixToolset.Converters/ConversionLab.cs b/src/wix/WixToolset.Converters/ConversionLab.cs new file mode 100644 index 00000000..903071f8 --- /dev/null +++ b/src/wix/WixToolset.Converters/ConversionLab.cs @@ -0,0 +1,91 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Converters +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml.Linq; + + internal class ConversionLab : IDisposable + { + private readonly XElement targetElement; + private readonly XElement parentElement; + private readonly List siblingNodes; + private int index; + + public ConversionLab(XElement targetElement) + { + this.targetElement = targetElement; + this.parentElement = this.targetElement.Parent; + this.siblingNodes = this.parentElement.Nodes().ToList(); + + foreach (var siblingNode in this.siblingNodes) + { + siblingNode.Remove(); + } + + this.index = this.siblingNodes.IndexOf(this.targetElement); + } + + public void RemoveOrphanTextNodes() + { + if (!this.targetElement.HasElements) + { + var childNodes = this.targetElement.Nodes().ToList(); + foreach (var childNode in childNodes) + { + childNode.Remove(); + } + } + } + + public void RemoveTargetElement() + { + if (this.index + 1 < this.siblingNodes.Count + && this.siblingNodes[this.index + 1] is XText trailingText + && String.IsNullOrWhiteSpace(trailingText.Value)) + { + this.siblingNodes.RemoveAt(this.index + 1); + } + this.siblingNodes.RemoveAt(this.index); + if (0 < this.index + && this.siblingNodes[this.index - 1] is XText leadingText + && String.IsNullOrWhiteSpace(leadingText.Value)) + { + this.siblingNodes.RemoveAt(this.index - 1); + } + } + + public void ReplaceTargetElement(XElement replacement) + { + this.siblingNodes[this.index] = replacement; + } + + public void AddCommentsAsSiblings(List comments) + { + if (0 < this.index + && this.siblingNodes[this.index - 1] is XText leadingText + && String.IsNullOrWhiteSpace(leadingText.Value)) + { + var leadingWhitespace = leadingText.Value; + --this.index; + var newComments = new List(); + foreach(var comment in comments) + { + newComments.Add(new XText(leadingWhitespace)); + newComments.Add(comment); + } + comments = newComments; + } + + this.siblingNodes.InsertRange(this.index, comments); + this.index = this.siblingNodes.IndexOf(this.targetElement); + } + + public void Dispose() + { + this.parentElement.Add(this.siblingNodes); + } + } +} diff --git a/src/wix/WixToolset.Converters/WixConverter.cs b/src/wix/WixToolset.Converters/WixConverter.cs index 9b0bebc1..de81c876 100644 --- a/src/wix/WixToolset.Converters/WixConverter.cs +++ b/src/wix/WixToolset.Converters/WixConverter.cs @@ -525,7 +525,7 @@ namespace WixToolset.Converters { if (!WixConverter.LeadingWhitespaceValid(this.IndentationAmount, level, whitespace.Value)) { - var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect."; + var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this comment is incorrect."; if (this.OnInformation(testType, node, message)) { @@ -538,7 +538,7 @@ namespace WixToolset.Converters { if (!String.IsNullOrEmpty(whitespace.Value) && whitespace.NodeType != XmlNodeType.CDATA) { - var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect."; + var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this comment is incorrect."; if (this.OnInformation(testType, node, message)) { @@ -924,23 +924,29 @@ namespace WixToolset.Converters private void ConvertControlElement(XElement element) { - var remove = new List(); - - foreach (var xCondition in element.Elements(ConditionElementName)) + using (var lab = new ConversionLab(element)) { - var action = UppercaseFirstChar(xCondition.Attribute("Action")?.Value); - if (!String.IsNullOrEmpty(action) && - TryGetInnerText(xCondition, out var text) && - this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}Condition' attribute instead.", xCondition.Name.LocalName, action)) + var xConditions = element.Elements(ConditionElementName).ToList(); + var comments = new List(); + + foreach (var xCondition in xConditions) { - element.Add(new XAttribute(action + "Condition", text)); - remove.Add(xCondition); + var action = UppercaseFirstChar(xCondition.Attribute("Action")?.Value); + if (!String.IsNullOrEmpty(action) && + TryGetInnerText(xCondition, out var text, out comments, comments) && + this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}Condition' attribute instead.", xCondition.Name.LocalName, action)) + { + element.Add(new XAttribute(action + "Condition", text)); + } } - } - for (var i = remove.Count - 1; i >= 0; i--) - { - remove[i].Remove(); + foreach (var xCondition in xConditions) + { + xCondition.Remove(); + } + + lab.RemoveOrphanTextNodes(); + lab.AddCommentsAsSiblings(comments); } } @@ -958,11 +964,16 @@ namespace WixToolset.Converters var xCondition = element.Element(ConditionElementName); if (xCondition != null) { - if (TryGetInnerText(xCondition, out var text) && + if (TryGetInnerText(xCondition, out var text, out var comments) && this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName)) { - element.Add(new XAttribute("Condition", text)); - xCondition.Remove(); + using (var lab = new ConversionLab(element)) + { + xCondition.Remove(); + element.Add(new XAttribute("Condition", text)); + lab.RemoveOrphanTextNodes(); + lab.AddCommentsAsSiblings(comments); + } } } @@ -1057,14 +1068,16 @@ namespace WixToolset.Converters { var level = xCondition.Attribute("Level")?.Value; if (!String.IsNullOrEmpty(level) && - TryGetInnerText(xCondition, out var text) && + TryGetInnerText(xCondition, out var text, out var comments) && this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Level' element instead.", xCondition.Name.LocalName)) { - xCondition.AddAfterSelf(new XElement(LevelElementName, - new XAttribute("Value", level), - new XAttribute("Condition", text) - )); - xCondition.Remove(); + using (var lab = new ConversionLab(xCondition)) + { + lab.ReplaceTargetElement(new XElement(LevelElementName, + new XAttribute("Value", level), + new XAttribute("Condition", text))); + lab.AddCommentsAsSiblings(comments); + } } } } @@ -1097,28 +1110,25 @@ namespace WixToolset.Converters private void ConvertFragmentElement(XElement element) { - var remove = new List(); + var xConditions = element.Elements(ConditionElementName).ToList(); - foreach (var xCondition in element.Elements(ConditionElementName)) + foreach (var xCondition in xConditions) { var message = xCondition.Attribute("Message")?.Value; if (!String.IsNullOrEmpty(message) && - TryGetInnerText(xCondition, out var text) && + TryGetInnerText(xCondition, out var text, out var comments) && this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName)) { - xCondition.AddAfterSelf(new XElement(LaunchElementName, - new XAttribute("Condition", text), - new XAttribute("Message", message) - )); - remove.Add(xCondition); + using (var lab = new ConversionLab(xCondition)) + { + lab.ReplaceTargetElement(new XElement(LaunchElementName, + new XAttribute("Condition", text), + new XAttribute("Message", message))); + lab.AddCommentsAsSiblings(comments); + } } } - - for (var i = remove.Count - 1; i >= 0; i--) - { - remove[i].Remove(); - } } private void ConvertFirewallRemoteAddressElement(XElement element) @@ -1161,11 +1171,18 @@ namespace WixToolset.Converters var xCondition = element.Element(ConditionElementName); if (xCondition != null) { - if (TryGetInnerText(xCondition, out var text) && + if (TryGetInnerText(xCondition, out var text, out var comments) && this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName)) { - element.Add(new XAttribute("Condition", text)); - xCondition.Remove(); + using (var lab = new ConversionLab(xCondition)) + { + lab.RemoveTargetElement(); + } + using (var lab = new ConversionLab(element)) + { + element.Add(new XAttribute("Condition", text)); + lab.AddCommentsAsSiblings(comments); + } } } } @@ -1251,14 +1268,16 @@ namespace WixToolset.Converters var message = xCondition.Attribute("Message")?.Value; if (!String.IsNullOrEmpty(message) && - TryGetInnerText(xCondition, out var text) && + TryGetInnerText(xCondition, out var text, out var comments) && this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName)) { - xCondition.AddAfterSelf(new XElement(LaunchElementName, - new XAttribute("Condition", text), - new XAttribute("Message", message) - )); - xCondition.Remove(); + using (var lab = new ConversionLab(xCondition)) + { + lab.ReplaceTargetElement(new XElement(LaunchElementName, + new XAttribute("Condition", text), + new XAttribute("Message", message))); + lab.AddCommentsAsSiblings(comments); + } } } @@ -1540,13 +1559,23 @@ namespace WixToolset.Converters private void ConvertPublishElement(XElement element) { - this.ConvertInnerTextToAttribute(element, "Condition"); - - var xCondition = element.Attribute("Condition"); - if (xCondition?.Value == "1" && - this.OnInformation(ConverterTestType.PublishConditionOneUnnecessary, element, "Adding Condition='1' on {0} elements is no longer necessary. Remove the Condition attribute.", xCondition.Name.LocalName)) + if (TryGetInnerText(element, out var text, out var comments) && + this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", element.Name.LocalName)) { - xCondition.Remove(); + using (var lab = new ConversionLab(element)) + { + if ("1" == text) + { + this.OnInformation(ConverterTestType.PublishConditionOneUnnecessary, element, "Adding Condition='1' on {0} elements is no longer necessary. Remove the Condition attribute.", element.Name.LocalName); + } + else + { + element.Add(new XAttribute("Condition", text)); + } + + lab.RemoveOrphanTextNodes(); + lab.AddCommentsAsSiblings(comments); + } } } @@ -1824,7 +1853,7 @@ namespace WixToolset.Converters var xScript = xCustomAction.Attribute("Script"); - if (xScript != null && TryGetInnerText(xCustomAction, out var scriptText)) + if (xScript != null && TryGetInnerText(xCustomAction, out var scriptText, out var comments)) { if (this.OnInformation(ConverterTestType.InnerTextDeprecated, xCustomAction, "Using {0} element text is deprecated. Extract the text to a file and use the 'ScriptSourceFile' attribute to reference it.", xCustomAction.Name.LocalName)) { @@ -1837,6 +1866,25 @@ namespace WixToolset.Converters RemoveChildren(xCustomAction); xCustomAction.Add(new XAttribute("ScriptSourceFile", scriptFile)); + + if (comments.Any()) + { + var remainingNodes = xCustomAction.NodesAfterSelf().ToList(); + var replacementNodes = remainingNodes.Where(e => XmlNodeType.Text != e.NodeType); + foreach (var node in remainingNodes) + { + node.Remove(); + } + foreach (var comment in comments) + { + xCustomAction.Add(comment); + xCustomAction.Add("\n"); + } + foreach (var node in replacementNodes) + { + xCustomAction.Add(node); + } + } } } } @@ -1956,11 +2004,15 @@ namespace WixToolset.Converters private void ConvertInnerTextToAttribute(XElement element, string attributeName) { - if (TryGetInnerText(element, out var text) && + if (TryGetInnerText(element, out var text, out var comments) && this.OnInformation(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}' attribute instead.", element.Name.LocalName, attributeName)) { - element.Add(new XAttribute(attributeName, text)); - RemoveChildren(element); + using (var lab = new ConversionLab(element)) + { + lab.RemoveOrphanTextNodes(); + element.Add(new XAttribute(attributeName, text)); + lab.AddCommentsAsSiblings(comments); + } } } @@ -2271,16 +2323,36 @@ namespace WixToolset.Converters return value; } - private static bool TryGetInnerText(XElement element, out string value) + private static bool TryGetInnerText(XElement element, out string value, out List comments) + { + return TryGetInnerText(element, out value, out comments, new List()); + } + + private static bool TryGetInnerText(XElement element, out string value, out List comments, List initialComments) { value = null; + comments = null; var found = false; var nodes = element.Nodes().ToList(); + comments = initialComments; + var nonCommentNodes = new List(); + + foreach(var node in nodes) + { + if (XmlNodeType.Comment == node.NodeType) + { + comments.Add(node); + } + else + { + nonCommentNodes.Add(node); + } + } - if (nodes.Any() && nodes.All(e => e.NodeType == XmlNodeType.Text || e.NodeType == XmlNodeType.CDATA)) + if (nonCommentNodes.Any() && nonCommentNodes.All(e => e.NodeType == XmlNodeType.Text || e.NodeType == XmlNodeType.CDATA)) { - value = String.Join(String.Empty, nodes.Cast().Select(TrimTextValue)); + value = String.Join(String.Empty, nonCommentNodes.Cast().Select(TrimTextValue)); found = true; } diff --git a/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs b/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs index daf66a8b..c9fecc94 100644 --- a/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs +++ b/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs @@ -35,13 +35,55 @@ namespace WixToolsetTest.Converters " ", " ", " ", - " ", - " ", - " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(4, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + + [Fact] + public void FixControlConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " ", + " ", + " x=y", + " a<>b", " ", " ", " ", " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", "" }; @@ -102,6 +144,53 @@ namespace WixToolsetTest.Converters var actualLines = UnformattedDocumentLines(document); WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixPublishConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " ", + " ", + " 1<2", + " 1", + " ", + " ", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(5, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } [Fact] public void FixComponentCondition() @@ -120,10 +209,43 @@ namespace WixToolsetTest.Converters { "", " ", - " ", - " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(3, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + + [Fact] + public void FixComponentConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " 1<2", " ", " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", "" }; @@ -175,27 +297,24 @@ namespace WixToolsetTest.Converters Assert.Equal(4, errors); } - [Fact(Skip = "Test demonstrates failure")] + [Fact] public void FixConditionWithComment() { var parse = String.Join(Environment.NewLine, "", "", " ", - " ", - " ", - " ", - " ", + " ", + "", " ", ""); - //TODO: expected value is not set in stone but must have replaced Condition element with Launch and should have kept the comment. var expected = new[] { "", " ", + " ", " ", - " ", " ", "" }; @@ -210,7 +329,7 @@ namespace WixToolsetTest.Converters var actualLines = UnformattedDocumentLines(document); WixAssert.CompareLineByLine(expected, actualLines); - Assert.Equal(2, errors); + Assert.Equal(3, errors); } [Fact] @@ -284,6 +403,43 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixFeatureConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " PROP = 1", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(3, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + [Fact] public void FixLaunchCondition() { @@ -322,6 +478,46 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixLaunchConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " 1<2", + " ", + " ", + " 1=2", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(4, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + [Fact] public void FixLaunchConditionInProduct() { @@ -362,6 +558,48 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixLaunchConditionInProductWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " ", + " 1<2", + " ", + " ", + " 1=2", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(6, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + [Fact] public void FixPermissionExCondition() { @@ -383,11 +621,49 @@ namespace WixToolsetTest.Converters "", " ", " ", - " ", - " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(3, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + + [Fact] + public void FixPermissionExConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " ", + " 1<2", " ", " ", " ", + ""); + + var expected = new[] + { + "", + "", + " ", + " ", + " ", + " ", + " ", + " ", "" }; diff --git a/src/wix/test/WixToolsetTest.Converters/UtilExtensionFixture.cs b/src/wix/test/WixToolsetTest.Converters/UtilExtensionFixture.cs index 10450c68..0f23d87b 100644 --- a/src/wix/test/WixToolsetTest.Converters/UtilExtensionFixture.cs +++ b/src/wix/test/WixToolsetTest.Converters/UtilExtensionFixture.cs @@ -44,6 +44,40 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixCloseAppsConditionWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + " ", + " ", + " a<>b", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(3, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + [Fact] public void FixXmlConfigValue() { @@ -77,6 +111,40 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixXmlConfigValueWithComment() + { + var parse = String.Join(Environment.NewLine, + "", + " ", + " ", + " a<>b", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(3, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + [Fact] public void WarnsOnAllRegistryValueSearches() { @@ -112,7 +180,6 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } - [Fact] public void FixXmlConfigValueCData() { -- cgit v1.2.3-55-g6feb