From 61d0e33943811cc31aeeae0c8c1c5c5768986bbe Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Wed, 11 Mar 2020 20:54:04 -0400 Subject: Fix https://github.com/wixtoolset/issues/issues/5860 recursive loc strings. --- src/WixToolset.Core/VariableResolver.cs | 6 ++-- .../VariableResolverFixture.cs | 37 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/test/WixToolsetTest.CoreIntegration/VariableResolverFixture.cs (limited to 'src') diff --git a/src/WixToolset.Core/VariableResolver.cs b/src/WixToolset.Core/VariableResolver.cs index 3e0b65b3..0a7916a3 100644 --- a/src/WixToolset.Core/VariableResolver.cs +++ b/src/WixToolset.Core/VariableResolver.cs @@ -35,7 +35,7 @@ namespace WixToolset.Core private IMessaging Messaging { get; } - public int VariableCount => this.wixVariables.Count; + public int VariableCount => this.wixVariables.Count; public void AddLocalization(Localization localization) { @@ -94,7 +94,7 @@ namespace WixToolset.Core result.IsDefault = true; result.Value = value; - if (0 < matches.Count) + while (!result.DelayedResolve && matches.Count > 0) { var sb = new StringBuilder(value); @@ -203,6 +203,8 @@ namespace WixToolset.Core } result.Value = sb.ToString(); + value = result.Value; + matches = Common.WixVariableRegex.Matches(value); } return result; diff --git a/src/test/WixToolsetTest.CoreIntegration/VariableResolverFixture.cs b/src/test/WixToolsetTest.CoreIntegration/VariableResolverFixture.cs new file mode 100644 index 00000000..b53842f7 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/VariableResolverFixture.cs @@ -0,0 +1,37 @@ + +// 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.CoreIntegration +{ + using System.Collections.Generic; + using WixToolset.Core; + using WixToolset.Data; + using WixToolset.Data.Bind; + using WixToolset.Extensibility.Services; + using Xunit; + + public class VariableResolverFixture + { + [Fact] + public void CanRecursivelyResolveVariables() + { + var serviceProvider = new WixToolsetServiceProvider(); + var variableResolver = serviceProvider.GetService(); + + var variables = new Dictionary() + { + { "ProductName", new BindVariable() { Id = "ProductName", Value = "Localized Product Name" } }, + { "ProductNameEdition", new BindVariable() { Id = "ProductNameEdition", Value = "!(loc.ProductName) Enterprise Edition" } }, + { "ProductNameEditionVersion", new BindVariable() { Id = "ProductNameEditionVersion", Value = "!(loc.ProductNameEdition) v1.2.3" } }, + }; + + var localization = new Localization(0, "x-none", variables, new Dictionary()); + + variableResolver.AddLocalization(localization); + + Assert.Equal("Welcome to Localized Product Name", variableResolver.ResolveVariables(null, "Welcome to !(loc.ProductName)", false).Value); + Assert.Equal("Welcome to Localized Product Name Enterprise Edition", variableResolver.ResolveVariables(null, "Welcome to !(loc.ProductNameEdition)", false).Value); + Assert.Equal("Welcome to Localized Product Name Enterprise Edition v1.2.3", variableResolver.ResolveVariables(null, "Welcome to !(loc.ProductNameEditionVersion)", false).Value); + } + } +} -- cgit v1.2.3-55-g6feb