diff --git a/test/api/test_morphology.cpp b/test/api/test_morphology.cpp index 21e0a5a410622a17b96a92513842f31f74527039..738c80e8096dc068a9f68c26b98f21f1b9d14afb 100644 --- a/test/api/test_morphology.cpp +++ b/test/api/test_morphology.cpp @@ -34,10 +34,36 @@ struct MorphologyKernelTestParams { using OutputType = ElementType; }; // end of struct MorphologyKernelTestParams -static constexpr std::array kSupportedBorders = { - INTRINSICCV_BORDER_TYPE_REPLICATE, - INTRINSICCV_BORDER_TYPE_CONSTANT, -}; +static constexpr std::array kDefaultBorder = { + INTRINSICCV_BORDER_TYPE_REPLICATE}; + +static constexpr std::array kConstantBorder = { + INTRINSICCV_BORDER_TYPE_CONSTANT}; + +static constexpr std::array + kDefaultBorderValues = {{ + {0, 0, 0, 0}, // default + }}; + +template +static const std::array &more_border_values() { + using limit = std::numeric_limits; + static const std::array values = { + {{0, 0, 0, 0}, // default + {7, 42, 99, 9}, + {limit::min(), limit::max(), limit::min(), limit::max()}, + {0, limit::min(), limit::max(), 0}}}; + return values; +} + +template +std::unique_ptr> +make_generator_ptr(IterableType &elements) { + test::Generator *pg = + new test::SequenceGenerator(elements); + return std::unique_ptr>( + pg); +} template class OperationParams, size_t kernelWidth, size_t kernelHeight> @@ -50,7 +76,15 @@ class MorphologyTest public: MorphologyTest() - : mask_{kernelWidth, kernelHeight}, kernel_{mask_}, iterations_{1} {} + : mask_{kernelWidth, kernelHeight}, + kernel_{mask_}, + iterations_{1}, + small_array_layouts_{ + test::small_array_layouts(kernelWidth, kernelHeight)} { + array_layout_generator_ = make_generator_ptr(small_array_layouts_); + border_type_generator_ = make_generator_ptr(kDefaultBorder); + border_values_generator_ = make_generator_ptr(kDefaultBorderValues); + } MorphologyTest &with_anchor(test::Point anchor) { kernel_ = test::Kernel(mask_, anchor); @@ -62,20 +96,40 @@ class MorphologyTest return *this; } + MorphologyTest &with_array_layouts( + std::unique_ptr> g) { + array_layout_generator_ = std::move(g); + return *this; + } + + MorphologyTest &with_border_types( + std::unique_ptr> g) { + border_type_generator_ = std::move(g); + return *this; + } + + MorphologyTest &with_border_values( + std::unique_ptr> g) { + border_values_generator_ = std::move(g); + return *this; + } + void test() { - auto array_layouts = test::default_array_layouts(kernelWidth, kernelHeight); - test::SequenceGenerator tested_array_layouts{array_layouts}; - test::SequenceGenerator tested_borders{kSupportedBorders}; - test::SequenceGenerator tested_border_values{test_border_values()}; test::PseudoRandomNumberGenerator element_generator; - Base::test(kernel_, tested_array_layouts, tested_borders, - tested_border_values, element_generator); + Base::test(kernel_, *array_layout_generator_, *border_type_generator_, + *border_values_generator_, element_generator); } protected: test::Array2D mask_; test::Kernel kernel_; size_t iterations_; + std::array small_array_layouts_; + std::unique_ptr> array_layout_generator_; + std::unique_ptr> + border_type_generator_; + std::unique_ptr> + border_values_generator_; intrinsiccv_error_t call_api( const test::Array2D *input, test::Array2D *output, @@ -134,23 +188,6 @@ class MorphologyTest } return result; } - - static constexpr double min_border() { - return static_cast(std::numeric_limits::min()); - } - - static constexpr double max_border() { - return static_cast(std::numeric_limits::max()); - } - - const std::array &test_border_values() const { - static const std::array values = { - {{0, 0, 0, 0}, // default - {7, 42, 99, 9}, - {min_border(), max_border(), min_border(), max_border()}, - {0, min_border(), max_border(), 0}}}; - return values; - } }; // end of class class MorphologyTest @@ -161,72 +198,94 @@ using ElementTypes = ::testing::Types; TYPED_TEST_SUITE(Morphology, ElementTypes); -TYPED_TEST(Morphology, Dilate1x1) { - MorphologyTest{}.test(); -} +TYPED_TEST(Morphology, 1xN) { + std::array medium_array_layouts_3x3 = + test::default_array_layouts(3, 3); -TYPED_TEST(Morphology, Erode1x1) { + MorphologyTest{}.test(); MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate1x2) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode1x2) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate3x1) { + MorphologyTest{} + .with_array_layouts(make_generator_ptr(medium_array_layouts_3x3)) + .test(); + MorphologyTest{} + .with_array_layouts(make_generator_ptr(medium_array_layouts_3x3)) + .test(); MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode3x1) { MorphologyTest{}.test(); } -TYPED_TEST(Morphology, Dilate3x3) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode3x3) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate5x5) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode5x5) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate11x11) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode11x11) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate4x4) { +std::array get_large_array_layouts(size_t min_width, + size_t min_height) { + size_t vl = test::Options::vector_length(); + size_t big_height = std::max(2 * vl + 1, min_height * 4); + + return {{ + // clang-format off + // width, height, padding, channels + { min_width * 8, min_height, 0, 8}, + { min_width * 8, min_height, vl, 8}, + { min_width * 2, big_height, 0, 1}, + { min_width * 2, big_height, vl, 1}, + // clang-format on + }}; +} + +TYPED_TEST(Morphology, LargeArrays) { + std::array large_array_layouts = + get_large_array_layouts(3, 3); + + MorphologyTest{} + .with_array_layouts(make_generator_ptr(large_array_layouts)) + .test(); + MorphologyTest{} + .with_array_layouts(make_generator_ptr(large_array_layouts)) + .test(); + MorphologyTest{} + .with_border_types(make_generator_ptr(kConstantBorder)) + .with_array_layouts(make_generator_ptr(large_array_layouts)) + .test(); + MorphologyTest{} + .with_border_types(make_generator_ptr(kConstantBorder)) + .with_array_layouts(make_generator_ptr(large_array_layouts)) + .test(); +} + +TYPED_TEST(Morphology, MediumArrays) { + std::array medium_array_layouts_3x3 = + test::default_array_layouts(3, 3); + MorphologyTest{} + .with_array_layouts(make_generator_ptr(medium_array_layouts_3x3)) + .test(); + MorphologyTest{} + .with_array_layouts(make_generator_ptr(medium_array_layouts_3x3)) + .test(); + std::array medium_array_layouts_5x5 = + test::default_array_layouts(5, 5); + MorphologyTest{} + .with_array_layouts(make_generator_ptr(medium_array_layouts_5x5)) + .test(); + MorphologyTest{} + .with_array_layouts(make_generator_ptr(medium_array_layouts_5x5)) + .test(); +} + +TYPED_TEST(Morphology, BorderValues) { + MorphologyTest{} + .with_border_types(make_generator_ptr(kConstantBorder)) + .with_border_values(make_generator_ptr(more_border_values())) + .test(); + MorphologyTest{} + .with_border_types(make_generator_ptr(kConstantBorder)) + .with_border_values(make_generator_ptr(more_border_values())) + .test(); +} + +TYPED_TEST(Morphology, UnortodoxSizes) { MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode7x5) { MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate8x4) { MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Dilate6x10) { - MorphologyTest{}.test(); -} - -TYPED_TEST(Morphology, Erode12x4) { - MorphologyTest{}.test(); + MorphologyTest{}.test(); + MorphologyTest{}.test(); } TYPED_TEST(Morphology, Iterations) { @@ -237,8 +296,14 @@ TYPED_TEST(Morphology, Iterations) { TYPED_TEST(Morphology, Anchors) { MorphologyTest{}.with_anchor({0, 0}).test(); - MorphologyTest{}.with_anchor({2, 0}).test(); - MorphologyTest{}.with_anchor({0, 4}).test(); + MorphologyTest{} + .with_border_types(make_generator_ptr(kConstantBorder)) + .with_anchor({2, 0}) + .test(); + MorphologyTest{} + .with_border_types(make_generator_ptr(kConstantBorder)) + .with_anchor({0, 4}) + .test(); MorphologyTest{}.with_anchor({2, 4}).test(); } diff --git a/test/framework/utils.cpp b/test/framework/utils.cpp index 63c987a882838e244357772883074a59c66d114f..05f9174d148ae1074ba63a278df216ebebb055ae 100644 --- a/test/framework/utils.cpp +++ b/test/framework/utils.cpp @@ -48,34 +48,47 @@ template void dump(const TwoDimensional *); template void dump(const TwoDimensional *); template void dump(const TwoDimensional *); -std::array default_array_layouts(size_t min_width, +std::array small_array_layouts(size_t min_width, + size_t min_height) { + size_t vl = test::Options::vector_length(); + size_t width = std::max(min_width, vl); + + return {{ + // clang-format off + // width, height, padding, channels + { min_width, min_height, 0, 1}, + { min_width * 2, min_height, 0, 2}, + { min_width * 3, min_height, vl, 3}, + { width + 1, min_height, 0, 1}, + { 2 * width, min_height, vl, 1}, + { 4 * width, min_height, vl, 1}, + // clang-format on + }}; +} + +std::array default_array_layouts(size_t min_width, size_t min_height) { size_t vl = test::Options::vector_length(); size_t width = std::max(min_width, vl); + size_t height = std::max(min_height, vl); return {{ // clang-format off // width, height, padding, channels - { min_width, min_height, 0, 1}, + { min_width, height, 0, 1}, { min_width * 2, min_height, 0, 2}, { min_width * 3, min_height, 0, 3}, { min_width * 4, min_height, 0, 4}, - { min_width * 8, min_height * 3, 0, 8}, - { min_width, min_height, vl, 1}, + { min_width, height, vl, 1}, { min_width * 2, min_height, vl, 2}, { min_width * 3, min_height, vl, 3}, { min_width * 4, min_height, vl, 4}, - { min_width * 8, min_height * 3, vl, 8}, - { width - 1, min_height, 0, 1}, + { 4 * width + 1, min_height + 1, 0, 1}, {2 * (width - 1), min_height + 1, 0, 2}, {3 * (width - 1), min_height + 2, 0, 3}, - {4 * (width + 1), min_height + 3, 0, 4}, - { width * 8, min_height * 3, 0, 8}, - { width - 1, min_height, vl, 1}, + { 4 * width + 1, min_height + 1, vl, 1}, {2 * (width - 1), min_height + 1, vl, 2}, {3 * (width - 1), min_height + 2, vl, 3}, - {4 * (width + 1), min_height + 3, vl, 4}, - { width * 8, min_height * 3, vl, 8}, // clang-format on }}; } diff --git a/test/framework/utils.h b/test/framework/utils.h index ad76a36953f808b52ee1c5f7ebe8db2e9d35d177..5cfa50c806bb1686bc81170d17a96e72cbbb9a17 100644 --- a/test/framework/utils.h +++ b/test/framework/utils.h @@ -82,8 +82,11 @@ class Options { template void dump(const TwoDimensional *elements); +// Returns an array of just a few small layouts. +std::array small_array_layouts(size_t min_width, + size_t min_height); // Returns an array of default tested layouts. -std::array default_array_layouts(size_t min_width, +std::array default_array_layouts(size_t min_width, size_t min_height); namespace internal {