diff --git a/release-notes.txt b/release-notes.txt index 5bd4ac6..7078840 100644 --- a/release-notes.txt +++ b/release-notes.txt @@ -2,6 +2,7 @@ Release notes: 1.0.0 + - fixes: TaskSeq.insertAt, insertManyAt, removeAt, removeManyAt, updateAt now raise ArgumentNullException (not NullReferenceException) when given a null source; insertManyAt also validates the values argument - refactor: simplify lengthBy and lengthBeforeMax to use while! and remove the redundant mutable 'go' and initial MoveNextAsync - adds TaskSeq.distinctUntilChangedWith and TaskSeq.distinctUntilChangedWithAsync, #345 - adds TaskSeq.withCancellation, #167 diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.InsertAt.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.InsertAt.Tests.fs index ad8a8c8..b198330 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.InsertAt.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.InsertAt.Tests.fs @@ -16,6 +16,18 @@ open FSharp.Control exception SideEffectPastEnd of string module EmptySeq = + [] + let ``Null source is invalid`` () = + assertNullArg <| fun () -> TaskSeq.insertAt 0 99 null + + assertNullArg + <| fun () -> TaskSeq.insertManyAt 0 TaskSeq.empty null + + [] + let ``Null values argument is invalid for insertManyAt`` () = + assertNullArg + <| fun () -> TaskSeq.insertManyAt 0 null (TaskSeq.ofList [ 1 ]) + [)>] let ``TaskSeq-insertAt(0) on empty input returns singleton`` variant = Gen.getEmptyVariant variant diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.RemoveAt.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.RemoveAt.Tests.fs index 9c60052..56b332e 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.RemoveAt.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.RemoveAt.Tests.fs @@ -16,6 +16,12 @@ open FSharp.Control exception SideEffectPastEnd of string module EmptySeq = + [] + let ``Null source is invalid`` () = + assertNullArg <| fun () -> TaskSeq.removeAt 0 null + + assertNullArg <| fun () -> TaskSeq.removeManyAt 0 1 null + [)>] let ``TaskSeq-removeAt(0) on empty input raises`` variant = fun () -> diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.UpdateAt.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.UpdateAt.Tests.fs index 0bf7e9d..ed93a48 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.UpdateAt.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.UpdateAt.Tests.fs @@ -15,6 +15,9 @@ open FSharp.Control exception SideEffectPastEnd of string module EmptySeq = + [] + let ``Null source is invalid`` () = assertNullArg <| fun () -> TaskSeq.updateAt 0 99 null + [)>] let ``TaskSeq-updateAt(0) on empty input should throw ArgumentException`` variant = fun () -> diff --git a/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs b/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs index bfcddc0..578c6ed 100644 --- a/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs +++ b/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs @@ -1369,6 +1369,12 @@ module internal TaskSeqInternal = /// InsertAt or InsertManyAt let insertAt index valueOrValues (source: TaskSeq<_>) = + checkNonNull (nameof source) source + + match valueOrValues with + | Many values -> checkNonNull "values" values + | One _ -> () + raiseCannotBeNegative (nameof index) index taskSeq { @@ -1394,6 +1400,7 @@ module internal TaskSeqInternal = } let removeAt index (source: TaskSeq<'T>) = + checkNonNull (nameof source) source raiseCannotBeNegative (nameof index) index taskSeq { @@ -1411,6 +1418,7 @@ module internal TaskSeqInternal = } let removeManyAt index count (source: TaskSeq<'T>) = + checkNonNull (nameof source) source raiseCannotBeNegative (nameof index) index taskSeq { @@ -1429,6 +1437,7 @@ module internal TaskSeqInternal = } let updateAt index value (source: TaskSeq<'T>) = + checkNonNull (nameof source) source raiseCannotBeNegative (nameof index) index taskSeq {