Added Range Manipulation APIs to Collection<T> and ObservableCollection<T> (dotnet...
authorAndrew Hoefling <andrew@hoeflingsoftware.com>
Thu, 2 May 2019 03:57:56 +0000 (23:57 -0400)
committerSantiago Fernandez Madero <safern@microsoft.com>
Thu, 2 May 2019 03:57:56 +0000 (20:57 -0700)
commit8253d5e7da3ce7cc29c3a5f7986588b8f452df44
treedaa277050974b66aa0a30977dd52d56e5b362f3c
parenta5ff8bcdb9facf0ce1ab293011d1101bfd699170
Added Range Manipulation APIs to Collection<T> and ObservableCollection<T> (dotnet/corefx#35772)

* Added Collection<T> AddRange and InsertRange and added new XUnit tests to cover new APIs

Added missing APIs from Collection<T>; Added new unit tests for RemoveRange, ReplaceRange, InsertItemsRange and RemoveItemsRange

Updated AddRange in Collection<T> to add items to the end of the collection

Added CollectionChanged tests for ObservableCollection<T> for InsertRange, AddRange, RemoveRange and ReplaceRange

Removing API changes as these will be mirrored from CoreCLR

Updated array assertions to use Span<T> to simplify logic

Sorted order of new API methods

Simplified CollectionTests Assertion to use Span<T> instead of calling out each item in the array

Added missing API ReplaceItemsRange and updated unit tests for check for overflow errors on RemoveItems

Added overrides for ObservableCollection<T> ItemsRange API to only fire CollectionChanged once per API call. Before this was firing for each item in the collection which is not the desired result. Updated unit tests to verify this logic

Updated RemoveItemsRange to prevent int.MaxValue overflow errors

Added int.MaxValue overflow tests for Collection<T> and ObservableCollection<T> when invoking RemoveItemsRange API

Added additional RemoveRange unit tests to cover when Count is Less than 0 or when Count is 0

Updated RemoveRange overflow tests to check for ArgumentException for new business rules

Updated ObservableCollection overflow test to assert ArgumentException

Added try-finally block to ObservableCollection<T> to certify that _skipCollectionChanged is always set to false after a collection manipulation in case an exception is thrown in a subclass. Added new test class to test the new rules on the example of a NonNullObservableCollection<T>

CollectionChanged events do not fire on RemoveRange if the count == 0

Updated ObservableCollection<T> to only throw the 3 required events when ReplaceItemsRange is invoked. Updated OnChangedEvent methods to check for IList and cast as necessary. Added additional exception handling to reset _skipRaisingEvents bool. Added unit tests to verify event and event parameters are being passed correctly.

Added Collection<T> AddRange and InsertRange and added new XUnit tests to cover new APIs

Simplified CollectionTests Assertion to use Span<T> instead of calling out each item in the array

Added additional RemoveRange unit tests to cover when Count is Less than 0 or when Count is 0

Updated ObservableCollection<T> to only throw the 3 required events when ReplaceItemsRange is invoked. Updated OnChangedEvent methods to check for IList and cast as necessary. Added additional exception handling to reset _skipRaisingEvents bool. Added unit tests to verify event and event parameters are being passed correctly.

Updated ReplaceRange event to pass in the OldItems and NewItems to match the event docs

Simplified CollectionChanged 'NewItems for InsertItemsRange

Updated removedItems to use an array instead of a List<T>

Added new OnCollectionChanged overloads to reduce need for additional if checks.

Removed stale code

Optimized ReplaceItemsRange by simplifying the itemsToReplace which is no an array instead of a List<T>

Removed (IList) cast in ReplaceItemsRange when raising CollectionChanged

Removed temp array in RemoveRange which decreases memory allocation needed

* Removed redudent AsSpan parameter in test code

* Removed stale code in test code

* Removed redundent Assert.NotNull calls in several tests

* Added additional check in InsertRange to verify the input collection.Count is greater than 0 before raising the events

* Removed stale code from the `NonNullObservableCollection<T>` test harness

* Removed unnecessary whitespace

* Renamed new API tests to include the .netcoreapp extension; Updated .Tests.csproj file to only run them when the project is built under .NET core as net standard is the default

* Renamed CollectionTests -> CollectionTests.netcoreapp.cs and only run the test if it is a netcoreapp as the new APIs aren't in netstandard yet

* Added UAP and UAPAOT build configurations for System.ObjectModel tests

* Updated ObservableCollection/Collection tests that use new APIs to be in a partial class with the .netcoreapp.cs extension and existings tests to be in the .cs file.

* Added CollectionTestBase as parent class for CollectionTests for the use case where the other tests are ignored in netstandard builds

* Adding using statements back in which were failing the build

* Moving private classes from the netcoreapp tests to the regular CollectionTests as they were not available in the netstandard CI test run

* Added missing using statement for colleciton tests

* Added if-block that certifies we have replaced items before raising the Replace Event on ReplaceItemsRange

* Removed whitespace in System.Runtime.Tests.csproj

* Added negative test case for ReplaceRange when no items are replaced

* Fixed issue with failing test

Commit migrated from https://github.com/dotnet/corefx/commit/b705522753f09d501762cca6c45d6bd031c112d7
src/libraries/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs
src/libraries/System.ObjectModel/tests/Configurations.props
src/libraries/System.ObjectModel/tests/ObservableCollection/ObservableCollection_MethodTests.netcoreapp.cs [new file with mode: 0644]
src/libraries/System.ObjectModel/tests/ObservableCollection/ObservableCollection_MethodsTest.cs
src/libraries/System.ObjectModel/tests/ObservableCollection/ObservableCollection_SkipCollectionChangedTests.netcoreapp.cs [new file with mode: 0644]
src/libraries/System.ObjectModel/tests/System.ObjectModel.Tests.csproj
src/libraries/System.Runtime/ref/System.Runtime.cs
src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj
src/libraries/System.Runtime/tests/System/Collections/ObjectModel/CollectionTests.cs
src/libraries/System.Runtime/tests/System/Collections/ObjectModel/CollectionTests.netcoreapp.cs [new file with mode: 0644]