@joebigelow / wix-1 / commits / 7987d2f7

Convert inner text to appropriate attributes

Rob Mensching committed Jun 23, 2020 at 00:58 UTC 7987d2f7e2d47427d7571ab7cc3640d7b0bbb7ff
7 files changed +886 -152
src/WixToolset.Converters/Wix3Converter.cs
+279 -1
@@ -26,16 +26,43 @@ namespace WixToolset.Converters
26 private static readonly XNamespace WixNamespace = "http://wixtoolset.org/schemas/v4/wxs";
27 private static readonly XNamespace WixUtilNamespace = "http://wixtoolset.org/schemas/v4/wxs/util";
28
29 + private static readonly XName AdminExecuteSequenceElementName = WixNamespace + "AdminExecuteSequence";
30 + private static readonly XName AdminUISequenceSequenceElementName = WixNamespace + "AdminUISequence";
31 + private static readonly XName AdvertiseExecuteSequenceElementName = WixNamespace + "AdvertiseExecuteSequence";
32 + private static readonly XName InstallExecuteSequenceElementName = WixNamespace + "InstallExecuteSequence";
33 + private static readonly XName InstallUISequenceSequenceElementName = WixNamespace + "InstallUISequence";
34 + private static readonly XName EmbeddedChainerElementName = WixNamespace + "EmbeddedChainer";
35 private static readonly XName ColumnElementName = WixNamespace + "Column";
36 + private static readonly XName ComponentElementName = WixNamespace + "Component";
37 + private static readonly XName ControlElementName = WixNamespace + "Control";
38 + private static readonly XName ConditionElementName = WixNamespace + "Condition";
39 private static readonly XName CreateFolderElementName = WixNamespace + "CreateFolder";
40 private static readonly XName CustomTableElementName = WixNamespace + "CustomTable";
41 private static readonly XName DirectoryElementName = WixNamespace + "Directory";
42 + private static readonly XName FeatureElementName = WixNamespace + "Feature";
43 private static readonly XName FileElementName = WixNamespace + "File";
44 + private static readonly XName FragmentElementName = WixNamespace + "Fragment";
45 + private static readonly XName ErrorElementName = WixNamespace + "Error";
46 + private static readonly XName LaunchElementName = WixNamespace + "Launch";
47 + private static readonly XName LevelElementName = WixNamespace + "Level";
48 private static readonly XName ExePackageElementName = WixNamespace + "ExePackage";
49 private static readonly XName MsiPackageElementName = WixNamespace + "MsiPackage";
50 private static readonly XName MspPackageElementName = WixNamespace + "MspPackage";
51 private static readonly XName MsuPackageElementName = WixNamespace + "MsuPackage";
52 private static readonly XName PayloadElementName = WixNamespace + "Payload";
53 + private static readonly XName PermissionExElementName = WixNamespace + "PermissionEx";
54 + private static readonly XName ProductElementName = WixNamespace + "Product";
55 + private static readonly XName ProgressTextElementName = WixNamespace + "ProgressText";
56 + private static readonly XName PublishElementName = WixNamespace + "Publish";
57 + private static readonly XName MultiStringValueElementName = WixNamespace + "MultiStringValue";
58 + private static readonly XName RequiredPrivilegeElementName = WixNamespace + "RequiredPrivilege";
59 + private static readonly XName RowElementName = WixNamespace + "Row";
60 + private static readonly XName ServiceArgumentElementName = WixNamespace + "ServiceArgument";
61 + private static readonly XName SetDirectoryElementName = WixNamespace + "SetDirectory";
62 + private static readonly XName SetPropertyElementName = WixNamespace + "SetProperty";
63 + private static readonly XName ShortcutPropertyElementName = WixNamespace + "ShortcutProperty";
64 + private static readonly XName TextElementName = WixNamespace + "Text";
65 + private static readonly XName UITextElementName = WixNamespace + "UIText";
66 private static readonly XName UtilPermissionExElementName = WixUtilNamespace + "PermissionEx";
67 private static readonly XName CustomActionElementName = WixNamespace + "CustomAction";
68 private static readonly XName PropertyElementName = WixNamespace + "Property";
@@ -83,16 +110,40 @@ namespace WixToolset.Converters
110 {
111 this.ConvertElementMapping = new Dictionary<XName, Action<XElement>>
112 {
113 + { Wix3Converter.AdminExecuteSequenceElementName, this.ConvertSequenceElement },
114 + { Wix3Converter.AdminUISequenceSequenceElementName, this.ConvertSequenceElement },
115 + { Wix3Converter.AdvertiseExecuteSequenceElementName, this.ConvertSequenceElement },
116 + { Wix3Converter.InstallUISequenceSequenceElementName, this.ConvertSequenceElement },
117 + { Wix3Converter.InstallExecuteSequenceElementName, this.ConvertSequenceElement },
118 { Wix3Converter.ColumnElementName, this.ConvertColumnElement },
119 { Wix3Converter.CustomTableElementName, this.ConvertCustomTableElement },
120 + { Wix3Converter.ControlElementName, this.ConvertControlElement },
121 + { Wix3Converter.ComponentElementName, this.ConvertComponentElement },
122 { Wix3Converter.DirectoryElementName, this.ConvertDirectoryElement },
123 + { Wix3Converter.FeatureElementName, this.ConvertFeatureElement },
124 { Wix3Converter.FileElementName, this.ConvertFileElement },
125 + { Wix3Converter.FragmentElementName, this.ConvertFragmentElement },
126 + { Wix3Converter.EmbeddedChainerElementName, this.ConvertEmbeddedChainerElement },
127 + { Wix3Converter.ErrorElementName, this.ConvertErrorElement },
128 { Wix3Converter.ExePackageElementName, this.ConvertSuppressSignatureValidation },
129 { Wix3Converter.MsiPackageElementName, this.ConvertSuppressSignatureValidation },
130 { Wix3Converter.MspPackageElementName, this.ConvertSuppressSignatureValidation },
131 { Wix3Converter.MsuPackageElementName, this.ConvertSuppressSignatureValidation },
132 { Wix3Converter.PayloadElementName, this.ConvertSuppressSignatureValidation },
133 + { Wix3Converter.PermissionExElementName, this.ConvertPermissionExElement },
134 + { Wix3Converter.ProductElementName, this.ConvertProductElement },
135 + { Wix3Converter.ProgressTextElementName, this.ConvertProgressTextElement },
136 + { Wix3Converter.PublishElementName, this.ConvertPublishElement },
137 + { Wix3Converter.MultiStringValueElementName, this.ConvertMultiStringValueElement },
138 + { Wix3Converter.RequiredPrivilegeElementName, this.ConvertRequiredPrivilegeElement },
139 + { Wix3Converter.RowElementName, this.ConvertRowElement },
140 { Wix3Converter.CustomActionElementName, this.ConvertCustomActionElement },
141 + { Wix3Converter.ServiceArgumentElementName, this.ConvertServiceArgumentElement },
142 + { Wix3Converter.SetDirectoryElementName, this.ConvertSetDirectoryElement },
143 + { Wix3Converter.SetPropertyElementName, this.ConvertSetPropertyElement },
144 + { Wix3Converter.ShortcutPropertyElementName, this.ConvertShortcutPropertyElement },
145 + { Wix3Converter.TextElementName, this.ConvertTextElement },
146 + { Wix3Converter.UITextElementName, this.ConvertUITextElement },
147 { Wix3Converter.UtilPermissionExElementName, this.ConvertUtilPermissionExElement },
148 { Wix3Converter.PropertyElementName, this.ConvertPropertyElement },
149 { Wix3Converter.WixElementWithoutNamespaceName, this.ConvertElementWithoutNamespace },
@@ -173,6 +224,8 @@ namespace WixToolset.Converters
224 /// <returns>The number of errors found.</returns>
225 public int ConvertDocument(XDocument document)
226 {
227 + this.Errors = 0;
228 +
229 var declaration = document.Declaration;
230
231 // Convert the declaration.
@@ -336,6 +389,36 @@ namespace WixToolset.Converters
389 }
390 }
391
392 + private void ConvertControlElement(XElement element)
393 + {
394 + var xCondition = element.Element(ConditionElementName);
395 + if (xCondition != null)
396 + {
397 + var action = UppercaseFirstChar(xCondition.Attribute("Action")?.Value);
398 + if (!String.IsNullOrEmpty(action) &&
399 + TryGetInnerText(xCondition, out var text) &&
400 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}Condition' attribute instead.", xCondition.Name.LocalName, action))
401 + {
402 + element.Add(new XAttribute(action + "Condition", text));
403 + xCondition.Remove();
404 + }
405 + }
406 + }
407 +
408 + private void ConvertComponentElement(XElement element)
409 + {
410 + var xCondition = element.Element(ConditionElementName);
411 + if (xCondition != null)
412 + {
413 + if (TryGetInnerText(xCondition, out var text) &&
414 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName))
415 + {
416 + element.Add(new XAttribute("Condition", text));
417 + xCondition.Remove();
418 + }
419 + }
420 + }
421 +
422 private void ConvertDirectoryElement(XElement element)
423 {
424 if (null == element.Attribute("Name"))
@@ -353,6 +436,25 @@ namespace WixToolset.Converters
436 }
437 }
438
439 + private void ConvertFeatureElement(XElement element)
440 + {
441 + var xCondition = element.Element(ConditionElementName);
442 + if (xCondition != null)
443 + {
444 + var level = xCondition.Attribute("Level")?.Value;
445 + if (!String.IsNullOrEmpty(level) &&
446 + TryGetInnerText(xCondition, out var text) &&
447 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Level' element instead.", xCondition.Name.LocalName))
448 + {
449 + xCondition.AddAfterSelf(new XElement(LevelElementName,
450 + new XAttribute("Value", level),
451 + new XAttribute("Condition", text)
452 + ));
453 + xCondition.Remove();
454 + }
455 + }
456 + }
457 +
458 private void ConvertFileElement(XElement element)
459 {
460 if (null == element.Attribute("Id"))
@@ -379,6 +481,90 @@ namespace WixToolset.Converters
481 }
482 }
483
484 + private void ConvertFragmentElement(XElement element)
485 + {
486 + var xCondition = element.Element(ConditionElementName);
487 + if (xCondition != null)
488 + {
489 + var message = xCondition.Attribute("Message")?.Value;
490 +
491 + if (!String.IsNullOrEmpty(message) &&
492 + TryGetInnerText(xCondition, out var text) &&
493 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName))
494 + {
495 + xCondition.AddAfterSelf(new XElement(LaunchElementName,
496 + new XAttribute("Condition", text),
497 + new XAttribute("Message", message)
498 + ));
499 + xCondition.Remove();
500 + }
501 + }
502 + }
503 +
504 + private void ConvertEmbeddedChainerElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Condition");
505 +
506 + private void ConvertErrorElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Message");
507 +
508 + private void ConvertPermissionExElement(XElement element)
509 + {
510 + var xCondition = element.Element(ConditionElementName);
511 + if (xCondition != null)
512 + {
513 + if (TryGetInnerText(xCondition, out var text) &&
514 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Condition' attribute instead.", xCondition.Name.LocalName))
515 + {
516 + element.Add(new XAttribute("Condition", text));
517 + xCondition.Remove();
518 + }
519 + }
520 + }
521 +
522 + private void ConvertProgressTextElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Message");
523 +
524 + private void ConvertProductElement(XElement element)
525 + {
526 + var xCondition = element.Element(ConditionElementName);
527 + if (xCondition != null)
528 + {
529 + var message = element.Attribute("Message")?.Value;
530 +
531 + if (!String.IsNullOrEmpty(message) &&
532 + TryGetInnerText(xCondition, out var text) &&
533 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the 'Launch' element instead.", xCondition.Name.LocalName))
534 + {
535 + xCondition.AddAfterSelf(new XElement(LaunchElementName,
536 + new XAttribute("Condition", text),
537 + new XAttribute("Message", message)
538 + ));
539 + xCondition.Remove();
540 + }
541 + }
542 + }
543 +
544 + private void ConvertPublishElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Condition");
545 +
546 + private void ConvertMultiStringValueElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Value");
547 +
548 + private void ConvertRequiredPrivilegeElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Name");
549 +
550 + private void ConvertRowElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Value");
551 +
552 + private void ConvertSequenceElement(XElement element)
553 + {
554 + foreach (var child in element.Elements())
555 + {
556 + this.ConvertInnerTextToAttribute(child, "Condition");
557 + }
558 + }
559 +
560 + private void ConvertServiceArgumentElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Value");
561 +
562 + private void ConvertSetDirectoryElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Condition");
563 +
564 + private void ConvertSetPropertyElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Condition");
565 +
566 + private void ConvertShortcutPropertyElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Value");
567 +
568 private void ConvertSuppressSignatureValidation(XElement element)
569 {
570 var suppressSignatureValidation = element.Attribute("SuppressSignatureValidation");
@@ -397,6 +583,10 @@ namespace WixToolset.Converters
583 }
584 }
585
586 + private void ConvertTextElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Value");
587 +
588 + private void ConvertUITextElement(XElement element) => this.ConvertInnerTextToAttribute(element, "Value");
589 +
590 private void ConvertCustomActionElement(XElement xCustomAction)
591 {
592 var xBinaryKey = xCustomAction.Attribute("BinaryKey");
@@ -436,6 +626,24 @@ namespace WixToolset.Converters
626 xProperty.Value = xProperty.Value.Replace("QtExec", "WixQuietExec");
627 }
628 }
629 +
630 + var xScript = xCustomAction.Attribute("Script");
631 +
632 + if (xScript != null && TryGetInnerText(xCustomAction, out var scriptText))
633 + {
634 + if (this.OnError(ConverterTestType.InnerTextDeprecated, xCustomAction, "Using {0} element text is deprecated. Extract the text to a file and use the 'ScriptFile' attribute to reference it.", xCustomAction.Name.LocalName))
635 + {
636 + var scriptFolder = Path.GetDirectoryName(this.SourceFile) ?? String.Empty;
637 + var id = xCustomAction.Attribute("Id")?.Value ?? Guid.NewGuid().ToString("N");
638 + var ext = (xScript.Value == "jscript") ? ".js" : (xScript.Value == "vbscript") ? ".vbs" : ".txt";
639 +
640 + var scriptFile = Path.Combine(scriptFolder, id + ext);
641 + File.WriteAllText(scriptFile, scriptText);
642 +
643 + RemoveChildren(xCustomAction);
644 + xCustomAction.Add(new XAttribute("ScriptFile", scriptFile));
645 + }
646 + }
647 }
648
649 private void ConvertPropertyElement(XElement xProperty)
@@ -446,6 +654,8 @@ namespace WixToolset.Converters
654 {
655 this.OnError(ConverterTestType.QtExecCmdTimeoutAmbiguous, xProperty, "QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout.");
656 }
657 +
658 + this.ConvertInnerTextToAttribute(xProperty, "Value");
659 }
660
661 private void ConvertUtilPermissionExElement(XElement element)
@@ -483,13 +693,22 @@ namespace WixToolset.Converters
693 }
694 }
695
696 + private void ConvertInnerTextToAttribute(XElement element, string attributeName)
697 + {
698 + if (TryGetInnerText(element, out var text) &&
699 + this.OnError(ConverterTestType.InnerTextDeprecated, element, "Using {0} element text is deprecated. Use the '{1}' attribute instead.", element.Name.LocalName, attributeName))
700 + {
701 + element.Add(new XAttribute(attributeName, text));
702 + RemoveChildren(element);
703 + }
704 + }
705 +
706 private IEnumerable<ConverterTestType> YieldConverterTypes(IEnumerable<string> types)
707 {
708 if (null != types)
709 {
710 foreach (var type in types)
711 {
492 -
712 if (Enum.TryParse<ConverterTestType>(type, true, out var itt))
713 {
714 yield return itt;
@@ -637,6 +856,60 @@ namespace WixToolset.Converters
856 return value;
857 }
858
859 + private static string UppercaseFirstChar(string value)
860 + {
861 + if (!String.IsNullOrEmpty(value))
862 + {
863 + var c = Char.ToUpperInvariant(value[0]);
864 + if (c != value[0])
865 + {
866 + var remainder = value.Length > 1 ? value.Substring(1) : String.Empty;
867 + return c + remainder;
868 + }
869 + }
870 +
871 + return value;
872 + }
873 +
874 + private static bool TryGetInnerText(XElement element, out string value)
875 + {
876 + value = null;
877 +
878 + var nodes = element.Nodes();
879 +
880 + if (nodes.All(e => e.NodeType == XmlNodeType.Text || e.NodeType == XmlNodeType.CDATA))
881 + {
882 + value = String.Join(String.Empty, nodes.Cast<XText>().Select(TrimTextValue));
883 + }
884 +
885 + return !String.IsNullOrEmpty(value);
886 + }
887 +
888 + private static string TrimTextValue(XText text)
889 + {
890 + var value = text.Value;
891 +
892 + if (String.IsNullOrEmpty(value))
893 + {
894 + return String.Empty;
895 + }
896 + else if (text.NodeType == XmlNodeType.CDATA && String.IsNullOrWhiteSpace(value))
897 + {
898 + return " ";
899 + }
900 +
901 + return value.Trim();
902 + }
903 +
904 + private static void RemoveChildren(XElement element)
905 + {
906 + var nodes = element.Nodes().ToList();
907 + foreach (var node in nodes)
908 + {
909 + node.Remove();
910 + }
911 + }
912 +
913 /// <summary>
914 /// Converter test types. These are used to condition error messages down to warnings.
915 /// </summary>
@@ -751,6 +1024,11 @@ namespace WixToolset.Converters
1024 /// Column element's Modularize attribute is camel-case.
1025 /// </summary>
1026 ColumnModularizeCamelCase,
1027 +
1028 + /// <summary>
1029 + /// Inner text value should move to an attribute.
1030 + /// </summary>
1031 + InnerTextDeprecated,
1032 }
1033 }
1034 }
src/test/WixToolsetTest.Converters/ConditionFixture.cs new
+208
@@ -0,0 +1,208 @@
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.Converters
4 +{
5 + using System;
6 + using System.Xml.Linq;
7 + using WixToolset.Converters;
8 + using WixToolsetTest.Converters.Mocks;
9 + using Xunit;
10 +
11 + public class ConditionFixture : BaseConverterFixture
12 + {
13 + [Fact]
14 + public void FixControlCondition()
15 + {
16 + var parse = String.Join(Environment.NewLine,
17 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
18 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
19 + " <Fragment>",
20 + " <UI>",
21 + " <Dialog Id='Dlg1'>",
22 + " <Control Id='Control1'>",
23 + " <Condition Action='hide'>a&lt;>b</Condition>",
24 + " </Control>",
25 + " </Dialog>",
26 + " </UI>",
27 + " </Fragment>",
28 + "</Wix>");
29 +
30 + var expected = new[]
31 + {
32 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
33 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
34 + " <Fragment>",
35 + " <UI>",
36 + " <Dialog Id=\"Dlg1\">",
37 + " <Control Id=\"Control1\" HideCondition=\"a&lt;&gt;b\">",
38 + " ",
39 + " </Control>",
40 + " </Dialog>",
41 + " </UI>",
42 + " </Fragment>",
43 + "</Wix>"
44 + };
45 +
46 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
47 +
48 + var messaging = new MockMessaging();
49 + var converter = new Wix3Converter(messaging, 2, null, null);
50 +
51 + var errors = converter.ConvertDocument(document);
52 + Assert.Equal(3, errors);
53 +
54 + var actualLines = UnformattedDocumentLines(document);
55 + CompareLineByLine(expected, actualLines);
56 + }
57 +
58 + [Fact]
59 + public void FixComponentCondition()
60 + {
61 + var parse = String.Join(Environment.NewLine,
62 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
63 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
64 + " <Fragment>",
65 + " <Component Id='Comp1' Directory='ApplicationFolder'>",
66 + " <Condition>1&lt;2</Condition>",
67 + " </Component>",
68 + " </Fragment>",
69 + "</Wix>");
70 +
71 + var expected = new[]
72 + {
73 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
74 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
75 + " <Fragment>",
76 + " <Component Id=\"Comp1\" Directory=\"ApplicationFolder\" Condition=\"1&lt;2\">",
77 + " ",
78 + " </Component>",
79 + " </Fragment>",
80 + "</Wix>"
81 + };
82 +
83 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
84 +
85 + var messaging = new MockMessaging();
86 + var converter = new Wix3Converter(messaging, 2, null, null);
87 +
88 + var errors = converter.ConvertDocument(document);
89 + Assert.Equal(3, errors);
90 +
91 + var actualLines = UnformattedDocumentLines(document);
92 + CompareLineByLine(expected, actualLines);
93 + }
94 +
95 + [Fact]
96 + public void FixFeatureCondition()
97 + {
98 + var parse = String.Join(Environment.NewLine,
99 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
100 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
101 + " <Fragment>",
102 + " <Feature Id='Feature1'>",
103 + " <Condition Level='0'>PROP = 1</Condition>",
104 + " </Feature>",
105 + " </Fragment>",
106 + "</Wix>");
107 +
108 + var expected = new[]
109 + {
110 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
111 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
112 + " <Fragment>",
113 + " <Feature Id=\"Feature1\">",
114 + " <Level Value=\"0\" Condition=\"PROP = 1\" />",
115 + " </Feature>",
116 + " </Fragment>",
117 + "</Wix>"
118 + };
119 +
120 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
121 +
122 + var messaging = new MockMessaging();
123 + var converter = new Wix3Converter(messaging, 2, null, null);
124 +
125 + var errors = converter.ConvertDocument(document);
126 + Assert.Equal(3, errors);
127 +
128 + var actualLines = UnformattedDocumentLines(document);
129 + CompareLineByLine(expected, actualLines);
130 + }
131 +
132 + [Fact]
133 + public void FixLaunchCondition()
134 + {
135 + var parse = String.Join(Environment.NewLine,
136 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
137 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
138 + " <Fragment>",
139 + " <Condition Message='Stop the install'>",
140 + " 1&lt;2",
141 + " </Condition>",
142 + " </Fragment>",
143 + "</Wix>");
144 +
145 + var expected = new[]
146 + {
147 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
148 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
149 + " <Fragment>",
150 + " <Launch Condition=\"1&lt;2\" Message=\"Stop the install\" />",
151 + " </Fragment>",
152 + "</Wix>"
153 + };
154 +
155 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
156 +
157 + var messaging = new MockMessaging();
158 + var converter = new Wix3Converter(messaging, 2, null, null);
159 +
160 + var errors = converter.ConvertDocument(document);
161 + Assert.Equal(3, errors);
162 +
163 + var actualLines = UnformattedDocumentLines(document);
164 + CompareLineByLine(expected, actualLines);
165 + }
166 +
167 + [Fact]
168 + public void FixPermissionExCondition()
169 + {
170 + var parse = String.Join(Environment.NewLine,
171 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
172 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
173 + " <Fragment>",
174 + " <Component Id='Comp1' Directory='ApplicationFolder'>",
175 + " <PermissionEx Sddl='sddl'>",
176 + " <Condition>1&lt;2</Condition>",
177 + " </PermissionEx>",
178 + " </Component>",
179 + " </Fragment>",
180 + "</Wix>");
181 +
182 + var expected = new[]
183 + {
184 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
185 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
186 + " <Fragment>",
187 + " <Component Id=\"Comp1\" Directory=\"ApplicationFolder\">",
188 + " <PermissionEx Sddl=\"sddl\" Condition=\"1&lt;2\">",
189 + " ",
190 + " </PermissionEx>",
191 + " </Component>",
192 + " </Fragment>",
193 + "</Wix>"
194 + };
195 +
196 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
197 +
198 + var messaging = new MockMessaging();
199 + var converter = new Wix3Converter(messaging, 2, null, null);
200 +
201 + var errors = converter.ConvertDocument(document);
202 + Assert.Equal(3, errors);
203 +
204 + var actualLines = UnformattedDocumentLines(document);
205 + CompareLineByLine(expected, actualLines);
206 + }
207 + }
208 +}
src/test/WixToolsetTest.Converters/ConverterFixture.cs
-151
@@ -168,95 +168,6 @@ namespace WixToolsetTest.Converters
168 Assert.Equal(3, conversions);
169 }
170
171 - [Fact]
172 - public void CanFixCdataWhitespace()
173 - {
174 - var parse = String.Join(Environment.NewLine,
175 - "<?xml version='1.0' encoding='utf-8'?>",
176 - "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
177 - " <Fragment>",
178 - " <Property Id='Prop'>",
179 - " <![CDATA[1<2]]>",
180 - " </Property>",
181 - " </Fragment>",
182 - "</Wix>");
183 -
184 - var expected = String.Join(Environment.NewLine,
185 - "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
186 - "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
187 - " <Fragment>",
188 - " <Property Id=\"Prop\"><![CDATA[1<2]]></Property>",
189 - " </Fragment>",
190 - "</Wix>");
191 -
192 - var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
193 -
194 - var messaging = new MockMessaging();
195 - var converter = new Wix3Converter(messaging, 2, null, null);
196 -
197 - var errors = converter.ConvertDocument(document);
198 -
199 - var actual = UnformattedDocumentString(document);
200 -
201 - Assert.Equal(expected, actual);
202 - Assert.Equal(2, errors);
203 - }
204 -
205 - [Fact]
206 - public void CanFixCdataWithWhitespace()
207 - {
208 - var parse = String.Join(Environment.NewLine,
209 - "<?xml version='1.0' encoding='utf-8'?>",
210 - "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
211 - " <Fragment>",
212 - " <Property Id='Prop'>",
213 - " <![CDATA[",
214 - " 1<2",
215 - " ]]>",
216 - " </Property>",
217 - " </Fragment>",
218 - "</Wix>");
219 -
220 - var expected = String.Join(Environment.NewLine,
221 - "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
222 - "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
223 - " <Fragment>",
224 - " <Property Id=\"Prop\"><![CDATA[1<2]]></Property>",
225 - " </Fragment>",
226 - "</Wix>");
227 -
228 - var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
229 -
230 - var messaging = new MockMessaging();
231 - var converter = new Wix3Converter(messaging, 2, null, null);
232 -
233 - var errors = converter.ConvertDocument(document);
234 -
235 - var actual = UnformattedDocumentString(document);
236 -
237 - Assert.Equal(expected, actual);
238 - Assert.Equal(2, errors);
239 - }
240 -
241 - [Fact]
242 - public void CanKeepCdataWithOnlyWhitespace()
243 - {
244 - var parse = String.Join(Environment.NewLine,
245 - "<?xml version='1.0' encoding='utf-8'?>",
246 - "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
247 - " <Fragment>",
248 - " <Property Id='Prop'><![CDATA[ ]]></Property>",
249 - " </Fragment>",
250 - "</Wix>");
251 -
252 - var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
253 -
254 - var messaging = new MockMessaging();
255 - var converter = new Wix3Converter(messaging, 2, null, null);
256 - var errors = converter.ConvertDocument(document);
257 - Assert.Equal(0, errors);
258 - }
259 -
171 [Fact]
172 public void CanConvertMainNamespace()
173 {
@@ -474,34 +385,6 @@ namespace WixToolsetTest.Converters
385 Assert.Equal(expected, actual);
386 }
387
477 - [Fact]
478 - public void CanConvertCustomTableBootstrapperApplicationData()
479 - {
480 - var parse = String.Join(Environment.NewLine,
481 - "<?xml version='1.0' encoding='utf-8'?>",
482 - "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
483 - " <CustomTable Id='FgAppx' BootstrapperApplicationData='yes' />",
484 - "</Wix>");
485 -
486 - var expected = String.Join(Environment.NewLine,
487 - "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
488 - "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
489 - " <CustomTable Id=\"FgAppx\" Unreal=\"yes\" />",
490 - "</Wix>");
491 -
492 - var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
493 -
494 - var messaging = new MockMessaging();
495 - var converter = new Wix3Converter(messaging, 2, null, null);
496 -
497 - var errors = converter.ConvertDocument(document);
498 -
499 - var actual = UnformattedDocumentString(document);
500 -
501 - Assert.Equal(1, errors);
502 - Assert.Equal(expected, actual);
503 - }
504 -
388 [Fact]
389 public void CanConvertShortNameDirectoryWithoutName()
390 {
@@ -585,39 +468,5 @@ namespace WixToolsetTest.Converters
468 Assert.Equal(1, errors);
469 Assert.Equal(expected, actual);
470 }
588 -
589 - [Fact]
590 - public void CanConvertCustomAction()
591 - {
592 - var parse = String.Join(Environment.NewLine,
593 - "<?xml version='1.0' encoding='utf-8'?>",
594 - "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
595 - " <CustomAction Id='Foo' BinaryKey='WixCA' DllEntry='CAQuietExec' />",
596 - " <CustomAction Id='Foo' BinaryKey='WixCA_x64' DllEntry='CAQuietExec64' />",
597 - " <CustomAction Id='Foo' BinaryKey='UtilCA' DllEntry='WixQuietExec' />",
598 - " <CustomAction Id='Foo' BinaryKey='UtilCA_x64' DllEntry='WixQuietExec64' />",
599 - "</Wix>");
600 -
601 - var expected = String.Join(Environment.NewLine,
602 - "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
603 - "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
604 - " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X86\" DllEntry=\"WixQuietExec\" />",
605 - " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X64\" DllEntry=\"WixQuietExec64\" />",
606 - " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X86\" DllEntry=\"WixQuietExec\" />",
607 - " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X64\" DllEntry=\"WixQuietExec64\" />",
608 - "</Wix>");
609 -
610 - var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
611 -
612 - var messaging = new MockMessaging();
613 - var converter = new Wix3Converter(messaging, 2, null, null);
614 -
615 - var errors = converter.ConvertDocument(document);
616 -
617 - var actual = UnformattedDocumentString(document);
618 -
619 - Assert.Equal(6, errors);
620 - Assert.Equal(expected, actual);
621 - }
471 }
472 }
src/test/WixToolsetTest.Converters/CustomActionFixture.cs new
+90
@@ -0,0 +1,90 @@
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.Converters
4 +{
5 + using System;
6 + using System.IO;
7 + using System.Xml.Linq;
8 + using WixToolset.Converters;
9 + using WixToolsetTest.Converters.Mocks;
10 + using Xunit;
11 +
12 + public class CustomActionFixture : BaseConverterFixture
13 + {
14 + [Fact]
15 + public void CanConvertCustomAction()
16 + {
17 + var parse = String.Join(Environment.NewLine,
18 + "<?xml version='1.0' encoding='utf-8'?>",
19 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
20 + " <CustomAction Id='Foo' BinaryKey='WixCA' DllEntry='CAQuietExec' />",
21 + " <CustomAction Id='Foo' BinaryKey='WixCA_x64' DllEntry='CAQuietExec64' />",
22 + " <CustomAction Id='Foo' BinaryKey='UtilCA' DllEntry='WixQuietExec' />",
23 + " <CustomAction Id='Foo' BinaryKey='UtilCA_x64' DllEntry='WixQuietExec64' />",
24 + "</Wix>");
25 +
26 + var expected = String.Join(Environment.NewLine,
27 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
28 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
29 + " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X86\" DllEntry=\"WixQuietExec\" />",
30 + " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X64\" DllEntry=\"WixQuietExec64\" />",
31 + " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X86\" DllEntry=\"WixQuietExec\" />",
32 + " <CustomAction Id=\"Foo\" BinaryKey=\"Wix4UtilCA_X64\" DllEntry=\"WixQuietExec64\" />",
33 + "</Wix>");
34 +
35 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
36 +
37 + var messaging = new MockMessaging();
38 + var converter = new Wix3Converter(messaging, 2, null, null);
39 +
40 + var errors = converter.ConvertDocument(document);
41 +
42 + var actual = UnformattedDocumentString(document);
43 +
44 + Assert.Equal(6, errors);
45 + Assert.Equal(expected, actual);
46 + }
47 +
48 + [Fact]
49 + public void CanConvertCustomActionScript()
50 + {
51 + var parse = String.Join(Environment.NewLine,
52 + "<?xml version='1.0' encoding='utf-8'?>",
53 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
54 + " <CustomAction Id='Foo' Script='jscript'>",
55 + " function() {",
56 + " var x = 0;",
57 + " return x;",
58 + " }",
59 + " </CustomAction>",
60 + "</Wix>");
61 +
62 + var expected = String.Join(Environment.NewLine,
63 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
64 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
65 + " <CustomAction Id=\"Foo\" Script=\"jscript\" ScriptFile=\"Foo.js\" />",
66 + "</Wix>");
67 +
68 + var expectedScript = String.Join("\n",
69 + "function() {",
70 + " var x = 0;",
71 + " return x;",
72 + " }");
73 +
74 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
75 +
76 + var messaging = new MockMessaging();
77 + var converter = new Wix3Converter(messaging, 2, null, null);
78 +
79 + var errors = converter.ConvertDocument(document);
80 +
81 + var actual = UnformattedDocumentString(document);
82 +
83 + Assert.Equal(1, errors);
84 + Assert.Equal(expected, actual);
85 +
86 + var script = File.ReadAllText("Foo.js");
87 + Assert.Equal(expectedScript, script);
88 + }
89 + }
90 +}
src/test/WixToolsetTest.Converters/CustomTableFixture.cs
+145
@@ -46,5 +46,150 @@ namespace WixToolsetTest.Converters
46 var actualLines = UnformattedDocumentLines(document);
47 CompareLineByLine(expected, actualLines);
48 }
49 +
50 + [Fact]
51 + public void FixCustomRowTextValue()
52 + {
53 + var parse = String.Join(Environment.NewLine,
54 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
55 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
56 + " <Fragment>",
57 + " <CustomTable Id='Custom1'>",
58 + " <Row Id='Column1'>",
59 + " Some value",
60 + " </Row>",
61 + " </CustomTable>",
62 + " </Fragment>",
63 + "</Wix>");
64 +
65 + var expected = new[]
66 + {
67 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
68 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
69 + " <Fragment>",
70 + " <CustomTable Id=\"Custom1\">",
71 + " <Row Id=\"Column1\" Value=\"Some value\" />",
72 + " </CustomTable>",
73 + " </Fragment>",
74 + "</Wix>"
75 + };
76 +
77 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
78 +
79 + var messaging = new MockMessaging();
80 + var converter = new Wix3Converter(messaging, 2, null, null);
81 +
82 + var errors = converter.ConvertDocument(document);
83 + Assert.Equal(3, errors);
84 +
85 + var actualLines = UnformattedDocumentLines(document);
86 + CompareLineByLine(expected, actualLines);
87 + }
88 +
89 + [Fact]
90 + public void FixCustomRowCdataValue()
91 + {
92 + var parse = String.Join(Environment.NewLine,
93 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
94 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
95 + " <Fragment>",
96 + " <CustomTable Id='Custom1'>",
97 + " <Row Id='Column1'>",
98 + " <![CDATA[",
99 + " Some value",
100 + " ]]>",
101 + " </Row>",
102 + " </CustomTable>",
103 + " </Fragment>",
104 + "</Wix>");
105 +
106 + var expected = new[]
107 + {
108 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
109 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
110 + " <Fragment>",
111 + " <CustomTable Id=\"Custom1\">",
112 + " <Row Id=\"Column1\" Value=\"Some value\" />",
113 + " </CustomTable>",
114 + " </Fragment>",
115 + "</Wix>"
116 + };
117 +
118 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
119 +
120 + var messaging = new MockMessaging();
121 + var converter = new Wix3Converter(messaging, 2, null, null);
122 +
123 + var errors = converter.ConvertDocument(document);
124 + Assert.Equal(3, errors);
125 +
126 + var actualLines = UnformattedDocumentLines(document);
127 + CompareLineByLine(expected, actualLines);
128 + }
129 +
130 + [Fact]
131 + public void FixCustomRowWithoutValue()
132 + {
133 + var parse = String.Join(Environment.NewLine,
134 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
135 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
136 + " <Fragment>",
137 + " <CustomTable Id='Custom1'>",
138 + " <Row Id='Column1'></Row>",
139 + " </CustomTable>",
140 + " </Fragment>",
141 + "</Wix>");
142 +
143 + var expected = new[]
144 + {
145 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
146 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
147 + " <Fragment>",
148 + " <CustomTable Id=\"Custom1\">",
149 + " <Row Id=\"Column1\"></Row>",
150 + " </CustomTable>",
151 + " </Fragment>",
152 + "</Wix>"
153 + };
154 +
155 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
156 +
157 + var messaging = new MockMessaging();
158 + var converter = new Wix3Converter(messaging, 2, null, null);
159 +
160 + var errors = converter.ConvertDocument(document);
161 + Assert.Equal(2, errors);
162 +
163 + var actualLines = UnformattedDocumentLines(document);
164 + CompareLineByLine(expected, actualLines);
165 + }
166 +
167 + [Fact]
168 + public void CanConvertCustomTableBootstrapperApplicationData()
169 + {
170 + var parse = String.Join(Environment.NewLine,
171 + "<?xml version='1.0' encoding='utf-8'?>",
172 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
173 + " <CustomTable Id='FgAppx' BootstrapperApplicationData='yes' />",
174 + "</Wix>");
175 +
176 + var expected = String.Join(Environment.NewLine,
177 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
178 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
179 + " <CustomTable Id=\"FgAppx\" Unreal=\"yes\" />",
180 + "</Wix>");
181 +
182 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
183 +
184 + var messaging = new MockMessaging();
185 + var converter = new Wix3Converter(messaging, 2, null, null);
186 +
187 + var errors = converter.ConvertDocument(document);
188 +
189 + var actual = UnformattedDocumentString(document);
190 +
191 + Assert.Equal(1, errors);
192 + Assert.Equal(expected, actual);
193 + }
194 }
195 }
src/test/WixToolsetTest.Converters/PropertyFixture.cs new
+114
@@ -0,0 +1,114 @@
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.Converters
4 +{
5 + using System;
6 + using System.Xml.Linq;
7 + using WixToolset.Converters;
8 + using WixToolsetTest.Converters.Mocks;
9 + using Xunit;
10 +
11 + public class PropertyFixture : BaseConverterFixture
12 + {
13 + [Fact]
14 + public void CanFixCdataWhitespace()
15 + {
16 + var parse = String.Join(Environment.NewLine,
17 + "<?xml version='1.0' encoding='utf-8'?>",
18 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
19 + " <Fragment>",
20 + " <Property Id='Prop'>",
21 + " <![CDATA[1<2]]>",
22 + " </Property>",
23 + " </Fragment>",
24 + "</Wix>");
25 +
26 + var expected = String.Join(Environment.NewLine,
27 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
28 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
29 + " <Fragment>",
30 + " <Property Id=\"Prop\" Value=\"1&lt;2\" />",
31 + " </Fragment>",
32 + "</Wix>");
33 +
34 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
35 +
36 + var messaging = new MockMessaging();
37 + var converter = new Wix3Converter(messaging, 2, null, null);
38 +
39 + var errors = converter.ConvertDocument(document);
40 +
41 + var actual = UnformattedDocumentString(document);
42 +
43 + Assert.Equal(expected, actual);
44 + Assert.Equal(1, errors);
45 + }
46 +
47 + [Fact]
48 + public void CanFixCdataWithWhitespace()
49 + {
50 + var parse = String.Join(Environment.NewLine,
51 + "<?xml version='1.0' encoding='utf-8'?>",
52 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
53 + " <Fragment>",
54 + " <Property Id='Prop'>",
55 + " <![CDATA[",
56 + " 1<2",
57 + " ]]>",
58 + " </Property>",
59 + " </Fragment>",
60 + "</Wix>");
61 +
62 + var expected = String.Join(Environment.NewLine,
63 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
64 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
65 + " <Fragment>",
66 + " <Property Id=\"Prop\" Value=\"1&lt;2\" />",
67 + " </Fragment>",
68 + "</Wix>");
69 +
70 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
71 +
72 + var messaging = new MockMessaging();
73 + var converter = new Wix3Converter(messaging, 2, null, null);
74 +
75 + var errors = converter.ConvertDocument(document);
76 +
77 + var actual = UnformattedDocumentString(document);
78 +
79 + Assert.Equal(expected, actual);
80 + Assert.Equal(1, errors);
81 + }
82 +
83 + [Fact]
84 + public void CanKeepCdataWithOnlyWhitespace()
85 + {
86 + var parse = String.Join(Environment.NewLine,
87 + "<?xml version='1.0' encoding='utf-8'?>",
88 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
89 + " <Fragment>",
90 + " <Property Id='Prop'><![CDATA[ ]]></Property>",
91 + " </Fragment>",
92 + "</Wix>");
93 +
94 + var expected = String.Join(Environment.NewLine,
95 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
96 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
97 + " <Fragment>",
98 + " <Property Id=\"Prop\" Value=\" \" />",
99 + " </Fragment>",
100 + "</Wix>");
101 +
102 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
103 +
104 + var messaging = new MockMessaging();
105 + var converter = new Wix3Converter(messaging, 2, null, null);
106 + var errors = converter.ConvertDocument(document);
107 +
108 + var actual = UnformattedDocumentString(document);
109 +
110 + Assert.Equal(expected, actual);
111 + Assert.Equal(1, errors);
112 + }
113 + }
114 +}
src/test/WixToolsetTest.Converters/SequenceFixture.cs new
+50
@@ -0,0 +1,50 @@
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.Converters
4 +{
5 + using System;
6 + using System.Xml.Linq;
7 + using WixToolset.Converters;
8 + using WixToolsetTest.Converters.Mocks;
9 + using Xunit;
10 +
11 + public class SequenceFixture : BaseConverterFixture
12 + {
13 + [Fact]
14 + public void FixCondition()
15 + {
16 + var parse = String.Join(Environment.NewLine,
17 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
18 + "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
19 + " <Fragment>",
20 + " <InstallUISequence>",
21 + " <Custom Action='ExampleCA' After='InstallFiles'>NOT Installed</Custom>",
22 + " </InstallUISequence>",
23 + " </Fragment>",
24 + "</Wix>");
25 +
26 + var expected = new[]
27 + {
28 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
29 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
30 + " <Fragment>",
31 + " <InstallUISequence>",
32 + " <Custom Action=\"ExampleCA\" After=\"InstallFiles\" Condition=\"NOT Installed\" />",
33 + " </InstallUISequence>",
34 + " </Fragment>",
35 + "</Wix>"
36 + };
37 +
38 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
39 +
40 + var messaging = new MockMessaging();
41 + var converter = new Wix3Converter(messaging, 2, null, null);
42 +
43 + var errors = converter.ConvertDocument(document);
44 + Assert.Equal(3, errors);
45 +
46 + var actualLines = UnformattedDocumentLines(document);
47 + CompareLineByLine(expected, actualLines);
48 + }
49 + }
50 +}