Path: blob/master/modules/gapi/test/internal/gapi_int_vectorref_test.cpp
16345 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.3//4// Copyright (C) 2018 Intel Corporation567#include "test_precomp.hpp"89namespace opencv_test10{1112typedef ::testing::Types<int, cv::Point, cv::Rect> VectorRef_Test_Types;1314template<typename T> struct VectorRefT: public ::testing::Test { using Type = T; };1516TYPED_TEST_CASE(VectorRefT, VectorRef_Test_Types);1718TYPED_TEST(VectorRefT, Reset_Valid)19{20using T = typename TestFixture::Type;21cv::detail::VectorRefT<T> ref; // vector ref created empty22EXPECT_NO_THROW(ref.reset()); // 1st reset is OK (initializes)23EXPECT_NO_THROW(ref.reset()); // 2nd reset is also OK (resets)24}2526TYPED_TEST(VectorRefT, Reset_Invalid)27{28using T = typename TestFixture::Type;29std::vector<T> vec(42); // create a std::vector of 42 elements30cv::detail::VectorRefT<T> ref(vec); // RO_EXT (since reference is const)31EXPECT_ANY_THROW(ref.reset()); // data-bound vector ref can't be reset32}3334TYPED_TEST(VectorRefT, ReadRef_External)35{36using T = typename TestFixture::Type;37const std::vector<T> vec(42); // create a std::vector of 42 elements38cv::detail::VectorRefT<T> ref(vec); // RO_EXT (since reference is const)39auto &vref = ref.rref();40EXPECT_EQ(vec.data(), vref.data());41EXPECT_EQ(vec.size(), vref.size());42}4344TYPED_TEST(VectorRefT, ReadRef_Internal)45{46using T = typename TestFixture::Type;47cv::detail::VectorRefT<T> ref;48ref.reset(); // RW_OWN (reset on empty ref)49auto &vref = ref.rref(); // read access is valid for RW_OWN50EXPECT_EQ(0u, vref.size()); // by default vector is empty51}5253TYPED_TEST(VectorRefT, WriteRef_External)54{55using T = typename TestFixture::Type;56std::vector<T> vec(42); // create a std::vector of 42 elements57cv::detail::VectorRefT<T> ref(vec); // RW_EXT (since reference is not const)58auto &vref = ref.wref(); // write access is valid with RW_EXT59EXPECT_EQ(vec.data(), vref.data());60EXPECT_EQ(vec.size(), vref.size());61}6263TYPED_TEST(VectorRefT, WriteRef_Internal)64{65using T = typename TestFixture::Type;66cv::detail::VectorRefT<T> ref;67ref.reset(); // RW_OWN (reset on empty ref)68auto &vref = ref.wref(); // write access is valid for RW_OWN69EXPECT_EQ(0u, vref.size()); // empty vector by default70}7172TYPED_TEST(VectorRefT, WriteToRO)73{74using T = typename TestFixture::Type;75const std::vector<T> vec(42); // create a std::vector of 42 elements76cv::detail::VectorRefT<T> ref(vec); // RO_EXT (since reference is const)77EXPECT_ANY_THROW(ref.wref());78}7980TYPED_TEST(VectorRefT, ReadAfterWrite)81{82using T = typename TestFixture::Type;83std::vector<T> vec; // Initial data holder (empty vector)84cv::detail::VectorRefT<T> writer(vec); // RW_EXT8586const auto& ro_ref = vec;87cv::detail::VectorRefT<T> reader(ro_ref); // RO_EXT8889EXPECT_EQ(0u, writer.wref().size()); // Check the initial state90EXPECT_EQ(0u, reader.rref().size());9192writer.wref().emplace_back(); // Check that write is successfull93EXPECT_EQ(1u, writer.wref().size());9495EXPECT_EQ(1u, vec.size()); // Check that changes are reflected to the original container96EXPECT_EQ(1u, reader.rref().size()); // Check that changes are reflected to reader's view9798EXPECT_EQ(T(), vec.at(0)); // Check the value (must be default-initialized)99EXPECT_EQ(T(), reader.rref().at(0));100EXPECT_EQ(T(), writer.wref().at(0));101}102103template<typename T> struct VectorRefU: public ::testing::Test { using Type = T; };104105TYPED_TEST_CASE(VectorRefU, VectorRef_Test_Types);106107template<class T> struct custom_struct { T a; T b; };108109TYPED_TEST(VectorRefU, Reset_Valid)110{111using T = typename TestFixture::Type;112cv::detail::VectorRef ref; // vector ref created empty113EXPECT_NO_THROW(ref.reset<T>()); // 1st reset is OK (initializes)114EXPECT_NO_THROW(ref.reset<T>()); // 2nd reset is also OK (resets)115116EXPECT_ANY_THROW(ref.reset<custom_struct<T> >()); // type change is not allowed117}118119TYPED_TEST(VectorRefU, Reset_Invalid)120{121using T = typename TestFixture::Type;122std::vector<T> vec(42); // create a std::vector of 42 elements123cv::detail::VectorRef ref(vec); // RO_EXT (since reference is const)124EXPECT_ANY_THROW(ref.reset<T>()); // data-bound vector ref can't be reset125}126127TYPED_TEST(VectorRefU, ReadRef_External)128{129using T = typename TestFixture::Type;130const std::vector<T> vec(42); // create a std::vector of 42 elements131cv::detail::VectorRef ref(vec); // RO_EXT (since reference is const)132auto &vref = ref.rref<T>();133EXPECT_EQ(vec.data(), vref.data());134EXPECT_EQ(vec.size(), vref.size());135}136137TYPED_TEST(VectorRefU, ReadRef_Internal)138{139using T = typename TestFixture::Type;140cv::detail::VectorRef ref;141ref.reset<T>(); // RW_OWN (reset on empty ref)142auto &vref = ref.rref<T>(); // read access is valid for RW_OWN143EXPECT_EQ(0u, vref.size()); // by default vector is empty144}145146TYPED_TEST(VectorRefU, WriteRef_External)147{148using T = typename TestFixture::Type;149std::vector<T> vec(42); // create a std::vector of 42 elements150cv::detail::VectorRef ref(vec); // RW_EXT (since reference is not const)151auto &vref = ref.wref<T>(); // write access is valid with RW_EXT152EXPECT_EQ(vec.data(), vref.data());153EXPECT_EQ(vec.size(), vref.size());154}155156TYPED_TEST(VectorRefU, WriteRef_Internal)157{158using T = typename TestFixture::Type;159cv::detail::VectorRef ref;160ref.reset<T>(); // RW_OWN (reset on empty ref)161auto &vref = ref.wref<T>(); // write access is valid for RW_OWN162EXPECT_EQ(0u, vref.size()); // empty vector by default163}164165TYPED_TEST(VectorRefU, WriteToRO)166{167using T = typename TestFixture::Type;168const std::vector<T> vec(42); // create a std::vector of 42 elements169cv::detail::VectorRef ref(vec); // RO_EXT (since reference is const)170EXPECT_ANY_THROW(ref.wref<T>());171}172173TYPED_TEST(VectorRefU, ReadAfterWrite)174{175using T = typename TestFixture::Type;176std::vector<T> vec; // Initial data holder (empty vector)177cv::detail::VectorRef writer(vec); // RW_EXT178179const auto& ro_ref = vec;180cv::detail::VectorRef reader(ro_ref); // RO_EXT181182EXPECT_EQ(0u, writer.wref<T>().size()); // Check the initial state183EXPECT_EQ(0u, reader.rref<T>().size());184185writer.wref<T>().emplace_back(); // Check that write is successfull186EXPECT_EQ(1u, writer.wref<T>().size());187188EXPECT_EQ(1u, vec.size()); // Check that changes are reflected to the original container189EXPECT_EQ(1u, reader.rref<T>().size()); // Check that changes are reflected to reader's view190191EXPECT_EQ(T(), vec.at(0)); // Check the value (must be default-initialized)192EXPECT_EQ(T(), reader.rref<T>().at(0));193EXPECT_EQ(T(), writer.wref<T>().at(0));194}195196TEST(VectorRefU, TypeCheck)197{198cv::detail::VectorRef ref;199ref.reset<int>(); // RW_OWN200201EXPECT_ANY_THROW(ref.reset<char>());202EXPECT_ANY_THROW(ref.rref<char>());203EXPECT_ANY_THROW(ref.wref<char>());204}205206} // namespace opencv_test207208209