Skip to content

Commit 88bf262

Browse files
committed
Starting on base version calculators
1 parent 33c891a commit 88bf262

File tree

10 files changed

+193
-1
lines changed

10 files changed

+193
-1
lines changed

GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@
115115
<Compile Include="TestEffectiveConfiguration.cs" />
116116
<Compile Include="TestFileSystem.cs" />
117117
<Compile Include="VariableProviderTests.cs" />
118+
<Compile Include="VersionCalculation\BaseVersionCalculatorTests.cs" />
119+
<Compile Include="VersionCalculation\Strategies\ConfigNextVersionBaseVersionStrategyTests.cs" />
120+
<Compile Include="VersionCalculation\Strategies\GitVersionContextBuilder.cs" />
118121
</ItemGroup>
119122
<ItemGroup>
120123
<None Include="packages.config" />
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
namespace GitVersionCore.Tests.VersionCalculation
2+
{
3+
using GitVersion;
4+
using GitVersion.VersionCalculation;
5+
using GitVersion.VersionCalculation.BaseVersionCalculators;
6+
using GitVersionCore.Tests.VersionCalculation.Strategies;
7+
using NUnit.Framework;
8+
using Shouldly;
9+
10+
[TestFixture]
11+
public class BaseVersionCalculatorTests
12+
{
13+
[Test]
14+
public void ChoosesHighestVersionReturnedFromStrategies()
15+
{
16+
var context = new GitVersionContextBuilder().Build();
17+
var sut = new BaseVersionCalculator(new V1Strategy(), new V2Strategy());
18+
19+
var baseVersion = sut.GetBaseVersion(context);
20+
21+
baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0");
22+
baseVersion.ShouldIncrement.ShouldBe(true);
23+
}
24+
25+
class V1Strategy : BaseVersionStrategy
26+
{
27+
public override BaseVersion GetVersion(GitVersionContext context)
28+
{
29+
return new BaseVersion(false, new SemanticVersion(1));
30+
}
31+
}
32+
33+
class V2Strategy : BaseVersionStrategy
34+
{
35+
public override BaseVersion GetVersion(GitVersionContext context)
36+
{
37+
return new BaseVersion(true, new SemanticVersion(2));
38+
}
39+
}
40+
}
41+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
namespace GitVersionCore.Tests.VersionCalculation.Strategies
2+
{
3+
using GitVersion;
4+
using GitVersion.VersionCalculation.BaseVersionCalculators;
5+
using NUnit.Framework;
6+
using Shouldly;
7+
8+
[TestFixture]
9+
public class ConfigNextVersionBaseVersionStrategyTests
10+
{
11+
[Test]
12+
public void ShouldNotBeIncremented()
13+
{
14+
var contextBuilder = new GitVersionContextBuilder()
15+
.WithConfig(new Config
16+
{
17+
NextVersion = "1.0.0"
18+
});
19+
var sut = new ConfigNextVersionBaseVersionStrategy();
20+
21+
var baseVersion = sut.GetVersion(contextBuilder.Build());
22+
23+
baseVersion.ShouldIncrement.ShouldBe(false);
24+
baseVersion.SemanticVersion.ToString().ShouldBe("1.0.0");
25+
}
26+
27+
[Test]
28+
public void ReturnsNullWhenNoNextVersionIsInConfig()
29+
{
30+
var contextBuilder = new GitVersionContextBuilder();
31+
var sut = new ConfigNextVersionBaseVersionStrategy();
32+
33+
var baseVersion = sut.GetVersion(contextBuilder.Build());
34+
35+
baseVersion.ShouldBe(null);
36+
}
37+
}
38+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace GitVersionCore.Tests.VersionCalculation.Strategies
2+
{
3+
using GitVersion;
4+
using LibGit2Sharp;
5+
6+
public class GitVersionContextBuilder
7+
{
8+
IRepository repository;
9+
Config config;
10+
11+
public GitVersionContextBuilder WithRepository(IRepository repository)
12+
{
13+
this.repository = repository;
14+
return this;
15+
}
16+
17+
public GitVersionContextBuilder WithConfig(Config config)
18+
{
19+
this.config = config;
20+
return this;
21+
}
22+
23+
public GitVersionContext Build()
24+
{
25+
return new GitVersionContext(repository ?? CreateRepository(), config ?? new Config());
26+
}
27+
28+
IRepository CreateRepository()
29+
{
30+
var mockBranch = new MockBranch("master") { new MockCommit { CommitterEx = SignatureBuilder.SignatureNow() } };
31+
var mockRepository = new MockRepository
32+
{
33+
Branches = new MockBranchCollection
34+
{
35+
mockBranch
36+
},
37+
Head = mockBranch
38+
};
39+
40+
return mockRepository;
41+
}
42+
}
43+
}

GitVersionCore/GitVersionCore.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@
8787
<Compile Include="OutputVariables\CommitsAsFourthVersionPartFormatter.cs" />
8888
<Compile Include="OutputVariables\VersionVariables.cs" />
8989
<Compile Include="SemanticVersionExtensions.cs" />
90+
<Compile Include="VersionCalculation\BaseVersionCalculator.cs" />
91+
<Compile Include="VersionCalculation\BaseVersionCalculators\BaseVersion.cs" />
92+
<Compile Include="VersionCalculation\BaseVersionCalculators\ConfigNextVersionBaseVersionStrategy.cs" />
93+
<Compile Include="VersionCalculation\BaseVersionStrategy.cs" />
9094
<Compile Include="VersioningModes\ContinuousDeliveryMode.cs" />
9195
<Compile Include="VersioningModes\ContinuousDeploymentMode.cs" />
9296
<Compile Include="VersioningModes\VersioningMode.cs" />
@@ -144,6 +148,7 @@
144148
</None>
145149
<None Include="packages.config" />
146150
</ItemGroup>
151+
<ItemGroup />
147152
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
148153
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
149154
<PropertyGroup>

GitVersionCore/SemanticVersion.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ public class SemanticVersion : IFormattable, IComparable<SemanticVersion>
1515
public SemanticVersionPreReleaseTag PreReleaseTag;
1616
public SemanticVersionBuildMetaData BuildMetaData;
1717

18-
public SemanticVersion()
18+
public SemanticVersion(int major = 0, int minor = 0, int patch = 0)
1919
{
20+
Major = major;
21+
Minor = minor;
22+
Patch = patch;
2023
PreReleaseTag = new SemanticVersionPreReleaseTag();
2124
BuildMetaData = new SemanticVersionBuildMetaData();
2225
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace GitVersion.VersionCalculation
2+
{
3+
using System.Linq;
4+
using GitVersion.VersionCalculation.BaseVersionCalculators;
5+
6+
public class BaseVersionCalculator
7+
{
8+
readonly BaseVersionStrategy[] strategies;
9+
10+
public BaseVersionCalculator(params BaseVersionStrategy[] strategies)
11+
{
12+
this.strategies = strategies;
13+
}
14+
15+
public BaseVersion GetBaseVersion(GitVersionContext context)
16+
{
17+
return strategies
18+
.Select(s => s.GetVersion(context))
19+
.Where(v => v != null)
20+
.Aggregate((v1, v2) => v1.SemanticVersion > v2.SemanticVersion ? v1 : v2);
21+
}
22+
}
23+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace GitVersion.VersionCalculation.BaseVersionCalculators
2+
{
3+
public class BaseVersion
4+
{
5+
public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion)
6+
{
7+
ShouldIncrement = shouldIncrement;
8+
SemanticVersion = semanticVersion;
9+
}
10+
11+
public bool ShouldIncrement { get; private set; }
12+
13+
public SemanticVersion SemanticVersion { get; private set; }
14+
}
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace GitVersion.VersionCalculation.BaseVersionCalculators
2+
{
3+
public class ConfigNextVersionBaseVersionStrategy : BaseVersionStrategy
4+
{
5+
public override BaseVersion GetVersion(GitVersionContext context)
6+
{
7+
if (string.IsNullOrEmpty(context.Configuration.NextVersion))
8+
return null;
9+
return new BaseVersion(false, SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix));
10+
}
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace GitVersion.VersionCalculation
2+
{
3+
using GitVersion.VersionCalculation.BaseVersionCalculators;
4+
5+
public abstract class BaseVersionStrategy
6+
{
7+
public abstract BaseVersion GetVersion(GitVersionContext context);
8+
}
9+
}

0 commit comments

Comments
 (0)