Fix custom table column values case in compiler and decompiler
Rob Mensching committed
Jun 12, 2020 at 06:51 UTC
49ce77951ca980848b275cef082309c49b117f47
9 files changed
+429
-239
src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs
+27
-26
@@ -87,84 +87,85 @@ namespace WixToolset.Core.WindowsInstaller.Bind
87
var category = ColumnCategory.Unknown;
88
switch (column.Category)
89
{
90
- case "Text":
90
+ case WixCustomTableColumnCategoryType.Text:
91
category = ColumnCategory.Text;
92
break;
93
- case "UpperCase":
93
+ case WixCustomTableColumnCategoryType.UpperCase:
94
category = ColumnCategory.UpperCase;
95
break;
96
- case "LowerCase":
96
+ case WixCustomTableColumnCategoryType.LowerCase:
97
category = ColumnCategory.LowerCase;
98
break;
99
- case "Integer":
99
+ case WixCustomTableColumnCategoryType.Integer:
100
category = ColumnCategory.Integer;
101
break;
102
- case "DoubleInteger":
102
+ case WixCustomTableColumnCategoryType.DoubleInteger:
103
category = ColumnCategory.DoubleInteger;
104
break;
105
- case "TimeDate":
105
+ case WixCustomTableColumnCategoryType.TimeDate:
106
category = ColumnCategory.TimeDate;
107
break;
108
- case "Identifier":
108
+ case WixCustomTableColumnCategoryType.Identifier:
109
category = ColumnCategory.Identifier;
110
break;
111
- case "Property":
111
+ case WixCustomTableColumnCategoryType.Property:
112
category = ColumnCategory.Property;
113
break;
114
- case "Filename":
114
+ case WixCustomTableColumnCategoryType.Filename:
115
category = ColumnCategory.Filename;
116
break;
117
- case "WildCardFilename":
117
+ case WixCustomTableColumnCategoryType.WildCardFilename:
118
category = ColumnCategory.WildCardFilename;
119
break;
120
- case "Path":
120
+ case WixCustomTableColumnCategoryType.Path:
121
category = ColumnCategory.Path;
122
break;
123
- case "Paths":
123
+ case WixCustomTableColumnCategoryType.Paths:
124
category = ColumnCategory.Paths;
125
break;
126
- case "AnyPath":
126
+ case WixCustomTableColumnCategoryType.AnyPath:
127
category = ColumnCategory.AnyPath;
128
break;
129
- case "DefaultDir":
129
+ case WixCustomTableColumnCategoryType.DefaultDir:
130
category = ColumnCategory.DefaultDir;
131
break;
132
- case "RegPath":
132
+ case WixCustomTableColumnCategoryType.RegPath:
133
category = ColumnCategory.RegPath;
134
break;
135
- case "Formatted":
135
+ case WixCustomTableColumnCategoryType.Formatted:
136
category = ColumnCategory.Formatted;
137
break;
138
- case "FormattedSddl":
138
+ case WixCustomTableColumnCategoryType.FormattedSddl:
139
category = ColumnCategory.FormattedSDDLText;
140
break;
141
- case "Template":
141
+ case WixCustomTableColumnCategoryType.Template:
142
category = ColumnCategory.Template;
143
break;
144
- case "Condition":
144
+ case WixCustomTableColumnCategoryType.Condition:
145
category = ColumnCategory.Condition;
146
break;
147
- case "Guid":
147
+ case WixCustomTableColumnCategoryType.Guid:
148
category = ColumnCategory.Guid;
149
break;
150
- case "Version":
150
+ case WixCustomTableColumnCategoryType.Version:
151
category = ColumnCategory.Version;
152
break;
153
- case "Language":
153
+ case WixCustomTableColumnCategoryType.Language:
154
category = ColumnCategory.Language;
155
break;
156
- case "Binary":
156
+ case WixCustomTableColumnCategoryType.Binary:
157
category = ColumnCategory.Binary;
158
break;
159
- case "CustomSource":
159
+ case WixCustomTableColumnCategoryType.CustomSource:
160
category = ColumnCategory.CustomSource;
161
break;
162
- case "Cabinet":
162
+ case WixCustomTableColumnCategoryType.Cabinet:
163
category = ColumnCategory.Cabinet;
164
break;
165
- case "Shortcut":
165
+ case WixCustomTableColumnCategoryType.Shortcut:
166
category = ColumnCategory.Shortcut;
167
break;
168
+ case null:
169
default:
170
break;
171
}
src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+26
-26
@@ -4481,82 +4481,82 @@ namespace WixToolset.Core.WindowsInstaller
4481
switch (columnDefinition.Category)
4482
{
4483
case ColumnCategory.Text:
4484
- column.Category = Wix.Column.CategoryType.Text;
4484
+ column.Category = Wix.Column.CategoryType.text;
4485
break;
4486
case ColumnCategory.UpperCase:
4487
- column.Category = Wix.Column.CategoryType.UpperCase;
4487
+ column.Category = Wix.Column.CategoryType.upperCase;
4488
break;
4489
case ColumnCategory.LowerCase:
4490
- column.Category = Wix.Column.CategoryType.LowerCase;
4490
+ column.Category = Wix.Column.CategoryType.lowerCase;
4491
break;
4492
case ColumnCategory.Integer:
4493
- column.Category = Wix.Column.CategoryType.Integer;
4493
+ column.Category = Wix.Column.CategoryType.integer;
4494
break;
4495
case ColumnCategory.DoubleInteger:
4496
- column.Category = Wix.Column.CategoryType.DoubleInteger;
4496
+ column.Category = Wix.Column.CategoryType.doubleInteger;
4497
break;
4498
case ColumnCategory.TimeDate:
4499
- column.Category = Wix.Column.CategoryType.TimeDate;
4499
+ column.Category = Wix.Column.CategoryType.timeDate;
4500
break;
4501
case ColumnCategory.Identifier:
4502
- column.Category = Wix.Column.CategoryType.Identifier;
4502
+ column.Category = Wix.Column.CategoryType.identifier;
4503
break;
4504
case ColumnCategory.Property:
4505
- column.Category = Wix.Column.CategoryType.Property;
4505
+ column.Category = Wix.Column.CategoryType.property;
4506
break;
4507
case ColumnCategory.Filename:
4508
- column.Category = Wix.Column.CategoryType.Filename;
4508
+ column.Category = Wix.Column.CategoryType.filename;
4509
break;
4510
case ColumnCategory.WildCardFilename:
4511
- column.Category = Wix.Column.CategoryType.WildCardFilename;
4511
+ column.Category = Wix.Column.CategoryType.wildCardFilename;
4512
break;
4513
case ColumnCategory.Path:
4514
- column.Category = Wix.Column.CategoryType.Path;
4514
+ column.Category = Wix.Column.CategoryType.path;
4515
break;
4516
case ColumnCategory.Paths:
4517
- column.Category = Wix.Column.CategoryType.Paths;
4517
+ column.Category = Wix.Column.CategoryType.paths;
4518
break;
4519
case ColumnCategory.AnyPath:
4520
- column.Category = Wix.Column.CategoryType.AnyPath;
4520
+ column.Category = Wix.Column.CategoryType.anyPath;
4521
break;
4522
case ColumnCategory.DefaultDir:
4523
- column.Category = Wix.Column.CategoryType.DefaultDir;
4523
+ column.Category = Wix.Column.CategoryType.defaultDir;
4524
break;
4525
case ColumnCategory.RegPath:
4526
- column.Category = Wix.Column.CategoryType.RegPath;
4526
+ column.Category = Wix.Column.CategoryType.regPath;
4527
break;
4528
case ColumnCategory.Formatted:
4529
- column.Category = Wix.Column.CategoryType.Formatted;
4529
+ column.Category = Wix.Column.CategoryType.formatted;
4530
break;
4531
case ColumnCategory.FormattedSDDLText:
4532
- column.Category = Wix.Column.CategoryType.FormattedSddl;
4532
+ column.Category = Wix.Column.CategoryType.formattedSddl;
4533
break;
4534
case ColumnCategory.Template:
4535
- column.Category = Wix.Column.CategoryType.Template;
4535
+ column.Category = Wix.Column.CategoryType.template;
4536
break;
4537
case ColumnCategory.Condition:
4538
- column.Category = Wix.Column.CategoryType.Condition;
4538
+ column.Category = Wix.Column.CategoryType.condition;
4539
break;
4540
case ColumnCategory.Guid:
4541
- column.Category = Wix.Column.CategoryType.Guid;
4541
+ column.Category = Wix.Column.CategoryType.guid;
4542
break;
4543
case ColumnCategory.Version:
4544
- column.Category = Wix.Column.CategoryType.Version;
4544
+ column.Category = Wix.Column.CategoryType.version;
4545
break;
4546
case ColumnCategory.Language:
4547
- column.Category = Wix.Column.CategoryType.Language;
4547
+ column.Category = Wix.Column.CategoryType.language;
4548
break;
4549
case ColumnCategory.Binary:
4550
- column.Category = Wix.Column.CategoryType.Binary;
4550
+ column.Category = Wix.Column.CategoryType.binary;
4551
break;
4552
case ColumnCategory.CustomSource:
4553
- column.Category = Wix.Column.CategoryType.CustomSource;
4553
+ column.Category = Wix.Column.CategoryType.customSource;
4554
break;
4555
case ColumnCategory.Cabinet:
4556
- column.Category = Wix.Column.CategoryType.Cabinet;
4556
+ column.Category = Wix.Column.CategoryType.cabinet;
4557
break;
4558
case ColumnCategory.Shortcut:
4559
- column.Category = Wix.Column.CategoryType.Shortcut;
4559
+ column.Category = Wix.Column.CategoryType.shortcut;
4560
break;
4561
default:
4562
throw new InvalidOperationException($"Unknown custom column category '{columnDefinition.Category.ToString()}'.");
src/WixToolset.Core/Compiler.cs
+95
-5
@@ -3712,7 +3712,6 @@ namespace WixToolset.Core
3712
{
3713
case "Column":
3714
string columnName = null;
3715
- var category = String.Empty;
3715
IntermediateFieldType? columnType = null;
3716
var description = String.Empty;
3717
int? keyColumn = null;
@@ -3720,6 +3719,7 @@ namespace WixToolset.Core
3719
var localizable = false;
3720
long? maxValue = null;
3721
long? minValue = null;
3722
+ WixCustomTableColumnCategoryType? category = null;
3723
var modularization = WixCustomTableColumnModularizeType.None;
3724
var nullable = false;
3725
var primaryKey = false;
@@ -3735,7 +3735,97 @@ namespace WixToolset.Core
3735
columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib);
3736
break;
3737
case "Category":
3738
- category = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3738
+ var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3739
+ switch (categoryValue)
3740
+ {
3741
+ case "text":
3742
+ category = WixCustomTableColumnCategoryType.Text;
3743
+ break;
3744
+ case "upperCase":
3745
+ category = WixCustomTableColumnCategoryType.UpperCase;
3746
+ break;
3747
+ case "lowerCase":
3748
+ category = WixCustomTableColumnCategoryType.LowerCase;
3749
+ break;
3750
+ case "integer":
3751
+ category = WixCustomTableColumnCategoryType.Integer;
3752
+ break;
3753
+ case "doubleInteger":
3754
+ category = WixCustomTableColumnCategoryType.DoubleInteger;
3755
+ break;
3756
+ case "timeDate":
3757
+ category = WixCustomTableColumnCategoryType.TimeDate;
3758
+ break;
3759
+ case "identifier":
3760
+ category = WixCustomTableColumnCategoryType.Identifier;
3761
+ break;
3762
+ case "property":
3763
+ category = WixCustomTableColumnCategoryType.Property;
3764
+ break;
3765
+ case "filename":
3766
+ category = WixCustomTableColumnCategoryType.Filename;
3767
+ break;
3768
+ case "wildCardFilename":
3769
+ category = WixCustomTableColumnCategoryType.WildCardFilename;
3770
+ break;
3771
+ case "path":
3772
+ category = WixCustomTableColumnCategoryType.Path;
3773
+ break;
3774
+ case "paths":
3775
+ category = WixCustomTableColumnCategoryType.Paths;
3776
+ break;
3777
+ case "anyPath":
3778
+ category = WixCustomTableColumnCategoryType.AnyPath;
3779
+ break;
3780
+ case "defaultDir":
3781
+ category = WixCustomTableColumnCategoryType.DefaultDir;
3782
+ break;
3783
+ case "regPath":
3784
+ category = WixCustomTableColumnCategoryType.RegPath;
3785
+ break;
3786
+ case "formatted":
3787
+ category = WixCustomTableColumnCategoryType.Formatted;
3788
+ break;
3789
+ case "formattedSddl":
3790
+ category = WixCustomTableColumnCategoryType.FormattedSddl;
3791
+ break;
3792
+ case "template":
3793
+ category = WixCustomTableColumnCategoryType.Template;
3794
+ break;
3795
+ case "condition":
3796
+ category = WixCustomTableColumnCategoryType.Condition;
3797
+ break;
3798
+ case "guid":
3799
+ category = WixCustomTableColumnCategoryType.Guid;
3800
+ break;
3801
+ case "version":
3802
+ category = WixCustomTableColumnCategoryType.Version;
3803
+ break;
3804
+ case "language":
3805
+ category = WixCustomTableColumnCategoryType.Language;
3806
+ break;
3807
+ case "binary":
3808
+ category = WixCustomTableColumnCategoryType.Binary;
3809
+ break;
3810
+ case "customSource":
3811
+ category = WixCustomTableColumnCategoryType.CustomSource;
3812
+ break;
3813
+ case "cabinet":
3814
+ category = WixCustomTableColumnCategoryType.Cabinet;
3815
+ break;
3816
+ case "shortcut":
3817
+ category = WixCustomTableColumnCategoryType.Shortcut;
3818
+ break;
3819
+ case "":
3820
+ break;
3821
+ default:
3822
+ this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue,
3823
+ "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename",
3824
+ "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template",
3825
+ "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut"));
3826
+ columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3827
+ break;
3828
+ }
3829
break;
3830
case "Description":
3831
description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
@@ -3854,11 +3944,11 @@ namespace WixToolset.Core
3944
}
3945
else if (columnType == IntermediateFieldType.Path)
3946
{
3857
- if (String.IsNullOrEmpty(category))
3947
+ if (!category.HasValue)
3948
{
3859
- category = "Binary";
3949
+ category = WixCustomTableColumnCategoryType.Binary;
3950
}
3861
- else if (category != "Binary")
3951
+ else if (category != WixCustomTableColumnCategoryType.Binary)
3952
{
3953
this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers));
3954
}
src/test/WixToolsetTest.CoreIntegration/CustomTableFixture.cs
new
+244
@@ -0,0 +1,244 @@
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 Microsoft.Build.Tasks;
7
+ using WixBuildTools.TestSupport;
8
+ using WixToolset.Core.TestPackage;
9
+ using Xunit;
10
+
11
+ public class CustomTableFixture
12
+ {
13
+ [Fact]
14
+ public void PopulatesCustomTable1()
15
+ {
16
+ var folder = TestData.Get(@"TestData");
17
+
18
+ using (var fs = new DisposableFileSystem())
19
+ {
20
+ var baseFolder = fs.GetFolder();
21
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
22
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
23
+
24
+ var result = WixRunner.Execute(new[]
25
+ {
26
+ "build",
27
+ Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
28
+ Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
29
+ Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
30
+ "-bindpath", Path.Combine(folder, "SingleFile", "data"),
31
+ "-intermediateFolder", intermediateFolder,
32
+ "-o", msiPath
33
+ });
34
+
35
+ result.AssertSuccess();
36
+
37
+ Assert.True(File.Exists(msiPath));
38
+ var results = Query.QueryDatabase(msiPath, new[] { "CustomTable1" });
39
+ Assert.Equal(new[]
40
+ {
41
+ "CustomTable1:Row1\ttest.txt",
42
+ "CustomTable1:Row2\ttest.txt",
43
+ }, results);
44
+ }
45
+ }
46
+
47
+ [Fact]
48
+ public void PopulatesCustomTableWithLocalization()
49
+ {
50
+ var folder = TestData.Get(@"TestData");
51
+
52
+ using (var fs = new DisposableFileSystem())
53
+ {
54
+ var baseFolder = fs.GetFolder();
55
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
56
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
57
+
58
+ var result = WixRunner.Execute(new[]
59
+ {
60
+ "build",
61
+ Path.Combine(folder, "CustomTable", "LocalizedCustomTable.wxs"),
62
+ Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
63
+ Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
64
+ "-loc", Path.Combine(folder, "CustomTable", "LocalizedCustomTable.en-us.wxl"),
65
+ "-bindpath", Path.Combine(folder, "SingleFile", "data"),
66
+ "-intermediateFolder", intermediateFolder,
67
+ "-o", msiPath
68
+ });
69
+
70
+ result.AssertSuccess();
71
+
72
+ Assert.True(File.Exists(msiPath));
73
+ var results = Query.QueryDatabase(msiPath, new[] { "CustomTableLocalized" });
74
+ Assert.Equal(new[]
75
+ {
76
+ "CustomTableLocalized:Row1\tThis is row one",
77
+ "CustomTableLocalized:Row2\tThis is row two",
78
+ }, results);
79
+ }
80
+ }
81
+
82
+ [Fact]
83
+ public void PopulatesCustomTableWithFilePath()
84
+ {
85
+ var folder = TestData.Get(@"TestData");
86
+
87
+ using (var fs = new DisposableFileSystem())
88
+ {
89
+ var baseFolder = fs.GetFolder();
90
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
91
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
92
+
93
+ var result = WixRunner.Execute(new[]
94
+ {
95
+ "build",
96
+ Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
97
+ Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
98
+ Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
99
+ "-bindpath", Path.Combine(folder, "CustomTable", "data"),
100
+ "-intermediateFolder", intermediateFolder,
101
+ "-o", msiPath
102
+ });
103
+
104
+ result.AssertSuccess();
105
+
106
+ Assert.True(File.Exists(msiPath));
107
+ var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
108
+ Assert.Equal(new[]
109
+ {
110
+ "CustomTableWithFile:Row1\t[Binary data]",
111
+ "CustomTableWithFile:Row2\t[Binary data]",
112
+ }, results);
113
+ }
114
+ }
115
+
116
+ [Fact]
117
+ public void PopulatesCustomTableWithFilePathSerialized()
118
+ {
119
+ var folder = TestData.Get(@"TestData");
120
+
121
+ using (var fs = new DisposableFileSystem())
122
+ {
123
+ var baseFolder = fs.GetFolder();
124
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
125
+ var wixlibPath = Path.Combine(baseFolder, @"bin\test.wixlib");
126
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
127
+
128
+ var result = WixRunner.Execute(new[]
129
+ {
130
+ "build",
131
+ Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
132
+ "-bindpath", Path.Combine(folder, "CustomTable", "data"),
133
+ "-intermediateFolder", intermediateFolder,
134
+ "-o", wixlibPath
135
+ });
136
+
137
+ result.AssertSuccess();
138
+
139
+ result = WixRunner.Execute(new[]
140
+ {
141
+ "build",
142
+ Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
143
+ Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
144
+ "-lib", wixlibPath,
145
+ "-bindpath", Path.Combine(folder, "CustomTable", "data"),
146
+ "-intermediateFolder", intermediateFolder,
147
+ "-o", msiPath
148
+ });
149
+
150
+ result.AssertSuccess();
151
+
152
+ Assert.True(File.Exists(msiPath));
153
+ var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
154
+ Assert.Equal(new[]
155
+ {
156
+ "CustomTableWithFile:Row1\t[Binary data]",
157
+ "CustomTableWithFile:Row2\t[Binary data]",
158
+ }, results);
159
+ }
160
+ }
161
+
162
+ [Fact]
163
+ public void UnrealCustomTableIsNotPresentInMsi()
164
+ {
165
+ var folder = TestData.Get(@"TestData");
166
+
167
+ using (var fs = new DisposableFileSystem())
168
+ {
169
+ var baseFolder = fs.GetFolder();
170
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
171
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
172
+
173
+ var result = WixRunner.Execute(new[]
174
+ {
175
+ "build",
176
+ Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
177
+ Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
178
+ Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
179
+ "-bindpath", Path.Combine(folder, "SingleFile", "data"),
180
+ "-intermediateFolder", intermediateFolder,
181
+ "-o", msiPath
182
+ });
183
+
184
+ result.AssertSuccess();
185
+
186
+ Assert.True(File.Exists(msiPath));
187
+ var results = Query.QueryDatabase(msiPath, new[] { "CustomTable2" });
188
+ Assert.Empty(results);
189
+ }
190
+ }
191
+
192
+ [Fact]
193
+ public void CanCompileAndDecompile()
194
+ {
195
+ var folder = TestData.Get(@"TestData");
196
+ var expectedFile = Path.Combine(folder, "CustomTable", "CustomTable-Expected.wxs");
197
+
198
+ using (var fs = new DisposableFileSystem())
199
+ {
200
+ var baseFolder = fs.GetFolder();
201
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
202
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
203
+ var decompiledWxsPath = Path.Combine(baseFolder, @"decompiled.wxs");
204
+
205
+ var result = WixRunner.Execute(new[]
206
+ {
207
+ "build",
208
+ Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
209
+ Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
210
+ Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
211
+ "-bindpath", Path.Combine(folder, "SingleFile", "data"),
212
+ "-intermediateFolder", intermediateFolder,
213
+ "-o", msiPath
214
+ });
215
+
216
+ result.AssertSuccess();
217
+ Assert.True(File.Exists(msiPath));
218
+
219
+ result = WixRunner.Execute(new[]
220
+ {
221
+ "decompile", msiPath,
222
+ "-intermediateFolder", intermediateFolder,
223
+ "-o", decompiledWxsPath
224
+ });
225
+
226
+ result.AssertSuccess();
227
+
228
+ CompareLineByLine(expectedFile, decompiledWxsPath);
229
+ }
230
+ }
231
+
232
+ private static void CompareLineByLine(string expectedFile, string actualFile)
233
+ {
234
+ var expectedLines = File.ReadAllLines(expectedFile);
235
+ var actualLines = File.ReadAllLines(actualFile);
236
+ for (var i = 0; i < expectedLines.Length; ++i)
237
+ {
238
+ Assert.True(actualLines.Length > i, $"{i}: Expected file longer than actual file");
239
+ Assert.Equal($"{i}: {expectedLines[i]}", $"{i}: {actualLines[i]}");
240
+ }
241
+ Assert.True(expectedLines.Length == actualLines.Length, "Actual file longer than expected file");
242
+ }
243
+ }
244
+}
src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
-179
@@ -438,185 +438,6 @@ namespace WixToolsetTest.CoreIntegration
438
}
439
}
440
441
- [Fact]
442
- public void PopulatesCustomTable1()
443
- {
444
- var folder = TestData.Get(@"TestData");
445
-
446
- using (var fs = new DisposableFileSystem())
447
- {
448
- var baseFolder = fs.GetFolder();
449
- var intermediateFolder = Path.Combine(baseFolder, "obj");
450
- var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
451
-
452
- var result = WixRunner.Execute(new[]
453
- {
454
- "build",
455
- Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
456
- Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
457
- Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
458
- "-bindpath", Path.Combine(folder, "SingleFile", "data"),
459
- "-intermediateFolder", intermediateFolder,
460
- "-o", msiPath
461
- });
462
-
463
- result.AssertSuccess();
464
-
465
- Assert.True(File.Exists(msiPath));
466
- var results = Query.QueryDatabase(msiPath, new[] { "CustomTable1" });
467
- Assert.Equal(new[]
468
- {
469
- "CustomTable1:Row1\ttest.txt",
470
- "CustomTable1:Row2\ttest.txt",
471
- }, results);
472
- }
473
- }
474
-
475
- [Fact]
476
- public void PopulatesCustomTableWithLocalization()
477
- {
478
- var folder = TestData.Get(@"TestData");
479
-
480
- using (var fs = new DisposableFileSystem())
481
- {
482
- var baseFolder = fs.GetFolder();
483
- var intermediateFolder = Path.Combine(baseFolder, "obj");
484
- var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
485
-
486
- var result = WixRunner.Execute(new[]
487
- {
488
- "build",
489
- Path.Combine(folder, "CustomTable", "LocalizedCustomTable.wxs"),
490
- Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
491
- Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
492
- "-loc", Path.Combine(folder, "CustomTable", "LocalizedCustomTable.en-us.wxl"),
493
- "-bindpath", Path.Combine(folder, "SingleFile", "data"),
494
- "-intermediateFolder", intermediateFolder,
495
- "-o", msiPath
496
- });
497
-
498
- result.AssertSuccess();
499
-
500
- Assert.True(File.Exists(msiPath));
501
- var results = Query.QueryDatabase(msiPath, new[] { "CustomTableLocalized" });
502
- Assert.Equal(new[]
503
- {
504
- "CustomTableLocalized:Row1\tThis is row one",
505
- "CustomTableLocalized:Row2\tThis is row two",
506
- }, results);
507
- }
508
- }
509
-
510
- [Fact]
511
- public void PopulatesCustomTableWithFilePath()
512
- {
513
- var folder = TestData.Get(@"TestData");
514
-
515
- using (var fs = new DisposableFileSystem())
516
- {
517
- var baseFolder = fs.GetFolder();
518
- var intermediateFolder = Path.Combine(baseFolder, "obj");
519
- var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
520
-
521
- var result = WixRunner.Execute(new[]
522
- {
523
- "build",
524
- Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
525
- Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
526
- Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
527
- "-bindpath", Path.Combine(folder, "CustomTable", "data"),
528
- "-intermediateFolder", intermediateFolder,
529
- "-o", msiPath
530
- });
531
-
532
- result.AssertSuccess();
533
-
534
- Assert.True(File.Exists(msiPath));
535
- var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
536
- Assert.Equal(new[]
537
- {
538
- "CustomTableWithFile:Row1\t[Binary data]",
539
- "CustomTableWithFile:Row2\t[Binary data]",
540
- }, results);
541
- }
542
- }
543
-
544
- [Fact]
545
- public void PopulatesCustomTableWithFilePathSerialized()
546
- {
547
- var folder = TestData.Get(@"TestData");
548
-
549
- using (var fs = new DisposableFileSystem())
550
- {
551
- var baseFolder = fs.GetFolder();
552
- var intermediateFolder = Path.Combine(baseFolder, "obj");
553
- var wixlibPath = Path.Combine(baseFolder, @"bin\test.wixlib");
554
- var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
555
-
556
- var result = WixRunner.Execute(new[]
557
- {
558
- "build",
559
- Path.Combine(folder, "CustomTable", "CustomTableWithFile.wxs"),
560
- "-bindpath", Path.Combine(folder, "CustomTable", "data"),
561
- "-intermediateFolder", intermediateFolder,
562
- "-o", wixlibPath
563
- });
564
-
565
- result.AssertSuccess();
566
-
567
- result = WixRunner.Execute(new[]
568
- {
569
- "build",
570
- Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
571
- Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
572
- "-lib", wixlibPath,
573
- "-bindpath", Path.Combine(folder, "CustomTable", "data"),
574
- "-intermediateFolder", intermediateFolder,
575
- "-o", msiPath
576
- });
577
-
578
- result.AssertSuccess();
579
-
580
- Assert.True(File.Exists(msiPath));
581
- var results = Query.QueryDatabase(msiPath, new[] { "CustomTableWithFile" });
582
- Assert.Equal(new[]
583
- {
584
- "CustomTableWithFile:Row1\t[Binary data]",
585
- "CustomTableWithFile:Row2\t[Binary data]",
586
- }, results);
587
- }
588
- }
589
-
590
- [Fact]
591
- public void UnrealCustomTableIsNotPresentInMsi()
592
- {
593
- var folder = TestData.Get(@"TestData");
594
-
595
- using (var fs = new DisposableFileSystem())
596
- {
597
- var baseFolder = fs.GetFolder();
598
- var intermediateFolder = Path.Combine(baseFolder, "obj");
599
- var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
600
-
601
- var result = WixRunner.Execute(new[]
602
- {
603
- "build",
604
- Path.Combine(folder, "CustomTable", "CustomTable.wxs"),
605
- Path.Combine(folder, "ProductWithComponentGroupRef", "MinimalComponentGroup.wxs"),
606
- Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
607
- "-bindpath", Path.Combine(folder, "SingleFile", "data"),
608
- "-intermediateFolder", intermediateFolder,
609
- "-o", msiPath
610
- });
611
-
612
- result.AssertSuccess();
613
-
614
- Assert.True(File.Exists(msiPath));
615
- var results = Query.QueryDatabase(msiPath, new[] { "CustomTable2" });
616
- Assert.Empty(results);
617
- }
618
- }
619
-
441
[Fact]
442
public void PopulatesDirectoryTableWithValidDefaultDir()
443
{
src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs
new
+33
@@ -0,0 +1,33 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Product Id="{83F9C623-26FE-42AB-951E-170022117F54}" Codepage="1252" Language="1033" Manufacturer="Example Corporation" Name="MsiPackage" UpgradeCode="{12E4699F-E774-4D05-8A01-5BDD41BBA127}" Version="1.0.0.0">
4
+ <Package Description="MsiPackage" InstallerVersion="500" Languages="1033" Manufacturer="Example Corporation" Platform="x86" />
5
+ <CustomTable Id="CustomTable1">
6
+ <Column Id="Column1" PrimaryKey="yes" Type="string" Width="0" Category="text" Description="The first custom column." />
7
+ <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" Description="The custom table's Component reference" />
8
+ <Row>
9
+ <Data Column="Column1">Row1</Data>
10
+ <Data Column="Component_">test.txt</Data>
11
+ </Row>
12
+ <Row>
13
+ <Data Column="Column1">Row2</Data>
14
+ <Data Column="Component_">test.txt</Data>
15
+ </Row>
16
+ </CustomTable>
17
+ <Directory Id="TARGETDIR" Name="SourceDir">
18
+ <Directory Id="ProgramFilesFolder">
19
+ <Directory Id="INSTALLFOLDER" Name="MsiPackage" ShortName="oekcr5lq">
20
+ <Component Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Guid="{E597A58A-03CB-50D8-93E3-DABA263F233A}" Win64="no">
21
+ <File Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Name="test.txt" KeyPath="yes" Source="SourceDir\\MsiPackage\test.txt" />
22
+ </Component>
23
+ </Directory>
24
+ </Directory>
25
+ </Directory>
26
+ <Feature Id="ProductFeature" Level="1" Title="MsiPackageTitle">
27
+ <ComponentRef Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" />
28
+ </Feature>
29
+ <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
30
+ <Media Id="1" />
31
+ <Property Id="ALLUSERS" Value="1" />
32
+ </Product>
33
+</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable.wxs
+2
-2
@@ -6,8 +6,8 @@
6
</ComponentGroup>
7
8
<CustomTable Id="CustomTable1">
9
- <Column Id="Column1" Type="string" PrimaryKey="yes" />
10
- <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" />
9
+ <Column Id="Column1" Type="string" PrimaryKey="yes" Category="text" Modularize="column" Description="The first custom column." />
10
+ <Column Id="Component_" Type="string" Width="72" KeyTable="Component" KeyColumn="1" Description="The custom table's Component reference" />
11
<Row>
12
<Data Column="Column1">Row1</Data>
13
<Data Column="Component_">test.txt</Data>
src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs
+1
-1
@@ -1,6 +1,6 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
- <Product Id="*" Name="MsiPackage" Codepage="1252" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="12E4699F-E774-4D05-8A01-5BDD41BBA127">
3
+ <Product Id="83f9c623-26fe-42ab-951e-170022117f54" Name="MsiPackage" Codepage="1252" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="12E4699F-E774-4D05-8A01-5BDD41BBA127">
4
<Package InstallerVersion="500" Compressed="no" InstallScope="perMachine" />
5
6
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
+1
@@ -34,6 +34,7 @@
34
<Content Include="TestData\Class\IconIndex0.wxs" CopyToOutputDirectory="PreserveNewest" />
35
<Content Include="TestData\Class\OldClassTableDef.msi" CopyToOutputDirectory="PreserveNewest" />
36
<Content Include="TestData\CustomAction\UnscheduledCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" />
37
+ <Content Include="TestData\CustomTable\CustomTable-Expected.wxs" CopyToOutputDirectory="PreserveNewest" />
38
<Content Include="TestData\CustomTable\CustomTableWithFile.wxs" CopyToOutputDirectory="PreserveNewest" />
39
<Content Include="TestData\CustomTable\data\file1.txt" CopyToOutputDirectory="PreserveNewest" />
40
<Content Include="TestData\CustomTable\data\test.txt" CopyToOutputDirectory="PreserveNewest" />