#if ENABLE_UNIT_TESTS #include "UnitTest++.h" #include "../ThreadLocalValue-c-api.h" #include "../../ThreadLocalValue.h" #include "../../Thread.h" SUITE(ThreadLocalValue) { static const int TEST_INT_VALUE = 7; struct ThreadLocalValueFixture { ThreadLocalValueFixture() { localObject = NULL; intValue = TEST_INT_VALUE; intCopyValue = 0; intPtr = &intCopyValue; localObject = UnityPalThreadLocalValueNew(); } ~ThreadLocalValueFixture() { UnityPalThreadLocalValueDelete(localObject); } UnityPalThreadLocalValue* localObject; int intValue; int intCopyValue; int* intPtr; struct ThreadLocalTestData { UnityPalThreadLocalValue* threadLocalVariable; int valueOnAnotherThread; }; static void CheckThreadLocalValueOnAnotherThread(void* arg) { ThreadLocalTestData* data = static_cast(arg); int* checkingIntValue; checkingIntValue = &data->valueOnAnotherThread; UnityPalThreadLocalValueGetValue(data->threadLocalVariable, reinterpret_cast(&checkingIntValue)); } static void SetThreadLocalValueOnAnotherThread(void* arg) { ThreadLocalTestData* data = static_cast(arg); int settingIntValue = data->valueOnAnotherThread; UnityPalThreadLocalValueSetValue(data->threadLocalVariable, &settingIntValue); } }; TEST_FIXTURE(ThreadLocalValueFixture, InstantiateNewReturnsValidPointer) { CHECK_NOT_NULL(localObject); } TEST_FIXTURE(ThreadLocalValueFixture, SetValueNormalReturnsSuccess) { CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, UnityPalThreadLocalValueSetValue(localObject, &intValue)); } TEST_FIXTURE(ThreadLocalValueFixture, GetValueReturnsSuccess) { UnityPalThreadLocalValueSetValue(localObject, &intValue); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, UnityPalThreadLocalValueGetValue(localObject, (void**)&intPtr)); } TEST_FIXTURE(ThreadLocalValueFixture, GetValueMatchedValueUsedInSet) { UnityPalThreadLocalValueSetValue(localObject, &intValue); UnityPalThreadLocalValueGetValue(localObject, (void**)&intPtr); CHECK_EQUAL(TEST_INT_VALUE, *intPtr); } TEST_FIXTURE(ThreadLocalValueFixture, ApiSetValueMatchesClassSetValue) { CHECK_EQUAL(localObject->SetValue(&intValue), UnityPalThreadLocalValueSetValue(localObject, &intValue)); } TEST_FIXTURE(ThreadLocalValueFixture, ApiGetValueMatchesClassGetValue) { UnityPalThreadLocalValueSetValue(localObject, &intValue); CHECK_EQUAL(localObject->GetValue((void**)&intPtr), UnityPalThreadLocalValueGetValue(localObject, (void**)&intPtr)); } TEST_FIXTURE(ThreadLocalValueFixture, ConfirmValueSetOnThisThreadIsDifferentFromValueOnAnotherThread) { il2cpp::os::Thread::Init(); ThreadLocalTestData data; data.threadLocalVariable = localObject; data.valueOnAnotherThread = 0; il2cpp::os::Thread thread; thread.Run(CheckThreadLocalValueOnAnotherThread, &data); thread.Join(); CHECK_NOT_EQUAL(TEST_INT_VALUE, data.valueOnAnotherThread); } TEST_FIXTURE(ThreadLocalValueFixture, ConfirmValueSetOnAnotherThreadIsDifferentFromValueSetOnThisThread) { UnityPalThreadLocalValueSetValue(localObject, &intValue); ThreadLocalTestData data; data.threadLocalVariable = localObject; data.valueOnAnotherThread = 42; il2cpp::os::Thread thread; thread.Run(SetThreadLocalValueOnAnotherThread, &data); thread.Join(); UnityPalThreadLocalValueGetValue(localObject, (void**)&intPtr); CHECK_EQUAL(TEST_INT_VALUE, *intPtr); } } #endif // ENABLE_UNIT_TESTS