From e1bcd658f9feab11baa1f7ffc5d0084243908bcb Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sun, 10 Sep 2023 22:54:53 +0400 Subject: [PATCH 01/11] Minor refactor --- .../FlatArray.Factory.Explicit.From.FlatArray.cs | 8 ++++---- .../FlatArray.Factory.Explicit.From.ImmutableArray.cs | 8 ++++---- .../FlatArray/FlatArray.Factory.From.FlatArray.cs | 8 ++++---- .../FlatArray/FlatArray.Factory.From.ImmutableArray.cs | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs index da294659..2c6a2e7f 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs @@ -8,6 +8,10 @@ public static FlatArray From(FlatArray source) => new(source); + public static FlatArray From(FlatArray? source) + => + new(source); + // TODO: Add the tests and make public internal static FlatArray From(FlatArray source, int start, int length) { @@ -28,10 +32,6 @@ void InnerValidateRange() } } - public static FlatArray From(FlatArray? source) - => - new(source); - // TODO: Add the tests and make public internal static FlatArray From(FlatArray? source, int start, int length) => diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs index a008bdde..6d7befbe 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs @@ -9,6 +9,10 @@ public static FlatArray From(ImmutableArray source) => new(source); + public static FlatArray From(ImmutableArray? source) + => + new(source); + // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray source, int start, int length) { @@ -36,10 +40,6 @@ void InnerValidateRange() } } - public static FlatArray From(ImmutableArray? source) - => - new(source); - // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray? source, int start, int length) => diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs index eafbec1a..c183c066 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs @@ -6,15 +6,15 @@ public static FlatArray From(FlatArray source) => new(source); + public static FlatArray From(FlatArray? source) + => + new(source); + // TODO: Add the tests and make public internal static FlatArray From(FlatArray source, int start, int length) => FlatArray.From(source, start, length); - public static FlatArray From(FlatArray? source) - => - new(source); - // TODO: Add the tests and make public internal static FlatArray From(FlatArray? source, int start, int length) => diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs index 94003f9c..56f14e1b 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs @@ -8,15 +8,15 @@ public static FlatArray From(ImmutableArray source) => new(source); + public static FlatArray From(ImmutableArray? source) + => + new(source); + // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray source, int start, int length) => FlatArray.From(source, start, length); - public static FlatArray From(ImmutableArray? source) - => - new(source); - // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray? source, int start, int length) => From 2a874762d4d14dbd774d75e1853d1a9862242f9d Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sun, 10 Sep 2023 23:13:06 +0400 Subject: [PATCH 02/11] FlatArray / Builder: Add Index-based --- .../FlatArray.T.Builder/FlatArray.Builder.Indexers.cs | 9 ++++++++- .../FlatArray/FlatArray.T/FlatArray.Indexers.cs | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs index 8d6f79ed..b692f478 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs @@ -31,8 +31,9 @@ public T this[int index] } } - // ItemRef is implemented readonly to prevent modification of FlatArray instances + // ItemRef are implemented readonly to prevent modification of FlatArray instances // initialized by calling 'MoveTo' on the Builder + [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref readonly T ItemRef(int index) { @@ -43,5 +44,11 @@ public ref readonly T ItemRef(int index) throw InnerExceptionFactory.IndexOutOfRange(index, length); } + + // TODO: Add the tests and make public + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ref readonly T ItemRef(Index index) + => + ref ItemRef(index.GetOffset(length)); } } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs index 3fbabc6a..45a7683d 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs @@ -28,4 +28,10 @@ public ref readonly T ItemRef(int index) throw InnerExceptionFactory.IndexOutOfRange(index, length); } + + // TODO: Add the tests and make public + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ref readonly T ItemRef(Index index) + => + ref ItemRef(index.GetOffset(length)); } From 384fd3ad5b17f12876e4eee064680e7ba9211b7a Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Fri, 12 Jan 2024 23:15:04 +0400 Subject: [PATCH 03/11] FlatArray: Add ItemRef(Index) with tests --- .../Array/Array.IndexerRef.IndexFromEnd.cs | 64 +++++++++++++++++++ .../Array/Array.IndexerRef.IndexFromStart.cs | 59 +++++++++++++++++ .../Array/Array.IndexerRef.cs | 3 + .../FlatArray.T/FlatArray.Indexers.cs | 3 +- 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs new file mode 100644 index 00000000..973e48bc --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs @@ -0,0 +1,64 @@ +using System; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayTest +{ + [Theory] + [InlineData(Zero)] + [InlineData(One)] + [InlineData(2)] + [InlineData(PlusFifteen)] + public void IndexerRef_IndexFromEnd_SourceIsDefault_ExpectIndexOutOfRangeException(int indexFromEnd) + { + var fromEnd = Index.FromEnd(indexFromEnd); + + var source = default(FlatArray); + var ex = Assert.Throws(Test); + + void Test() + => + _ = source.ItemRef(fromEnd); + } + + [Theory] + [InlineData(0, 1, 1, EmptyString)] + [InlineData(0, 2, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, 4, null, "One", "Two", "Three")] + [InlineData(1, 1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(2, 1, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(3, 1, 4, null, "One", "Two", "Three")] + public void IndexerRef_IndexFromEnd_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( + int index, int indexFromEnd, int sourceLength, params string?[] sourceItems) + { + var fromEnd = Index.FromEnd(indexFromEnd); + + var source = sourceItems.InitializeFlatArray(sourceLength); + + var actual = source.ItemRef(fromEnd); + var expected = sourceItems[index]; + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(0, 1, SomeString)] + [InlineData(0, 1, EmptyString, AnotherString)] + [InlineData(4, 3, LowerSomeString, null, SomeString)] + public void IndexerRef_IndexFromEnd_IndexIsOutOfRange_ExpectIndexOutOfRangeException( + int indexFromEnd, int sourceLength, params string?[] sourceItems) + { + var fromEnd = Index.FromEnd(indexFromEnd); + + var source = sourceItems.InitializeFlatArray(sourceLength); + var ex = Assert.Throws(Test); + + void Test() + => + _ = source.ItemRef(fromEnd); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs new file mode 100644 index 00000000..1fd5b119 --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs @@ -0,0 +1,59 @@ +using System; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayTest +{ + [Theory] + [InlineData(Zero)] + [InlineData(PlusFifteen)] + public void IndexerRef_IndexFromStart_SourceIsDefault_ExpectIndexOutOfRangeException(int index) + { + var fromStart = Index.FromStart(index); + + var source = default(FlatArray); + var ex = Assert.Throws(Test); + + void Test() + => + _ = source.ItemRef(fromStart); + } + + [Theory] + [InlineData(0, 1, EmptyString)] + [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(3, 4, null, "One", "Two", "Three")] + public void IndexerRef_IndexFromStart_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( + int index, int sourceLength, params string?[] sourceItems) + { + var fromStart = Index.FromStart(index); + + var source = sourceItems.InitializeFlatArray(sourceLength); + + var actual = source.ItemRef(fromStart); + var expected = sourceItems[index]; + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(1, 1, SomeString)] + [InlineData(1, 1, EmptyString, AnotherString)] + [InlineData(5, 2, EmptyString, SomeString)] + public void IndexerRef_IndexFromStart_IndexIsOutOfRange_ExpectIndexOutOfRangeException( + int index, int sourceLength, params string?[] sourceItems) + { + var fromStart = Index.FromStart(index); + + var source = sourceItems.InitializeFlatArray(sourceLength); + var ex = Assert.Throws(Test); + + void Test() + => + _ = source.ItemRef(fromStart); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs index 90141ca1..10131b83 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs @@ -23,6 +23,9 @@ void Test() [Theory] [InlineData(0, 1, EmptyString)] + [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] [InlineData(3, 4, null, "One", "Two", "Three")] diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs index 45a7683d..81bf1c59 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Indexers.cs @@ -29,9 +29,8 @@ public ref readonly T ItemRef(int index) throw InnerExceptionFactory.IndexOutOfRange(index, length); } - // TODO: Add the tests and make public [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal ref readonly T ItemRef(Index index) + public ref readonly T ItemRef(Index index) => ref ItemRef(index.GetOffset(length)); } From 0ccf3bde06ab9d1081a7a378023b55ba20b32d1c Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 00:22:20 +0400 Subject: [PATCH 04/11] v1.3.0-rc.2 --- src/flatcollections-array/FlatArray/FlatArray.csproj | 2 +- src/flatcollections/FlatCollections/FlatCollections.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/flatcollections-array/FlatArray/FlatArray.csproj b/src/flatcollections-array/FlatArray/FlatArray.csproj index 38900595..bc0fd588 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.csproj +++ b/src/flatcollections-array/FlatArray/FlatArray.csproj @@ -18,7 +18,7 @@ PrimeFuncPack Core.FlatArray is a core library for .NET consisting of immutable FlatArray targeted for use in functional programming. System PrimeFuncPack.Core.FlatArray - 1.3.0-rc.1 + 1.3.0-rc.2 diff --git a/src/flatcollections/FlatCollections/FlatCollections.csproj b/src/flatcollections/FlatCollections/FlatCollections.csproj index 24abd215..be97a320 100644 --- a/src/flatcollections/FlatCollections/FlatCollections.csproj +++ b/src/flatcollections/FlatCollections/FlatCollections.csproj @@ -18,7 +18,7 @@ PrimeFuncPack Core.FlatCollections is a set of immutable Flat collections for .NET designed for developing business applications based on functional programming. System PrimeFuncPack.Core.FlatCollections - 1.3.0-rc.1 + 1.3.0-rc.2 @@ -33,7 +33,7 @@ - + From ad6dad4806da4ff1c802de1897a0daa2941db8d5 Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 07:04:18 +0400 Subject: [PATCH 05/11] FlatArray: Improve indexers test cases --- .../Tests.FlatArray.T/Array/Array.Indexer.cs | 8 ++++++++ .../Array/Array.IndexerRef.IndexFromEnd.cs | 4 +++- .../Array/Array.IndexerRef.IndexFromStart.cs | 7 +++++++ .../Tests.FlatArray.T/Array/Array.IndexerRef.cs | 9 +++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs index a85a2523..aac59e17 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs @@ -9,7 +9,9 @@ partial class FlatArrayTest { [Theory] [InlineData(MinusFifteen)] + [InlineData(MinusOne)] [InlineData(Zero)] + [InlineData(One)] [InlineData(PlusFifteen)] public void Indexer_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { @@ -23,8 +25,14 @@ void Test() [Theory] [InlineData(0, 1, EmptyString)] + [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(1, 3, SomeString, AnotherString, null, LowerSomeString)] [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] + [InlineData(1, 4, null, "One", "Two", "Three")] + [InlineData(2, 4, null, "One", "Two", "Three")] [InlineData(3, 4, null, "One", "Two", "Three")] public void Indexer_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( int index, int sourceLength, params string?[] sourceItems) diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs index 973e48bc..5a344ac5 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs @@ -10,7 +10,6 @@ partial class FlatArrayTest [Theory] [InlineData(Zero)] [InlineData(One)] - [InlineData(2)] [InlineData(PlusFifteen)] public void IndexerRef_IndexFromEnd_SourceIsDefault_ExpectIndexOutOfRangeException(int indexFromEnd) { @@ -47,7 +46,10 @@ public void IndexerRef_IndexFromEnd_IndexIsInRange_ExpectItemIsFromSourceItemsBy [Theory] [InlineData(0, 1, SomeString)] + [InlineData(2, 1, SomeString)] [InlineData(0, 1, EmptyString, AnotherString)] + [InlineData(2, 1, EmptyString, AnotherString)] + [InlineData(0, 3, LowerSomeString, null, SomeString)] [InlineData(4, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexFromEnd_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int indexFromEnd, int sourceLength, params string?[] sourceItems) diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs index 1fd5b119..5fe84853 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs @@ -9,6 +9,7 @@ partial class FlatArrayTest { [Theory] [InlineData(Zero)] + [InlineData(One)] [InlineData(PlusFifteen)] public void IndexerRef_IndexFromStart_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { @@ -24,8 +25,14 @@ void Test() [Theory] [InlineData(0, 1, EmptyString)] + [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(1, 3, SomeString, AnotherString, null, LowerSomeString)] [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] + [InlineData(1, 4, null, "One", "Two", "Three")] + [InlineData(2, 4, null, "One", "Two", "Three")] [InlineData(3, 4, null, "One", "Two", "Three")] public void IndexerRef_IndexFromStart_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( int index, int sourceLength, params string?[] sourceItems) diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs index 10131b83..fa22a622 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs @@ -9,7 +9,9 @@ partial class FlatArrayTest { [Theory] [InlineData(MinusFifteen)] + [InlineData(MinusOne)] [InlineData(Zero)] + [InlineData(One)] [InlineData(PlusFifteen)] public void IndexerRef_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { @@ -24,10 +26,13 @@ void Test() [Theory] [InlineData(0, 1, EmptyString)] [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] - [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] - [InlineData(0, 4, null, "One", "Two", "Three")] [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(1, 3, SomeString, AnotherString, null, LowerSomeString)] [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] + [InlineData(1, 4, null, "One", "Two", "Three")] + [InlineData(2, 4, null, "One", "Two", "Three")] [InlineData(3, 4, null, "One", "Two", "Three")] public void IndexerRef_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( int index, int sourceLength, params string?[] sourceItems) From 1497fe10b768960b4e5ebcbb877379d7dbe523ae Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 07:05:17 +0400 Subject: [PATCH 06/11] FlatArray.Builder: Arrange Factory files --- .../FlatArray.Builder.Factory.From.Array.cs | 13 +++++++ ...latArray.Builder.Factory.From.FlatArray.cs | 15 ++++++++ ...ray.Builder.Factory.From.ImmutableArray.cs | 17 +++++++++ .../FlatArray.Builder.Factory.From.List.cs | 14 ++++++++ .../FlatArray.Builder.Factory.From.cs | 35 ------------------- 5 files changed, 59 insertions(+), 35 deletions(-) create mode 100644 src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.Array.cs create mode 100644 src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.FlatArray.cs create mode 100644 src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.ImmutableArray.cs create mode 100644 src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.List.cs delete mode 100644 src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.cs diff --git a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.Array.cs b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.Array.cs new file mode 100644 index 00000000..1b71fc57 --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.Array.cs @@ -0,0 +1,13 @@ +using System.Diagnostics.CodeAnalysis; + +namespace System; + +partial class FlatArray +{ + partial class Builder + { + public static FlatArray.Builder From([AllowNull] params T[] source) + => + new(source); + } +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.FlatArray.cs b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.FlatArray.cs new file mode 100644 index 00000000..ca964104 --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.FlatArray.cs @@ -0,0 +1,15 @@ +namespace System; + +partial class FlatArray +{ + partial class Builder + { + public static FlatArray.Builder From(FlatArray source) + => + FlatArray.Builder.From(source); + + public static FlatArray.Builder From(FlatArray? source) + => + FlatArray.Builder.From(source); + } +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.ImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.ImmutableArray.cs new file mode 100644 index 00000000..3ef1332c --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.ImmutableArray.cs @@ -0,0 +1,17 @@ +using System.Collections.Immutable; + +namespace System; + +partial class FlatArray +{ + partial class Builder + { + public static FlatArray.Builder From(ImmutableArray source) + => + FlatArray.Builder.From(source); + + public static FlatArray.Builder From(ImmutableArray? source) + => + FlatArray.Builder.From(source); + } +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.List.cs b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.List.cs new file mode 100644 index 00000000..13b5dc31 --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.List.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace System; + +partial class FlatArray +{ + partial class Builder + { + public static FlatArray.Builder From([AllowNull] List source) + => + FlatArray.Builder.From(source); + } +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.cs b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.cs deleted file mode 100644 index 89d532d2..00000000 --- a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.From.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; - -namespace System; - -partial class FlatArray -{ - partial class Builder - { - public static FlatArray.Builder From([AllowNull] params T[] source) - => - new(source); - - public static FlatArray.Builder From(FlatArray source) - => - FlatArray.Builder.From(source); - - public static FlatArray.Builder From(FlatArray? source) - => - FlatArray.Builder.From(source); - - public static FlatArray.Builder From([AllowNull] List source) - => - FlatArray.Builder.From(source); - - public static FlatArray.Builder From(ImmutableArray source) - => - FlatArray.Builder.From(source); - - public static FlatArray.Builder From(ImmutableArray? source) - => - FlatArray.Builder.From(source); - } -} From 52f06dbbe2e0c76d29166f28ba8d03e85d2d0d67 Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 07:06:47 +0400 Subject: [PATCH 07/11] FlatArray.Builder: Add CollectionBuilder --- .../FlatArray/FlatArray.T.Builder/FlatArray.Builder.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.cs b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.cs index 77919351..66523cb8 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.cs @@ -5,6 +5,9 @@ namespace System; partial struct FlatArray { +#if NET8_0_OR_GREATER + [CollectionBuilder(typeof(FlatArray.Builder), nameof(FlatArray.Builder.From))] +#endif [DebuggerDisplay($"{nameof(Length)} = {{{nameof(Length)}}}")] public sealed partial class Builder { From 1e48d6957be67be6fe851b0d0a5f6abd8e12f7fc Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 07:12:52 +0400 Subject: [PATCH 08/11] FlatArray.Builder: Add CollectionBuilder tests --- .../Factory/Factory.CollectionExpression.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.CollectionExpression.cs diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.CollectionExpression.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.CollectionExpression.cs new file mode 100644 index 00000000..49cddd08 --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.CollectionExpression.cs @@ -0,0 +1,26 @@ +#if NET8_0_OR_GREATER +using System; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Fact] + public static void ConstructFromCollectionExpression_SourceIsEmpty_ExpectDefault() + { + FlatArray.Builder actual = []; + actual.VerifyInnerState([], default); + } + + [Fact] + public static void ConstructFromCollectionExpression_SourceIsNotEmpty_ExpectInnerStateIsSourceCollection() + { + FlatArray.Builder actual = [ SomeString, null, EmptyString, WhiteSpaceString, AnotherString ]; + string?[] expectedItems = [ SomeString, null, EmptyString, WhiteSpaceString, AnotherString ]; + + actual.VerifyInnerState(expectedItems, expectedItems.Length); + } +} +#endif \ No newline at end of file From 74abc2d694d490fd7b2297882bde9fc11fb0b040 Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 07:51:18 +0400 Subject: [PATCH 09/11] FlatArray.Builder: Add ItemRef(Index) with tests --- .../Builder/Builder.Indexer.cs | 14 ++++- .../Builder.IndexerRef.IndexFromEnd.cs | 60 +++++++++++++++++++ .../Builder.IndexerRef.IndexFromStart.cs | 60 +++++++++++++++++++ .../Builder/Builder.IndexerRef.cs | 14 ++++- .../FlatArray.Builder.Indexers.cs | 3 +- 5 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs index 89d71d72..b3eb4b79 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs @@ -8,9 +8,11 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayBuilderTest { [Theory] + [InlineData(MinusFifteen)] [InlineData(-1)] [InlineData(0)] [InlineData(1)] + [InlineData(PlusFifteen)] public void Indexer_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var source = new FlatArray.Builder(); @@ -19,10 +21,16 @@ public void Indexer_SourceIsDefault_ExpectIndexOutOfRangeException(int index) } [Theory] - [InlineData(0, 1, TabString)] + [InlineData(0, 1, EmptyString)] + [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] - [InlineData(2, 3, AnotherString, AnotherString, null, SomeString)] - [InlineData(3, 4, "Zero", "One", "Two", "Three")] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(1, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] + [InlineData(1, 4, null, "One", "Two", "Three")] + [InlineData(2, 4, null, "One", "Two", "Three")] + [InlineData(3, 4, null, "One", "Two", "Three")] public void Indexer_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs new file mode 100644 index 00000000..79631b9a --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs @@ -0,0 +1,60 @@ +using System; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(PlusFifteen)] + public void IndexerRef_IndexFromEnd_SourceIsDefault_ExpectIndexOutOfRangeException(int indexFromEnd) + { + var fromEnd = Index.FromEnd(indexFromEnd); + + var source = new FlatArray.Builder(); + + _ = Assert.Throws(() => _ = source.ItemRef(fromEnd)); + } + + [Theory] + [InlineData(0, 1, 1, EmptyString)] + [InlineData(0, 2, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, 4, null, "One", "Two", "Three")] + [InlineData(1, 1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(2, 1, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(3, 1, 4, null, "One", "Two", "Three")] + public void IndexerRef_IndexFromEnd_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( + int index, int indexFromEnd, int sourceLength, params string?[] sourceItems) + { + var fromEnd = Index.FromEnd(indexFromEnd); + + var source = sourceItems.InitializeFlatArrayBuilder(sourceLength); + + var actual = source.ItemRef(fromEnd); + var expected = sourceItems[index]; + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(0, 1, SomeString)] + [InlineData(2, 1, SomeString)] + [InlineData(0, 1, EmptyString, AnotherString)] + [InlineData(2, 1, EmptyString, AnotherString)] + [InlineData(0, 3, LowerSomeString, null, SomeString)] + [InlineData(4, 3, LowerSomeString, null, SomeString)] + public void IndexerRef_IndexFromEnd_IndexIsOutOfRange_ExpectIndexOutOfRangeException( + int indexFromEnd, int sourceLength, params string?[] sourceItems) + { + var fromEnd = Index.FromEnd(indexFromEnd); + + var source = sourceItems.InitializeFlatArrayBuilder(sourceLength); + + _ = Assert.Throws(() => _ = source.ItemRef(fromEnd)); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs new file mode 100644 index 00000000..12184299 --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs @@ -0,0 +1,60 @@ +using System; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(PlusFifteen)] + public void IndexerRef_IndexFromStart_SourceIsDefault_ExpectIndexOutOfRangeException(int index) + { + var fromStart = Index.FromStart(index); + + var source = new FlatArray.Builder(); + + _ = Assert.Throws(() => _ = source.ItemRef(fromStart)); + } + + [Theory] + [InlineData(0, 1, EmptyString)] + [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(1, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] + [InlineData(1, 4, null, "One", "Two", "Three")] + [InlineData(2, 4, null, "One", "Two", "Three")] + [InlineData(3, 4, null, "One", "Two", "Three")] + public void IndexerRef_IndexFromStart_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( + int index, int sourceLength, params string?[] sourceItems) + { + var fromStart = Index.FromStart(index); + + var source = sourceItems.InitializeFlatArrayBuilder(sourceLength); + + var actual = source.ItemRef(fromStart); + var expected = sourceItems[index]; + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(1, 1, SomeString)] + [InlineData(1, 1, AnotherString, SomeString)] + [InlineData(5, 2, EmptyString, TabString)] + public void IndexerRef_IndexFromStart_IndexIsOutOfRange_ExpectIndexOutOfRangeException( + int index, int sourceLength, params string?[] sourceItems) + { + var fromStart = Index.FromStart(index); + + var source = sourceItems.InitializeFlatArrayBuilder(sourceLength); + + _ = Assert.Throws(() => _ = source.ItemRef(fromStart)); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs index af0e51f7..ea73e7e3 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs @@ -8,9 +8,11 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayBuilderTest { [Theory] + [InlineData(MinusFifteen)] [InlineData(-1)] [InlineData(0)] [InlineData(1)] + [InlineData(PlusFifteen)] public void IndexerRef_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var source = new FlatArray.Builder(); @@ -19,10 +21,16 @@ public void IndexerRef_SourceIsDefault_ExpectIndexOutOfRangeException(int index) } [Theory] - [InlineData(0, 1, TabString)] + [InlineData(0, 1, EmptyString)] + [InlineData(0, 2, AnotherString, SomeString, LowerSomeString)] [InlineData(1, 2, AnotherString, SomeString, LowerSomeString)] - [InlineData(2, 3, AnotherString, AnotherString, null, SomeString)] - [InlineData(3, 4, "Zero", "One", "Two", "Three")] + [InlineData(0, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(1, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(2, 3, SomeString, AnotherString, null, LowerSomeString)] + [InlineData(0, 4, null, "One", "Two", "Three")] + [InlineData(1, 4, null, "One", "Two", "Three")] + [InlineData(2, 4, null, "One", "Two", "Three")] + [InlineData(3, 4, null, "One", "Two", "Three")] public void IndexerRef_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs index b692f478..6d8b6cc2 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.Indexers.cs @@ -45,9 +45,8 @@ public ref readonly T ItemRef(int index) throw InnerExceptionFactory.IndexOutOfRange(index, length); } - // TODO: Add the tests and make public [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal ref readonly T ItemRef(Index index) + public ref readonly T ItemRef(Index index) => ref ItemRef(index.GetOffset(length)); } From 29b68ddb5f4608f9c50def13e7ca8fc03bb08553 Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 08:23:43 +0400 Subject: [PATCH 10/11] Improve indexers test cases --- .../Builder/Builder.Indexer.cs | 40 ++++++++++++++++- .../Builder.IndexerRef.IndexFromEnd.cs | 16 +++++++ .../Builder.IndexerRef.IndexFromStart.cs | 23 +++++++++- .../Builder/Builder.IndexerRef.cs | 40 ++++++++++++++++- .../Tests.FlatArray.T/Array/Array.Indexer.cs | 44 +++++++++++++++++-- .../Array/Array.IndexerRef.IndexFromEnd.cs | 20 ++++++++- .../Array/Array.IndexerRef.IndexFromStart.cs | 25 +++++++++-- .../Array/Array.IndexerRef.cs | 44 +++++++++++++++++-- 8 files changed, 233 insertions(+), 19 deletions(-) diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs index b3eb4b79..75805cb1 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.Indexer.cs @@ -8,11 +8,15 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayBuilderTest { [Theory] + [InlineData(int.MinValue)] + [InlineData(int.MinValue + 1)] [InlineData(MinusFifteen)] [InlineData(-1)] [InlineData(0)] [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void Indexer_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var source = new FlatArray.Builder(); @@ -43,10 +47,42 @@ public void Indexer_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( } [Theory] + // Effective Length: 1, Inner array length: 1 + [InlineData(int.MinValue, 1, SomeString)] + [InlineData(int.MinValue + 1, 1, SomeString)] + [InlineData(MinusFifteen, 1, SomeString)] + [InlineData(-1, 1, SomeString)] [InlineData(1, 1, SomeString)] - [InlineData(1, 1, AnotherString, SomeString)] - [InlineData(5, 2, EmptyString, TabString)] + [InlineData(PlusFifteen, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 + [InlineData(int.MinValue, 1, EmptyString, AnotherString)] + [InlineData(int.MinValue + 1, 1, EmptyString, AnotherString)] + [InlineData(MinusFifteen, 1, EmptyString, AnotherString)] + [InlineData(-1, 1, EmptyString, AnotherString)] + [InlineData(1, 1, EmptyString, AnotherString)] + [InlineData(PlusFifteen, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(int.MinValue, 2, EmptyString, SomeString)] + [InlineData(int.MinValue + 1, 2, EmptyString, SomeString)] + [InlineData(MinusFifteen, 2, EmptyString, SomeString)] + [InlineData(-1, 2, EmptyString, SomeString)] + [InlineData(2, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 + [InlineData(int.MinValue, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MinValue + 1, 3, LowerSomeString, null, SomeString)] + [InlineData(MinusFifteen, 3, LowerSomeString, null, SomeString)] [InlineData(-1, 3, LowerSomeString, null, SomeString)] + [InlineData(3, 3, LowerSomeString, null, SomeString)] + [InlineData(PlusFifteen, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void Indexer_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs index 79631b9a..04aca244 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromEnd.cs @@ -11,6 +11,8 @@ partial class FlatArrayBuilderTest [InlineData(0)] [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void IndexerRef_IndexFromEnd_SourceIsDefault_ExpectIndexOutOfRangeException(int indexFromEnd) { var fromEnd = Index.FromEnd(indexFromEnd); @@ -42,12 +44,26 @@ public void IndexerRef_IndexFromEnd_IndexIsInRange_ExpectItemIsFromSourceItemsBy } [Theory] + // Effective Length: 1, Inner array length: 1 [InlineData(0, 1, SomeString)] [InlineData(2, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 [InlineData(0, 1, EmptyString, AnotherString)] [InlineData(2, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(0, 2, EmptyString, SomeString)] + [InlineData(3, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 [InlineData(0, 3, LowerSomeString, null, SomeString)] [InlineData(4, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexFromEnd_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int indexFromEnd, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs index 12184299..ace1253c 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.IndexFromStart.cs @@ -11,6 +11,8 @@ partial class FlatArrayBuilderTest [InlineData(0)] [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void IndexerRef_IndexFromStart_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var fromStart = Index.FromStart(index); @@ -45,9 +47,26 @@ public void IndexerRef_IndexFromStart_IndexIsInRange_ExpectItemIsFromSourceItems } [Theory] + // Effective Length: 1, Inner array length: 1 [InlineData(1, 1, SomeString)] - [InlineData(1, 1, AnotherString, SomeString)] - [InlineData(5, 2, EmptyString, TabString)] + [InlineData(PlusFifteen, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 + [InlineData(1, 1, EmptyString, AnotherString)] + [InlineData(PlusFifteen, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(2, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 + [InlineData(3, 3, LowerSomeString, null, SomeString)] + [InlineData(PlusFifteen, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexFromStart_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs index ea73e7e3..b433a7df 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.IndexerRef.cs @@ -8,11 +8,15 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayBuilderTest { [Theory] + [InlineData(int.MinValue)] + [InlineData(int.MinValue + 1)] [InlineData(MinusFifteen)] [InlineData(-1)] [InlineData(0)] [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void IndexerRef_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var source = new FlatArray.Builder(); @@ -43,10 +47,42 @@ public void IndexerRef_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( } [Theory] + // Effective Length: 1, Inner array length: 1 + [InlineData(int.MinValue, 1, SomeString)] + [InlineData(int.MinValue + 1, 1, SomeString)] + [InlineData(MinusFifteen, 1, SomeString)] + [InlineData(-1, 1, SomeString)] [InlineData(1, 1, SomeString)] - [InlineData(1, 1, AnotherString, SomeString)] - [InlineData(5, 2, EmptyString, TabString)] + [InlineData(PlusFifteen, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 + [InlineData(int.MinValue, 1, EmptyString, AnotherString)] + [InlineData(int.MinValue + 1, 1, EmptyString, AnotherString)] + [InlineData(MinusFifteen, 1, EmptyString, AnotherString)] + [InlineData(-1, 1, EmptyString, AnotherString)] + [InlineData(1, 1, EmptyString, AnotherString)] + [InlineData(PlusFifteen, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(int.MinValue, 2, EmptyString, SomeString)] + [InlineData(int.MinValue + 1, 2, EmptyString, SomeString)] + [InlineData(MinusFifteen, 2, EmptyString, SomeString)] + [InlineData(-1, 2, EmptyString, SomeString)] + [InlineData(2, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 + [InlineData(int.MinValue, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MinValue + 1, 3, LowerSomeString, null, SomeString)] + [InlineData(MinusFifteen, 3, LowerSomeString, null, SomeString)] [InlineData(-1, 3, LowerSomeString, null, SomeString)] + [InlineData(3, 3, LowerSomeString, null, SomeString)] + [InlineData(PlusFifteen, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs index aac59e17..576f9798 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.Indexer.cs @@ -8,11 +8,15 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayTest { [Theory] + [InlineData(int.MinValue)] + [InlineData(int.MinValue + 1)] [InlineData(MinusFifteen)] - [InlineData(MinusOne)] - [InlineData(Zero)] - [InlineData(One)] + [InlineData(-1)] + [InlineData(0)] + [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void Indexer_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var source = default(FlatArray); @@ -46,10 +50,42 @@ public void Indexer_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( } [Theory] + // Effective Length: 1, Inner array length: 1 + [InlineData(int.MinValue, 1, SomeString)] + [InlineData(int.MinValue + 1, 1, SomeString)] + [InlineData(MinusFifteen, 1, SomeString)] + [InlineData(-1, 1, SomeString)] [InlineData(1, 1, SomeString)] + [InlineData(PlusFifteen, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 + [InlineData(int.MinValue, 1, EmptyString, AnotherString)] + [InlineData(int.MinValue + 1, 1, EmptyString, AnotherString)] + [InlineData(MinusFifteen, 1, EmptyString, AnotherString)] + [InlineData(-1, 1, EmptyString, AnotherString)] [InlineData(1, 1, EmptyString, AnotherString)] - [InlineData(5, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(int.MinValue, 2, EmptyString, SomeString)] + [InlineData(int.MinValue + 1, 2, EmptyString, SomeString)] + [InlineData(MinusFifteen, 2, EmptyString, SomeString)] + [InlineData(-1, 2, EmptyString, SomeString)] + [InlineData(2, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 + [InlineData(int.MinValue, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MinValue + 1, 3, LowerSomeString, null, SomeString)] + [InlineData(MinusFifteen, 3, LowerSomeString, null, SomeString)] [InlineData(-1, 3, LowerSomeString, null, SomeString)] + [InlineData(3, 3, LowerSomeString, null, SomeString)] + [InlineData(PlusFifteen, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void Indexer_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs index 5a344ac5..5c77cf80 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromEnd.cs @@ -8,9 +8,11 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayTest { [Theory] - [InlineData(Zero)] - [InlineData(One)] + [InlineData(0)] + [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void IndexerRef_IndexFromEnd_SourceIsDefault_ExpectIndexOutOfRangeException(int indexFromEnd) { var fromEnd = Index.FromEnd(indexFromEnd); @@ -45,12 +47,26 @@ public void IndexerRef_IndexFromEnd_IndexIsInRange_ExpectItemIsFromSourceItemsBy } [Theory] + // Effective Length: 1, Inner array length: 1 [InlineData(0, 1, SomeString)] [InlineData(2, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 [InlineData(0, 1, EmptyString, AnotherString)] [InlineData(2, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(0, 2, EmptyString, SomeString)] + [InlineData(3, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 [InlineData(0, 3, LowerSomeString, null, SomeString)] [InlineData(4, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexFromEnd_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int indexFromEnd, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs index 5fe84853..fcc1ab7f 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.IndexFromStart.cs @@ -8,9 +8,11 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayTest { [Theory] - [InlineData(Zero)] - [InlineData(One)] + [InlineData(0)] + [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void IndexerRef_IndexFromStart_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var fromStart = Index.FromStart(index); @@ -48,9 +50,26 @@ public void IndexerRef_IndexFromStart_IndexIsInRange_ExpectItemIsFromSourceItems } [Theory] + // Effective Length: 1, Inner array length: 1 [InlineData(1, 1, SomeString)] + [InlineData(PlusFifteen, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 [InlineData(1, 1, EmptyString, AnotherString)] - [InlineData(5, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(2, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 + [InlineData(3, 3, LowerSomeString, null, SomeString)] + [InlineData(PlusFifteen, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexFromStart_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int index, int sourceLength, params string?[] sourceItems) { diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs index fa22a622..277b3a99 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T/Array/Array.IndexerRef.cs @@ -8,11 +8,15 @@ namespace PrimeFuncPack.Core.Tests; partial class FlatArrayTest { [Theory] + [InlineData(int.MinValue)] + [InlineData(int.MinValue + 1)] [InlineData(MinusFifteen)] - [InlineData(MinusOne)] - [InlineData(Zero)] - [InlineData(One)] + [InlineData(-1)] + [InlineData(0)] + [InlineData(1)] [InlineData(PlusFifteen)] + [InlineData(int.MaxValue - 1)] + [InlineData(int.MaxValue)] public void IndexerRef_SourceIsDefault_ExpectIndexOutOfRangeException(int index) { var source = default(FlatArray); @@ -46,10 +50,42 @@ public void IndexerRef_IndexIsInRange_ExpectItemIsFromSourceItemsByIndex( } [Theory] + // Effective Length: 1, Inner array length: 1 + [InlineData(int.MinValue, 1, SomeString)] + [InlineData(int.MinValue + 1, 1, SomeString)] + [InlineData(MinusFifteen, 1, SomeString)] + [InlineData(-1, 1, SomeString)] [InlineData(1, 1, SomeString)] + [InlineData(PlusFifteen, 1, SomeString)] + [InlineData(int.MaxValue - 1, 1, SomeString)] + [InlineData(int.MaxValue, 1, SomeString)] + // Effective Length: 1, Inner array length: 2 + [InlineData(int.MinValue, 1, EmptyString, AnotherString)] + [InlineData(int.MinValue + 1, 1, EmptyString, AnotherString)] + [InlineData(MinusFifteen, 1, EmptyString, AnotherString)] + [InlineData(-1, 1, EmptyString, AnotherString)] [InlineData(1, 1, EmptyString, AnotherString)] - [InlineData(5, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue - 1, 1, EmptyString, AnotherString)] + [InlineData(int.MaxValue, 1, EmptyString, AnotherString)] + // Effective Length: 2, Inner array length: 2 + [InlineData(int.MinValue, 2, EmptyString, SomeString)] + [InlineData(int.MinValue + 1, 2, EmptyString, SomeString)] + [InlineData(MinusFifteen, 2, EmptyString, SomeString)] + [InlineData(-1, 2, EmptyString, SomeString)] + [InlineData(2, 2, EmptyString, SomeString)] + [InlineData(PlusFifteen, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue - 1, 2, EmptyString, SomeString)] + [InlineData(int.MaxValue, 2, EmptyString, SomeString)] + // Effective Length: 3, Inner array length: 3 + [InlineData(int.MinValue, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MinValue + 1, 3, LowerSomeString, null, SomeString)] + [InlineData(MinusFifteen, 3, LowerSomeString, null, SomeString)] [InlineData(-1, 3, LowerSomeString, null, SomeString)] + [InlineData(3, 3, LowerSomeString, null, SomeString)] + [InlineData(PlusFifteen, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue - 1, 3, LowerSomeString, null, SomeString)] + [InlineData(int.MaxValue, 3, LowerSomeString, null, SomeString)] public void IndexerRef_IndexIsOutOfRange_ExpectIndexOutOfRangeException( int index, int sourceLength, params string?[] sourceItems) { From 20fe788b517a16453905113c5236db5592694663 Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Sat, 13 Jan 2024 08:33:28 +0400 Subject: [PATCH 11/11] Arrange Builder Factory test files --- .../Factory/Factory.From.Array.cs | 52 +++++ .../Factory/Factory.From.FlatArray.cs | 61 +++++ .../Factory/Factory.From.ImmutableArray.cs | 65 ++++++ .../Factory/Factory.From.List.cs | 69 ++++++ .../Factory/Factory.From.cs | 220 ------------------ 5 files changed, 247 insertions(+), 220 deletions(-) create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.Array.cs create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.FlatArray.cs create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.ImmutableArray.cs create mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.List.cs delete mode 100644 src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.cs diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.Array.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.Array.cs new file mode 100644 index 00000000..367a646f --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.Array.cs @@ -0,0 +1,52 @@ +using System; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Fact] + public void FromArray_SourceIsNull_ExpectInnerStateIsDefault() + { + StructType[]? source = null; + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Fact] + public void FromArray_SourceIsEmpty_ExpectInnerStateIsDefault() + { + var source = Array.Empty(); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Theory] + [InlineData(Zero)] + [InlineData(PlusFifteen, Zero, MinusFifteen, PlusFifteen)] + [InlineData(12, 15, 1, 91, 7, -95, 975, 0, 5, 6, 7, 901, 98, -266, 78, 62, 21, 35, 75, 212, 51)] + public void FromArray_SourceIsNotEmpty_ExpectInnerStateIsSourceArray( + params int[] source) + { + var coppied = source.GetCopy(); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(coppied, coppied.Length); + } + + [Fact] + public void FromArray_ThenModifySource_ExpectInnerStateHasNotChanged() + { + var sourceArray = new[] { "One", "Two", "Three" }; + var actual = FlatArray.Builder.From(sourceArray); + + sourceArray[0] = "2"; + var expectedItems = new[] { "One", "Two", "Three" }; + + actual.VerifyInnerState(expectedItems, expectedItems.Length); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.FlatArray.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.FlatArray.cs new file mode 100644 index 00000000..2f5846ed --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.FlatArray.cs @@ -0,0 +1,61 @@ +using System; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Fact] + public void FromFlatArray_SourceIsDefault_ExpectInnerStateIsDefault() + { + var source = default(FlatArray); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Theory] + [InlineData(SomeString, AnotherString)] + [InlineData(LowerSomeString, null, SomeString, EmptyString, WhiteSpaceString)] + public void FromFlatArray_SourceIsNotDefault_ExpectInnerStateIsSourceArray( + params string?[] sourceArray) + { + var coppied = sourceArray.GetCopy(); + + var source = sourceArray.InitializeFlatArray(); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(coppied, coppied.Length); + } + + [Fact] + public void FromNullableFlatArray_SourceIsNull_ExpectInnerStateIsDefault() + { + var source = default(FlatArray?); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Fact] + public void FromNullableFlatArray_SourceIsDefault_ExpectInnerStateIsDefault() + { + FlatArray? source = default(FlatArray); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Fact] + public void FromNullableFlatArray_SourceIsNotDefault_ExpectInnerStateIsSourceArray() + { + FlatArray? source = new bool?[] { false, null, true }.InitializeFlatArray(2); + + var actual = FlatArray.Builder.From(source); + var expectedItems = new bool?[] { false, null }; + + actual.VerifyInnerState(expectedItems, expectedItems.Length); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.ImmutableArray.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.ImmutableArray.cs new file mode 100644 index 00000000..d459664f --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.ImmutableArray.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Immutable; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Fact] + public void FromImmutableArray_SourceIsDefault_ExpectInnerStateIsDefault() + { + var source = default(ImmutableArray); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Theory] + [InlineData(SomeString)] + [InlineData(LowerSomeString, null, AnotherString)] + public void FromImmutableArray_SourceIsNotDefault_ExpectInnerStateAreSourceItems( + params string?[] sourceArray) + { + var coppied = sourceArray.GetCopy(); + + var source = sourceArray.ToImmutableArray(); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(coppied, coppied.Length); + } + + [Fact] + public void FromNullableImmutableArray_SourceIsNull_ExpectInnerStateIsDefault() + { + ImmutableArray? source = null; + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Fact] + public void FromNullableImmutableArray_SourceIsDefault_ExpectInnerStateIsDefault() + { + ImmutableArray? source = new ImmutableArray();; + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Theory] + [InlineData(PlusFifteen)] + [InlineData(null, MinusFifteen, Zero)] + public void FromNullableImmutableArray_SourceIsNotDefault_ExpectInnerStateAreSourceItems( + params int?[] sourceItems) + { + var coppied = sourceItems.GetCopy(); + + var source = sourceItems.ToImmutableArray(); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(coppied, coppied.Length); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.List.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.List.cs new file mode 100644 index 00000000..fc3284b1 --- /dev/null +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.List.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using PrimeFuncPack.UnitTest; +using Xunit; +using static PrimeFuncPack.UnitTest.TestData; + +namespace PrimeFuncPack.Core.Tests; + +partial class FlatArrayBuilderTest +{ + [Fact] + public void FromList_SourceIsNull_ExpectInnerStateIsDefault() + { + List? source = null; + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Fact] + public void FromList_SourceIsEmpty_ExpectInnerStateIsDefault() + { + var source = new List(); + var actual = FlatArray.Builder.From(source); + + actual.VerifyInnerState(Array.Empty(), default); + } + + [Fact] + public void FromList_SourceIsNotEmpty_ExpectInnerStateAreSourceItems() + { + var source = new List + { + SomeTextRecordStruct, null, AnotherTextRecordStruct + }; + + var actual = FlatArray.Builder.From(source); + + const int expectedLength = 3; + var expectedItems = new RecordStruct?[] + { + SomeTextRecordStruct, null, AnotherTextRecordStruct + }; + + actual.VerifyInnerState(expectedItems, expectedLength); + } + + [Fact] + public void FromList_ThenModifySource_ExpectInnerStateHasNotChanged() + { + var sourceList = new List + { + MinusFifteenIdSomeStringNameRecord, ZeroIdNullNameRecord, PlusFifteenIdSomeStringNameRecord + }; + + var actual = FlatArray.Builder.From(sourceList); + + sourceList[0] = PlusFifteenIdLowerSomeStringNameRecord; + sourceList.Add(MinusFifteenIdNullNameRecord); + + const int expectedLength = 3; + var expectedItems = new[] + { + MinusFifteenIdSomeStringNameRecord, ZeroIdNullNameRecord, PlusFifteenIdSomeStringNameRecord + }; + + actual.VerifyInnerState(expectedItems, expectedLength); + } +} \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.cs deleted file mode 100644 index 61c15a7c..00000000 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Factory/Factory.From.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using PrimeFuncPack.UnitTest; -using Xunit; -using static PrimeFuncPack.UnitTest.TestData; - -namespace PrimeFuncPack.Core.Tests; - -partial class FlatArrayBuilderTest -{ - [Fact] - public void FromArray_SourceIsNull_ExpectInnerStateIsDefault() - { - StructType[]? source = null; - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Fact] - public void FromArray_SourceIsEmpty_ExpectInnerStateIsDefault() - { - var source = Array.Empty(); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Theory] - [InlineData(Zero)] - [InlineData(PlusFifteen, Zero, MinusFifteen, PlusFifteen)] - [InlineData(12, 15, 1, 91, 7, -95, 975, 0, 5, 6, 7, 901, 98, -266, 78, 62, 21, 35, 75, 212, 51)] - public void FromArray_SourceIsNotEmpty_ExpectInnerStateIsSourceArray( - params int[] source) - { - var coppied = source.GetCopy(); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(coppied, coppied.Length); - } - - [Fact] - public void FromArray_ThenModifySource_ExpectInnerStateHasNotChanged() - { - var sourceArray = new[] { "One", "Two", "Three" }; - var actual = FlatArray.Builder.From(sourceArray); - - sourceArray[0] = "2"; - var expectedItems = new[] { "One", "Two", "Three" }; - - actual.VerifyInnerState(expectedItems, expectedItems.Length); - } - - [Fact] - public void FromFlatArray_SourceIsDefault_ExpectInnerStateIsDefault() - { - var source = default(FlatArray); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Theory] - [InlineData(SomeString, AnotherString)] - [InlineData(LowerSomeString, null, SomeString, EmptyString, WhiteSpaceString)] - public void FromFlatArray_SourceIsNotDefault_ExpectInnerStateIsSourceArray( - params string?[] sourceArray) - { - var coppied = sourceArray.GetCopy(); - - var source = sourceArray.InitializeFlatArray(); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(coppied, coppied.Length); - } - - [Fact] - public void FromNullableFlatArray_SourceIsNull_ExpectInnerStateIsDefault() - { - var source = default(FlatArray?); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Fact] - public void FromNullableFlatArray_SourceIsDefault_ExpectInnerStateIsDefault() - { - FlatArray? source = default(FlatArray); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Fact] - public void FromNullableFlatArray_SourceIsNotDefault_ExpectInnerStateIsSourceArray() - { - FlatArray? source = new bool?[] { false, null, true }.InitializeFlatArray(2); - - var actual = FlatArray.Builder.From(source); - var expectedItems = new bool?[] { false, null }; - - actual.VerifyInnerState(expectedItems, expectedItems.Length); - } - - [Fact] - public void FromList_SourceIsNull_ExpectInnerStateIsDefault() - { - List? source = null; - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Fact] - public void FromList_SourceIsEmpty_ExpectInnerStateIsDefault() - { - var source = new List(); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Fact] - public void FromList_SourceIsNotEmpty_ExpectInnerStateAreSourceItems() - { - var source = new List - { - SomeTextRecordStruct, null, AnotherTextRecordStruct - }; - - var actual = FlatArray.Builder.From(source); - - const int expectedLength = 3; - var expectedItems = new RecordStruct?[] - { - SomeTextRecordStruct, null, AnotherTextRecordStruct - }; - - actual.VerifyInnerState(expectedItems, expectedLength); - } - - [Fact] - public void FromList_ThenModifySource_ExpectInnerStateHasNotChanged() - { - var sourceList = new List - { - MinusFifteenIdSomeStringNameRecord, ZeroIdNullNameRecord, PlusFifteenIdSomeStringNameRecord - }; - - var actual = FlatArray.Builder.From(sourceList); - - sourceList[0] = PlusFifteenIdLowerSomeStringNameRecord; - sourceList.Add(MinusFifteenIdNullNameRecord); - - const int expectedLength = 3; - var expectedItems = new[] - { - MinusFifteenIdSomeStringNameRecord, ZeroIdNullNameRecord, PlusFifteenIdSomeStringNameRecord - }; - - actual.VerifyInnerState(expectedItems, expectedLength); - } - - [Fact] - public void FromImmutableArray_SourceIsDefault_ExpectInnerStateIsDefault() - { - var source = default(ImmutableArray); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Theory] - [InlineData(SomeString)] - [InlineData(LowerSomeString, null, AnotherString)] - public void FromImmutableArray_SourceIsNotDefault_ExpectInnerStateAreSourceItems( - params string?[] sourceArray) - { - var coppied = sourceArray.GetCopy(); - - var source = sourceArray.ToImmutableArray(); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(coppied, coppied.Length); - } - - [Fact] - public void FromNullableImmutableArray_SourceIsNull_ExpectInnerStateIsDefault() - { - ImmutableArray? source = null; - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Fact] - public void FromNullableImmutableArray_SourceIsDefault_ExpectInnerStateIsDefault() - { - ImmutableArray? source = new ImmutableArray();; - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(Array.Empty(), default); - } - - [Theory] - [InlineData(PlusFifteen)] - [InlineData(null, MinusFifteen, Zero)] - public void FromNullableImmutableArray_SourceIsNotDefault_ExpectInnerStateAreSourceItems( - params int?[] sourceItems) - { - var coppied = sourceItems.GetCopy(); - - var source = sourceItems.ToImmutableArray(); - var actual = FlatArray.Builder.From(source); - - actual.VerifyInnerState(coppied, coppied.Length); - } -} \ No newline at end of file