{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/51886569","id":51886569,"diff_hunk":"@@ -0,0 +1,742 @@\n+﻿// Licensed to the .NET Foundation under one or more agreements.\n+// The .NET Foundation licenses this file to you under the MIT license.\n+// See the LICENSE file in the project root for more information.\n+\n+using System.Collections.Generic;\n+using System.Linq;\n+using Xunit;\n+\n+namespace System.Collections.Tests\n+{\n+    /// <summary>\n+    /// Contains tests that ensure the correctness of any class that implements the generic\n+    /// IEnumerable interface.\n+    /// </summary>\n+    public abstract class IEnumerable_Generic_Tests<T> : TestBase<T>\n+    {\n+        #region IEnumerable<T> Helper Methods\n+\n+        /// <summary>\n+        /// Creates an instance of an IEnumerable{T} that can be used for testing.\n+        /// </summary>\n+        /// <param name=\"count\">The number of unique items that the returned IEnumerable{T} contains.</param>\n+        /// <returns>An instance of an IEnumerable{T} that can be used for testing.</returns>\n+        protected abstract IEnumerable<T> GenericIEnumerableFactory(int count);\n+\n+        /// <summary>\n+        /// Modifies the given IEnumerable using the given modificationCode as a 'key' to determine\n+        /// how to modify that IEnumerable. A range of values from 0..WaysToModify will be\n+        /// then passed to this function. The purpose of this is to enable easy testing\n+        /// of all modification scenarios of an IEnumerable.\n+        /// \n+        /// Example: ICollection has three methods that can modify (and thus invalidate any currently existing\n+        /// enumerators): Add, Clear, and Remove. Therefore, when testing with an ICollection, WaysToModify should\n+        /// return 3.\n+        /// </summary>\n+        protected abstract void ModifyEnumerable(IEnumerable<T> enumerable, int modificationCode);\n+\n+        /// <summary>\n+        /// To be implemented in the concrete collections test classes. Returns an integer representing how many\n+        /// different ways there are to modify the IEnumerable. A range of values from 0..WaysToModify will be\n+        /// then passed to the ModifyEnumerable helper function. The purpose of this is to enable easy testing\n+        /// of all modification scenarios of an IEnumerable.\n+        /// \n+        /// Example: ICollection has three methods that can modify (and thus invalidate any currently existing\n+        /// enumerators): Add, Clear, and Remove. Therefore, when testing with an ICollection, WaysToModify should\n+        /// return 3.\n+        /// </summary>\n+        protected abstract int WaysToModify { get; }\n+\n+        /// <summary>\n+        /// The Reset method is provided for COM interoperability. It does not necessarily need to be\n+        /// implemented; instead, the implementer can simply throw a NotSupportedException.\n+        /// \n+        /// If Reset is not implemented, this property must return False. The default value is true.\n+        /// </summary>\n+        protected virtual bool ResetImplemented { get { return true; } }\n+\n+        /// <summary>\n+        /// When calling Current of the enumerator before the first MoveNext, after the end of the collection,\n+        /// or after modification of the enumeration, the resulting behavior is undefined. Tests are included\n+        /// to cover two behavioral scenarios:\n+        ///   - Throwing an InvalidOperationException\n+        ///   - Returning an undefined value.\n+        /// \n+        /// If this property is set to true, the tests ensure that the exception is thrown. The default value is\n+        /// false.\n+        /// </summary>\n+        protected virtual bool Enumerator_Current_UndefinedOperation_Throws { get { return false; } }\n+\n+        /// <summary>\n+        /// The behavior of MoveNext at the end of the enumerable after modification is undefined for the generic\n+        /// IEnumerable. It may either throw an InvalidOperationException or do nothing.\n+        /// </summary>\n+        protected bool MoveNextAtEndThrowsOnModifiedCollection { get { return true; } }\n+\n+        /// <summary>\n+        /// Specifies whether this IEnumerable follows some sort of ordering pattern.\n+        /// </summary>\n+        protected virtual EnumerableOrder Order { get { return EnumerableOrder.Sequential; } }\n+\n+        /// <summary>\n+        /// An enum to allow specification of the order of the Enumerable. Used in validation for enumerables.\n+        /// </summary>\n+        protected enum EnumerableOrder\n+        {\n+            Unspecified,\n+            Sequential\n+        }\n+\n+        #endregion\n+\n+        #region Validation\n+\n+        private void RepeatTest(\n+            Action<IEnumerator, T[], int> testCode,\n+            int iters = 3)\n+        {\n+            IEnumerable<T> enumerable = GenericIEnumerableFactory(32);\n+            T[] items = enumerable.ToArray();\n+            IEnumerator enumerator = enumerable.GetEnumerator();\n+            for (var i = 0; i < iters; i++)\n+            {\n+                testCode(enumerator, items, i);\n+                if (!ResetImplemented)\n+                {\n+                    enumerator = enumerable.GetEnumerator();\n+                }\n+                else\n+                {\n+                    enumerator.Reset();\n+                }\n+            }\n+        }\n+\n+        private void RepeatTest(\n+            Action<IEnumerator, T[]> testCode,\n+            int iters = 3)\n+        {\n+            RepeatTest((e, i, it) => testCode(e, i), iters);\n+        }\n+\n+        private void VerifyModifiedEnumerator(\n+            IEnumerator enumerator,\n+            object expectedCurrent,\n+            bool expectCurrentThrow,\n+            bool atEnd)\n+        {\n+            if (expectCurrentThrow)\n+            {\n+                Assert.Throws<InvalidOperationException>(\n+                    () => enumerator.Current);\n+            }\n+            else\n+            {\n+                object current = enumerator.Current;\n+                for (var i = 0; i < 3; i++)\n+                {\n+                    Assert.Equal(expectedCurrent, current);\n+                    current = enumerator.Current;\n+                }\n+            }\n+\n+            if (!atEnd || MoveNextAtEndThrowsOnModifiedCollection)\n+            {\n+                Assert.Throws<InvalidOperationException>(\n+                    () => enumerator.MoveNext());\n+            }\n+            else\n+            {\n+                Assert.False(enumerator.MoveNext());\n+            }\n+\n+            if (!!ResetImplemented)\n+            {\n+                Assert.Throws<InvalidOperationException>(\n+                    () => enumerator.Reset());\n+            }\n+        }\n+\n+        private void VerifyEnumerator(\n+            IEnumerator enumerator,\n+            T[] expectedItems)\n+        {\n+            VerifyEnumerator(\n+                enumerator,\n+                expectedItems,\n+                0,\n+                expectedItems.Length,\n+                true,\n+                true);\n+        }\n+\n+        private void VerifyEnumerator(\n+            IEnumerator enumerator,\n+            T[] expectedItems,\n+            int startIndex,\n+            int count,\n+            bool validateStart,\n+            bool validateEnd)\n+        {\n+            bool needToMatchAllExpectedItems = count - startIndex\n+                                               == expectedItems.Length;\n+            if (validateStart)\n+            {\n+                for (var i = 0; i < 3; i++)\n+                {\n+                    Assert.Throws<InvalidOperationException>(\n+                        () => enumerator.Current);\n+                }\n+            }\n+\n+            int iterations;\n+            if (Order == EnumerableOrder.Unspecified)\n+            {\n+                var itemsVisited =\n+                    new BitArray(\n+                        needToMatchAllExpectedItems\n+                            ? count\n+                            : expectedItems.Length,\n+                        false);\n+                for (iterations = 0;\n+                     iterations < count && enumerator.MoveNext();\n+                     iterations++)\n+                {\n+                    object currentItem = enumerator.Current;\n+                    var itemFound = false;\n+                    for (var i = 0; i < itemsVisited.Length; ++i)\n+                    {\n+                        if (!itemsVisited[i]\n+                            && Equals(\n+                                currentItem,\n+                                expectedItems[\n+                                    i\n+                                    + (needToMatchAllExpectedItems\n+                                           ? startIndex\n+                                           : 0)]))\n+                        {\n+                            itemsVisited[i] = true;\n+                            itemFound = true;\n+                            break;\n+                        }\n+                    }\n+                    Assert.True(itemFound, \"itemFound\");\n+\n+                    for (var i = 0; i < 3; i++)\n+                    {\n+                        object tempItem = enumerator.Current;\n+                        Assert.Equal(currentItem, tempItem);\n+                    }\n+                }\n+                if (needToMatchAllExpectedItems)\n+                {\n+                    for (var i = 0; i < itemsVisited.Length; i++)\n+                    {\n+                        Assert.True(itemsVisited[i]);\n+                    }\n+                }\n+                else\n+                {\n+                    var visitedItemCount = 0;\n+                    for (var i = 0; i < itemsVisited.Length; i++)\n+                    {\n+                        if (itemsVisited[i])\n+                        {\n+                            ++visitedItemCount;\n+                        }\n+                    }\n+                    Assert.Equal(count, visitedItemCount);\n+                }\n+            }\n+            else if (Order == EnumerableOrder.Sequential)\n+            {\n+                for (iterations = 0;\n+                     iterations < count && enumerator.MoveNext();\n+                     iterations++)\n+                {\n+                    object currentItem = enumerator.Current;\n+                    Assert.Equal(expectedItems[iterations], currentItem);\n+                    for (var i = 0; i < 3; i++)\n+                    {\n+                        object tempItem = enumerator.Current;\n+                        Assert.Equal(currentItem, tempItem);\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                throw new ArgumentException(\n+                    \"EnumerableOrder is invalid.\");\n+            }\n+            Assert.Equal(count, iterations);\n+\n+            if (validateEnd)\n+            {\n+                for (var i = 0; i < 3; i++)\n+                {\n+                    Assert.False(\n+                        enumerator.MoveNext(),\n+                        \"enumerator.MoveNext() returned true past the expected end.\");\n+                }\n+\n+                if (!Enumerator_Current_UndefinedOperation_Throws)\n+                {\n+                    return;\n+                }\n+                // apparently it is okay if enumerator.Current doesn't throw when the collection is generic.\n+                for (var i = 0; i < 3; i++)\n+                {\n+                }\n+                Assert.Throws<InvalidOperationException>(\n+                    () => enumerator.Current);\n+            }\n+        }\n+\n+        #endregion\n+\n+        #region GetEnumerator()\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_GetEnumerator_NoExceptionsWhileGetting(int count)\n+        {\n+            IEnumerable<T> enumerable = GenericIEnumerableFactory(count);\n+            enumerable.GetEnumerator().Dispose();\n+        }\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_GetEnumerator_ReturnsUniqueEnumerator(int count)\n+        {\n+            //Tests that the enumerators returned by GetEnumerator operate independently of one another\n+            IEnumerable<T> enumerable = GenericIEnumerableFactory(count);\n+            int iterations = 0;\n+            foreach (T item in enumerable)\n+                foreach (T item2 in enumerable)\n+                    foreach (T item3 in enumerable)\n+                        iterations++;\n+            Assert.Equal(count * count * count, iterations);\n+        }\n+\n+        #endregion\n+\n+        #region Enumerator.MoveNext\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_Enumerator_MoveNext_FromStartToFinish(int count)\n+        {\n+            int iterations = 0;\n+            using (IEnumerator<T> enumerator = GenericIEnumerableFactory(count).GetEnumerator())\n+            {\n+                while (enumerator.MoveNext())\n+                    iterations++;\n+                Assert.Equal(count, iterations);\n+            }\n+        }\n+\n+        /// <summary>\n+        /// For most collections, all calls to MoveNext after disposal of an enumerator will return false.\n+        /// Some collections (SortedList), however, treat a call to dispose as if it were a call to Reset. Since the docs\n+        /// specify neither of these as being strictly correct, we leave the method virtual.\n+        /// </summary>\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public virtual void Enumerator_MoveNext_AfterDisposal(int count)\n+        {\n+            IEnumerator<T> enumerator = GenericIEnumerableFactory(count).GetEnumerator();\n+            for (int i = 0; i < count; i++)\n+                enumerator.MoveNext();\n+            enumerator.Dispose();\n+            Assert.False(enumerator.MoveNext());\n+        }\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_Enumerator_MoveNext_AfterEndOfCollection(int count)\n+        {\n+            using (IEnumerator<T> enumerator = GenericIEnumerableFactory(count).GetEnumerator())\n+            {\n+                for (int i = 0; i < count; i++)\n+                    enumerator.MoveNext();\n+                Assert.False(enumerator.MoveNext());\n+                Assert.False(enumerator.MoveNext());\n+            }\n+        }\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_Enumerator_MoveNext_ModifiedBeforeEnumeration_ThrowsInvalidOperationException(int count)\n+        {\n+            Assert.All(Enumerable.Range(0, WaysToModify), modificationCode =>\n+            {\n+                IEnumerable<T> enumerable = GenericIEnumerableFactory(count);\n+                using (IEnumerator<T> enumerator = enumerable.GetEnumerator())\n+                {\n+                    ModifyEnumerable(enumerable, modificationCode);\n+                    Assert.Throws<InvalidOperationException>(() => enumerator.MoveNext());\n+                }\n+            });\n+        }\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_Enumerator_MoveNext_ModifiedDuringEnumeration_ThrowsInvalidOperationException(int count)\n+        {\n+            Assert.All(Enumerable.Range(0, WaysToModify), modificationCode =>\n+            {\n+                IEnumerable<T> enumerable = GenericIEnumerableFactory(count);\n+                using (IEnumerator<T> enumerator = enumerable.GetEnumerator())\n+                {\n+                    for (int i = 0; i < count / 2; i++)\n+                        enumerator.MoveNext();\n+                    ModifyEnumerable(enumerable, modificationCode);\n+                    Assert.Throws<InvalidOperationException>(() => enumerator.MoveNext());\n+                }\n+            });\n+        }\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_Enumerator_MoveNext_ModifiedAfterEnumeration_ThrowsInvalidOperationException(int count)\n+        {\n+            Assert.All(Enumerable.Range(0, WaysToModify), modificationCode =>\n+            {\n+                IEnumerable<T> enumerable = GenericIEnumerableFactory(count);\n+                using (IEnumerator<T> enumerator = enumerable.GetEnumerator())\n+                {\n+                    while (enumerator.MoveNext()) ;\n+                    ModifyEnumerable(enumerable, modificationCode);\n+                    Assert.Throws<InvalidOperationException>(() => enumerator.MoveNext());\n+                }\n+            });\n+        }\n+\n+        [Fact]\n+        public void IEnumerable_Generic_Enumerator_MoveNextHitsAllItems()\n+        {\n+            RepeatTest(\n+                (enumerator, items) =>\n+                {\n+                    var iterations = 0;\n+                    while (enumerator.MoveNext())\n+                    {\n+                        iterations++;\n+                    }\n+                    Assert.Equal(items.Length, iterations);\n+                });\n+        }\n+\n+        [Fact]\n+        public void IEnumerable_Generic_Enumerator_MoveNextFalseAfterEndOfCollection()\n+        {\n+            RepeatTest(\n+                (enumerator, items) =>\n+                {\n+                    while (enumerator.MoveNext())\n+                    {\n+                    }\n+\n+                    Assert.False(enumerator.MoveNext());\n+                });\n+        }\n+\n+        #endregion\n+\n+        #region Enumerator.Current\n+\n+        [Fact]\n+        public void IEnumerable_Generic_Enumerator_CurrentThrowsAfterEndOfCollection()\n+        {\n+            if (Enumerator_Current_UndefinedOperation_Throws)\n+            {\n+                RepeatTest(\n+                    (enumerator, items) =>\n+                    {\n+                        while (enumerator.MoveNext())\n+                        {\n+                        }\n+                        Assert.Throws<InvalidOperationException>(\n+                            () => enumerator.Current);\n+                    });\n+            }\n+        }\n+\n+        [Fact]\n+        public void IEnumerable_Generic_Enumerator_Current()\n+        {\n+            // Verify that current returns proper result.\n+            RepeatTest(\n+                (enumerator, items, iteration) =>\n+                {\n+                    if (iteration == 1)\n+                    {\n+                        VerifyEnumerator(\n+                            enumerator,\n+                            items,\n+                            0,\n+                            items.Length / 2,\n+                            true,\n+                            false);\n+                    }\n+                    else\n+                    {\n+                        VerifyEnumerator(enumerator, items);\n+                    }\n+                });\n+        }\n+\n+        [Theory]\n+        [MemberData(\"ValidCollectionSizes\")]\n+        public void IEnumerable_Generic_Enumerator_Current_FromStartToFinish(int count)\n+        {\n+            using (IEnumerator<T> enumerator = GenericIEnumerableFactory(count).GetEnumerator())\n+            {\n+                T current;\n+                while (enumerator.MoveNext())\n+                    current = enumerator.Current;\n+            }","path":"src/Common/tests/System/Collections/IEnumerable.Generic.Tests.cs","position":498,"original_position":498,"commit_id":"f5a930cb8b4fdc1bf0afc126315f22dac1a38723","original_commit_id":"f5a930cb8b4fdc1bf0afc126315f22dac1a38723","user":{"login":"stephentoub","id":2642209,"avatar_url":"https://avatars.githubusercontent.com/u/2642209?v=3","gravatar_id":"","url":"https://api.github.com/users/stephentoub","html_url":"https://github.com/stephentoub","followers_url":"https://api.github.com/users/stephentoub/followers","following_url":"https://api.github.com/users/stephentoub/following{/other_user}","gists_url":"https://api.github.com/users/stephentoub/gists{/gist_id}","starred_url":"https://api.github.com/users/stephentoub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stephentoub/subscriptions","organizations_url":"https://api.github.com/users/stephentoub/orgs","repos_url":"https://api.github.com/users/stephentoub/repos","events_url":"https://api.github.com/users/stephentoub/events{/privacy}","received_events_url":"https://api.github.com/users/stephentoub/received_events","type":"User","site_admin":false},"body":"Should we be asserting anything, like that we got the right number of iterations, the right values enumerated, etc.?","created_at":"2016-02-04T15:21:30Z","updated_at":"2016-02-04T15:21:30Z","html_url":"https://github.com/dotnet/corefx/pull/5764#discussion_r51886569","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/5764","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/51886569"},"html":{"href":"https://github.com/dotnet/corefx/pull/5764#discussion_r51886569"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/5764"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/5764","id":57592053,"html_url":"https://github.com/dotnet/corefx/pull/5764","diff_url":"https://github.com/dotnet/corefx/pull/5764.diff","patch_url":"https://github.com/dotnet/corefx/pull/5764.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/5764","number":5764,"state":"open","locked":false,"title":"Simplify and Modernize System.Collections tests","user":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"body":"The tests for System.Collections were ported from an old framework and filled with Drivers and unnecessary obfuscations. I simplified them and consolidated code wherever possible.\r\n\r\n- refactored the tests to maximize code reuse and achieve a higher coverage rate. \r\n- Interface-specific tests were added for interface-specific behavior e.g. ICollection_Generic_tests. I added these tests to Common/tests alongside the existing IEnumerableTest, ICollectionTests, etc. \r\n  - Note that these new classes encompass all of the coverage that the existing IEnumerableTest/IDictionaryTest/etc do. However, those classes are being used in System.ObjectModel and may not be deleted until that library is modified to use the new structures. I am going to do that at a later date.\r\n- removed some lines of code form System.Collections that weren't being hit.\r\n- Added generic scenarios for every collections for at least one value type (int) and one reference type (string). Some collections (e.g. HashSet) have many more test sets\r\n\r\nImprovements:\r\n16547 additions, 44866 deletions => 28319 lines removed\r\n\r\n|                 | before | after  |\r\n|-----------------|--------|--------|\r\n| line coverage   | 74.5%   | 96.2%   |\r\n| branch coverage | 70.4%   | 92.8%   |\r\n| execution time  | 49.388 s | 41.496 s |\r\n| number of tests | 1604   | 36140  |\r\n\r\n*coverage doesn't include Dictionary or List since those are in mscorlib. For those libraries (particularly Dictionary) I <i>mostly</i> just added new tests and didn't remove old ones.\r\n\r\nresolves #754, #4964 \r\n\r\ncc: people who have been active in the Collections space recently: @stephentoub @hughbe @Clockwork-Muse ","created_at":"2016-01-29T01:01:59Z","updated_at":"2016-02-04T15:21:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cd379dd182d0a989db684a6a558181cf57156085","assignee":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/dotnet/corefx/milestones/4","html_url":"https://github.com/dotnet/corefx/milestones/1.0.0-rtm","labels_url":"https://api.github.com/repos/dotnet/corefx/milestones/4/labels","id":1248719,"number":4,"title":"1.0.0-rtm","description":"Q1 2016 (https://github.com/aspnet/Home/wiki/Roadmap)","creator":{"login":"joshfree","id":1302850,"avatar_url":"https://avatars.githubusercontent.com/u/1302850?v=3","gravatar_id":"","url":"https://api.github.com/users/joshfree","html_url":"https://github.com/joshfree","followers_url":"https://api.github.com/users/joshfree/followers","following_url":"https://api.github.com/users/joshfree/following{/other_user}","gists_url":"https://api.github.com/users/joshfree/gists{/gist_id}","starred_url":"https://api.github.com/users/joshfree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshfree/subscriptions","organizations_url":"https://api.github.com/users/joshfree/orgs","repos_url":"https://api.github.com/users/joshfree/repos","events_url":"https://api.github.com/users/joshfree/events{/privacy}","received_events_url":"https://api.github.com/users/joshfree/received_events","type":"User","site_admin":false},"open_issues":237,"closed_issues":217,"state":"open","created_at":"2015-08-10T18:04:00Z","updated_at":"2016-02-04T14:55:08Z","due_on":"2016-03-31T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/5764/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/5764/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/5764/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/f5a930cb8b4fdc1bf0afc126315f22dac1a38723","head":{"label":"ianhays:collections2","ref":"collections2","sha":"f5a930cb8b4fdc1bf0afc126315f22dac1a38723","user":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"repo":{"id":37934303,"name":"corefx","full_name":"ianhays/corefx","owner":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ianhays/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":true,"url":"https://api.github.com/repos/ianhays/corefx","forks_url":"https://api.github.com/repos/ianhays/corefx/forks","keys_url":"https://api.github.com/repos/ianhays/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ianhays/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ianhays/corefx/teams","hooks_url":"https://api.github.com/repos/ianhays/corefx/hooks","issue_events_url":"https://api.github.com/repos/ianhays/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/ianhays/corefx/events","assignees_url":"https://api.github.com/repos/ianhays/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/ianhays/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/ianhays/corefx/tags","blobs_url":"https://api.github.com/repos/ianhays/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ianhays/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ianhays/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/ianhays/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ianhays/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/ianhays/corefx/languages","stargazers_url":"https://api.github.com/repos/ianhays/corefx/stargazers","contributors_url":"https://api.github.com/repos/ianhays/corefx/contributors","subscribers_url":"https://api.github.com/repos/ianhays/corefx/subscribers","subscription_url":"https://api.github.com/repos/ianhays/corefx/subscription","commits_url":"https://api.github.com/repos/ianhays/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/ianhays/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/ianhays/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/ianhays/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/ianhays/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/ianhays/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ianhays/corefx/merges","archive_url":"https://api.github.com/repos/ianhays/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ianhays/corefx/downloads","issues_url":"https://api.github.com/repos/ianhays/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/ianhays/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/ianhays/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/ianhays/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ianhays/corefx/labels{/name}","releases_url":"https://api.github.com/repos/ianhays/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/ianhays/corefx/deployments","created_at":"2015-06-23T17:36:59Z","updated_at":"2016-01-11T18:31:07Z","pushed_at":"2016-02-04T01:37:49Z","git_url":"git://github.com/ianhays/corefx.git","ssh_url":"git@github.com:ianhays/corefx.git","clone_url":"https://github.com/ianhays/corefx.git","svn_url":"https://github.com/ianhays/corefx","homepage":"http://dotnet.github.io/core/","size":51547,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"08ce3f5019358d0c00ee80e208c3419c1e6e0bd0","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/corefx/deployments","created_at":"2014-11-06T23:42:48Z","updated_at":"2016-02-04T14:28:41Z","pushed_at":"2016-02-04T14:55:09Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"http://dotnet.github.io/","size":61706,"stargazers_count":9076,"watchers_count":9076,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2104,"mirror_url":null,"open_issues_count":816,"forks":2104,"open_issues":816,"watchers":9076,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/5764"},"html":{"href":"https://github.com/dotnet/corefx/pull/5764"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/5764"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/5764/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/5764/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/5764/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/f5a930cb8b4fdc1bf0afc126315f22dac1a38723"}}}}