diff options
Diffstat (limited to 'src/api')
-rw-r--r-- | src/api/wix/WixToolset.Data/WixVersion.cs | 335 | ||||
-rw-r--r-- | src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs | 408 |
2 files changed, 0 insertions, 743 deletions
diff --git a/src/api/wix/WixToolset.Data/WixVersion.cs b/src/api/wix/WixToolset.Data/WixVersion.cs deleted file mode 100644 index a0de7a10..00000000 --- a/src/api/wix/WixToolset.Data/WixVersion.cs +++ /dev/null | |||
@@ -1,335 +0,0 @@ | |||
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 WixToolset.Data | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | |||
8 | /// <summary> | ||
9 | /// WiX Toolset's representation of a version designed to support | ||
10 | /// a different version types including 4-part versions with very | ||
11 | /// large numbers and semantic versions with 4-part versions with | ||
12 | /// or without leading "v" indicators. | ||
13 | /// </summary> | ||
14 | [CLSCompliant(false)] | ||
15 | public class WixVersion | ||
16 | { | ||
17 | /// <summary> | ||
18 | /// Gets the prefix of the version if present when parsed. Usually, 'v' or 'V'. | ||
19 | /// </summary> | ||
20 | public char? Prefix { get; set; } | ||
21 | |||
22 | /// <summary> | ||
23 | /// Gets or sets the major version. | ||
24 | /// </summary> | ||
25 | public uint Major { get; set; } | ||
26 | |||
27 | /// <summary> | ||
28 | /// Gets or sets the minor version. | ||
29 | /// </summary> | ||
30 | public uint Minor { get; set; } | ||
31 | |||
32 | /// <summary> | ||
33 | /// Gets or sets the patch version. | ||
34 | /// </summary> | ||
35 | public uint Patch { get; set; } | ||
36 | |||
37 | /// <summary> | ||
38 | /// Gets or sets the revision version. | ||
39 | /// </summary> | ||
40 | public uint Revision { get; set; } | ||
41 | |||
42 | /// <summary> | ||
43 | /// Gets or sets whether the version did not parse correctly. | ||
44 | /// </summary> | ||
45 | public bool Invalid { get; set; } | ||
46 | |||
47 | /// <summary> | ||
48 | /// Gets or sets whether the major version was defined. | ||
49 | /// </summary> | ||
50 | public bool HasMajor { get; set; } | ||
51 | |||
52 | /// <summary> | ||
53 | /// Gets or sets the whether the minor version was defined. | ||
54 | /// </summary> | ||
55 | public bool HasMinor { get; set; } | ||
56 | |||
57 | /// <summary> | ||
58 | /// Gets or sets the whether the patch version was defined. | ||
59 | /// </summary> | ||
60 | public bool HasPatch { get; set; } | ||
61 | |||
62 | /// <summary> | ||
63 | /// Gets or sets the whether the revision version was defined. | ||
64 | /// </summary> | ||
65 | public bool HasRevision { get; set; } | ||
66 | |||
67 | /// <summary> | ||
68 | /// Gets or sets the labels in the version. | ||
69 | /// </summary> | ||
70 | public WixVersionLabel[] Labels { get; set; } | ||
71 | |||
72 | /// <summary> | ||
73 | /// Gets or sets the metadata in the version. | ||
74 | /// </summary> | ||
75 | public string Metadata { get; set; } | ||
76 | |||
77 | /// <summary> | ||
78 | /// Parse a string value into a <c>WixVersion</c>. The returned version may be invalid. | ||
79 | /// </summary> | ||
80 | /// <param name="parse">String value to parse into a version.</param> | ||
81 | /// <returns>Parsed version.</returns> | ||
82 | public static WixVersion Parse(string parse) | ||
83 | { | ||
84 | var version = new WixVersion(); | ||
85 | |||
86 | var labels = new List<WixVersionLabel>(); | ||
87 | var start = 0; | ||
88 | var end = parse.Length; | ||
89 | |||
90 | if (end > 0 && (parse[0] == 'v' || parse[0] == 'V')) | ||
91 | { | ||
92 | version.Prefix = parse[0]; | ||
93 | |||
94 | ++start; | ||
95 | } | ||
96 | |||
97 | var partBegin = start; | ||
98 | var partEnd = start; | ||
99 | var lastPart = false; | ||
100 | var trailingDot = false; | ||
101 | var invalid = false; | ||
102 | var currentPart = 0; | ||
103 | var parsedVersionNumber = false; | ||
104 | var expectedReleaseLabels = false; | ||
105 | |||
106 | // Parse version number | ||
107 | while (start < end) | ||
108 | { | ||
109 | trailingDot = false; | ||
110 | |||
111 | // Find end of part. | ||
112 | for (; ; ) | ||
113 | { | ||
114 | if (partEnd >= end) | ||
115 | { | ||
116 | lastPart = true; | ||
117 | break; | ||
118 | } | ||
119 | |||
120 | var ch = parse[partEnd]; | ||
121 | |||
122 | switch (ch) | ||
123 | { | ||
124 | case '0': | ||
125 | case '1': | ||
126 | case '2': | ||
127 | case '3': | ||
128 | case '4': | ||
129 | case '5': | ||
130 | case '6': | ||
131 | case '7': | ||
132 | case '8': | ||
133 | case '9': | ||
134 | ++partEnd; | ||
135 | continue; | ||
136 | case '.': | ||
137 | trailingDot = true; | ||
138 | break; | ||
139 | case '-': | ||
140 | case '+': | ||
141 | lastPart = true; | ||
142 | break; | ||
143 | default: | ||
144 | invalid = true; | ||
145 | break; | ||
146 | } | ||
147 | |||
148 | break; | ||
149 | } | ||
150 | |||
151 | var partLength = partEnd - partBegin; | ||
152 | if (invalid || partLength <= 0) | ||
153 | { | ||
154 | invalid = true; | ||
155 | break; | ||
156 | } | ||
157 | |||
158 | // Parse version part. | ||
159 | var s = parse.Substring(partBegin, partLength); | ||
160 | if (!UInt32.TryParse(s, out var part)) | ||
161 | { | ||
162 | invalid = true; | ||
163 | break; | ||
164 | } | ||
165 | |||
166 | switch (currentPart) | ||
167 | { | ||
168 | case 0: | ||
169 | version.Major = part; | ||
170 | version.HasMajor = true; | ||
171 | break; | ||
172 | case 1: | ||
173 | version.Minor = part; | ||
174 | version.HasMinor = true; | ||
175 | break; | ||
176 | case 2: | ||
177 | version.Patch = part; | ||
178 | version.HasPatch = true; | ||
179 | break; | ||
180 | case 3: | ||
181 | version.Revision = part; | ||
182 | version.HasRevision = true; | ||
183 | break; | ||
184 | } | ||
185 | |||
186 | if (trailingDot) | ||
187 | { | ||
188 | ++partEnd; | ||
189 | } | ||
190 | partBegin = partEnd; | ||
191 | ++currentPart; | ||
192 | |||
193 | if (4 <= currentPart || lastPart) | ||
194 | { | ||
195 | parsedVersionNumber = true; | ||
196 | break; | ||
197 | } | ||
198 | } | ||
199 | |||
200 | invalid |= !parsedVersionNumber || trailingDot; | ||
201 | |||
202 | if (!invalid && partBegin < end && parse[partBegin] == '-') | ||
203 | { | ||
204 | partBegin = partEnd = partBegin + 1; | ||
205 | expectedReleaseLabels = true; | ||
206 | lastPart = false; | ||
207 | } | ||
208 | |||
209 | while (expectedReleaseLabels && partBegin < end) | ||
210 | { | ||
211 | trailingDot = false; | ||
212 | |||
213 | // Find end of part. | ||
214 | for (; ; ) | ||
215 | { | ||
216 | if (partEnd >= end) | ||
217 | { | ||
218 | lastPart = true; | ||
219 | break; | ||
220 | } | ||
221 | |||
222 | var ch = parse[partEnd]; | ||
223 | if (ch >= '0' && ch <= '9' || | ||
224 | ch >= 'A' && ch <= 'Z' || | ||
225 | ch >= 'a' && ch <= 'z' || | ||
226 | ch == '-') | ||
227 | { | ||
228 | ++partEnd; | ||
229 | continue; | ||
230 | } | ||
231 | else if (ch == '+') | ||
232 | { | ||
233 | lastPart = true; | ||
234 | } | ||
235 | else if (ch == '.') | ||
236 | { | ||
237 | trailingDot = true; | ||
238 | } | ||
239 | else | ||
240 | { | ||
241 | invalid = true; | ||
242 | } | ||
243 | |||
244 | break; | ||
245 | } | ||
246 | |||
247 | var partLength = partEnd - partBegin; | ||
248 | if (invalid || partLength <= 0) | ||
249 | { | ||
250 | invalid = true; | ||
251 | break; | ||
252 | } | ||
253 | |||
254 | WixVersionLabel label; | ||
255 | var partString = parse.Substring(partBegin, partLength); | ||
256 | if (UInt32.TryParse(partString, out var numericPart)) | ||
257 | { | ||
258 | label = new WixVersionLabel(partString, numericPart); | ||
259 | } | ||
260 | else | ||
261 | { | ||
262 | label = new WixVersionLabel(partString); | ||
263 | } | ||
264 | |||
265 | labels.Add(label); | ||
266 | |||
267 | if (trailingDot) | ||
268 | { | ||
269 | ++partEnd; | ||
270 | } | ||
271 | partBegin = partEnd; | ||
272 | |||
273 | if (lastPart) | ||
274 | { | ||
275 | break; | ||
276 | } | ||
277 | } | ||
278 | |||
279 | invalid |= expectedReleaseLabels && (labels.Count == 0 || trailingDot); | ||
280 | |||
281 | if (!invalid && partBegin < end) | ||
282 | { | ||
283 | if (parse[partBegin] == '+') | ||
284 | { | ||
285 | version.Metadata = parse.Substring(partBegin + 1); | ||
286 | } | ||
287 | else | ||
288 | { | ||
289 | invalid = true; | ||
290 | } | ||
291 | } | ||
292 | |||
293 | version.Labels = labels.Count == 0 ? null : labels.ToArray(); | ||
294 | |||
295 | if (invalid) | ||
296 | { | ||
297 | // If the prefix was parsed but the rest of the version was | ||
298 | // invalid, store the full invalid version in the Metadata | ||
299 | // and clear the prefix. | ||
300 | if (version.Prefix.HasValue && partBegin == 1) | ||
301 | { | ||
302 | version.Prefix = null; | ||
303 | version.Metadata = parse; | ||
304 | } | ||
305 | else // store the remaining invalid content in Metadata. | ||
306 | { | ||
307 | version.Metadata = (partBegin < end) ? parse.Substring(partBegin) : String.Empty; | ||
308 | } | ||
309 | |||
310 | version.Invalid = true; | ||
311 | } | ||
312 | |||
313 | return version; | ||
314 | } | ||
315 | |||
316 | /// <summary> | ||
317 | /// Tries to parse a string value into a valid <c>WixVersion</c>. | ||
318 | /// </summary> | ||
319 | /// <param name="parse">String value to parse into a version.</param> | ||
320 | /// <param name="version">Parsed version.</param> | ||
321 | /// <returns>True if the version was successfully parsed, or false otherwise.</returns> | ||
322 | public static bool TryParse(string parse, out WixVersion version) | ||
323 | { | ||
324 | version = WixVersion.Parse(parse); | ||
325 | |||
326 | if (version.Invalid) | ||
327 | { | ||
328 | version = null; | ||
329 | return false; | ||
330 | } | ||
331 | |||
332 | return true; | ||
333 | } | ||
334 | } | ||
335 | } | ||
diff --git a/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs b/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs deleted file mode 100644 index 56c72896..00000000 --- a/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs +++ /dev/null | |||
@@ -1,408 +0,0 @@ | |||
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.Data | ||
4 | { | ||
5 | using System; | ||
6 | using System.Linq; | ||
7 | using WixToolset.Data; | ||
8 | using Xunit; | ||
9 | |||
10 | public class WixVerFixture | ||
11 | { | ||
12 | [Fact] | ||
13 | public void CannotParseEmptyStringAsVersion() | ||
14 | { | ||
15 | Assert.False(WixVersion.TryParse(String.Empty, out var version)); | ||
16 | Assert.Null(version); | ||
17 | } | ||
18 | |||
19 | [Fact] | ||
20 | public void CanParseEmptyStringAsInvalidVersion() | ||
21 | { | ||
22 | var version = WixVersion.Parse(String.Empty); | ||
23 | Assert.Empty(version.Metadata); | ||
24 | Assert.True(version.Invalid); | ||
25 | } | ||
26 | |||
27 | [Fact] | ||
28 | public void CannotParseInvalidStringAsVersion() | ||
29 | { | ||
30 | Assert.False(WixVersion.TryParse("invalid", out var version)); | ||
31 | Assert.Null(version); | ||
32 | } | ||
33 | |||
34 | [Fact] | ||
35 | public void CanParseInvalidStringAsInvalidVersion() | ||
36 | { | ||
37 | var version = WixVersion.Parse("invalid"); | ||
38 | Assert.Equal("invalid", version.Metadata); | ||
39 | Assert.True(version.Invalid); | ||
40 | } | ||
41 | |||
42 | [Fact] | ||
43 | public void CanParseFourPartVersion() | ||
44 | { | ||
45 | Assert.True(WixVersion.TryParse("1.2.3.4", out var version)); | ||
46 | Assert.Null(version.Prefix); | ||
47 | Assert.Equal((uint)1, version.Major); | ||
48 | Assert.Equal((uint)2, version.Minor); | ||
49 | Assert.Equal((uint)3, version.Patch); | ||
50 | Assert.Equal((uint)4, version.Revision); | ||
51 | Assert.True(version.HasMajor); | ||
52 | Assert.True(version.HasMinor); | ||
53 | Assert.True(version.HasPatch); | ||
54 | Assert.True(version.HasRevision); | ||
55 | Assert.Null(version.Labels); | ||
56 | Assert.Null(version.Metadata); | ||
57 | Assert.False(version.Invalid); | ||
58 | } | ||
59 | |||
60 | [Fact] | ||
61 | public void CanParseThreePartVersion() | ||
62 | { | ||
63 | Assert.True(WixVersion.TryParse("1.2.3", out var version)); | ||
64 | Assert.Null(version.Prefix); | ||
65 | Assert.Equal((uint)1, version.Major); | ||
66 | Assert.Equal((uint)2, version.Minor); | ||
67 | Assert.Equal((uint)3, version.Patch); | ||
68 | Assert.Equal((uint)0, version.Revision); | ||
69 | Assert.True(version.HasMajor); | ||
70 | Assert.True(version.HasMinor); | ||
71 | Assert.True(version.HasPatch); | ||
72 | Assert.False(version.HasRevision); | ||
73 | Assert.Null(version.Labels); | ||
74 | Assert.Null(version.Metadata); | ||
75 | Assert.False(version.Invalid); | ||
76 | } | ||
77 | |||
78 | [Fact] | ||
79 | public void CanParseFourPartVersionWithTrailingZero() | ||
80 | { | ||
81 | Assert.True(WixVersion.TryParse("1.2.3.0", out var version)); | ||
82 | Assert.Null(version.Prefix); | ||
83 | Assert.Equal((uint)1, version.Major); | ||
84 | Assert.Equal((uint)2, version.Minor); | ||
85 | Assert.Equal((uint)3, version.Patch); | ||
86 | Assert.Equal((uint)0, version.Revision); | ||
87 | Assert.True(version.HasMajor); | ||
88 | Assert.True(version.HasMinor); | ||
89 | Assert.True(version.HasPatch); | ||
90 | Assert.True(version.HasRevision); | ||
91 | Assert.Null(version.Labels); | ||
92 | Assert.Null(version.Metadata); | ||
93 | Assert.False(version.Invalid); | ||
94 | } | ||
95 | |||
96 | [Fact] | ||
97 | public void CanParseNumericReleaseLabels() | ||
98 | { | ||
99 | Assert.True(WixVersion.TryParse("1.2-19", out var version)); | ||
100 | Assert.Null(version.Prefix); | ||
101 | Assert.Equal((uint)1, version.Major); | ||
102 | Assert.Equal((uint)2, version.Minor); | ||
103 | Assert.Equal((uint)0, version.Patch); | ||
104 | Assert.Equal((uint)0, version.Revision); | ||
105 | Assert.True(version.HasMajor); | ||
106 | Assert.True(version.HasMinor); | ||
107 | Assert.False(version.HasPatch); | ||
108 | Assert.False(version.HasRevision); | ||
109 | Assert.Equal(new[] { "19" }, version.Labels.Select(l => l.Label).ToArray()); | ||
110 | Assert.Equal(new uint?[] { 19 }, version.Labels.Select(l => l.Numeric).ToArray()); | ||
111 | Assert.Null(version.Metadata); | ||
112 | Assert.False(version.Invalid); | ||
113 | } | ||
114 | |||
115 | [Fact] | ||
116 | public void CanParseDottedNumericReleaseLabels() | ||
117 | { | ||
118 | Assert.True(WixVersion.TryParse("1.2-2.0", out var version)); | ||
119 | Assert.Null(version.Prefix); | ||
120 | Assert.Equal((uint)1, version.Major); | ||
121 | Assert.Equal((uint)2, version.Minor); | ||
122 | Assert.Equal((uint)0, version.Patch); | ||
123 | Assert.Equal((uint)0, version.Revision); | ||
124 | Assert.True(version.HasMajor); | ||
125 | Assert.True(version.HasMinor); | ||
126 | Assert.False(version.HasPatch); | ||
127 | Assert.False(version.HasRevision); | ||
128 | Assert.Equal(new[] { "2", "0" }, version.Labels.Select(l => l.Label).ToArray()); | ||
129 | Assert.Equal(new uint?[] { 2, 0 }, version.Labels.Select(l => l.Numeric).ToArray()); | ||
130 | Assert.Null(version.Metadata); | ||
131 | Assert.False(version.Invalid); | ||
132 | } | ||
133 | |||
134 | [Fact] | ||
135 | public void CanParseHyphenAsVersionSeparator() | ||
136 | { | ||
137 | Assert.True(WixVersion.TryParse("0.0.1-a", out var version)); | ||
138 | Assert.Null(version.Prefix); | ||
139 | Assert.Equal((uint)0, version.Major); | ||
140 | Assert.Equal((uint)0, version.Minor); | ||
141 | Assert.Equal((uint)1, version.Patch); | ||
142 | Assert.Equal((uint)0, version.Revision); | ||
143 | Assert.True(version.HasMajor); | ||
144 | Assert.True(version.HasMinor); | ||
145 | Assert.True(version.HasPatch); | ||
146 | Assert.False(version.HasRevision); | ||
147 | Assert.Equal(new[] { "a" }, version.Labels.Select(l => l.Label).ToArray()); | ||
148 | Assert.Equal(new uint?[] { null }, version.Labels.Select(l => l.Numeric).ToArray()); | ||
149 | Assert.Null(version.Metadata); | ||
150 | Assert.False(version.Invalid); | ||
151 | } | ||
152 | |||
153 | [Fact] | ||
154 | public void CanParseIgnoringLeadingZeros() | ||
155 | { | ||
156 | Assert.True(WixVersion.TryParse("0.01-a.000", out var version)); | ||
157 | Assert.Null(version.Prefix); | ||
158 | Assert.Equal((uint)0, version.Major); | ||
159 | Assert.Equal((uint)1, version.Minor); | ||
160 | Assert.Equal((uint)0, version.Patch); | ||
161 | Assert.Equal((uint)0, version.Revision); | ||
162 | Assert.True(version.HasMajor); | ||
163 | Assert.True(version.HasMinor); | ||
164 | Assert.False(version.HasPatch); | ||
165 | Assert.False(version.HasRevision); | ||
166 | Assert.Equal(new[] { "a", "000" }, version.Labels.Select(l => l.Label).ToArray()); | ||
167 | Assert.Equal(new uint?[] { null, 0 }, version.Labels.Select(l => l.Numeric).ToArray()); | ||
168 | Assert.Null(version.Metadata); | ||
169 | Assert.False(version.Invalid); | ||
170 | } | ||
171 | |||
172 | [Fact] | ||
173 | public void CanParseMetadata() | ||
174 | { | ||
175 | Assert.True(WixVersion.TryParse("1.2.3+abcd", out var version)); | ||
176 | Assert.Null(version.Prefix); | ||
177 | Assert.Equal((uint)1, version.Major); | ||
178 | Assert.Equal((uint)2, version.Minor); | ||
179 | Assert.Equal((uint)3, version.Patch); | ||
180 | Assert.Equal((uint)0, version.Revision); | ||
181 | Assert.True(version.HasMajor); | ||
182 | Assert.True(version.HasMinor); | ||
183 | Assert.True(version.HasPatch); | ||
184 | Assert.False(version.HasRevision); | ||
185 | Assert.Null(version.Labels); | ||
186 | Assert.Equal("abcd", version.Metadata); | ||
187 | Assert.False(version.Invalid); | ||
188 | } | ||
189 | |||
190 | [Fact] | ||
191 | public void CannotParseUnexpectedContentAsMetadata() | ||
192 | { | ||
193 | Assert.False(WixVersion.TryParse("1.2.3.abcd", out var version)); | ||
194 | Assert.Null(version); | ||
195 | Assert.False(WixVersion.TryParse("1.2.3.-abcd", out version)); | ||
196 | Assert.Null(version); | ||
197 | } | ||
198 | |||
199 | [Fact] | ||
200 | public void CanParseUnexpectedContentAsInvalidMetadata() | ||
201 | { | ||
202 | var version = WixVersion.Parse("1.2.3.abcd"); | ||
203 | Assert.Equal("abcd", version.Metadata); | ||
204 | Assert.True(version.Invalid); | ||
205 | |||
206 | version = WixVersion.Parse("1.2.3.-abcd"); | ||
207 | Assert.Equal("-abcd", version.Metadata); | ||
208 | Assert.True(version.Invalid); | ||
209 | } | ||
210 | |||
211 | [Fact] | ||
212 | public void CanParseLeadingPrefix() | ||
213 | { | ||
214 | Assert.True(WixVersion.TryParse("v10.20.30.40", out var version)); | ||
215 | Assert.Equal('v', version.Prefix); | ||
216 | Assert.Equal((uint)10, version.Major); | ||
217 | Assert.Equal((uint)20, version.Minor); | ||
218 | Assert.Equal((uint)30, version.Patch); | ||
219 | Assert.Equal((uint)40, version.Revision); | ||
220 | Assert.True(version.HasMajor); | ||
221 | Assert.True(version.HasMinor); | ||
222 | Assert.True(version.HasPatch); | ||
223 | Assert.True(version.HasRevision); | ||
224 | Assert.Null(version.Labels); | ||
225 | Assert.Null(version.Metadata); | ||
226 | Assert.False(version.Invalid); | ||
227 | |||
228 | Assert.True(WixVersion.TryParse("V100.200.300.400", out var version2)); | ||
229 | Assert.Equal('V', version2.Prefix); | ||
230 | Assert.Equal((uint)100, version2.Major); | ||
231 | Assert.Equal((uint)200, version2.Minor); | ||
232 | Assert.Equal((uint)300, version2.Patch); | ||
233 | Assert.Equal((uint)400, version2.Revision); | ||
234 | Assert.True(version.HasMajor); | ||
235 | Assert.True(version.HasMinor); | ||
236 | Assert.True(version.HasPatch); | ||
237 | Assert.True(version.HasRevision); | ||
238 | Assert.Null(version2.Labels); | ||
239 | Assert.Null(version2.Metadata); | ||
240 | Assert.False(version.Invalid); | ||
241 | } | ||
242 | |||
243 | [Fact] | ||
244 | public void CanParseVeryLargeNumbers() | ||
245 | { | ||
246 | Assert.True(WixVersion.TryParse("4294967295.4294967295.4294967295.4294967295", out var version)); | ||
247 | Assert.Null(version.Prefix); | ||
248 | Assert.Equal(4294967295, version.Major); | ||
249 | Assert.Equal(4294967295, version.Minor); | ||
250 | Assert.Equal(4294967295, version.Patch); | ||
251 | Assert.Equal(4294967295, version.Revision); | ||
252 | Assert.True(version.HasMajor); | ||
253 | Assert.True(version.HasMinor); | ||
254 | Assert.True(version.HasPatch); | ||
255 | Assert.True(version.HasRevision); | ||
256 | Assert.Null(version.Labels); | ||
257 | Assert.Null(version.Metadata); | ||
258 | Assert.False(version.Invalid); | ||
259 | } | ||
260 | |||
261 | [Fact] | ||
262 | public void CannotParseTooLargeNumbers() | ||
263 | { | ||
264 | Assert.False(WixVersion.TryParse("4294967296.4294967296.4294967296.4294967296", out var version)); | ||
265 | Assert.Null(version); | ||
266 | } | ||
267 | |||
268 | [Fact] | ||
269 | public void CanParseInvalidTooLargeNumbers() | ||
270 | { | ||
271 | var version = WixVersion.Parse("4294967296.4294967296.4294967296.4294967296"); | ||
272 | Assert.Equal(0U, version.Major); | ||
273 | Assert.Equal("4294967296.4294967296.4294967296.4294967296", version.Metadata); | ||
274 | Assert.True(version.Invalid); | ||
275 | } | ||
276 | |||
277 | [Fact] | ||
278 | public void CanParseInvalidTooLargeNumbersWithPrefix() | ||
279 | { | ||
280 | var version = WixVersion.Parse("v4294967296.4294967296.4294967296.4294967296"); | ||
281 | Assert.Equal("v4294967296.4294967296.4294967296.4294967296", version.Metadata); | ||
282 | Assert.Null(version.Prefix); | ||
283 | Assert.True(version.Invalid); | ||
284 | } | ||
285 | |||
286 | [Fact] | ||
287 | public void CanParseLabelsWithMetadata() | ||
288 | { | ||
289 | Assert.True(WixVersion.TryParse("1.2.3.4-a.b.c.d.5+abc123", out var version)); | ||
290 | Assert.Null(version.Prefix); | ||
291 | Assert.Equal((uint)1, version.Major); | ||
292 | Assert.Equal((uint)2, version.Minor); | ||
293 | Assert.Equal((uint)3, version.Patch); | ||
294 | Assert.Equal((uint)4, version.Revision); | ||
295 | Assert.True(version.HasMajor); | ||
296 | Assert.True(version.HasMinor); | ||
297 | Assert.True(version.HasPatch); | ||
298 | Assert.True(version.HasRevision); | ||
299 | Assert.Equal(new[] { "a", "b", "c", "d", "5" }, version.Labels.Select(l => l.Label).ToArray()); | ||
300 | Assert.Equal(new uint?[] { null, null, null, null, 5 }, version.Labels.Select(l => l.Numeric).ToArray()); | ||
301 | Assert.Equal("abc123", version.Metadata); | ||
302 | Assert.False(version.Invalid); | ||
303 | } | ||
304 | |||
305 | [Fact] | ||
306 | public void CanParseVersionWithTrailingDotsAsInvalid() | ||
307 | { | ||
308 | var version = WixVersion.Parse("."); | ||
309 | Assert.Null(version.Prefix); | ||
310 | Assert.Equal(0U, version.Major); | ||
311 | Assert.Equal(0U, version.Minor); | ||
312 | Assert.Equal(0U, version.Patch); | ||
313 | Assert.Equal(0U, version.Revision); | ||
314 | Assert.Null(version.Labels); | ||
315 | Assert.False(version.HasMajor); | ||
316 | Assert.False(version.HasMinor); | ||
317 | Assert.False(version.HasPatch); | ||
318 | Assert.False(version.HasRevision); | ||
319 | Assert.Equal(".", version.Metadata); | ||
320 | Assert.True(version.Invalid); | ||
321 | |||
322 | version = WixVersion.Parse("1."); | ||
323 | Assert.Null(version.Prefix); | ||
324 | Assert.Equal(1U, version.Major); | ||
325 | Assert.Equal(0U, version.Minor); | ||
326 | Assert.Equal(0U, version.Patch); | ||
327 | Assert.Equal(0U, version.Revision); | ||
328 | Assert.Null(version.Labels); | ||
329 | Assert.True(version.HasMajor); | ||
330 | Assert.False(version.HasMinor); | ||
331 | Assert.False(version.HasPatch); | ||
332 | Assert.False(version.HasRevision); | ||
333 | Assert.Equal(String.Empty, version.Metadata); | ||
334 | Assert.True(version.Invalid); | ||
335 | |||
336 | version = WixVersion.Parse("2.1."); | ||
337 | Assert.Null(version.Prefix); | ||
338 | Assert.Equal(2U, version.Major); | ||
339 | Assert.Equal(1U, version.Minor); | ||
340 | Assert.Equal(0U, version.Patch); | ||
341 | Assert.Equal(0U, version.Revision); | ||
342 | Assert.Null(version.Labels); | ||
343 | Assert.True(version.HasMajor); | ||
344 | Assert.True(version.HasMinor); | ||
345 | Assert.False(version.HasPatch); | ||
346 | Assert.False(version.HasRevision); | ||
347 | Assert.Equal(String.Empty, version.Metadata); | ||
348 | Assert.True(version.Invalid); | ||
349 | |||
350 | version = WixVersion.Parse("3.2.1."); | ||
351 | Assert.Null(version.Prefix); | ||
352 | Assert.Equal(3U, version.Major); | ||
353 | Assert.Equal(2U, version.Minor); | ||
354 | Assert.Equal(1U, version.Patch); | ||
355 | Assert.Equal(0U, version.Revision); | ||
356 | Assert.Null(version.Labels); | ||
357 | Assert.True(version.HasMajor); | ||
358 | Assert.True(version.HasMinor); | ||
359 | Assert.True(version.HasPatch); | ||
360 | Assert.False(version.HasRevision); | ||
361 | Assert.Equal(String.Empty, version.Metadata); | ||
362 | Assert.True(version.Invalid); | ||
363 | |||
364 | version = WixVersion.Parse("4.3.2.1."); | ||
365 | Assert.Null(version.Prefix); | ||
366 | Assert.Equal(4U, version.Major); | ||
367 | Assert.Equal(3U, version.Minor); | ||
368 | Assert.Equal(2U, version.Patch); | ||
369 | Assert.Equal(1U, version.Revision); | ||
370 | Assert.Null(version.Labels); | ||
371 | Assert.True(version.HasMajor); | ||
372 | Assert.True(version.HasMinor); | ||
373 | Assert.True(version.HasPatch); | ||
374 | Assert.True(version.HasRevision); | ||
375 | Assert.Equal(String.Empty, version.Metadata); | ||
376 | Assert.True(version.Invalid); | ||
377 | |||
378 | version = WixVersion.Parse("5-."); | ||
379 | Assert.Null(version.Prefix); | ||
380 | Assert.Equal(5U, version.Major); | ||
381 | Assert.Equal(0U, version.Minor); | ||
382 | Assert.Equal(0U, version.Patch); | ||
383 | Assert.Equal(0U, version.Revision); | ||
384 | Assert.Null(version.Labels); | ||
385 | Assert.True(version.HasMajor); | ||
386 | Assert.False(version.HasMinor); | ||
387 | Assert.False(version.HasPatch); | ||
388 | Assert.False(version.HasRevision); | ||
389 | Assert.Equal(".", version.Metadata); | ||
390 | Assert.True(version.Invalid); | ||
391 | |||
392 | version = WixVersion.Parse("6-a."); | ||
393 | Assert.Null(version.Prefix); | ||
394 | Assert.Equal(6U, version.Major); | ||
395 | Assert.Equal(0U, version.Minor); | ||
396 | Assert.Equal(0U, version.Patch); | ||
397 | Assert.Equal(0U, version.Revision); | ||
398 | Assert.Equal(new[] { "a" }, version.Labels.Select(l => l.Label).ToArray()); | ||
399 | Assert.Equal(new uint?[] { null }, version.Labels.Select(l => l.Numeric).ToArray()); | ||
400 | Assert.True(version.HasMajor); | ||
401 | Assert.False(version.HasMinor); | ||
402 | Assert.False(version.HasPatch); | ||
403 | Assert.False(version.HasRevision); | ||
404 | Assert.Equal(String.Empty, version.Metadata); | ||
405 | Assert.True(version.Invalid); | ||
406 | } | ||
407 | } | ||
408 | } | ||