// Copyright 2018 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "common/Result.h" namespace { template void TestError(Result* result, E expectedError) { ASSERT_TRUE(result->IsError()); ASSERT_FALSE(result->IsSuccess()); E storedError = result->AcquireError(); ASSERT_EQ(storedError, expectedError); } template void TestSuccess(Result* result, T expectedSuccess) { ASSERT_FALSE(result->IsError()); ASSERT_TRUE(result->IsSuccess()); T storedSuccess = result->AcquireSuccess(); ASSERT_EQ(storedSuccess, expectedSuccess); } static int dummyError = 0xbeef; static float dummySuccess = 42.0f; // Result // Test constructing an error Result TEST(ResultOnlyPointerError, ConstructingError) { Result result(&dummyError); TestError(&result, &dummyError); } // Test moving an error Result TEST(ResultOnlyPointerError, MovingError) { Result result(&dummyError); Result movedResult(std::move(result)); TestError(&movedResult, &dummyError); } // Test returning an error Result TEST(ResultOnlyPointerError, ReturningError) { auto CreateError = []() -> Result { return {&dummyError}; }; Result result = CreateError(); TestError(&result, &dummyError); } // Test constructing a success Result TEST(ResultOnlyPointerError, ConstructingSuccess) { Result result; ASSERT_TRUE(result.IsSuccess()); ASSERT_FALSE(result.IsError()); } // Test moving a success Result TEST(ResultOnlyPointerError, MovingSuccess) { Result result; Result movedResult(std::move(result)); ASSERT_TRUE(movedResult.IsSuccess()); ASSERT_FALSE(movedResult.IsError()); } // Test returning a success Result TEST(ResultOnlyPointerError, ReturningSuccess) { auto CreateError = []() -> Result { return {}; }; Result result = CreateError(); ASSERT_TRUE(result.IsSuccess()); ASSERT_FALSE(result.IsError()); } // Result // Test constructing an error Result TEST(ResultBothPointer, ConstructingError) { Result result(&dummyError); TestError(&result, &dummyError); } // Test moving an error Result TEST(ResultBothPointer, MovingError) { Result result(&dummyError); Result movedResult(std::move(result)); TestError(&movedResult, &dummyError); } // Test returning an error Result TEST(ResultBothPointer, ReturningError) { auto CreateError = []() -> Result { return {&dummyError}; }; Result result = CreateError(); TestError(&result, &dummyError); } // Test constructing a success Result TEST(ResultBothPointer, ConstructingSuccess) { Result result(&dummySuccess); TestSuccess(&result, &dummySuccess); } // Test moving a success Result TEST(ResultBothPointer, MovingSuccess) { Result result(&dummySuccess); Result movedResult(std::move(result)); TestSuccess(&movedResult, &dummySuccess); } // Test returning a success Result TEST(ResultBothPointer, ReturningSuccess) { auto CreateSuccess = []() -> Result { return {&dummySuccess}; }; Result result = CreateSuccess(); TestSuccess(&result, &dummySuccess); } // Result // Test constructing an error Result TEST(ResultGeneric, ConstructingError) { Result, int*> result(&dummyError); TestError(&result, &dummyError); } // Test moving an error Result TEST(ResultGeneric, MovingError) { Result, int*> result(&dummyError); Result, int*> movedResult(std::move(result)); TestError(&movedResult, &dummyError); } // Test returning an error Result TEST(ResultGeneric, ReturningError) { auto CreateError = []() -> Result, int*> { return {&dummyError}; }; Result, int*> result = CreateError(); TestError(&result, &dummyError); } // Test constructing a success Result TEST(ResultGeneric, ConstructingSuccess) { Result, int*> result({1.0f}); TestSuccess(&result, {1.0f}); } // Test moving a success Result TEST(ResultGeneric, MovingSuccess) { Result, int*> result({1.0f}); Result, int*> movedResult(std::move(result)); TestSuccess(&movedResult, {1.0f}); } // Test returning a success Result TEST(ResultGeneric, ReturningSuccess) { auto CreateSuccess = []() -> Result, int*> { return {{1.0f}}; }; Result, int*> result = CreateSuccess(); TestSuccess(&result, {1.0f}); } } // anonymous namespace