14 #include <gtest/gtest.h>    17 #include <cuda_runtime.h>    28 class TCore : 
public ::testing::Test
    33 #define ECVL_TUPLE(type, ...) \    34     Image g2_##type = Image({ 2, 2, 1 }, DataType::type, "xyc", ColorType::GRAY); \    35     View<DataType::type> g2_##type##_v;    44 #define ECVL_TUPLE(type, ...) \    45         g2_##type##_v = g2_##type; \    46         g2_##type##_v({ 0,0,0 }) = 50; g2_##type##_v({ 1,0,0 }) = 32; \    47         g2_##type##_v({ 0,1,0 }) = 14; g2_##type##_v({ 1,1,0 }) = 60;    54 using CoreImage = TCore;
    55 using CoreArithmetics = TCore;
    57 TEST(Core, CreateEmptyImage)
    60     EXPECT_EQ(img.
dims_.size(), 0);
    62     EXPECT_EQ(img.
data_, 
nullptr);
    65 TEST(Core, CreateImageWithFiveDims)
    68     EXPECT_EQ(img.
dims_.size(), 5);
    70     for (
int i = 0; i < sdims; i++) {
    71         EXPECT_EQ(img.
dims_[i], i + 1);
    76 #define ECVL_TUPLE(type, ...) \    77 TEST_F(CoreImage, Move##type) \    79     Image img(std::move(g2_##type)); \    80     View<DataType::type> img_v(img); \    81     EXPECT_TRUE(img_v({ 0,0,0 }) == 50); EXPECT_TRUE(img_v({ 1,0,0 }) == 32); \    82     EXPECT_TRUE(img_v({ 0,1,0 }) == 14); EXPECT_TRUE(img_v({ 1,1,0 }) == 60); \    85 TEST_F(CoreImage, Copy##type) \    87     Image img(g2_##type); \    88     View<DataType::type> img_v(img); \    89     EXPECT_TRUE(img_v({ 0,0,0 }) == 50); EXPECT_TRUE(img_v({ 1,0,0 }) == 32); \    90     EXPECT_TRUE(img_v({ 0,1,0 }) == 14); EXPECT_TRUE(img_v({ 1,1,0 }) == 60); \    93 TEST_F(CoreImage, CopyNonContiguousXYZC##type) \    95     Image src({ 2, 3, 3, 1 }, DataType::type, "xyzc", ColorType::GRAY); \    96     View<DataType::type> src_v(src, { 0, 0, 0, 0 }, { 2, 2, 2, 1 }); \    97     src_v({ 0,0,0,0 }) = 50; src_v({ 0,0,1,0 }) = 32; \    98     src_v({ 0,1,0,0 }) = 14; src_v({ 0,1,1,0 }) = 60; \    99     src_v({ 1,0,0,0 }) = 54; src_v({ 1,0,1,0 }) = 41; \   100     src_v({ 1,1,0,0 }) = 97; src_v({ 1,1,1,0 }) = 79; \   102     View<DataType::type> dst_v(dst); \   103     EXPECT_TRUE(dst_v({ 0,0,0,0 }) == 50); EXPECT_TRUE(dst_v({ 0,0,1,0 }) == 32); \   104     EXPECT_TRUE(dst_v({ 0,1,0,0 }) == 14); EXPECT_TRUE(dst_v({ 0,1,1,0 }) == 60); \   105     EXPECT_TRUE(dst_v({ 1,0,0,0 }) == 54); EXPECT_TRUE(dst_v({ 1,0,1,0 }) == 41); \   106     EXPECT_TRUE(dst_v({ 1,1,0,0 }) == 97); EXPECT_TRUE(dst_v({ 1,1,1,0 }) == 79); \   109 TEST_F(CoreImage, RearrangeXYZC##type) \   111     Image img({ 3, 4, 3, 2 }, DataType::type, "cxyz", ColorType::RGB); \   112     View<DataType::type> view(img); \   113     auto it = view.Begin(); \   114     for (uint8_t i = 0; i < 24 * 3; ++i) { \   115         *reinterpret_cast<TypeInfo_t<DataType::type>*>(it.ptr_) = i; \   119     RearrangeChannels(img, img2, "xyzc"); \   120     View<DataType::type> view2(img2); \   122     EXPECT_TRUE(view2({ 2, 0, 1, 0 }) == 42); \   123     EXPECT_TRUE(view2({ 3, 1, 1, 2 }) == 59); \   124     EXPECT_TRUE(view2({ 0, 2, 0, 1 }) == 25); \   125     EXPECT_TRUE(view2({ 1, 2, 0, 1 }) == 28); \   127 TEST_F(CoreImage, CopyNonContiguousXYO##type) \   129     Image src({ 2, 3, 3 }, DataType::type, "xyo", ColorType::GRAY); \   130     View<DataType::type> src_v(src, { 0, 0, 0 }, { 2, 2, 2 }); \   131     src_v({ 0,0,0 }) = 50; src_v({ 0,0,1 }) = 32; \   132     src_v({ 0,1,0 }) = 14; src_v({ 0,1,1 }) = 60; \   133     src_v({ 1,0,0 }) = 54; src_v({ 1,0,1 }) = 41; \   134     src_v({ 1,1,0 }) = 97; src_v({ 1,1,1 }) = 79; \   136     View<DataType::type> dst_v(dst); \   137     EXPECT_TRUE(dst_v({ 0,0,0 }) == 50); EXPECT_TRUE(dst_v({ 0,0,1 }) == 32); \   138     EXPECT_TRUE(dst_v({ 0,1,0 }) == 14); EXPECT_TRUE(dst_v({ 0,1,1 }) == 60); \   139     EXPECT_TRUE(dst_v({ 1,0,0 }) == 54); EXPECT_TRUE(dst_v({ 1,0,1 }) == 41); \   140     EXPECT_TRUE(dst_v({ 1,1,0 }) == 97); EXPECT_TRUE(dst_v({ 1,1,1 }) == 79); \   143 TEST_F(CoreImage, RearrangeXYO##type) \   145     Image img({ 6, 4, 3 }, DataType::type, "oxy", ColorType::RGB); \   146     View<DataType::type> view(img); \   147     auto it = view.Begin(); \   148     for (uint8_t i = 0; i < 24 * 3; ++i) { \   149         *reinterpret_cast<TypeInfo_t<DataType::type>*>(it.ptr_) = i; \   153     RearrangeChannels(img, img2, "xyo"); \   154     View<DataType::type> view2(img2); \   156     EXPECT_TRUE(view2({ 3, 1, 0 }) == 42); \   157     EXPECT_TRUE(view2({ 1, 2, 5 }) == 59); \   158     EXPECT_TRUE(view2({ 0, 1, 1 }) == 25); \   159     EXPECT_TRUE(view2({ 0, 1, 4 }) == 28); \   162 TEST_F(CoreImage, ToFpga##type) \   164     Image tmp(g2_##type); \   165     EXPECT_THROW(tmp.To(Device::FPGA), std::runtime_error); \   170 TEST_F(CoreArithmetics, AddScalar##type) \   173     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 60); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 42); \   174     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 24); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 70); \   175     g2_##type.Add(10, false); \   176     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 70); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 52); \   177     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 34); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 80); \   180 TEST_F(CoreArithmetics, AddImage##type) \   182     g2_##type.Add(g2_##type); \   183     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 100); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 64); \   184     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 28); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 120); \   187 TEST_F(CoreArithmetics, AddImageNonSaturate##type) \   189     g2_##type.Add(g2_##type, false); \   190     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 100); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 64); \   191     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 28); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 120); \   194 TEST_F(CoreArithmetics, SubScalar##type) \   197     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 40); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 22); \   198     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 4); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 50); \   201 TEST_F(CoreArithmetics, SubScalarNonSaturate##type) \   203     g2_##type.Sub(10, false); \   204     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 40); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 22); \   205     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 4); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 50); \   208 TEST_F(CoreArithmetics, SubImage##type) \   210     g2_##type.Sub(g2_##type); \   211     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 0); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 0); \   212     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 0); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 0); \   215 TEST_F(CoreArithmetics, MulScalar##type) \   218     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 100); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 64); \   219     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 28); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 120); \   222 TEST_F(CoreArithmetics, MulScalarNonSaturate##type) \   224     g2_##type.Mul(2, false); \   225     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 100); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 64); \   226     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 28); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 120); \   229 TEST_F(CoreArithmetics, MulImage##type) \   231     Image tmp(g2_##type); \   232     View<DataType::type> tmp_v(tmp); \   233     auto i = tmp.Begin<uint8_t>(), e = tmp.End<uint8_t>(); \   234     for (; i != e; ++i) { \   235         *reinterpret_cast<TypeInfo_t<DataType::type>*>(i.ptr_) = 2; \   237     g2_##type.Mul(tmp); \   238     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 100); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 64); \   239     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 28); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 120); \   242 TEST_F(CoreArithmetics, DivScalar##type) \   245     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 25); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 16); \   246     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 7); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 30); \   249 TEST_F(CoreArithmetics, DivScalarNonSaturate##type) \   251     g2_##type.Div(2, false); \   252     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 25); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 16); \   253     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 7); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 30); \   256 TEST_F(CoreArithmetics, DivImage##type) \   258     Image tmp(g2_##type); \   259     View<DataType::type> tmp_v(tmp); \   260     auto i = tmp.Begin<uint8_t>(), e = tmp.End<uint8_t>(); \   261     for (; i != e; ++i) { \   262         *reinterpret_cast<TypeInfo_t<DataType::type>*>(i.ptr_) = 2; \   264     g2_##type.Div(tmp); \   265     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == 25); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == 16); \   266     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == 7); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == 30); \   269 TEST_F(CoreArithmetics, SetTo0##type) \   271     g2_##type.SetTo(0); \   272     View<DataType::type> my_view(g2_##type); \   273     auto i = my_view.Begin(), e = my_view.End(); \   274     for (; i != e; ++i) { \   275         EXPECT_TRUE(*i == static_cast<TypeInfo_t<DataType::type>>(0)); \   279 TEST_F(CoreArithmetics, SetTo10_##type) \   281     g2_##type.SetTo(10.); \   282     View<DataType::type> my_view(g2_##type); \   283     auto i = my_view.Begin(), e = my_view.End(); \   284     for (; i != e; ++i) { \   285         EXPECT_TRUE(*i == static_cast<TypeInfo_t<DataType::type>>(10.)); \   289 TEST_F(CoreArithmetics, SetTo10_f##type) \   291     g2_##type.SetTo(10.f); \   292     View<DataType::type> my_view(g2_##type); \   293     auto i = my_view.Begin(), e = my_view.End(); \   294     for (; i != e; ++i) { \   295         EXPECT_TRUE(*i == static_cast<TypeInfo_t<DataType::type>>(10.f)); \   299 TEST_F(CoreArithmetics, SetTo10##type) \   301     g2_##type.SetTo(10); \   302     View<DataType::type> my_view(g2_##type); \   303     auto i = my_view.Begin(), e = my_view.End(); \   304     for (; i != e; ++i) { \   305         EXPECT_TRUE(*i == static_cast<TypeInfo_t<DataType::type>>(10)); \   309 TEST_F(CoreArithmetics, ConvertTo##type) \   312         Image img({ 2, 2, 1 }, DataType::type, "xyc", ColorType::GRAY); \   313         img.SetTo(std::numeric_limits<TypeInfo_t<DataType::type>>::max()); \   314         ConvertTo(img, out, DataType::uint8, true); \   315         View<DataType::type> img_v(img); \   316         EXPECT_TRUE(out.elemtype_ == DataType::uint8); \   317         View<DataType::uint8> out_v(out); \   318         auto i = img_v.Begin(), e = img_v.End(); \   319         auto o_i = out_v.Begin(); \   320         for (; i != e; ++i, ++o_i) { \   321             EXPECT_TRUE(*o_i == saturate_cast<TypeInfo_t<DataType::uint8>>(*i)); \   325         Image img({ 2, 2, 1 }, DataType::type, "xyc", ColorType::GRAY); \   326         img.SetTo(std::numeric_limits<TypeInfo_t<DataType::type>>::max()); \   327         ConvertTo(img, out, DataType::int16, true); \   328         View<DataType::type> img_v(img); \   329         EXPECT_TRUE(out.elemtype_ == DataType::int16); \   330         View<DataType::int16> out_v(out); \   331         auto i = img_v.Begin(), e = img_v.End(); \   332         auto o_i = out_v.Begin(); \   333         for (; i != e; ++i, ++o_i) { \   334             EXPECT_TRUE(*o_i == saturate_cast<TypeInfo_t<DataType::int16>>(*i)); \   342 #define ECVL_TUPLE(type, ...) \   343 TEST_F(CoreArithmetics, Neg##type) \   346     EXPECT_TRUE(g2_##type##_v({ 0,0,0 }) == -50); EXPECT_TRUE(g2_##type##_v({ 1,0,0 }) == -32); \   347     EXPECT_TRUE(g2_##type##_v({ 0,1,0 }) == -14); EXPECT_TRUE(g2_##type##_v({ 1,1,0 }) == -60); \   354 #define ECVL_TUPLE(type, ...) \   355 TEST_F(CoreImage, CpuToGpu##type) \   357     Image tmp(g2_##type); \   358     tmp.To(Device::GPU); \   361     checkCudaError(cudaMalloc(&res_d, 1)); \   362     RunTestCpuToGpuKernel##type(tmp.data_, res_d); \   363     checkCudaError(cudaMemcpy(&res_h, res_d, 1, cudaMemcpyDeviceToHost)); \   364     checkCudaError(cudaFree(res_d)); \   365     EXPECT_TRUE(res_h == 1); \   368 TEST_F(CoreImage, GpuToCpu##type) { \   369     Image gpu_img({ 2, 2, 1 }, DataType::type, "xyc", ColorType::GRAY, { 1, 1, 1 }, Device::GPU); \   370     RunTestGpuToCpuKernel##type(gpu_img.data_); \   371     checkCudaError(cudaDeviceSynchronize()); \   372     gpu_img.To(Device::CPU); \   373     View<DataType::type> img_v(gpu_img); \   374     EXPECT_TRUE(img_v({ 0,0,0 }) == 50); EXPECT_TRUE(img_v({ 1,0,0 }) == 32); \   375     EXPECT_TRUE(img_v({ 0,1,0 }) == 14); EXPECT_TRUE(img_v({ 1,1,0 }) == 60); \   381 #if 0 // TODO Functions reimplementation needed   382 TEST_F(CoreArithmetics, Anduint8)
   386     tmp_v({ 0,0,0 }) = 49; tmp_v({ 1,0,0 }) = 31;
   387     tmp_v({ 0,1,0 }) = 13; tmp_v({ 1,1,0 }) = 59;
   388     And(g2_uint8, tmp, out);
   390     EXPECT_TRUE(out_v({ 0,0,0 }) == 48); EXPECT_TRUE(out_v({ 1,0,0 }) == 0);
   391     EXPECT_TRUE(out_v({ 0,1,0 }) == 12); EXPECT_TRUE(out_v({ 1,1,0 }) == 56);
   394 TEST_F(CoreArithmetics, Oruint8)
   398     tmp_v({ 0,0,0 }) = 49; tmp_v({ 1,0,0 }) = 31;
   399     tmp_v({ 0,1,0 }) = 13; tmp_v({ 1,1,0 }) = 59;
   400     Or(g2_uint8, tmp, out);
   402     EXPECT_TRUE(out_v({ 0,0,0 }) == 51); EXPECT_TRUE(out_v({ 1,0,0 }) == 63);
   403     EXPECT_TRUE(out_v({ 0,1,0 }) == 15); EXPECT_TRUE(out_v({ 1,1,0 }) == 63);
 
uint8_t * data_
Pointer to Image data.
 
int vsize(const std::vector< T > &v)
 
std::vector< int > strides_
Vector of Image strides.
 
TEST(DatasetParser, LoadNonExistingDataset)