From f99cd1b1616909f0314504c9fdba836e162e1fa6 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 2 Mar 2022 13:57:05 -0800 Subject: Support "==" as equality operator in preprocessor Fixes 5880 --- src/wix/WixToolset.Core/Preprocessor.cs | 13 +++- .../WixToolsetTest.Core/PreprocessorFixture.cs | 79 ++++++++++++++++++++++ .../WixToolsetTest.Core/WixToolsetTest.Core.csproj | 25 +++++++ src/wix/wix.sln | 19 ++++++ 4 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.Core/PreprocessorFixture.cs create mode 100644 src/wix/test/WixToolsetTest.Core/WixToolsetTest.Core.csproj diff --git a/src/wix/WixToolset.Core/Preprocessor.cs b/src/wix/WixToolset.Core/Preprocessor.cs index 486a4c8c..3abe0b5f 100644 --- a/src/wix/WixToolset.Core/Preprocessor.cs +++ b/src/wix/WixToolset.Core/Preprocessor.cs @@ -185,6 +185,7 @@ namespace WixToolset.Core } if ("=" == operation || + "==" == operation || "!=" == operation || "<" == operation || "<=" == operation || @@ -885,6 +886,7 @@ namespace WixToolset.Core // or end of string, whichever comes first var space = expression.IndexOf(" ", StringComparison.Ordinal); var equals = expression.IndexOf("=", StringComparison.Ordinal); + var doubleEquals = expression.IndexOf("==", StringComparison.Ordinal); var lessThan = expression.IndexOf("<", StringComparison.Ordinal); var lessThanEquals = expression.IndexOf("<=", StringComparison.Ordinal); var greaterThan = expression.IndexOf(">", StringComparison.Ordinal); @@ -903,6 +905,11 @@ namespace WixToolset.Core equals = Int32.MaxValue; } + if (doubleEquals == -1) + { + doubleEquals = Int32.MaxValue; + } + if (lessThan == -1) { lessThan = Int32.MaxValue; @@ -933,7 +940,7 @@ namespace WixToolset.Core equalsNoCase = Int32.MaxValue; } - closingIndex = Math.Min(space, Math.Min(equals, Math.Min(lessThan, Math.Min(lessThanEquals, Math.Min(greaterThan, Math.Min(greaterThanEquals, Math.Min(equalsNoCase, notEquals))))))); + closingIndex = Math.Min(space, Math.Min(equals, Math.Min(doubleEquals, Math.Min(lessThan, Math.Min(lessThanEquals, Math.Min(greaterThan, Math.Min(greaterThanEquals, Math.Min(equalsNoCase, notEquals)))))))); if (Int32.MaxValue == closingIndex) { @@ -944,7 +951,7 @@ namespace WixToolset.Core if (0 == closingIndex) { // Length 2 operators - if (closingIndex == lessThanEquals || closingIndex == greaterThanEquals || closingIndex == notEquals || closingIndex == equalsNoCase) + if (closingIndex == doubleEquals || closingIndex == lessThanEquals || closingIndex == greaterThanEquals || closingIndex == notEquals || closingIndex == equalsNoCase) { closingIndex = 2; } @@ -1096,7 +1103,7 @@ namespace WixToolset.Core { leftValue = leftValue.Trim(); rightValue = rightValue.Trim(); - if ("=" == operation) + if ("=" == operation || "==" == operation) { if (leftValue == rightValue) { diff --git a/src/wix/test/WixToolsetTest.Core/PreprocessorFixture.cs b/src/wix/test/WixToolsetTest.Core/PreprocessorFixture.cs new file mode 100644 index 00000000..b3ad0803 --- /dev/null +++ b/src/wix/test/WixToolsetTest.Core/PreprocessorFixture.cs @@ -0,0 +1,79 @@ +// 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 WixToolsetTest.Core +{ + using System; + using System.IO; + using System.Xml; + using WixBuildTools.TestSupport; + using WixToolset.Core; + using WixToolset.Extensibility.Data; + using WixToolset.Extensibility.Services; + using Xunit; + + public class PreprocessorFixture + { + [Fact] + public void CanPreprocessWithSingleEquals() + { + var input = String.Join(Environment.NewLine, + "", + "", + "", + " ", + "", + "" + ); + var expected = new[] + { + "", + " ", + "" + }; + + var result = PreprocessFromString(input); + + var actual = result.Document.ToString().Split("\r\n"); + WixAssert.CompareLineByLine(expected, actual); + } + + [Fact] + public void CanPreprocessWithDoubleEquals() + { + var input = String.Join(Environment.NewLine, + "", + "", + "", + " ", + "", + "" + ); + var expected = new[] + { + "", + " ", + "" + }; + + var result = PreprocessFromString(input); + + var actual = result.Document.ToString().Split("\r\n"); + WixAssert.CompareLineByLine(expected, actual); + } + + private static IPreprocessResult PreprocessFromString(string xml) + { + using var stringReader = new StringReader(xml); + using var xmlReader = XmlReader.Create(stringReader); + + var sp = WixToolsetServiceProviderFactory.CreateServiceProvider(); + + var context = sp.GetService(); + context.SourcePath = @"path\provided\for\testing\purposes\only.wxs"; + + var preprocessor = context.ServiceProvider.GetService(); + var result = preprocessor.Preprocess(context, xmlReader); + return result; + } + } +} diff --git a/src/wix/test/WixToolsetTest.Core/WixToolsetTest.Core.csproj b/src/wix/test/WixToolsetTest.Core/WixToolsetTest.Core.csproj new file mode 100644 index 00000000..3b0259cb --- /dev/null +++ b/src/wix/test/WixToolsetTest.Core/WixToolsetTest.Core.csproj @@ -0,0 +1,25 @@ + + + + + + netcoreapp3.1 + false + embedded + false + + + + + + + + + + + + + + + + diff --git a/src/wix/wix.sln b/src/wix/wix.sln index 15ee82e4..81faf8be 100644 --- a/src/wix/wix.sln +++ b/src/wix/wix.sln @@ -52,6 +52,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.BuildTasks", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "pack-wix", "pack-wix\pack-wix.csproj", "{CE489499-60E1-4883-B72A-CA8F95DBA073}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Core", "test\WixToolsetTest.Core\WixToolsetTest.Core.csproj", "{392817AE-4493-4BED-A7FD-2399379E1B1C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -448,6 +450,22 @@ Global {CE489499-60E1-4883-B72A-CA8F95DBA073}.Release|x64.Build.0 = Release|Any CPU {CE489499-60E1-4883-B72A-CA8F95DBA073}.Release|x86.ActiveCfg = Release|Any CPU {CE489499-60E1-4883-B72A-CA8F95DBA073}.Release|x86.Build.0 = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|ARM64.Build.0 = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|x64.ActiveCfg = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|x64.Build.0 = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|x86.ActiveCfg = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Debug|x86.Build.0 = Debug|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|Any CPU.Build.0 = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|ARM64.ActiveCfg = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|ARM64.Build.0 = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|x64.ActiveCfg = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|x64.Build.0 = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|x86.ActiveCfg = Release|Any CPU + {392817AE-4493-4BED-A7FD-2399379E1B1C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -463,6 +481,7 @@ Global {9D788104-2636-4E4C-891C-08FF05FEC31E} = {1284331E-BC6C-426D-AAAF-140C0174F875} {93645356-5D5F-45DE-AC7F-252D35E1ACE5} = {1284331E-BC6C-426D-AAAF-140C0174F875} {A05698E0-30D9-4B36-8F3B-585A99D67118} = {1284331E-BC6C-426D-AAAF-140C0174F875} + {392817AE-4493-4BED-A7FD-2399379E1B1C} = {1284331E-BC6C-426D-AAAF-140C0174F875} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB8820D5-723D-426D-B4A0-4D221603C5FA} -- cgit v1.2.3-55-g6feb