Skip to content

Commit 8cead89

Browse files
add tests for parameter validation of constructor taking enumerable of strings
1 parent f3a333e commit 8cead89

File tree

2 files changed

+122
-2
lines changed

2 files changed

+122
-2
lines changed

Semver.Test/SemVersionConstructorTests.cs

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using Semver.Test.Builders;
45
using Xunit;
@@ -293,7 +294,126 @@ public void ConstructWithStringIdentifiersInvalidTest(int major, int minor, int
293294
Assert.Equal(expectedParamName, ex.ParamName);
294295
}
295296

296-
// TODO add tests for validation of prerelease and metadata
297+
[Fact]
298+
public void ConstructWithStringIdentifiersPrereleaseNull()
299+
{
300+
var v = new SemVersion(1, 2, 3, (IEnumerable<string>)null);
301+
302+
Assert.Equal(new SemVersion(1, 2, 3, ""), v);
303+
}
304+
305+
[Fact]
306+
public void ConstructWithStringIdentifiersPrereleaseEmpty()
307+
{
308+
var v = new SemVersion(1, 2, 3, Enumerable.Empty<string>());
309+
310+
Assert.Equal(new SemVersion(1, 2, 3, ""), v);
311+
}
312+
313+
[Fact]
314+
public void ConstructWithStringIdentifiersPrereleaseEmptyIdentifier()
315+
{
316+
var ex = Assert.Throws<ArgumentException>(()
317+
=> new SemVersion(1, 2, 3, new[] { "bar", "" }));
318+
Assert.StartsWith("Prerelease identifier cannot be empty.", ex.Message);
319+
Assert.Equal("prerelease", ex.ParamName);
320+
}
321+
322+
[Fact]
323+
public void ConstructWithStringIdentifiersPrereleaseNullIdentifier()
324+
{
325+
var ex = Assert.Throws<ArgumentNullException>(()
326+
=> new SemVersion(1, 2, 3, new[] { "bar", null }));
327+
Assert.StartsWith("Value cannot be null.", ex.Message);
328+
Assert.Equal("prerelease", ex.ParamName);
329+
}
330+
331+
[Fact]
332+
public void ConstructWithStringIdentifiersPrereleaseLeadingZeros()
333+
{
334+
var ex = Assert.Throws<ArgumentException>(()
335+
=> new SemVersion(1, 2, 3, new[] { "bar", "0123" }));
336+
Assert.StartsWith("Leading zeros are not allowed on numeric prerelease identifiers '0123'.", ex.Message);
337+
Assert.Equal("prerelease", ex.ParamName);
338+
}
339+
340+
[Fact]
341+
public void ConstructWithStringIdentifiersPrereleaseTooLarge()
342+
{
343+
var ex = Assert.Throws<OverflowException>(()
344+
=> new SemVersion(1, 2, 3, new[] { "bar", "99999999999999999" }));
345+
Assert.StartsWith("Prerelease identifier '99999999999999999' was too large for Int32.", ex.Message);
346+
}
347+
348+
[Fact]
349+
public void ConstructWithStringIdentifiersPrereleaseInvalidCharacter()
350+
{
351+
var ex = Assert.Throws<ArgumentException>(()
352+
=> new SemVersion(1, 2, 3, new[] { "bar", "abc@123" }));
353+
Assert.StartsWith("A prerelease identifier can contain only ASCII alphanumeric characters and hyphens 'abc@123'.", ex.Message);
354+
Assert.Equal("prerelease", ex.ParamName);
355+
}
356+
357+
[Fact]
358+
public void ConstructWithStringIdentifiersMetadataNull()
359+
{
360+
var v = new SemVersion(1, 2, 3, metadata: (IEnumerable<string>)null);
361+
362+
Assert.Equal(new SemVersion(1, 2, 3), v);
363+
}
364+
365+
[Fact]
366+
public void ConstructWithStringIdentifiersMetadataEmpty()
367+
{
368+
var v = new SemVersion(1, 2, 3, metadata: Enumerable.Empty<string>());
369+
370+
Assert.Equal(new SemVersion(1, 2, 3), v);
371+
}
372+
373+
[Fact]
374+
public void ConstructWithStringIdentifiersMetadataEmptyIdentifier()
375+
{
376+
var ex = Assert.Throws<ArgumentException>(()
377+
=> new SemVersion(1, 2, 3, metadata: new[] { "bar", "" }));
378+
Assert.StartsWith("Metadata identifier cannot be empty.", ex.Message);
379+
Assert.Equal("metadata", ex.ParamName);
380+
}
381+
382+
[Fact]
383+
public void ConstructWithStringIdentifiersMetadataNullIdentifier()
384+
{
385+
var ex = Assert.Throws<ArgumentNullException>(()
386+
=> new SemVersion(1, 2, 3, metadata: new[] { "bar", null }));
387+
Assert.StartsWith("Value cannot be null.", ex.Message);
388+
Assert.Equal("metadata", ex.ParamName);
389+
}
390+
391+
[Fact]
392+
public void ConstructWithStringIdentifiersMetadataLeadingZeros()
393+
{
394+
var v = new SemVersion(1, 2, 3, metadata: new[] { "bar", "0123" });
395+
396+
Assert.Equal(new SemVersion(1, 2, 3, "", "bar.0123"), v);
397+
}
398+
399+
[Fact]
400+
public void ConstructWithStringIdentifiersMetadataTooLarge()
401+
{
402+
var v = new SemVersion(1, 2, 3, metadata: new[] { "bar", "99999999999999999" });
403+
404+
Assert.Equal(new SemVersion(1, 2, 3, "", "bar.99999999999999999"), v);
405+
}
406+
407+
[Fact]
408+
public void ConstructWithStringIdentifiersMetadataInvalidCharacter()
409+
{
410+
var ex = Assert.Throws<ArgumentException>(()
411+
=> new SemVersion(1, 2, 3, metadata: new[] { "bar", "abc@123" }));
412+
Assert.StartsWith(
413+
"A metadata identifier can contain only ASCII alphanumeric characters and hyphens 'abc@123'.",
414+
ex.Message);
415+
Assert.Equal("metadata", ex.ParamName);
416+
}
297417
#endregion
298418

299419
#region SemVersion.ParsedFrom(int major, int minor = 0, int patch = 0, string prerelease, string build)

Semver/SemVersion.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public SemVersion(int major, int minor = 0, int patch = 0,
223223
.Select(i => new PrereleaseIdentifier(i, allowLeadingZeros: false, nameof(prerelease)))
224224
.ToReadOnlyList();
225225

226-
var metadataIdentifiers = metadata
226+
var metadataIdentifiers = metadata?
227227
.Select(i => new MetadataIdentifier(i, nameof(metadata)))
228228
.ToReadOnlyList();
229229

0 commit comments

Comments
 (0)