Skip to content

Commit 86240c9

Browse files
add new constructors with fewer arguments. Make other constructor arguments optional
1 parent f35222d commit 86240c9

File tree

5 files changed

+123
-48
lines changed

5 files changed

+123
-48
lines changed

Semver.Test/SemVersionConstructorTests.cs

Lines changed: 77 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,81 @@ public class SemVersionConstructorTests
1313
private const string PrereleaseIdentifierIsDefaultMessage = "Prerelease identifier cannot be default/null.";
1414
private const string MetadataIdentifierIsDefaultMessage = "Metadata identifier cannot be default/null.";
1515

16+
/// <summary>
17+
/// This test shows that named arguments will resolve to a constructor with few parameters
18+
/// rather than one with more parameters that might be obsolete.
19+
/// </summary>
20+
[Fact]
21+
public void NamedArgumentsResolveToShortestConstructor()
22+
{
23+
var v = new SemVersion(major: 2, minor: 1, patch: 3);
24+
25+
Assert.Equal(new SemVersion(2, 1, 3), v);
26+
}
27+
28+
#region SemVersion(int major)
29+
[Theory]
30+
[InlineData(1)]
31+
[InlineData(2)]
32+
// TODO Negative versions should be invalid and throw argument exceptions (issue#41)
33+
[InlineData(-1)]
34+
public void ConstructWithMajorTest(int major)
35+
{
36+
var v = new SemVersion(major);
37+
38+
Assert.Equal(major, v.Major);
39+
Assert.Equal(0, v.Minor);
40+
Assert.Equal(0, v.Patch);
41+
Assert.Equal("", v.Prerelease);
42+
Assert.Empty(v.PrereleaseIdentifiers);
43+
Assert.Equal("", v.Metadata);
44+
Assert.Empty(v.MetadataIdentifiers);
45+
}
46+
#endregion
47+
48+
#region SemVersion(int major, int minor)
49+
[Theory]
50+
[InlineData(1, 2)]
51+
// TODO Negative versions should be invalid and throw argument exceptions (issue#41)
52+
[InlineData(-1, 0)]
53+
[InlineData(0, -1)]
54+
[InlineData(-1, -1)]
55+
public void ConstructWithMajorMinorTest(int major, int minor)
56+
{
57+
var v = new SemVersion(major, minor);
58+
59+
Assert.Equal(major, v.Major);
60+
Assert.Equal(minor, v.Minor);
61+
Assert.Equal(0, v.Patch);
62+
Assert.Equal("", v.Prerelease);
63+
Assert.Empty(v.PrereleaseIdentifiers);
64+
Assert.Equal("", v.Metadata);
65+
Assert.Empty(v.MetadataIdentifiers);
66+
}
67+
#endregion
68+
69+
#region SemVersion(int major, int minor, int patch)
70+
[Theory]
71+
[InlineData(1, 2, 3)]
72+
// TODO Negative versions should be invalid and throw argument exceptions (issue#41)
73+
[InlineData(-1, 0, 0)]
74+
[InlineData(0, -1, 0)]
75+
[InlineData(0, 0, -1)]
76+
[InlineData(-1, -1, -1)]
77+
public void ConstructWithMajorMinorPatchTest(int major, int minor, int patch)
78+
{
79+
var v = new SemVersion(major, minor, patch);
80+
81+
Assert.Equal(major, v.Major);
82+
Assert.Equal(minor, v.Minor);
83+
Assert.Equal(patch, v.Patch);
84+
Assert.Equal("", v.Prerelease);
85+
Assert.Empty(v.PrereleaseIdentifiers);
86+
Assert.Equal("", v.Metadata);
87+
Assert.Empty(v.MetadataIdentifiers);
88+
}
89+
#endregion
90+
1691
#region SemVersion(int major, int minor = 0, int patch = 0, string prerelease, string build)
1792
/// <summary>
1893
/// Verifies the default values of the arguments to the primary constructor.
@@ -132,29 +207,7 @@ public void ConstructTest(int major, int minor, int patch, string prerelease, st
132207
}
133208
#endregion
134209

135-
#region SemVersion(int major, int minor, int patch)
136-
[Theory]
137-
[InlineData(1, 2, 3)]
138-
// TODO Negative versions should be invalid and throw argument exceptions (issue#41)
139-
[InlineData(-1, 0, 0)]
140-
[InlineData(0, -1, 0)]
141-
[InlineData(0, 0, -1)]
142-
[InlineData(-1, -1, -1)]
143-
public void ConstructWithMajorMinorPatchTest(int major, int minor, int patch)
144-
{
145-
var v = new SemVersion(major, minor, patch);
146-
147-
Assert.Equal(major, v.Major);
148-
Assert.Equal(minor, v.Minor);
149-
Assert.Equal(patch, v.Patch);
150-
Assert.Equal("", v.Prerelease);
151-
Assert.Empty(v.PrereleaseIdentifiers);
152-
Assert.Equal("", v.Metadata);
153-
Assert.Empty(v.MetadataIdentifiers);
154-
}
155-
#endregion
156-
157-
#region SemVersion(int major, int minor, int patch, IEnumerable<PrereleaseIdentifier> prerelease, IEnumerable<MetadataIdentifier> metadata)
210+
#region SemVersion(int major, int minor = 0, int patch = 0, IEnumerable<PrereleaseIdentifier> prerelease = null, IEnumerable<MetadataIdentifier> metadata = null)
158211
[Fact]
159212
public void ConstructWithIdentifiersTest()
160213
{
@@ -206,7 +259,7 @@ public void ConstructWithDefaultMetadataIdentifiersTest()
206259
}
207260
#endregion
208261

209-
#region SemVersion(int major, int minor, int patch, IEnumerable<string> prerelease, IEnumerable<string> metadata)
262+
#region SemVersion(int major, int minor = 0, int patch = 0, IEnumerable<string> prerelease = null, IEnumerable<string> metadata = null)
210263
[Fact]
211264
public void ConstructWithStringIdentifiersTest()
212265
{

Semver/PublicAPI/net452/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ Semver.SemVersion.IsRelease.get -> bool
2626
Semver.SemVersion.Metadata.get -> string
2727
Semver.SemVersion.MetadataIdentifiers.get -> System.Collections.Generic.IReadOnlyList<Semver.MetadataIdentifier>
2828
Semver.SemVersion.PrereleaseIdentifiers.get -> System.Collections.Generic.IReadOnlyList<Semver.PrereleaseIdentifier>
29+
Semver.SemVersion.SemVersion(int major) -> void
30+
Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> void
31+
Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, System.Collections.Generic.IEnumerable<string> prerelease = null, System.Collections.Generic.IEnumerable<string> metadata = null) -> void
32+
Semver.SemVersion.SemVersion(int major, int minor) -> void
2933
Semver.SemVersion.SemVersion(int major, int minor, int patch) -> void
30-
Semver.SemVersion.SemVersion(int major, int minor, int patch, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> void
31-
Semver.SemVersion.SemVersion(int major, int minor, int patch, System.Collections.Generic.IEnumerable<string> prerelease = null, System.Collections.Generic.IEnumerable<string> metadata = null) -> void
3234
Semver.SemVersion.ToVersion() -> System.Version
3335
Semver.SemVersion.With(int? major = null, int? minor = null, int? patch = null, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> Semver.SemVersion
3436
Semver.SemVersion.WithMajor(int major) -> Semver.SemVersion

Semver/PublicAPI/netstandard1.1/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ Semver.SemVersion.IsRelease.get -> bool
2626
Semver.SemVersion.Metadata.get -> string
2727
Semver.SemVersion.MetadataIdentifiers.get -> System.Collections.Generic.IReadOnlyList<Semver.MetadataIdentifier>
2828
Semver.SemVersion.PrereleaseIdentifiers.get -> System.Collections.Generic.IReadOnlyList<Semver.PrereleaseIdentifier>
29+
Semver.SemVersion.SemVersion(int major) -> void
30+
Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> void
31+
Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, System.Collections.Generic.IEnumerable<string> prerelease = null, System.Collections.Generic.IEnumerable<string> metadata = null) -> void
32+
Semver.SemVersion.SemVersion(int major, int minor) -> void
2933
Semver.SemVersion.SemVersion(int major, int minor, int patch) -> void
30-
Semver.SemVersion.SemVersion(int major, int minor, int patch, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> void
31-
Semver.SemVersion.SemVersion(int major, int minor, int patch, System.Collections.Generic.IEnumerable<string> prerelease = null, System.Collections.Generic.IEnumerable<string> metadata = null) -> void
3234
Semver.SemVersion.ToVersion() -> System.Version
3335
Semver.SemVersion.With(int? major = null, int? minor = null, int? patch = null, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> Semver.SemVersion
3436
Semver.SemVersion.WithMajor(int major) -> Semver.SemVersion

Semver/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ Semver.SemVersion.IsRelease.get -> bool
2626
Semver.SemVersion.Metadata.get -> string
2727
Semver.SemVersion.MetadataIdentifiers.get -> System.Collections.Generic.IReadOnlyList<Semver.MetadataIdentifier>
2828
Semver.SemVersion.PrereleaseIdentifiers.get -> System.Collections.Generic.IReadOnlyList<Semver.PrereleaseIdentifier>
29+
Semver.SemVersion.SemVersion(int major) -> void
30+
Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> void
31+
Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, System.Collections.Generic.IEnumerable<string> prerelease = null, System.Collections.Generic.IEnumerable<string> metadata = null) -> void
32+
Semver.SemVersion.SemVersion(int major, int minor) -> void
2933
Semver.SemVersion.SemVersion(int major, int minor, int patch) -> void
30-
Semver.SemVersion.SemVersion(int major, int minor, int patch, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> void
31-
Semver.SemVersion.SemVersion(int major, int minor, int patch, System.Collections.Generic.IEnumerable<string> prerelease = null, System.Collections.Generic.IEnumerable<string> metadata = null) -> void
3234
Semver.SemVersion.ToVersion() -> System.Version
3335
Semver.SemVersion.With(int? major = null, int? minor = null, int? patch = null, System.Collections.Generic.IEnumerable<Semver.PrereleaseIdentifier> prerelease = null, System.Collections.Generic.IEnumerable<Semver.MetadataIdentifier> metadata = null) -> Semver.SemVersion
3436
Semver.SemVersion.WithMajor(int major) -> Semver.SemVersion

Semver/SemVersion.cs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,32 @@ private SemVersion(SerializationInfo info, StreamingContext context)
7272
MetadataIdentifiers = semVersion.MetadataIdentifiers;
7373
}
7474
#endif
75+
/// <summary>
76+
/// Constructs a new instance of the <see cref="SemVersion" /> class.
77+
/// </summary>
78+
/// <param name="major">The major version number.</param>
79+
// Constructor needed to resolve ambiguity between other overloads with default parameters.
80+
public SemVersion(int major)
81+
: this(major, 0, 0, "") { }
82+
83+
/// <summary>
84+
/// Constructs a new instance of the <see cref="SemVersion" /> class.
85+
/// </summary>
86+
/// <param name="major">The major version number.</param>
87+
/// <param name="minor">The minor version number.</param>
88+
// Constructor needed to resolve ambiguity between other overloads with default parameters.
89+
public SemVersion(int major, int minor)
90+
: this(major, minor, 0, "") { }
91+
92+
/// <summary>
93+
/// Constructs a new instance of the <see cref="SemVersion" /> class.
94+
/// </summary>
95+
/// <param name="major">The major version number.</param>
96+
/// <param name="minor">The minor version number.</param>
97+
/// <param name="patch">The patch version number.</param>
98+
// Constructor needed to resolve ambiguity between other overloads with default parameters.
99+
public SemVersion(int major, int minor, int patch)
100+
: this(major, minor, patch, "") { }
75101

76102
/// <summary>
77103
/// Constructs a new instance of the <see cref="SemVersion" /> class.
@@ -100,18 +126,6 @@ public SemVersion(int major, int minor = 0, int patch = 0, string prerelease = "
100126
#pragma warning restore CS0612 // Type or member is obsolete
101127
}
102128

103-
/// <summary>
104-
/// Constructs a new instance of the <see cref="SemVersion" /> class.
105-
/// </summary>
106-
/// <param name="major">The major version number.</param>
107-
/// <param name="minor">The minor version number.</param>
108-
/// <param name="patch">The patch version number.</param>
109-
// Constructor needed to resolve ambiguity between other overloads with default parameters.
110-
public SemVersion(int major, int minor, int patch)
111-
: this(major, minor, patch, "")
112-
{
113-
}
114-
115129
/// <summary>
116130
/// Constructs a new instance of the <see cref="SemVersion" /> class.
117131
/// </summary>
@@ -124,7 +138,7 @@ public SemVersion(int major, int minor, int patch)
124138
/// <paramref name="minor"/>, or <paramref name="patch"/> version number is negative.</exception>
125139
/// <exception cref="ArgumentException">A prerelease or metadata identifier has the default value.</exception>
126140
#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
127-
public SemVersion(int major, int minor, int patch,
141+
public SemVersion(int major, int minor = 0, int patch = 0,
128142
IEnumerable<PrereleaseIdentifier> prerelease = null,
129143
IEnumerable<MetadataIdentifier> metadata = null)
130144
#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
@@ -197,7 +211,7 @@ public SemVersion(int major, int minor, int patch,
197211
/// <exception cref="OverflowException">A numeric prerelease identifier value is too large
198212
/// for <see cref="Int32"/>.</exception>
199213
#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
200-
public SemVersion(int major, int minor, int patch,
214+
public SemVersion(int major, int minor = 0, int patch = 0,
201215
IEnumerable<string> prerelease = null,
202216
IEnumerable<string> metadata = null)
203217
#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
@@ -590,7 +604,8 @@ public SemVersion Change(int? major = null, int? minor = null, int? patch = null
590604
}
591605

592606
/// <summary>
593-
/// Creates a copy of the current instance with changed properties.
607+
/// Creates a copy of the current instance with multiple changed properties. If changing only
608+
/// one property use one of the more specific <c>WithX()</c> methods.
594609
/// </summary>
595610
/// <param name="major">The value to replace the major version number or <see langword="null"/> to leave it unchanged.</param>
596611
/// <param name="minor">The value to replace the minor version number or <see langword="null"/> to leave it unchanged.</param>
@@ -670,9 +685,10 @@ public SemVersion With(
670685
}
671686

672687
/// <summary>
673-
/// Creates a copy of the current instance with changed properties. Parses prerelease and
674-
/// metadata identifiers from dot separated strings. Use <see cref="With"/> instead if
675-
/// parsing is not needed.
688+
/// Creates a copy of the current instance with multiple changed properties. Parses prerelease
689+
/// and metadata identifiers from dot separated strings. Use <see cref="With"/> instead if
690+
/// parsing is not needed. If changing only one property use one of the more specific
691+
/// <c>WithX()</c> methods.
676692
/// </summary>
677693
/// <param name="major">The value to replace the major version number or <see langword="null"/> to leave it unchanged.</param>
678694
/// <param name="minor">The value to replace the minor version number or <see langword="null"/> to leave it unchanged.</param>

0 commit comments

Comments
 (0)