diff --git a/src/core-func-factory/Fanc.Factory.Tests/Fanc.Factory.Tests.csproj b/src/core-func-factory/Fanc.Factory.Tests/Fanc.Factory.Tests.csproj
new file mode 100644
index 00000000..25307fc6
--- /dev/null
+++ b/src/core-func-factory/Fanc.Factory.Tests/Fanc.Factory.Tests.csproj
@@ -0,0 +1,29 @@
+
+
+
+ net5.0
+ true
+ false
+ Andrei Sergeev, Pavel Moskovoy
+ PrimeFuncPack: A Functional Programming Pack for .NET
+ Copyright © 2020 Andrei Sergeev, Pavel Moskovoy
+ PrimeFuncPack.Core.Tests
+ PrimeFuncPack.Core.Func.Factory.Tests
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
diff --git a/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.00.cs b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.00.cs
new file mode 100644
index 00000000..943352d2
--- /dev/null
+++ b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.00.cs
@@ -0,0 +1,42 @@
+#nullable enable
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using PrimeFuncPack.UnitTest;
+using Xunit;
+using static PrimeFuncPack.UnitTest.TestData;
+
+namespace PrimeFuncPack.Core.Tests
+{
+ partial class AsyncFuncTest
+ {
+ [Fact]
+ public void Create_00_SourceFuncIsNull_ExpectArgumentNullException()
+ {
+ var sourceFunc = (Func>)null!;
+ var ex = Assert.Throws(() => _ = Func.Create(sourceFunc));
+ Assert.Equal("func", ex.ParamName);
+ }
+
+ [Theory]
+ [InlineData(null, false)]
+ [InlineData(null, true)]
+ [InlineData(EmptyString, false)]
+ [InlineData(EmptyString, true)]
+ [InlineData(WhiteSpaceString, false)]
+ [InlineData(WhiteSpaceString, true)]
+ [InlineData(SomeString, false)]
+ [InlineData(SomeString, true)]
+ public async Task Create_00_ThenInvokeAsync_ExpectResultOfSourceFunc(
+ string? sourceFuncResult, bool canceled)
+ {
+ var actual = Func.Create(_ => ValueTask.FromResult(sourceFuncResult));
+
+ var cancellationToken = new CancellationToken(canceled: canceled);
+ var actualResult = await actual.InvokeAsync(cancellationToken);
+
+ Assert.Equal(sourceFuncResult, actualResult);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.01.cs b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.01.cs
new file mode 100644
index 00000000..be6afc85
--- /dev/null
+++ b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.01.cs
@@ -0,0 +1,35 @@
+#nullable enable
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using PrimeFuncPack.UnitTest;
+using Xunit;
+using static PrimeFuncPack.UnitTest.TestData;
+
+namespace PrimeFuncPack.Core.Tests
+{
+ partial class AsyncFuncTest
+ {
+ [Fact]
+ public void Create_01_SourceFuncIsNull_ExpectArgumentNullException()
+ {
+ var sourceFunc = (Func>)null!;
+ var ex = Assert.Throws(() => _ = Func.Create(sourceFunc));
+ Assert.Equal("func", ex.ParamName);
+ }
+
+ [Theory]
+ [MemberData(nameof(TestEntitySource.RecordTypes), MemberType = typeof(TestEntitySource))]
+ public async Task Create_01_ThenInvokeAsync_ExpectResultOfSourceFunc(
+ RecordType? sourceFuncResult)
+ {
+ var actual = Func.Create((_, _) => ValueTask.FromResult(sourceFuncResult));
+
+ var cancellationToken = default(CancellationToken);
+ var actualResult = await actual.InvokeAsync(PlusFifteenIdRefType, cancellationToken);
+
+ Assert.Equal(sourceFuncResult, actualResult);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.02.cs b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.02.cs
new file mode 100644
index 00000000..aff1393e
--- /dev/null
+++ b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.02.cs
@@ -0,0 +1,38 @@
+#nullable enable
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using PrimeFuncPack.UnitTest;
+using Xunit;
+using static PrimeFuncPack.UnitTest.TestData;
+
+namespace PrimeFuncPack.Core.Tests
+{
+ partial class AsyncFuncTest
+ {
+ [Fact]
+ public void Create_02_SourceFuncIsNull_ExpectArgumentNullException()
+ {
+ var sourceFunc = (Func>)null!;
+ var ex = Assert.Throws(() => _ = Func.Create(sourceFunc));
+ Assert.Equal("func", ex.ParamName);
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Create_02_ThenInvokeAsync_ExpectResultOfSourceFunc(
+ bool? sourceFuncResult)
+ {
+ var actual = Func.Create(
+ (_, _, _) => ValueTask.FromResult(sourceFuncResult));
+
+ var cancellationToken = new CancellationToken(canceled: true);
+ var actualResult = await actual.InvokeAsync(MinusFifteenIdNullNameRecord, default, cancellationToken);
+
+ Assert.Equal(sourceFuncResult, actualResult);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.03.cs b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.03.cs
new file mode 100644
index 00000000..59bdaa2b
--- /dev/null
+++ b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.03.cs
@@ -0,0 +1,38 @@
+#nullable enable
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using PrimeFuncPack.UnitTest;
+using Xunit;
+using static PrimeFuncPack.UnitTest.TestData;
+
+namespace PrimeFuncPack.Core.Tests
+{
+ partial class AsyncFuncTest
+ {
+ [Fact]
+ public void Create_03_SourceFuncIsNull_ExpectArgumentNullException()
+ {
+ var sourceFunc = (Func>)null!;
+ var ex = Assert.Throws(() => _ = Func.Create(sourceFunc));
+ Assert.Equal("func", ex.ParamName);
+ }
+
+ [Theory]
+ [MemberData(nameof(TestEntitySource.StructTypes), MemberType = typeof(TestEntitySource))]
+ public async Task Create_03_ThenInvokeAsync_ExpectResultOfSourceFunc(
+ StructType sourceFuncResult)
+ {
+ var actual = Func.Create(
+ (_, _, _, _) => ValueTask.FromResult(sourceFuncResult));
+
+ var cancellationToken = new CancellationToken(canceled: false);
+
+ var actualResult = await actual.InvokeAsync(
+ LowerSomeString, ZeroIdRefType, PlusFifteenIdLowerSomeStringNameRecord, cancellationToken);
+
+ Assert.Equal(sourceFuncResult, actualResult);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.04.cs b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.04.cs
new file mode 100644
index 00000000..95fba73d
--- /dev/null
+++ b/src/core-func-factory/Fanc.Factory.Tests/Test.AsyncFunc/AsyncFuncTest.04.cs
@@ -0,0 +1,38 @@
+#nullable enable
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using PrimeFuncPack.UnitTest;
+using Xunit;
+using static PrimeFuncPack.UnitTest.TestData;
+
+namespace PrimeFuncPack.Core.Tests
+{
+ partial class AsyncFuncTest
+ {
+ [Fact]
+ public void Create_04_SourceFuncIsNull_ExpectArgumentNullException()
+ {
+ var sourceFunc = (Func>)null!;
+ var ex = Assert.Throws(() => _ = Func.Create(sourceFunc));
+ Assert.Equal("func", ex.ParamName);
+ }
+
+ [Theory]
+ [MemberData(nameof(TestEntitySource.RefTypes), MemberType = typeof(TestEntitySource))]
+ public async Task Create_04_ThenInvokeAsync_ExpectResultOfSourceFunc(
+ RefType? sourceFuncResult)
+ {
+ var actual = Func.Create