diff --git a/modules/gapi/test/gapi_transform_tests.cpp b/modules/gapi/test/gapi_transform_tests.cpp index c18e930e06..832d32143a 100644 --- a/modules/gapi/test/gapi_transform_tests.cpp +++ b/modules/gapi/test/gapi_transform_tests.cpp @@ -23,6 +23,9 @@ using GMat3 = std::tuple; using GScalar = cv::GScalar; template using GArray = cv::GArray; +using ArrayT = int; +using WrongArrayT = char; + GAPI_TRANSFORM(gmat_in_gmat_out, , "gmat_in_gmat_out") { static GMat pattern(GMat) { return {}; } @@ -59,22 +62,34 @@ GAPI_TRANSFORM(gmat_in_gsc_out, , "gmat_in_gsc_out") static GScalar substitute(GMat) { return {}; } }; -GAPI_TRANSFORM(garr_in_gmat_out, )>, "garr_in_gmat_out") +GAPI_TRANSFORM(garr_in_gmat_out, )>, "garr_in_gmat_out") { - static GMat pattern(GArray) { return {}; } - static GMat substitute(GArray) { return {}; } + static GMat pattern(GArray) { return {}; } + static GMat substitute(GArray) { return {}; } }; -GAPI_TRANSFORM(gmat_in_garr_out, (GMat)>, "gmat_in_garr_out") +GAPI_TRANSFORM(gmat_in_garr_out, (GMat)>, "gmat_in_garr_out") { - static GArray pattern(GMat) { return {}; } - static GArray substitute(GMat) { return {}; } + static GArray pattern(GMat) { return {}; } + static GArray substitute(GMat) { return {}; } }; -GAPI_TRANSFORM(gmat_gsc_garray_in_gmat2_out, )>, "gmat_gsc_garray_in_gmat2_out") +GAPI_TRANSFORM(garr_in_gscalar_out, )>, "garr_in_gscalar_out") { - static GMat2 pattern(GMat, GScalar, GArray) { return {}; } - static GMat2 substitute(GMat, GScalar, GArray) { return {}; } + static GScalar pattern(GArray) { return {}; } + static GScalar substitute(GArray) { return {}; } +}; + +GAPI_TRANSFORM(gscalar_in_garr_out, (GScalar)>, "gscalar_in_garr_out") +{ + static GArray pattern(GScalar) { return {}; } + static GArray substitute(GScalar) { return {}; } +}; + +GAPI_TRANSFORM(gmat_gsc_garray_in_gmat2_out, )>, "gmat_gsc_garray_in_gmat2_out") +{ + static GMat2 pattern(GMat, GScalar, GArray) { return {}; } + static GMat2 substitute(GMat, GScalar, GArray) { return {}; } }; } // anonymous namespace @@ -90,11 +105,13 @@ TEST(KernelPackageTransform, CreatePackage) , gmat_in_gsc_out , garr_in_gmat_out , gmat_in_garr_out + , garr_in_gscalar_out + , gscalar_in_garr_out , gmat_gsc_garray_in_gmat2_out >(); auto tr = pkg.get_transformations(); - EXPECT_EQ(9u, tr.size()); + EXPECT_EQ(11u, tr.size()); } TEST(KernelPackageTransform, Include) @@ -116,14 +133,15 @@ TEST(KernelPackageTransform, Combine) EXPECT_EQ(2u, tr.size()); } -namespace { +namespace +{ template inline bool ProtoContainsT(const cv::GProtoArg &arg) { return cv::GProtoArg::index_of() == arg.index(); } } // anonymous namespace -TEST(KernelPackageTransform, gmat_gsc_in_gmat_out) +TEST(KernelPackageTransform, gmat_gsc_garray_in_gmat2_out) { auto tr = gmat_gsc_garray_in_gmat2_out::transformation(); @@ -135,8 +153,8 @@ TEST(KernelPackageTransform, gmat_gsc_in_gmat_out) EXPECT_TRUE(ProtoContainsT(p.m_ins[0])); EXPECT_TRUE(ProtoContainsT(p.m_ins[1])); EXPECT_TRUE(ProtoContainsT(p.m_ins[2])); - EXPECT_TRUE(cv::util::get(p.m_ins[2]).holds()); - EXPECT_FALSE(cv::util::get(p.m_ins[2]).holds()); + EXPECT_TRUE(cv::util::get(p.m_ins[2]).holds()); + EXPECT_FALSE(cv::util::get(p.m_ins[2]).holds()); EXPECT_TRUE(ProtoContainsT(p.m_outs[0])); EXPECT_TRUE(ProtoContainsT(p.m_outs[1])); @@ -146,44 +164,102 @@ TEST(KernelPackageTransform, gmat_gsc_in_gmat_out) check(tr.substitute()); } -TEST(KernelPackageTransform, gmat_in_garr_out) +namespace { - auto tr = gmat_in_garr_out::transformation(); + template + typename std::enable_if<(cv::detail::GTypeTraits::kind == cv::detail::ArgKind::GARRAY), void>::type + array_check(const cv::GComputation::Priv &p) + { + EXPECT_TRUE(ProtoContainsT(p.m_ins[0])); - auto check = [](const cv::GComputation &comp){ + EXPECT_TRUE(ProtoContainsT(p.m_outs[0])); + EXPECT_TRUE(cv::util::get(p.m_outs[0]).holds()); + EXPECT_FALSE(cv::util::get(p.m_outs[0]).holds()); + } + + template + typename std::enable_if<(cv::detail::GTypeTraits::kind == cv::detail::ArgKind::GARRAY), void>::type + array_check(const cv::GComputation::Priv &p) + { + EXPECT_TRUE(ProtoContainsT(p.m_outs[0])); + + EXPECT_TRUE(ProtoContainsT(p.m_ins[0])); + EXPECT_TRUE(cv::util::get(p.m_ins[0]).holds()); + EXPECT_FALSE(cv::util::get(p.m_ins[0]).holds()); + } + + template + typename std::enable_if<(cv::detail::GTypeTraits::kind == cv::detail::ArgKind::GARRAY || + cv::detail::GTypeTraits::kind == cv::detail::ArgKind::GARRAY), void>::type + args_check(const cv::GComputation &comp) + { const auto &p = comp.priv(); EXPECT_EQ(1u, p.m_ins.size()); EXPECT_EQ(1u, p.m_outs.size()); - EXPECT_TRUE(ProtoContainsT(p.m_ins[0])); - - EXPECT_TRUE(ProtoContainsT(p.m_outs[0])); - EXPECT_TRUE(cv::util::get(p.m_outs[0]).holds()); - EXPECT_FALSE(cv::util::get(p.m_outs[0]).holds()); + array_check(p); }; - check(tr.pattern()); - check(tr.substitute()); + template + typename std::enable_if<(cv::detail::GTypeTraits::kind != cv::detail::ArgKind::GARRAY && + cv::detail::GTypeTraits::kind != cv::detail::ArgKind::GARRAY), void>::type + args_check(const cv::GComputation &comp) + { + const auto &p = comp.priv(); + EXPECT_EQ(1u, p.m_ins.size()); + EXPECT_EQ(1u, p.m_outs.size()); + EXPECT_TRUE(ProtoContainsT(p.m_ins[0])); + EXPECT_TRUE(ProtoContainsT(p.m_outs[0])); + } +} // anonymous namespace + +template +static void transformTest() +{ + auto tr = Transformation::transformation(); + + args_check(tr.pattern()); + args_check(tr.substitute()); +} + +TEST(KernelPackageTransform, gmat_in_gmat_out) +{ + transformTest(); +} + +TEST(KernelPackageTransform, gmatp_in_gmatp_out) +{ + transformTest(); +} + +TEST(KernelPackageTransform, gsc_in_gmat_out) +{ + transformTest(); +} + +TEST(KernelPackageTransform, gmat_in_gsc_out) +{ + transformTest(); } TEST(KernelPackageTransform, garr_in_gmat_out) { - auto tr = garr_in_gmat_out::transformation(); + transformTest, GMat>(); +} - auto check = [](const cv::GComputation &comp){ - const auto &p = comp.priv(); - EXPECT_EQ(1u, p.m_ins.size()); - EXPECT_EQ(1u, p.m_outs.size()); +TEST(KernelPackageTransform, gmat_in_garr_out) +{ + transformTest>(); +} - EXPECT_TRUE(ProtoContainsT(p.m_ins[0])); - EXPECT_TRUE(cv::util::get(p.m_ins[0]).holds()); - EXPECT_FALSE(cv::util::get(p.m_ins[0]).holds()); +TEST(KernelPackageTransform, garr_in_gscalar_out) +{ + transformTest, GScalar>(); +} - EXPECT_TRUE(ProtoContainsT(p.m_outs[0])); - }; - - check(tr.pattern()); - check(tr.substitute()); +TEST(KernelPackageTransform, gscalar_in_garr_out) +{ + transformTest>(); } } // namespace opencv_test