{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/WinObjC/pulls/comments/100197462","pull_request_review_id":20895286,"id":100197462,"diff_hunk":"@@ -0,0 +1,599 @@\n+//******************************************************************************\n+//\n+// Copyright (c) 2016 Microsoft Corporation. All rights reserved.\n+//\n+// This code is licensed under the MIT License (MIT).\n+//\n+// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n+// THE SOFTWARE.\n+//\n+//******************************************************************************\n+#pragma once\n+\n+#include \"gtest-api.h\"\n+\n+#include \"Logger.h\"\n+#include <mutex>\n+#include <string>\n+#include <locale>\n+#include <codecvt>\n+\n+#ifdef __OBJC__\n+#pragma push_macro(\"interface\")\n+#ifndef interface\n+#define interface struct\n+#endif\n+#pragma push_macro(\"Nil\")\n+#undef Nil\n+#pragma push_macro(\"__alignof\")\n+#define __alignof alignof\n+#pragma clang diagnostic push\n+#pragma clang diagnostic ignored \"-Wmicrosoft\"\n+\n+#include <UWP/RTHelpers.h>\n+#endif\n+\n+#include <WexTestClass.h>\n+\n+#ifdef __OBJC__\n+#pragma pop_macro(\"Nil\")\n+#pragma pop_macro(\"interface\")\n+#pragma pop_macro(\"__alignof\")\n+#pragma clang diagnostic pop\n+#endif\n+\n+#include \"Framework/Framework.h\"\n+extern void UIApplicationDefaultInitialize();\n+\n+/////////////////////////////////////////////////////////\n+// Logging macros\n+/////////////////////////////////////////////////////////\n+\n+#ifdef __clang__\n+#define _TESTAPI_FUNCTION __PRETTY_FUNCTION__\n+#else\n+#define _TESTAPI_FUNCTION __FUNCTION__\n+#endif\n+\n+#ifdef LOG_INFO\n+#undef LOG_INFO\n+#endif\n+#define LOG_INFO(__format, ...) TestLog::LogComment(GTestLogPrivate::Format(__format, __VA_ARGS__).data())\n+\n+#ifdef LOG_WARNING\n+#undef LOG_WARNING\n+#endif\n+#define LOG_WARNING(__format, ...) \\\n+    TestLog::LogWarning(GTestLogPrivate::Format(__format, __VA_ARGS__).data(), __FILE__, _TESTAPI_FUNCTION, __LINE__)\n+\n+#ifdef LOG_ERROR\n+#undef LOG_ERROR\n+#endif\n+#define LOG_ERROR(__format, ...) \\\n+    TestLog::LogError(GTestLogPrivate::Format(__format, __VA_ARGS__).data(), __FILE__, _TESTAPI_FUNCTION, __LINE__)\n+\n+/////////////////////////////////////////////////////////\n+// Assert and Verify macros override\n+/////////////////////////////////////////////////////////\n+\n+#ifdef GTEST_SUCCESS_\n+#undef GTEST_SUCCESS_\n+#endif\n+#define GTEST_SUCCESS_(__message) TestLog::LogComment((__message))\n+\n+#ifdef GTEST_NONFATAL_FAILURE_\n+#undef GTEST_NONFATAL_FAILURE_\n+#endif\n+#define GTEST_NONFATAL_FAILURE_(__message) TestLog::LogError((__message), __FILE__, _TESTAPI_FUNCTION, __LINE__)\n+\n+#ifdef GTEST_FATAL_FAILURE_\n+#undef GTEST_FATAL_FAILURE_\n+#endif\n+#define GTEST_FATAL_FAILURE_(__message) TestLog::LogErrorAndAbort((__message), __FILE__, _TESTAPI_FUNCTION, __LINE__)\n+\n+// TODO::\n+// todo-nithishm-04182016 - Investigate a better way to support ASSERT_*_MSG and EXPECT_*_MSG macros without re-defining them\n+// here. Bug 7244185 is tracking this work.\n+\n+/////////////////////////////////////////////////////////\n+// Assert macros (terminates the test on failure)\n+/////////////////////////////////////////////////////////\n+\n+#ifdef ASSERT_TRUE_MSG\n+#undef ASSERT_TRUE_MSG\n+#endif\n+#define ASSERT_TRUE_MSG(condition, format, ...)                            \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_TRUE(condition);\n+\n+#ifdef ASSERT_FALSE_MSG\n+#undef ASSERT_FALSE_MSG\n+#endif\n+#define ASSERT_FALSE_MSG(condition, format, ...)                           \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_FALSE(condition);\n+\n+#ifdef ASSERT_EQ_MSG\n+#undef ASSERT_EQ_MSG\n+#endif\n+#define ASSERT_EQ_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_EQ(val1, val2);\n+\n+#ifdef ASSERT_NE_MSG\n+#undef ASSERT_NE_MSG\n+#endif\n+#define ASSERT_NE_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_NE(val1, val2);\n+\n+#ifdef ASSERT_LE_MSG\n+#undef ASSERT_LE_MSG\n+#endif\n+#define ASSERT_LE_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_LE(val1, val2);\n+\n+#ifdef ASSERT_LT_MSG\n+#undef ASSERT_LT_MSG\n+#endif\n+#define ASSERT_LT_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_LT(val1, val2);\n+\n+#ifdef ASSERT_GE_MSG\n+#undef ASSERT_GE_MSG\n+#endif\n+#define ASSERT_GE_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_GE(val1, val2);\n+\n+#ifdef ASSERT_GT_MSG\n+#undef ASSERT_GT_MSG\n+#endif\n+#define ASSERT_GT_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_GT(val1, val2);\n+\n+#ifdef ASSERT_HRESULT_SUCCEEDED_MSG\n+#undef ASSERT_HRESULT_SUCCEEDED_MSG\n+#endif\n+#define ASSERT_HRESULT_SUCCEEDED_MSG(expr, format, ...)                    \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_HRESULT_SUCCEEDED(expr);\n+\n+#ifdef ASSERT_HRESULT_FAILED_MSG\n+#undef ASSERT_HRESULT_FAILED_MSG\n+#endif\n+#define ASSERT_HRESULT_FAILED_MSG(expr, format, ...)                       \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_HRESULT_FAILED(expr);\n+\n+#ifdef ASSERT_STREQ_MSG\n+#undef ASSERT_STREQ_MSG\n+#endif\n+#define ASSERT_STREQ_MSG(expected, actual, format, ...)                    \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_STREQ(expected, actual);\n+\n+#ifdef ASSERT_STRNE_MSG\n+#undef ASSERT_STRNE_MSG\n+#endif\n+#define ASSERT_STRNE_MSG(expected, actual, format, ...)                    \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_STRNE(expected, actual);\n+\n+#ifdef ASSERT_STRCASEEQ_MSG\n+#undef ASSERT_STRCASEEQ_MSG\n+#endif\n+#define ASSERT_STRCASEEQ_MSG(expected, actual, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_STRCASEEQ(expected, actual);\n+\n+#ifdef ASSERT_STRCASENE_MSG\n+#undef ASSERT_STRCASENE_MSG\n+#endif\n+#define ASSERT_STRCASENE_MSG(expected, actual, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_STRCASENE(expected, actual);\n+\n+#ifdef ASSERT_FLOAT_EQ_MSG\n+#undef ASSERT_FLOAT_EQ_MSG\n+#endif\n+#define ASSERT_FLOAT_EQ_MSG(expected, actual, format, ...)                 \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_FLOAT_EQ(expected, actual);\n+\n+#ifdef ASSERT_DOUBLE_EQ_MSG\n+#undef ASSERT_DOUBLE_EQ_MSG\n+#endif\n+#define ASSERT_DOUBLE_EQ_MSG(expected, actual, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_DOUBLE_EQ(expected, actual);\n+\n+#ifdef ASSERT_NEAR_MSG\n+#undef ASSERT_NEAR_MSG\n+#endif\n+#define ASSERT_NEAR_MSG(val1, val2, abs_error, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_NEAR(val1, val2, abs_error);\n+\n+#ifdef ASSERT_THROW_MSG\n+#undef ASSERT_THROW_MSG\n+#endif\n+#define ASSERT_THROW_MSG(statement, expected_exception, format, ...)       \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_THROW(statement, expected_exception);\n+\n+#ifdef ASSERT_NO_THROW_MSG\n+#undef ASSERT_NO_THROW_MSG\n+#endif\n+#define ASSERT_NO_THROW_MSG(statement, format, ...)                        \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_NO_THROW(statement);\n+\n+#ifdef ASSERT_ANY_THROW_MSG\n+#undef ASSERT_ANY_THROW_MSG\n+#endif\n+#define ASSERT_ANY_THROW_MSG(statement, format, ...)                       \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_ANY_THROW(statement);\n+\n+#ifdef ASSERT_OBJCEQ_MSG\n+#undef ASSERT_OBJCEQ_MSG\n+#endif\n+#define ASSERT_OBJCEQ_MSG(val1, val2, format, ...)                         \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_OBJCEQ(val1, val2);\n+\n+#ifdef ASSERT_OBJCNE_MSG\n+#undef ASSERT_OBJCNE_MSG\n+#endif\n+#define ASSERT_OBJCNE_MSG(val1, val2, format, ...)                         \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    ASSERT_OBJCNE(val1, val2);\n+\n+///////////////////////////////////////////////////////////\n+// Expect macros (fails, but continues the test on failure)\n+///////////////////////////////////////////////////////////\n+\n+#ifdef EXPECT_TRUE_MSG\n+#undef EXPECT_TRUE_MSG\n+#endif\n+#define EXPECT_TRUE_MSG(condition, format, ...)                            \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_TRUE(condition);\n+\n+#ifdef EXPECT_FALSE_MSG\n+#undef EXPECT_FALSE_MSG\n+#endif\n+#define EXPECT_FALSE_MSG(condition, format, ...)                           \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_FALSE(condition);\n+\n+#ifdef EXPECT_EQ_MSG\n+#undef EXPECT_EQ_MSG\n+#endif\n+#define EXPECT_EQ_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_EQ(val1, val2);\n+\n+#ifdef EXPECT_NE_MSG\n+#undef EXPECT_NE_MSG\n+#endif\n+#define EXPECT_NE_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_NE(val1, val2);\n+\n+#ifdef EXPECT_LE_MSG\n+#undef EXPECT_LE_MSG\n+#endif\n+#define EXPECT_LE_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_LE(val1, val2);\n+\n+#ifdef EXPECT_LT_MSG\n+#undef EXPECT_LT_MSG\n+#endif\n+#define EXPECT_LT_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_LT(val1, val2);\n+\n+#ifdef EXPECT_GE_MSG\n+#undef EXPECT_GE_MSG\n+#endif\n+#define EXPECT_GE_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_GE(val1, val2);\n+\n+#ifdef EXPECT_GT_MSG\n+#undef EXPECT_GT_MSG\n+#endif\n+#define EXPECT_GT_MSG(val1, val2, format, ...)                             \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_GT(val1, val2);\n+\n+#ifdef EXPECT_HRESULT_SUCCEEDED_MSG\n+#undef EXPECT_HRESULT_SUCCEEDED_MSG\n+#endif\n+#define EXPECT_HRESULT_SUCCEEDED_MSG(expr, format, ...)                    \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_HRESULT_SUCCEEDED(expr);\n+\n+#ifdef EXPECT_HRESULT_FAILED_MSG\n+#undef EXPECT_HRESULT_FAILED_MSG\n+#endif\n+#define EXPECT_HRESULT_FAILED_MSG(expr, format, ...)                       \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_HRESULT_FAILED(expr);\n+\n+#ifdef EXPECT_STREQ_MSG\n+#undef EXPECT_STREQ_MSG\n+#endif\n+#define EXPECT_STREQ_MSG(expected, actual, format, ...)                    \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_STREQ(expected, actual);\n+\n+#ifdef EXPECT_STRNE_MSG\n+#undef EXPECT_STRNE_MSG\n+#endif\n+#define EXPECT_STRNE_MSG(expected, actual, format, ...)                    \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_STRNE(expected, actual);\n+\n+#ifdef EXPECT_STRCASEEQ_MSG\n+#undef EXPECT_STRCASEEQ_MSG\n+#endif\n+#define EXPECT_STRCASEEQ_MSG(expected, actual, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_STRCASEEQ(expected, actual);\n+\n+#ifdef EXPECT_STRCASENE_MSG\n+#undef EXPECT_STRCASENE_MSG\n+#endif\n+#define EXPECT_STRCASENE_MSG(expected, actual, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_STRCASENE(expected, actual);\n+\n+#ifdef EXPECT_FLOAT_EQ_MSG\n+#undef EXPECT_FLOAT_EQ_MSG\n+#endif\n+#define EXPECT_FLOAT_EQ_MSG(expected, actual, format, ...)                 \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_FLOAT_EQ(expected, actual);\n+\n+#ifdef EXPECT_DOUBLE_EQ_MSG\n+#undef EXPECT_DOUBLE_EQ_MSG\n+#endif\n+#define EXPECT_DOUBLE_EQ_MSG(expected, actual, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_DOUBLE_EQ(expected, actual);\n+\n+#ifdef EXPECT_NEAR_MSG\n+#undef EXPECT_NEAR_MSG\n+#endif\n+#define EXPECT_NEAR_MSG(val1, val2, abs_error, format, ...)                \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_NEAR(val1, val2, abs_error);\n+\n+#ifdef EXPECT_THROW_MSG\n+#undef EXPECT_THROW_MSG\n+#endif\n+#define EXPECT_THROW_MSG(statement, expected_exception, format, ...)       \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_EXPECT_THROW(statement, expected_exception);\n+\n+#ifdef EXPECT_NO_THROW_MSG\n+#undef EXPECT_NO_THROW_MSG\n+#endif\n+#define EXPECT_NO_THROW_MSG(statement, format, ...)                        \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_NO_THROW(statement);\n+\n+#ifdef EXPECT_ANY_THROW_MSG\n+#undef EXPECT_ANY_THROW_MSG\n+#endif\n+#define EXPECT_ANY_THROW_MSG(statement, format, ...)                       \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_ANY_THROW(statement);\n+\n+#ifdef EXPECT_OBJCEQ_MSG\n+#undef EXPECT_OBJCEQ_MSG\n+#endif\n+#define EXPECT_OBJCEQ_MSG(val1, val2, format, ...)                         \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_OBJCEQ(val1, val2);\n+\n+#ifdef EXPECT_OBJCNE_MSG\n+#undef EXPECT_OBJCNE_MSG\n+#endif\n+#define EXPECT_OBJCNE_MSG(val1, val2, format, ...)                         \\\n+    TestLog::SetUserComment(GTestLogPrivate::Format(format, __VA_ARGS__)); \\\n+    EXPECT_OBJCNE(val1, val2);\n+\n+#ifdef FRIEND_TEST\n+#undef FRIEND_TEST\n+#endif\n+#define FRIEND_TEST(test_case_name, test_name) friend class test_case_name##_##test_name\n+\n+// clang-format off\n+template <unsigned NumChar>\n+constexpr const wchar_t* const _IsDisabledTest(char const (&str1)[NumChar]) {\n+    return ((NumChar > 8)  &&\n+            str1[0] == 'D' &&\n+            str1[1] == 'I' &&\n+            str1[2] == 'S' &&\n+            str1[3] == 'A' &&\n+            str1[4] == 'B' &&\n+            str1[5] == 'L' &&\n+            str1[6] == 'E' &&\n+            str1[7] == 'D') ? L\"TRUE\" : L\"FALSE\";\n+}\n+\n+__declspec(noinline) inline std::string _ExchangeAlternateTestName(\n+    const std::string& alternateName, bool exchange) {\n+\n+    static std::string s_alternateTestName;\n+    static std::mutex s_alternateTestNameLock;\n+    std::lock_guard<std::mutex> lock(s_alternateTestNameLock);\n+    std::string toReturn = s_alternateTestName;\n+    if (exchange) {\n+        s_alternateTestName = alternateName;\n+    }\n+    \n+    return toReturn;\n+}\n+\n+#pragma push_macro(\"GTEST_TEST_\")\n+#define GTEST_TEST_(className, methodName, parent_class, parent_id) \\\n+    class className##_##methodName : public parent_class { \\\n+        BEGIN_TEST_CLASS(className##_##methodName) \\\n+            TEST_CLASS_PROPERTY(L\"Ignore\", _IsDisabledTest( #methodName )) \\\n+        END_TEST_CLASS() \\\n+        \\\n+        TEST_METHOD(Test); \\\n+        \\\n+        TEST_METHOD_SETUP(_Setup) { \\\n+            SetUp(); \\\n+            return true; \\\n+        } \\\n+        TEST_METHOD_CLEANUP(_Teardown) { \\\n+            TearDown(); \\\n+            return true; \\\n+        } \\\n+        TEST_CLASS_SETUP(_SetupClass) { \\\n+            SetUpTestCase(); \\\n+            return true; \\\n+        } \\\n+        TEST_CLASS_CLEANUP(_TeardownClass) { \\\n+            TearDownTestCase(); \\\n+            return true; \\\n+        } \\\n+        \\\n+        virtual void TestBody() { \\\n+            /* Unused. Strictly to conform to GTEST test abstract methods. */ \\\n+            Test(); \\\n+        } \\\n+        \\\n+    }; \\\n+    \\\n+    void className##_##methodName::Test()\n+\n+#pragma push_macro(\"INSTANTIATE_TEST_CASE_P\")\n+#define  INSTANTIATE_TEST_CASE_P(prefix, className, generator, ...)                  \\\n+/* This assumes that there already exists a className type with SetUp and TearDown methods to call */ \\\n+    \\\n+    class prefix##_##className { \\\n+        BEGIN_TEST_CLASS(prefix##_##className) \\\n+                TEST_CLASS_PROPERTY(L\"Ignore\", _IsDisabledTest( #prefix )) \\\n+        END_TEST_CLASS() \\\n+    \\\n+        TEST_CLASS_SETUP(_SetupClass) { \\\n+            className::SetUpTestCase(); \\\n+            return true; \\\n+        } \\\n+       TEST_CLASS_CLEANUP(_TeardownClass) { \\\n+            className::TearDownTestCase(); \\\n+            return true; \\\n+        } \\\n+        \\\n+        TEST_METHOD(Test) { \\\n+            WEX::Logging::Log::Comment(L\"\\nStarting parameterized subtests for \" L#prefix L\"_\" L#className L\":\"); \\\n+            ::testing::internal::ParamGenerator<className::ParamType> paramGenerator(generator); \\\n+            for (const auto& metaFactory : ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n+              GetTestCasePatternHolder<className>( \\\n+                  #className, \\\n+                  ::testing::internal::CodeLocation( \\\n+                      __FILE__, __LINE__))->GetTestMetaFactories()) { \\\n+                 size_t i = 0; \\\n+                 static std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; \\\n+                 std::wstring c_stringPrefix = L #prefix L\"_\" L#className L\".\" + converter.from_bytes(metaFactory.first.c_str()); \\\n+                 for (typename ::testing::internal::ParamGenerator<className::ParamType>::iterator param = paramGenerator.begin(); param != paramGenerator.end(); ++param, ++i) { \\\n+                    std::wstring currentTest = c_stringPrefix + L\"/\" + std::to_wstring(i); \\\n+                    /* TODO: don't leak. Use better storage. */ \\\n+                    auto factory = metaFactory.second->CreateTestFactory(*param); \\\n+                    auto test = factory->CreateTest(); \\\n+                    \\\n+                    WEX::Logging::Log::StartGroup(currentTest.c_str()); \\\n+                    _ExchangeAlternateTestName(converter.to_bytes(currentTest), true); \\\n+                    try \\\n+                    { \\\n+                        ::testing::TestRunner::SetUp(test); \\\n+                    } \\\n+                    catch (const ::WEX::TestExecution::VerifyFailureException&) \\\n+                    { \\\n+                    } \\\n+                    \\\n+                    try \\\n+                    { \\\n+                        ::testing::TestRunner::TestBody(test); \\\n+                    } \\\n+                    catch (const ::WEX::TestExecution::VerifyFailureException&) \\\n+                    { \\\n+                    } \\\n+                    \\\n+                    try \\\n+                    { \\\n+                        ::testing::TestRunner::TearDown(test); \\\n+                    } \\\n+                    catch (const ::WEX::TestExecution::VerifyFailureException&) \\\n+                    { \\\n+                    } \\\n+                    _ExchangeAlternateTestName(std::string(), true); \\\n+                    \\\n+                    WEX::Logging::Log::EndGroup(currentTest.c_str()); \\\n+                    \\\n+                    delete factory; \\\n+                    delete test; \\\n+                } \\\n+            } \\\n+            WEX::Logging::Log::Comment(L\"\\nEnd of parameterized subtests for \" L#className L\"_\" L#prefix L\".\\n\"); \\\n+        } \\\n+    };\n+\n+// clang-format on\n+\n+__if_not_exists(GetCurrentTestDirectory) {\n+    static std::string GetCurrentTestDirectory() {\n+        WEX::Common::String testDeploymentPath;\n+        WEX::TestExecution::RuntimeParameters::TryGetValue(L\"TestDeploymentDir\", testDeploymentPath);\n+        std::wstring toReturn(testDeploymentPath);\n+\n+        static std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;\n+        return converter.to_bytes(toReturn);\n+    }\n+}\n+\n+__if_not_exists(GetTestFullName) {\n+    static std::string GetTestFullName() {\n+        std::string alternateTestName = _ExchangeAlternateTestName(std::string(), false);\n+        if (!alternateTestName.empty()) {\n+            return alternateTestName;\n+        }\n+        WEX::Common::String testName;\n+        WEX::TestExecution::RuntimeParameters::TryGetValue(L\"TestName\", testName);\n+\n+        std::wstring wideToReturn(testName);\n+        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;\n+        std::string toReturn = converter.to_bytes(wideToReturn);\n+\n+        toReturn = toReturn.substr(0, toReturn.rfind(\"::Test\"));\n+        toReturn.replace(toReturn.find(\"_\"), 1, \".\");\n+        return toReturn;\n+    }\n+}\n+\n+#ifndef LOG_TEST_PROPERTY\n+#define LOG_TEST_PROPERTY(key, value)                                            \\\n+    {                                                                            \\\n+        static std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; \\\n+        std::wstring wideKey = converter.from_bytes(key);                        \\\n+        std::wstring wideValue = converter.from_bytes(value);                    \\","path":"tests/Tests.Shared/test-api.h","position":596,"original_position":596,"commit_id":"1eee8676ec232331a58978b350782b1af2239d67","original_commit_id":"a3246d1b9d32a7b7fbdb5aadb09bcecb0d72fffe","user":{"login":"DHowett-MSFT","id":14316954,"avatar_url":"https://avatars.githubusercontent.com/u/14316954?v=3","gravatar_id":"","url":"https://api.github.com/users/DHowett-MSFT","html_url":"https://github.com/DHowett-MSFT","followers_url":"https://api.github.com/users/DHowett-MSFT/followers","following_url":"https://api.github.com/users/DHowett-MSFT/following{/other_user}","gists_url":"https://api.github.com/users/DHowett-MSFT/gists{/gist_id}","starred_url":"https://api.github.com/users/DHowett-MSFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DHowett-MSFT/subscriptions","organizations_url":"https://api.github.com/users/DHowett-MSFT/orgs","repos_url":"https://api.github.com/users/DHowett-MSFT/repos","events_url":"https://api.github.com/users/DHowett-MSFT/events{/privacy}","received_events_url":"https://api.github.com/users/DHowett-MSFT/received_events","type":"User","site_admin":false},"body":"Does Log::Property require`typeof(value) == std::wstring`? If not, and it's overloaded, we should pass value through unharmed for the appropriate implicit conversions to happen. This is too narrowly-specified as-is, it will only work for utf8 strings.","created_at":"2017-02-08T23:25:53Z","updated_at":"2017-02-08T23:28:58Z","html_url":"https://github.com/Microsoft/WinObjC/pull/1849#discussion_r100197462","pull_request_url":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/WinObjC/pulls/comments/100197462"},"html":{"href":"https://github.com/Microsoft/WinObjC/pull/1849#discussion_r100197462"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849","id":103428347,"html_url":"https://github.com/Microsoft/WinObjC/pull/1849","diff_url":"https://github.com/Microsoft/WinObjC/pull/1849.diff","patch_url":"https://github.com/Microsoft/WinObjC/pull/1849.patch","issue_url":"https://api.github.com/repos/Microsoft/WinObjC/issues/1849","number":1849,"state":"open","locked":false,"title":"Create common test static lib and move UTs to TAEF","user":{"login":"bbowman","id":15642573,"avatar_url":"https://avatars.githubusercontent.com/u/15642573?v=3","gravatar_id":"","url":"https://api.github.com/users/bbowman","html_url":"https://github.com/bbowman","followers_url":"https://api.github.com/users/bbowman/followers","following_url":"https://api.github.com/users/bbowman/following{/other_user}","gists_url":"https://api.github.com/users/bbowman/gists{/gist_id}","starred_url":"https://api.github.com/users/bbowman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bbowman/subscriptions","organizations_url":"https://api.github.com/users/bbowman/orgs","repos_url":"https://api.github.com/users/bbowman/repos","events_url":"https://api.github.com/users/bbowman/events{/privacy}","received_events_url":"https://api.github.com/users/bbowman/received_events","type":"User","site_admin":false},"body":"","created_at":"2017-01-27T02:12:50Z","updated_at":"2017-02-08T23:28:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a92f6dd69e6597cd76a06cd89d2f090aecb5609e","assignee":{"login":"aballway","id":7557395,"avatar_url":"https://avatars.githubusercontent.com/u/7557395?v=3","gravatar_id":"","url":"https://api.github.com/users/aballway","html_url":"https://github.com/aballway","followers_url":"https://api.github.com/users/aballway/followers","following_url":"https://api.github.com/users/aballway/following{/other_user}","gists_url":"https://api.github.com/users/aballway/gists{/gist_id}","starred_url":"https://api.github.com/users/aballway/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aballway/subscriptions","organizations_url":"https://api.github.com/users/aballway/orgs","repos_url":"https://api.github.com/users/aballway/repos","events_url":"https://api.github.com/users/aballway/events{/privacy}","received_events_url":"https://api.github.com/users/aballway/received_events","type":"User","site_admin":false},"assignees":[{"login":"aballway","id":7557395,"avatar_url":"https://avatars.githubusercontent.com/u/7557395?v=3","gravatar_id":"","url":"https://api.github.com/users/aballway","html_url":"https://github.com/aballway","followers_url":"https://api.github.com/users/aballway/followers","following_url":"https://api.github.com/users/aballway/following{/other_user}","gists_url":"https://api.github.com/users/aballway/gists{/gist_id}","starred_url":"https://api.github.com/users/aballway/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aballway/subscriptions","organizations_url":"https://api.github.com/users/aballway/orgs","repos_url":"https://api.github.com/users/aballway/repos","events_url":"https://api.github.com/users/aballway/events{/privacy}","received_events_url":"https://api.github.com/users/aballway/received_events","type":"User","site_admin":false},{"login":"jaredhms","id":13719817,"avatar_url":"https://avatars.githubusercontent.com/u/13719817?v=3","gravatar_id":"","url":"https://api.github.com/users/jaredhms","html_url":"https://github.com/jaredhms","followers_url":"https://api.github.com/users/jaredhms/followers","following_url":"https://api.github.com/users/jaredhms/following{/other_user}","gists_url":"https://api.github.com/users/jaredhms/gists{/gist_id}","starred_url":"https://api.github.com/users/jaredhms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jaredhms/subscriptions","organizations_url":"https://api.github.com/users/jaredhms/orgs","repos_url":"https://api.github.com/users/jaredhms/repos","events_url":"https://api.github.com/users/jaredhms/events{/privacy}","received_events_url":"https://api.github.com/users/jaredhms/received_events","type":"User","site_admin":false},{"login":"DHowett-MSFT","id":14316954,"avatar_url":"https://avatars.githubusercontent.com/u/14316954?v=3","gravatar_id":"","url":"https://api.github.com/users/DHowett-MSFT","html_url":"https://github.com/DHowett-MSFT","followers_url":"https://api.github.com/users/DHowett-MSFT/followers","following_url":"https://api.github.com/users/DHowett-MSFT/following{/other_user}","gists_url":"https://api.github.com/users/DHowett-MSFT/gists{/gist_id}","starred_url":"https://api.github.com/users/DHowett-MSFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DHowett-MSFT/subscriptions","organizations_url":"https://api.github.com/users/DHowett-MSFT/orgs","repos_url":"https://api.github.com/users/DHowett-MSFT/repos","events_url":"https://api.github.com/users/DHowett-MSFT/events{/privacy}","received_events_url":"https://api.github.com/users/DHowett-MSFT/received_events","type":"User","site_admin":false},{"login":"ms-jihua","id":16024095,"avatar_url":"https://avatars.githubusercontent.com/u/16024095?v=3","gravatar_id":"","url":"https://api.github.com/users/ms-jihua","html_url":"https://github.com/ms-jihua","followers_url":"https://api.github.com/users/ms-jihua/followers","following_url":"https://api.github.com/users/ms-jihua/following{/other_user}","gists_url":"https://api.github.com/users/ms-jihua/gists{/gist_id}","starred_url":"https://api.github.com/users/ms-jihua/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ms-jihua/subscriptions","organizations_url":"https://api.github.com/users/ms-jihua/orgs","repos_url":"https://api.github.com/users/ms-jihua/repos","events_url":"https://api.github.com/users/ms-jihua/events{/privacy}","received_events_url":"https://api.github.com/users/ms-jihua/received_events","type":"User","site_admin":false},{"login":"msft-Jeyaram","id":18413092,"avatar_url":"https://avatars.githubusercontent.com/u/18413092?v=3","gravatar_id":"","url":"https://api.github.com/users/msft-Jeyaram","html_url":"https://github.com/msft-Jeyaram","followers_url":"https://api.github.com/users/msft-Jeyaram/followers","following_url":"https://api.github.com/users/msft-Jeyaram/following{/other_user}","gists_url":"https://api.github.com/users/msft-Jeyaram/gists{/gist_id}","starred_url":"https://api.github.com/users/msft-Jeyaram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/msft-Jeyaram/subscriptions","organizations_url":"https://api.github.com/users/msft-Jeyaram/orgs","repos_url":"https://api.github.com/users/msft-Jeyaram/repos","events_url":"https://api.github.com/users/msft-Jeyaram/events{/privacy}","received_events_url":"https://api.github.com/users/msft-Jeyaram/received_events","type":"User","site_admin":false},{"login":"oliversa-msft","id":18710594,"avatar_url":"https://avatars.githubusercontent.com/u/18710594?v=3","gravatar_id":"","url":"https://api.github.com/users/oliversa-msft","html_url":"https://github.com/oliversa-msft","followers_url":"https://api.github.com/users/oliversa-msft/followers","following_url":"https://api.github.com/users/oliversa-msft/following{/other_user}","gists_url":"https://api.github.com/users/oliversa-msft/gists{/gist_id}","starred_url":"https://api.github.com/users/oliversa-msft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oliversa-msft/subscriptions","organizations_url":"https://api.github.com/users/oliversa-msft/orgs","repos_url":"https://api.github.com/users/oliversa-msft/repos","events_url":"https://api.github.com/users/oliversa-msft/events{/privacy}","received_events_url":"https://api.github.com/users/oliversa-msft/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849/commits","review_comments_url":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849/comments","review_comment_url":"https://api.github.com/repos/Microsoft/WinObjC/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/WinObjC/issues/1849/comments","statuses_url":"https://api.github.com/repos/Microsoft/WinObjC/statuses/1eee8676ec232331a58978b350782b1af2239d67","head":{"label":"bbowman:bbowman/updateTAEF+RedoUTs","ref":"bbowman/updateTAEF+RedoUTs","sha":"1eee8676ec232331a58978b350782b1af2239d67","user":{"login":"bbowman","id":15642573,"avatar_url":"https://avatars.githubusercontent.com/u/15642573?v=3","gravatar_id":"","url":"https://api.github.com/users/bbowman","html_url":"https://github.com/bbowman","followers_url":"https://api.github.com/users/bbowman/followers","following_url":"https://api.github.com/users/bbowman/following{/other_user}","gists_url":"https://api.github.com/users/bbowman/gists{/gist_id}","starred_url":"https://api.github.com/users/bbowman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bbowman/subscriptions","organizations_url":"https://api.github.com/users/bbowman/orgs","repos_url":"https://api.github.com/users/bbowman/repos","events_url":"https://api.github.com/users/bbowman/events{/privacy}","received_events_url":"https://api.github.com/users/bbowman/received_events","type":"User","site_admin":false},"repo":{"id":70117942,"name":"WinObjC","full_name":"bbowman/WinObjC","owner":{"login":"bbowman","id":15642573,"avatar_url":"https://avatars.githubusercontent.com/u/15642573?v=3","gravatar_id":"","url":"https://api.github.com/users/bbowman","html_url":"https://github.com/bbowman","followers_url":"https://api.github.com/users/bbowman/followers","following_url":"https://api.github.com/users/bbowman/following{/other_user}","gists_url":"https://api.github.com/users/bbowman/gists{/gist_id}","starred_url":"https://api.github.com/users/bbowman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bbowman/subscriptions","organizations_url":"https://api.github.com/users/bbowman/orgs","repos_url":"https://api.github.com/users/bbowman/repos","events_url":"https://api.github.com/users/bbowman/events{/privacy}","received_events_url":"https://api.github.com/users/bbowman/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bbowman/WinObjC","description":"Objective-C for Windows","fork":true,"url":"https://api.github.com/repos/bbowman/WinObjC","forks_url":"https://api.github.com/repos/bbowman/WinObjC/forks","keys_url":"https://api.github.com/repos/bbowman/WinObjC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bbowman/WinObjC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bbowman/WinObjC/teams","hooks_url":"https://api.github.com/repos/bbowman/WinObjC/hooks","issue_events_url":"https://api.github.com/repos/bbowman/WinObjC/issues/events{/number}","events_url":"https://api.github.com/repos/bbowman/WinObjC/events","assignees_url":"https://api.github.com/repos/bbowman/WinObjC/assignees{/user}","branches_url":"https://api.github.com/repos/bbowman/WinObjC/branches{/branch}","tags_url":"https://api.github.com/repos/bbowman/WinObjC/tags","blobs_url":"https://api.github.com/repos/bbowman/WinObjC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bbowman/WinObjC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bbowman/WinObjC/git/refs{/sha}","trees_url":"https://api.github.com/repos/bbowman/WinObjC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bbowman/WinObjC/statuses/{sha}","languages_url":"https://api.github.com/repos/bbowman/WinObjC/languages","stargazers_url":"https://api.github.com/repos/bbowman/WinObjC/stargazers","contributors_url":"https://api.github.com/repos/bbowman/WinObjC/contributors","subscribers_url":"https://api.github.com/repos/bbowman/WinObjC/subscribers","subscription_url":"https://api.github.com/repos/bbowman/WinObjC/subscription","commits_url":"https://api.github.com/repos/bbowman/WinObjC/commits{/sha}","git_commits_url":"https://api.github.com/repos/bbowman/WinObjC/git/commits{/sha}","comments_url":"https://api.github.com/repos/bbowman/WinObjC/comments{/number}","issue_comment_url":"https://api.github.com/repos/bbowman/WinObjC/issues/comments{/number}","contents_url":"https://api.github.com/repos/bbowman/WinObjC/contents/{+path}","compare_url":"https://api.github.com/repos/bbowman/WinObjC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bbowman/WinObjC/merges","archive_url":"https://api.github.com/repos/bbowman/WinObjC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bbowman/WinObjC/downloads","issues_url":"https://api.github.com/repos/bbowman/WinObjC/issues{/number}","pulls_url":"https://api.github.com/repos/bbowman/WinObjC/pulls{/number}","milestones_url":"https://api.github.com/repos/bbowman/WinObjC/milestones{/number}","notifications_url":"https://api.github.com/repos/bbowman/WinObjC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bbowman/WinObjC/labels{/name}","releases_url":"https://api.github.com/repos/bbowman/WinObjC/releases{/id}","deployments_url":"https://api.github.com/repos/bbowman/WinObjC/deployments","created_at":"2016-10-06T02:57:29Z","updated_at":"2016-10-06T02:57:49Z","pushed_at":"2017-02-08T23:21:53Z","git_url":"git://github.com/bbowman/WinObjC.git","ssh_url":"git@github.com:bbowman/WinObjC.git","clone_url":"https://github.com/bbowman/WinObjC.git","svn_url":"https://github.com/bbowman/WinObjC","homepage":"","size":371396,"stargazers_count":0,"watchers_count":0,"language":"Objective-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":"develop"}},"base":{"label":"Microsoft:develop","ref":"develop","sha":"4527ce3fb869a3bd6676f46c2a8f69d766e8fdc8","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":37950166,"name":"WinObjC","full_name":"Microsoft/WinObjC","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/WinObjC","description":"Objective-C for Windows","fork":false,"url":"https://api.github.com/repos/Microsoft/WinObjC","forks_url":"https://api.github.com/repos/Microsoft/WinObjC/forks","keys_url":"https://api.github.com/repos/Microsoft/WinObjC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/WinObjC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/WinObjC/teams","hooks_url":"https://api.github.com/repos/Microsoft/WinObjC/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/WinObjC/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/WinObjC/events","assignees_url":"https://api.github.com/repos/Microsoft/WinObjC/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/WinObjC/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/WinObjC/tags","blobs_url":"https://api.github.com/repos/Microsoft/WinObjC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/WinObjC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/WinObjC/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/WinObjC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/WinObjC/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/WinObjC/languages","stargazers_url":"https://api.github.com/repos/Microsoft/WinObjC/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/WinObjC/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/WinObjC/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/WinObjC/subscription","commits_url":"https://api.github.com/repos/Microsoft/WinObjC/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/WinObjC/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/WinObjC/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/WinObjC/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/WinObjC/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/WinObjC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/WinObjC/merges","archive_url":"https://api.github.com/repos/Microsoft/WinObjC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/WinObjC/downloads","issues_url":"https://api.github.com/repos/Microsoft/WinObjC/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/WinObjC/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/WinObjC/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/WinObjC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/WinObjC/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/WinObjC/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/WinObjC/deployments","created_at":"2015-06-23T23:14:58Z","updated_at":"2017-02-08T14:59:18Z","pushed_at":"2017-02-08T23:21:55Z","git_url":"git://github.com/Microsoft/WinObjC.git","ssh_url":"git@github.com:Microsoft/WinObjC.git","clone_url":"https://github.com/Microsoft/WinObjC.git","svn_url":"https://github.com/Microsoft/WinObjC","homepage":"","size":377876,"stargazers_count":5591,"watchers_count":5591,"language":"Objective-C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":743,"mirror_url":null,"open_issues_count":317,"forks":743,"open_issues":317,"watchers":5591,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849"},"html":{"href":"https://github.com/Microsoft/WinObjC/pull/1849"},"issue":{"href":"https://api.github.com/repos/Microsoft/WinObjC/issues/1849"},"comments":{"href":"https://api.github.com/repos/Microsoft/WinObjC/issues/1849/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/WinObjC/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/WinObjC/pulls/1849/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/WinObjC/statuses/1eee8676ec232331a58978b350782b1af2239d67"}}}}
{"actor":{"display_login":"DHowett-MSFT"}}