Skip to content

Commit b6110b9

Browse files
committed
Merge branch 'master' into release
2 parents 998b390 + 20f133b commit b6110b9

39 files changed

+1196
-167
lines changed

Build/BuildScripts/CodeJam.AppVeyor.NUnit.Tests.ps1

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ foreach ($target in $targetsDotNet) {
1212
where { $_.fullname -match "\\bin\\Release\\$($target)" } | `
1313
select -ExpandProperty FullName)
1414

15+
echo ""
16+
echo "=== $target ==="
1517
echo "nunit3-console $testAssemblies --result=$logFileName"
1618
&"nunit3-console" $testAssemblies "--result=$logFileName"
1719
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
@@ -32,6 +34,8 @@ foreach ($target in $targetsDotNetCore) {
3234
where { $_.fullname -match "\\bin\\Release\\$($target)" } | `
3335
select -ExpandProperty FullName)
3436

37+
echo ""
38+
echo "=== $target ==="
3539
echo "dotnet vstest $testAssemblies --logger:'trx;LogFileName=$logFileName'"
3640
dotnet vstest $testAssemblies --logger:"trx;LogFileName=$logFileName"
3741
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }

CodeJam.Blocks.Tests/CodeJam.Blocks.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
<ItemGroup Condition=" '$(TargetFramework)' == 'net20' ">
2525
<!-- NUnit v3.11 is the last version supporting .NET 2.0 -->
2626
<PackageReference Include="NUnit" Version="[3.11.0]" />
27-
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
28-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
27+
<PackageReference Include="NUnit3TestAdapter" Version="[3.15.1]" />
28+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="[16.2.0]" />
2929
</ItemGroup>
3030
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp1.1'">
3131
<!-- NUnit v3.9 is the last version supporting .NET Core 1.0 -->
3232
<PackageReference Include="NUnit" Version="[3.9.0]" />
33-
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
33+
<PackageReference Include="NUnit3TestAdapter" Version="[3.15.1]" />
3434
<!-- Microsoft.NET.Test.Sdk v16.2 is the last version supporting .NET Core 1.0 -->
3535
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="[16.2.0]" />
3636
</ItemGroup>

CodeJam.Blocks/Services/ServiceProviderHelper.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,15 @@ public static IDisposable Publish<T>(
9191
{
9292
Code.NotNull(publisher, nameof(publisher));
9393
Code.NotNull(instanceFactory, nameof(instanceFactory));
94-
// DONTTOUCH: for valid overload resolution (fails on net35).
9594

95+
// DONTTOUCH: for valid overload resolution (fails on net35).
96+
#if NET40_OR_GREATER || TARGETS_NETSTANDARD || TARGETS_NETCOREAPP
9697
// ReSharper disable once RedundantCast
97-
return publisher.Publish(typeof(T), instanceFactory);
98+
return publisher.Publish(typeof(T), (Func<IServicePublisher, object>)instanceFactory);
99+
#else
100+
// Hack for CS0030 Cannot convert type 'System.Func<CodeJam.Services.IServicePublisher, T>' to 'System.Func<CodeJam.Services.IServicePublisher, object>'
101+
return publisher.Publish(typeof(T), new Func<IServicePublisher, object>(sp => instanceFactory(sp)));
102+
#endif
98103
}
99104
}
100105
}

CodeJam.Experimental.Tests/UseCases/EnumCodeUseCases.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
using System.Globalization;
44
using System.Threading;
55

6-
using CodeJam.Internal;
7-
86
using JetBrains.Annotations;
97

108
using NUnit.Framework;
@@ -17,26 +15,21 @@ namespace CodeJam.UseCases.EnumHelperSamples
1715
public class EnumCodeUseCases
1816
{
1917
#region Test helpers
20-
private bool? _breakOnException;
2118
private CultureInfo _previousCulture;
2219

2320
[OneTimeSetUp]
2421
[UsedImplicitly]
2522
public void SetUp()
2623
{
27-
_breakOnException = CodeExceptionsHelper.BreakOnException;
2824
_previousCulture = Thread.CurrentThread.CurrentUICulture;
29-
CodeExceptionsHelper.BreakOnException = false;
3025
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
3126
}
3227

3328
[OneTimeTearDown]
3429
[UsedImplicitly]
3530
public void TearDown()
3631
{
37-
Code.NotNull(_breakOnException, nameof(_breakOnException));
3832
Code.NotNull(_previousCulture, nameof(_previousCulture));
39-
CodeExceptionsHelper.BreakOnException = _breakOnException.GetValueOrDefault();
4033
Thread.CurrentThread.CurrentUICulture = _previousCulture;
4134
}
4235
#endregion

CodeJam.Main.Tests/Assertions/CodeTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void TestLogging()
2525
{
2626
TraceOutputOptions = TraceOptions.None
2727
};
28-
var ts = CodeExceptionsHelper.CodeTraceSource;
28+
var ts = Configuration.CodeTraceSource;
2929
var logLevel = ts.Switch.Level;
3030
try
3131
{

CodeJam.Main.Tests/CodeJam.Main.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
<ItemGroup Condition=" '$(TargetFramework)' == 'net20' ">
2626
<!-- NUnit v3.11 is the last version supporting .NET 2.0 -->
2727
<PackageReference Include="NUnit" Version="[3.11.0]" />
28-
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
29-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
28+
<PackageReference Include="NUnit3TestAdapter" Version="[3.15.1]" />
29+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="[16.2.0]" />
3030
</ItemGroup>
3131
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp1.1'">
3232
<!-- NUnit v3.9 is the last version supporting .NET Core 1.0 -->
3333
<PackageReference Include="NUnit" Version="[3.9.0]" />
34-
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
34+
<PackageReference Include="NUnit3TestAdapter" Version="[3.15.1]" />
3535
<!-- Microsoft.NET.Test.Sdk v16.3 is the last version supporting .NET Core 1.0 -->
3636
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="[16.2.0]" />
3737
<PackageReference Include="System.Diagnostics.TextWriterTraceListener" Version="4.3.0" />

CodeJam.Main.Tests/IO/TempDataTests.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,31 @@
22
using System.IO;
33
using System.Runtime.CompilerServices;
44
using System.Text;
5+
using System.Threading;
6+
7+
using CodeJam.Internal;
58

69
using NUnit.Framework;
710

811
namespace CodeJam.IO
912
{
1013
[TestFixture(Category = "IO")]
14+
[NonParallelizable]
1115
public class TempDataTests
1216
{
1317
#region Test helpers
1418
private static void AssertDisposed<T>(Func<T> memberCallback) =>
1519
Assert.Throws<ObjectDisposedException>(() => memberCallback());
16-
#endregion
20+
21+
// DONTTOUCH: DO NOT use [OneTimeSetUp] here as some tests may override the retry policy
22+
[SetUp]
23+
public static void SetupDisableTempDataRetry() =>
24+
Configuration.SetTempDataRetryCallback(a => a());
25+
26+
// DONTTOUCH: DO NOT use [OneTimeTearDown] here as some tests may override the retry policy
27+
[TearDown]
28+
public static void TearDownRestoreTempDataRetry() =>
29+
Configuration.SetTempDataRetryCallback(null);
1730

1831
[MethodImpl(MethodImplOptions.NoInlining)]
1932
private static string CreateAndLeakTempDir(string s)
@@ -26,6 +39,7 @@ private static string CreateAndLeakTempDir(string s)
2639
GC.KeepAlive(dir2);
2740
return dir2Path;
2841
}
42+
#endregion
2943

3044
[Test]
3145
public void TestDirectory()
@@ -98,6 +112,46 @@ public void TestDirectoryNestedContent()
98112
Assert.IsFalse(File.Exists(nestedFile), "File should NOT exist");
99113
}
100114

115+
[Test]
116+
public void TestRetryPolicy()
117+
{
118+
int disposeCallCount = 0;
119+
try
120+
{
121+
Configuration.SetTempDataRetryCallback(
122+
a =>
123+
{
124+
Interlocked.Increment(ref disposeCallCount);
125+
a();
126+
});
127+
128+
string dirPath;
129+
string nestedFile;
130+
using (var dir = TempData.CreateDirectory())
131+
{
132+
dirPath = dir.Path;
133+
nestedFile = Path.Combine(dirPath, "test.tmp");
134+
135+
using (File.Create(nestedFile))
136+
{
137+
Assert.Throws<IOException>(() => dir.Dispose());
138+
Assert.AreEqual(disposeCallCount, 1);
139+
}
140+
141+
Assert.DoesNotThrow(() => dir.Dispose());
142+
Assert.AreEqual(disposeCallCount, 2);
143+
144+
}
145+
Assert.AreEqual(disposeCallCount, 2);
146+
Assert.IsFalse(Directory.Exists(dirPath), "Directory should NOT exist");
147+
Assert.IsFalse(File.Exists(nestedFile), "File should NOT exist");
148+
}
149+
finally
150+
{
151+
Configuration.SetTempDataRetryCallback(null);
152+
}
153+
}
154+
101155
[Test]
102156
public void TestDirectorySpecificPath()
103157
{

CodeJam.Main.Tests/Ranges/CompositeRangeTests.cs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,129 @@ public static void TestCompositeRangeWithValues()
588588
AreEqual(compositeRange4, compositeRange.WithoutKeys());
589589
}
590590

591+
[Test]
592+
public static void TestCompositeRangeExclusiveWithOrWithoutKeys()
593+
{
594+
var compositeRange = Enumerable
595+
.Range(1, 2)
596+
.ToCompositeRangeExclusive(i => i - 1, i => i + 1);
597+
AreEqual(compositeRange.ToString(), "(0..3): { '1':(0..2); '2':(1..3) }");
598+
599+
var compositeRange2 = compositeRange.WithKeys(i => "A" + i);
600+
AreEqual(compositeRange2.ToString(), "(0..3): { 'A1':(0..2); 'A2':(1..3) }");
601+
602+
var compositeRange3 = compositeRange2.WithoutKeys();
603+
AreEqual(compositeRange3.ToString(), "(0..3): { (0..2); (1..3) }");
604+
605+
var compositeRange4 = compositeRange3.WithKeys("A");
606+
AreEqual(compositeRange4.ToString(), "(0..3): { 'A':(0..2); 'A':(1..3) }");
607+
608+
var compositeRange5 = compositeRange4.WithKeys("B");
609+
AreEqual(compositeRange5.ToString(), "(0..3): { 'B':(0..2); 'B':(1..3) }");
610+
}
611+
612+
[Test]
613+
public static void TestCompositeRangeExclusiveWithValues()
614+
{
615+
var compositeRange = Enumerable
616+
.Range(1, 2)
617+
.ToCompositeRangeExclusive(i => i - 1, i => i + 1);
618+
AreEqual(compositeRange.ToString(), "(0..3): { '1':(0..2); '2':(1..3) }");
619+
620+
var compositeRange2 = compositeRange.WithValues(i => "A" + i);
621+
AreEqual(compositeRange2.ToString(), "(A0..A3): { '1':(A0..A2); '2':(A1..A3) }");
622+
623+
var compositeRange3 = compositeRange2.WithValues(i => i, i => "B" + i.Substring(1));
624+
AreEqual(compositeRange3.ToString(), "(A0..B3): { '1':(A0..B2); '2':(A1..B3) }");
625+
626+
var compositeRange4 = compositeRange3.WithoutKeys().WithValues(i => int.Parse(i.Substring(1)));
627+
AreEqual(compositeRange4.ToString(), "(0..3): { (0..2); (1..3) }");
628+
629+
AreEqual(compositeRange4, compositeRange.WithoutKeys());
630+
}
631+
632+
[Test]
633+
public static void TestCompositeRangeExclusiveFromWithOrWithoutKeys()
634+
{
635+
var compositeRange = Enumerable
636+
.Range(1, 2)
637+
.ToCompositeRangeExclusiveFrom(i => i - 1, i => i + 1);
638+
AreEqual(compositeRange.ToString(), "(0..3]: { '1':(0..2]; '2':(1..3] }");
639+
640+
var compositeRange2 = compositeRange.WithKeys(i => "A" + i);
641+
AreEqual(compositeRange2.ToString(), "(0..3]: { 'A1':(0..2]; 'A2':(1..3] }");
642+
643+
var compositeRange3 = compositeRange2.WithoutKeys();
644+
AreEqual(compositeRange3.ToString(), "(0..3]: { (0..2]; (1..3] }");
645+
646+
var compositeRange4 = compositeRange3.WithKeys("A");
647+
AreEqual(compositeRange4.ToString(), "(0..3]: { 'A':(0..2]; 'A':(1..3] }");
648+
649+
var compositeRange5 = compositeRange4.WithKeys("B");
650+
AreEqual(compositeRange5.ToString(), "(0..3]: { 'B':(0..2]; 'B':(1..3] }");
651+
}
652+
653+
[Test]
654+
public static void TestCompositeRangeExclusiveFromWithValues()
655+
{
656+
var compositeRange = Enumerable
657+
.Range(1, 2)
658+
.ToCompositeRangeExclusiveFrom(i => i - 1, i => i + 1);
659+
AreEqual(compositeRange.ToString(), "(0..3]: { '1':(0..2]; '2':(1..3] }");
660+
661+
var compositeRange2 = compositeRange.WithValues(i => "A" + i);
662+
AreEqual(compositeRange2.ToString(), "(A0..A3]: { '1':(A0..A2]; '2':(A1..A3] }");
663+
664+
var compositeRange3 = compositeRange2.WithValues(i => i, i => "B" + i.Substring(1));
665+
AreEqual(compositeRange3.ToString(), "(A0..B3]: { '1':(A0..B2]; '2':(A1..B3] }");
666+
667+
var compositeRange4 = compositeRange3.WithoutKeys().WithValues(i => int.Parse(i.Substring(1)));
668+
AreEqual(compositeRange4.ToString(), "(0..3]: { (0..2]; (1..3] }");
669+
670+
AreEqual(compositeRange4, compositeRange.WithoutKeys());
671+
}
672+
673+
[Test]
674+
public static void TestCompositeRangeExclusiveToWithOrWithoutKeys()
675+
{
676+
var compositeRange = Enumerable
677+
.Range(1, 2)
678+
.ToCompositeRangeExclusiveTo(i => i - 1, i => i + 1);
679+
AreEqual(compositeRange.ToString(), "[0..3): { '1':[0..2); '2':[1..3) }");
680+
681+
var compositeRange2 = compositeRange.WithKeys(i => "A" + i);
682+
AreEqual(compositeRange2.ToString(), "[0..3): { 'A1':[0..2); 'A2':[1..3) }");
683+
684+
var compositeRange3 = compositeRange2.WithoutKeys();
685+
AreEqual(compositeRange3.ToString(), "[0..3): { [0..2); [1..3) }");
686+
687+
var compositeRange4 = compositeRange3.WithKeys("A");
688+
AreEqual(compositeRange4.ToString(), "[0..3): { 'A':[0..2); 'A':[1..3) }");
689+
690+
var compositeRange5 = compositeRange4.WithKeys("B");
691+
AreEqual(compositeRange5.ToString(), "[0..3): { 'B':[0..2); 'B':[1..3) }");
692+
}
693+
694+
[Test]
695+
public static void TestCompositeRangeExclusiveToWithValues()
696+
{
697+
var compositeRange = Enumerable
698+
.Range(1, 2)
699+
.ToCompositeRangeExclusiveTo(i => i - 1, i => i + 1);
700+
AreEqual(compositeRange.ToString(), "[0..3): { '1':[0..2); '2':[1..3) }");
701+
702+
var compositeRange2 = compositeRange.WithValues(i => "A" + i);
703+
AreEqual(compositeRange2.ToString(), "[A0..A3): { '1':[A0..A2); '2':[A1..A3) }");
704+
705+
var compositeRange3 = compositeRange2.WithValues(i => i, i => "B" + i.Substring(1));
706+
AreEqual(compositeRange3.ToString(), "[A0..B3): { '1':[A0..B2); '2':[A1..B3) }");
707+
708+
var compositeRange4 = compositeRange3.WithoutKeys().WithValues(i => int.Parse(i.Substring(1)));
709+
AreEqual(compositeRange4.ToString(), "[0..3): { [0..2); [1..3) }");
710+
711+
AreEqual(compositeRange4, compositeRange.WithoutKeys());
712+
}
713+
591714
[Test]
592715
[TestCase(
593716
"∅",

0 commit comments

Comments
 (0)