main
cs 188 lines 7.97 KB
Raw
1 // 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.
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 using System.IO;
6 using System.Linq;
7 using WixInternal.Core.TestPackage;
8 using WixInternal.TestSupport;
9 using WixToolset.Core;
10 using WixToolset.Data;
11 using WixToolset.Data.Symbols;
12 using WixToolset.Extensibility.Data;
13 using WixToolset.Extensibility.Services;
14 using Xunit;
15
16 public class PreprocessorFixture
17 {
18 [Fact]
19 public void PreprocessDirectly()
20 {
21 var folder = TestData.Get(@"TestData\IncludePath");
22 var sourcePath = Path.Combine(folder, "Package.wxs");
23 var includeFolder = Path.Combine(folder, "data");
24 var includeFile = Path.Combine(includeFolder, "Package.wxi");
25
26 var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
27
28 var context = serviceProvider.GetService<IPreprocessContext>();
29 context.SourcePath = sourcePath;
30 context.IncludeSearchPaths = new[] { includeFolder };
31
32 var preprocessor = serviceProvider.GetService<IPreprocessor>();
33 var result = preprocessor.Preprocess(context);
34
35 var includedFile = result.IncludedFiles.Single();
36 Assert.NotNull(result.Document);
37 WixAssert.StringEqual(includeFile, includedFile.Path);
38 WixAssert.StringEqual(sourcePath, includedFile.SourceLineNumbers.FileName);
39 Assert.Equal(1, includedFile.SourceLineNumbers.LineNumber.Value);
40 WixAssert.StringEqual($"{sourcePath}*1", includedFile.SourceLineNumbers.QualifiedFileName);
41 Assert.Null(includedFile.SourceLineNumbers.Parent);
42 }
43
44 [Fact]
45 public void IncludeSourceLineNumbersPreserved()
46 {
47 var folder = TestData.Get(@"TestData\IncludePath");
48
49 using (var fs = new DisposableFileSystem())
50 {
51 var baseFolder = fs.GetFolder();
52 var intermediateFolder = Path.Combine(baseFolder, "obj");
53
54 var result = WixRunner.Execute(warningsAsErrors: false, new[]
55 {
56 "build",
57 Path.Combine(folder, "Package.wxs"),
58 Path.Combine(folder, "PackageComponents.wxs"),
59 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
60 "-includepath", Path.Combine(folder, "data"),
61 "-bindpath", Path.Combine(folder, "data"),
62 "-intermediateFolder", intermediateFolder,
63 "-o", Path.Combine(baseFolder, @"bin\test.msi")
64 });
65
66 result.AssertSuccess();
67
68 using (var output = WixOutput.Read(Path.Combine(baseFolder, @"bin\test.wixpdb")))
69 {
70 var intermediate = Intermediate.Load(output);
71 var component = intermediate.Sections.Single().Symbols.OfType<ComponentSymbol>().Single();
72 Assert.Equal(3, component.SourceLineNumbers.LineNumber);
73 Assert.Equal(5, component.SourceLineNumbers.Parent.LineNumber);
74
75 var encoded = component.SourceLineNumbers.GetEncoded();
76 var decoded = SourceLineNumber.CreateFromEncoded(encoded);
77 Assert.Equal(3, decoded.LineNumber);
78 Assert.Equal(5, decoded.Parent.LineNumber);
79 }
80 }
81 }
82
83 [Fact]
84 /// <remarks>
85 /// This test will fail on 32-bit operating systems because it depends on "CommonProgramFiles(x86)"
86 /// which is only defined on 64-bit Windows.
87 /// </remarks>
88 public void SupportParensInEnvironmentVariables()
89 {
90 var folder = TestData.Get(@"TestData", "Preprocessor");
91
92 var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
93 var context = serviceProvider.GetService<IPreprocessContext>();
94 context.SourcePath = Path.Combine(folder, "EnvParens.wxs");
95
96 var preprocessor = serviceProvider.GetService<IPreprocessor>();
97 var result = preprocessor.Preprocess(context);
98 Assert.NotNull(result.Document);
99 }
100
101 [Fact]
102 public void VariableRedefinitionIsAWarning()
103 {
104 var folder = TestData.Get(@"TestData", "Variables");
105
106 using (var fs = new DisposableFileSystem())
107 {
108 var baseFolder = fs.GetFolder();
109 var intermediateFolder = Path.Combine(baseFolder, "obj");
110
111 var result = WixRunner.Execute(warningsAsErrors: false, new[]
112 {
113 "build",
114 Path.Combine(folder, "Package.wxs"),
115 Path.Combine(folder, "PackageComponents.wxs"),
116 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
117 "-bindpath", Path.Combine(folder, "data"),
118 "-intermediateFolder", intermediateFolder,
119 "-o", Path.Combine(baseFolder, @"bin\test.msi")
120 });
121
122 result.AssertSuccess();
123
124 var warning = result.Messages.Where(m => m.Level == MessageLevel.Warning || m.Level == MessageLevel.Error)
125 .Select(m => $"ln {m.SourceLineNumbers.LineNumber}: {m.Level.ToString().ToLowerInvariant()}: {m}".Replace(baseFolder, "<baseFolder>"))
126 .ToArray();
127 WixAssert.CompareLineByLine(new[]
128 {
129 "ln 5: warning: The variable 'Bar' with value 'Baz' was previously declared with value 'Bar'.",
130 "ln 24: warning: It is no longer necessary to define the standard directory 'TARGETDIR'. Use the StandardDirectory element instead.",
131 "ln 25: warning: It is no longer necessary to define the standard directory 'ProgramFilesFolder'. Use the StandardDirectory element instead."
132 }, warning);
133 }
134 }
135
136 [Fact]
137 public void ForEachLoopsWork()
138 {
139 var folder = TestData.Get(@"TestData\ForEach");
140
141 using (var fs = new DisposableFileSystem())
142 {
143 var baseFolder = fs.GetFolder();
144 var intermediateFolder = Path.Combine(baseFolder, "obj");
145
146 var result = WixRunner.Execute(new[]
147 {
148 "build",
149 Path.Combine(folder, "Package.wxs"),
150 Path.Combine(folder, "PackageComponents.wxs"),
151 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
152 "-bindpath", Path.Combine(folder, "data"),
153 "-intermediateFolder", intermediateFolder,
154 "-o", Path.Combine(baseFolder, @"bin\test.msi")
155 });
156
157 result.AssertSuccess();
158 }
159 }
160
161 [Fact]
162 public void NonterminatedPreprocessorInstructionShowsSourceLineNumber()
163 {
164 var folder = TestData.Get(@"TestData\BadIf");
165
166 using (var fs = new DisposableFileSystem())
167 {
168 var baseFolder = fs.GetFolder();
169 var intermediateFolder = Path.Combine(baseFolder, "obj");
170
171 var result = WixRunner.Execute(new[]
172 {
173 "build",
174 Path.Combine(folder, "Package.wxs"),
175 Path.Combine(folder, "PackageComponents.wxs"),
176 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
177 "-bindpath", Path.Combine(folder, "data"),
178 "-intermediateFolder", intermediateFolder,
179 "-o", Path.Combine(baseFolder, @"bin\test.msi")
180 });
181
182 Assert.Equal(147, result.ExitCode);
183 Assert.StartsWith("Found a <?if?>", result.Messages.Single().ToString());
184 }
185 }
186 }
187 }
188