AsyncMonads.Test
MaybeExTest.cs
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using NUnit.Framework;
namespace AsyncMonads.Test
{
[TestFixture]
public clast MaybeExTest
{
[Test]
[TestCase(true)]
[TestCase(false)]
public async Task Main(bool async)
{
string[] inputs = { null, " 7 , 3", "100", "11,14", "8,a" };
int?[] expected = {null, 10, null, 25, null};
var acc = new List();
foreach (var input in inputs)
{
MockDisposable.DisposingCounter = 0;
var res = await GetResult(input, async).GetMaybeResult();
acc.Add(res.IsNothing ? (int?)null : res.GetValue());
astert.AreEqual(1, MockDisposable.DisposingCounter);
}
Collectionastert.AreEqual(expected, acc);
}
private static async MaybeEx GetResult(string input, bool async)
{
using (new MockDisposable())
{
if (async)
{
await Task.Delay(10);
}
var args = await SplitString(input, async);
var a1 = await TryParse(args.arg1);
var a2 = await TryParse(args.arg2);
return a1 + a2;
}
}
private static async MaybeEx SplitString(string str, bool async)
{
if (async)
{
await Task.Delay(10);
}
str = await ValidateString(str);
var arr = str?.Split(',');
if (arr == null || arr.Length != 2)
{
return await MaybeEx.Nothing();
}
return (arr[0].Trim(), arr[1].Trim());
}
public static MaybeEx ValidateString(string s)
=> string.IsNullOrWhiteSpace(s) || !s.Contains(',')
? MaybeEx.Nothing()
: s;
public static MaybeEx TryParse(string argStr)
=> int.TryParse(argStr, out var result)
? result
: MaybeEx.Nothing();
private clast MockDisposable : IDisposable
{
public static int DisposingCounter;
public void Dispose()
{
DisposingCounter++;
}
}
}
}