From f9804feb02c893bd54986f046ff5246082eaff22 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Fri, 6 Jan 2023 12:40:07 -0800 Subject: Correctly convert Controls with multiple Conditions with same action Fixes 7142 --- src/wix/WixToolset.Converters/WixConverter.cs | 12 +++++- .../WixToolsetTest.Converters/ConditionFixture.cs | 43 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/wix/WixToolset.Converters/WixConverter.cs b/src/wix/WixToolset.Converters/WixConverter.cs index 3d844b44..f962dc9c 100644 --- a/src/wix/WixToolset.Converters/WixConverter.cs +++ b/src/wix/WixToolset.Converters/WixConverter.cs @@ -1013,6 +1013,7 @@ namespace WixToolset.Converters { var xConditions = element.Elements(ConditionElementName).ToList(); var comments = new List(); + var conditions = new List>(); foreach (var xCondition in xConditions) { @@ -1021,10 +1022,19 @@ namespace WixToolset.Converters 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)); + conditions.Add(new KeyValuePair(action, text)); } } + foreach (var actionCondition in conditions.GroupBy(c => c.Key)) + { + var conditionValues = actionCondition.Select(c => c.Value).ToList(); + + var finalCondition = (conditionValues.Count == 1) ? conditionValues.Single() : String.Join(" OR ", conditionValues.Select(c => $"({c})")); + + element.Add(new XAttribute(actionCondition.Key + "Condition", finalCondition)); + } + foreach (var xCondition in xConditions) { xCondition.Remove(); diff --git a/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs b/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs index d8a55402..24dee1c6 100644 --- a/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs +++ b/src/wix/test/WixToolsetTest.Converters/ConditionFixture.cs @@ -54,6 +54,49 @@ namespace WixToolsetTest.Converters WixAssert.CompareLineByLine(expected, actualLines); } + [Fact] + public void FixDoubleControlCondition() + { + var parse = String.Join(Environment.NewLine, + "", + "", + " ", + " ", + " ", + " ", + " x=y", + " 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(4, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + [Fact] public void FixControlConditionWithComment() { -- cgit v1.2.3-55-g6feb