From 220c0ba08c2b66535e92fb5afa90b5d86280db13 Mon Sep 17 00:00:00 2001 From: Ioana Ghiban Date: Mon, 4 Mar 2024 18:21:24 +0200 Subject: [PATCH] Check kernel size against input image size --- .../src/filters/gaussian_blur_neon.cpp | 4 + intrinsiccv/src/filters/gaussian_blur_sc.h | 4 + intrinsiccv/src/filters/sobel_neon.cpp | 12 + intrinsiccv/src/filters/sobel_sc.h | 12 + .../src/morphology/morphology_neon.cpp | 12 + intrinsiccv/src/morphology/morphology_sc.h | 12 + test/api/test_gaussian_blur.cpp | 305 ++++++++++++++---- test/api/test_morphology.cpp | 190 +++++++++-- test/api/test_sobel.cpp | 110 +++++-- 9 files changed, 541 insertions(+), 120 deletions(-) diff --git a/intrinsiccv/src/filters/gaussian_blur_neon.cpp b/intrinsiccv/src/filters/gaussian_blur_neon.cpp index 21e3fac45..af3e3dd4a 100644 --- a/intrinsiccv/src/filters/gaussian_blur_neon.cpp +++ b/intrinsiccv/src/filters/gaussian_blur_neon.cpp @@ -155,6 +155,10 @@ intrinsiccv_error_t discrete_gaussian_blur( CHECK_POINTER_AND_STRIDE(dst, dst_stride); CHECK_IMAGE_SIZE(width, height); + if (width < KernelSize - 1 || height < KernelSize - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + if (channels > INTRINSICCV_MAXIMUM_CHANNEL_COUNT) { return INTRINSICCV_ERROR_RANGE; } diff --git a/intrinsiccv/src/filters/gaussian_blur_sc.h b/intrinsiccv/src/filters/gaussian_blur_sc.h index 4911906cf..dd42eb609 100644 --- a/intrinsiccv/src/filters/gaussian_blur_sc.h +++ b/intrinsiccv/src/filters/gaussian_blur_sc.h @@ -95,6 +95,10 @@ intrinsiccv_error_t discrete_gaussian_blur( CHECK_POINTER_AND_STRIDE(dst, dst_stride); CHECK_IMAGE_SIZE(width, height); + if (width < KernelSize - 1 || height < KernelSize - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + if (channels > INTRINSICCV_MAXIMUM_CHANNEL_COUNT) { return INTRINSICCV_ERROR_RANGE; } diff --git a/intrinsiccv/src/filters/sobel_neon.cpp b/intrinsiccv/src/filters/sobel_neon.cpp index 9ed8cc9cc..16b6046e7 100644 --- a/intrinsiccv/src/filters/sobel_neon.cpp +++ b/intrinsiccv/src/filters/sobel_neon.cpp @@ -136,6 +136,12 @@ intrinsiccv_error_t sobel_3x3_horizontal_s16_u8(const uint8_t *src, CHECK_POINTER_AND_STRIDE(dst, dst_stride); CHECK_IMAGE_SIZE(width, height); + const size_t KernelSize = 3; + + if (width < KernelSize - 1 || height < KernelSize - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + if (channels > INTRINSICCV_MAXIMUM_CHANNEL_COUNT) { return INTRINSICCV_ERROR_RANGE; } @@ -166,6 +172,12 @@ intrinsiccv_error_t sobel_3x3_vertical_s16_u8(const uint8_t *src, CHECK_POINTER_AND_STRIDE(dst, dst_stride); CHECK_IMAGE_SIZE(width, height); + const size_t KernelSize = 3; + + if (width < KernelSize - 1 || height < KernelSize - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + if (channels > INTRINSICCV_MAXIMUM_CHANNEL_COUNT) { return INTRINSICCV_ERROR_RANGE; } diff --git a/intrinsiccv/src/filters/sobel_sc.h b/intrinsiccv/src/filters/sobel_sc.h index c9cd893a2..01d9ae777 100644 --- a/intrinsiccv/src/filters/sobel_sc.h +++ b/intrinsiccv/src/filters/sobel_sc.h @@ -126,6 +126,12 @@ static intrinsiccv_error_t sobel_3x3_horizontal_s16_u8_sc( CHECK_POINTER_AND_STRIDE(dst, dst_stride); CHECK_IMAGE_SIZE(width, height); + const size_t KernelSize = 3; + + if (width < KernelSize - 1 || height < KernelSize - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + if (channels > INTRINSICCV_MAXIMUM_CHANNEL_COUNT) { return INTRINSICCV_ERROR_RANGE; } @@ -157,6 +163,12 @@ static intrinsiccv_error_t sobel_3x3_vertical_s16_u8_sc( CHECK_POINTER_AND_STRIDE(dst, dst_stride); CHECK_IMAGE_SIZE(width, height); + const size_t KernelSize = 3; + + if (width < KernelSize - 1 || height < KernelSize - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + if (channels > INTRINSICCV_MAXIMUM_CHANNEL_COUNT) { return INTRINSICCV_ERROR_RANGE; } diff --git a/intrinsiccv/src/morphology/morphology_neon.cpp b/intrinsiccv/src/morphology/morphology_neon.cpp index 2bca15c6d..98aac273b 100644 --- a/intrinsiccv/src/morphology/morphology_neon.cpp +++ b/intrinsiccv/src/morphology/morphology_neon.cpp @@ -506,7 +506,13 @@ intrinsiccv_error_t dilate(const T *src, size_t src_stride, T *dst, return INTRINSICCV_ERROR_CONTEXT_MISMATCH; } + // Currently valid, will need to be changed if morphology supports more border + // types, like INTRINSICCV_BORDER_TYPE_REVERSE. Rectangle kernel{workspace->kernel()}; + if (width < kernel.width() - 1 || height < kernel.height() - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + Rows src_rows{src, src_stride, workspace->channels()}; Rows dst_rows{dst, dst_stride, workspace->channels()}; Margin margin{workspace->kernel(), workspace->anchor()}; @@ -569,7 +575,13 @@ intrinsiccv_error_t erode(const T *src, size_t src_stride, T *dst, return INTRINSICCV_ERROR_CONTEXT_MISMATCH; } + // Currently valid, will need to be changed if morphology supports more border + // types, like INTRINSICCV_BORDER_TYPE_REVERSE. Rectangle kernel{workspace->kernel()}; + if (width < kernel.width() - 1 || height < kernel.height() - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + Rows src_rows{src, src_stride, workspace->channels()}; Rows dst_rows{dst, dst_stride, workspace->channels()}; Margin margin{workspace->kernel(), workspace->anchor()}; diff --git a/intrinsiccv/src/morphology/morphology_sc.h b/intrinsiccv/src/morphology/morphology_sc.h index 40791e939..437970404 100644 --- a/intrinsiccv/src/morphology/morphology_sc.h +++ b/intrinsiccv/src/morphology/morphology_sc.h @@ -469,7 +469,13 @@ static intrinsiccv_error_t dilate_sc(const T *src, size_t src_stride, T *dst, return INTRINSICCV_ERROR_CONTEXT_MISMATCH; } + // Currently valid, will need to be changed if morphology supports more border + // types, like INTRINSICCV_BORDER_TYPE_REVERSE. Rectangle kernel{workspace->kernel()}; + if (width < kernel.width() - 1 || height < kernel.height() - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + Rows src_rows{src, src_stride, workspace->channels()}; Rows dst_rows{dst, dst_stride, workspace->channels()}; Margin margin{workspace->kernel(), workspace->anchor()}; @@ -538,7 +544,13 @@ static intrinsiccv_error_t erode_sc(const T *src, size_t src_stride, T *dst, return INTRINSICCV_ERROR_CONTEXT_MISMATCH; } + // Currently valid, will need to be changed if morphology supports more border + // types, like INTRINSICCV_BORDER_TYPE_REVERSE. Rectangle kernel{workspace->kernel()}; + if (width < kernel.width() - 1 || height < kernel.height() - 1) { + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; + } + Rows src_rows{src, src_stride, workspace->channels()}; Rows dst_rows{dst, dst_stride, workspace->channels()}; Margin margin{workspace->kernel(), workspace->anchor()}; diff --git a/test/api/test_gaussian_blur.cpp b/test/api/test_gaussian_blur.cpp index f0ed05f3b..da70ee83e 100644 --- a/test/api/test_gaussian_blur.cpp +++ b/test/api/test_gaussian_blur.cpp @@ -190,11 +190,13 @@ TYPED_TEST(GaussianBlur, 5x5) { .test(mask); } -TYPED_TEST(GaussianBlur, UnsupportedBorderType) { +TYPED_TEST(GaussianBlur, UnsupportedBorderType3x3) { + using KernelTestParams = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams::kKernelSize - 1; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1] = {}, dst[1]; for (intrinsiccv_border_type_t border : { INTRINSICCV_BORDER_TYPE_CONSTANT, @@ -203,27 +205,48 @@ TYPED_TEST(GaussianBlur, UnsupportedBorderType) { }) { EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, gaussian_blur_3x3()(src, sizeof(TypeParam), dst, - sizeof(TypeParam), 1, 1, 1, border, - context)); + sizeof(TypeParam), validSize, + validSize, 1, border, context)); + } + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); +} + +TYPED_TEST(GaussianBlur, UnsupportedBorderType5x5) { + using KernelTestParams = GaussianBlurKernelTestParams; + intrinsiccv_filter_context_t *context = nullptr; + size_t validSize = KernelTestParams::kKernelSize - 1; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); + TypeParam src[1] = {}, dst[1]; + for (intrinsiccv_border_type_t border : { + INTRINSICCV_BORDER_TYPE_CONSTANT, + INTRINSICCV_BORDER_TYPE_TRANSPARENT, + INTRINSICCV_BORDER_TYPE_NONE, + }) { EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, gaussian_blur_5x5()(src, sizeof(TypeParam), dst, - sizeof(TypeParam), 1, 1, 1, border, - context)); + sizeof(TypeParam), validSize, + validSize, 1, border, context)); } EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } TYPED_TEST(GaussianBlur, NullPointer) { + using KernelTestParams3x3 = GaussianBlurKernelTestParams; + using KernelTestParams5x5 = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams3x3::kKernelSize - 1; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1] = {}, dst[1]; test::test_null_args(gaussian_blur_3x3(), src, sizeof(TypeParam), - dst, sizeof(TypeParam), 1, 1, 1, + dst, sizeof(TypeParam), validSize, validSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context); + validSize = KernelTestParams5x5::kKernelSize - 1; test::test_null_args(gaussian_blur_5x5(), src, sizeof(TypeParam), - dst, sizeof(TypeParam), 1, 1, 1, + dst, sizeof(TypeParam), validSize, validSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } @@ -233,37 +256,41 @@ TYPED_TEST(GaussianBlur, Misalignment) { // misalignment impossible return; } + using KernelTestParams3x3 = GaussianBlurKernelTestParams; + using KernelTestParams5x5 = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams3x3::kKernelSize - 1; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1] = {}, dst[1]; EXPECT_EQ(INTRINSICCV_ERROR_ALIGNMENT, gaussian_blur_3x3()( - src, sizeof(TypeParam) + 1, dst, sizeof(TypeParam), 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + src, sizeof(TypeParam) + 1, dst, sizeof(TypeParam), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); EXPECT_EQ(INTRINSICCV_ERROR_ALIGNMENT, gaussian_blur_3x3()( - src, sizeof(TypeParam), dst, sizeof(TypeParam) + 1, 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam) + 1, validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + validSize = KernelTestParams5x5::kKernelSize - 1; EXPECT_EQ(INTRINSICCV_ERROR_ALIGNMENT, gaussian_blur_5x5()( - src, sizeof(TypeParam) + 1, dst, sizeof(TypeParam), 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + src, sizeof(TypeParam) + 1, dst, sizeof(TypeParam), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); EXPECT_EQ(INTRINSICCV_ERROR_ALIGNMENT, gaussian_blur_5x5()( - src, sizeof(TypeParam), dst, sizeof(TypeParam) + 1, 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam) + 1, validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } -TYPED_TEST(GaussianBlur, ZeroImageSize) { +TYPED_TEST(GaussianBlur, ZeroImageSize3x3) { TypeParam src[1] = {}, dst[1]; intrinsiccv_filter_context_t *context = nullptr; ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), intrinsiccv_rectangle_t{0, 1})); - EXPECT_EQ(INTRINSICCV_OK, + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, gaussian_blur_3x3()( src, sizeof(TypeParam), dst, sizeof(TypeParam), 0, 1, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); @@ -272,13 +299,148 @@ TYPED_TEST(GaussianBlur, ZeroImageSize) { ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), intrinsiccv_rectangle_t{1, 0})); - EXPECT_EQ(INTRINSICCV_OK, + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, gaussian_blur_3x3()( src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 0, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } +TYPED_TEST(GaussianBlur, ZeroImageSize5x5) { + TypeParam src[1] = {}, dst[1]; + intrinsiccv_filter_context_t *context = nullptr; + ASSERT_EQ(INTRINSICCV_OK, + intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{0, 1})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_5x5()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), 0, 1, 1, + INTRINSICCV_BORDER_TYPE_REFLECT, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); + + ASSERT_EQ(INTRINSICCV_OK, + intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{1, 0})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_5x5()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 0, 1, + INTRINSICCV_BORDER_TYPE_REFLECT, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); +} + +TYPED_TEST(GaussianBlur, ValidImageSize3x3) { + using KernelTestParams = GaussianBlurKernelTestParams; + intrinsiccv_filter_context_t *context = nullptr; + size_t validSize = KernelTestParams::kKernelSize - 1; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); + test::Array2D src{validSize, validSize, + test::Options::vector_length()}; + src.set(0, 0, {1, 2}); + src.set(1, 0, {1, 2}); + + test::Array2D dst{validSize, validSize, + test::Options::vector_length()}; + EXPECT_EQ(INTRINSICCV_OK, + gaussian_blur_3x3()( + src.data(), src.stride(), dst.data(), dst.stride(), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REVERSE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); +} + +TYPED_TEST(GaussianBlur, ValidImageSize5x5) { + using KernelTestParams = GaussianBlurKernelTestParams; + intrinsiccv_filter_context_t *context = nullptr; + size_t validSize = KernelTestParams::kKernelSize - 1; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); + test::Array2D src{validSize, validSize, + test::Options::vector_length()}; + src.set(0, 0, {1, 2, 3, 4}); + src.set(1, 0, {1, 2, 3, 4}); + src.set(2, 0, {1, 2, 3, 4}); + src.set(3, 0, {1, 2, 3, 4}); + + test::Array2D dst{validSize, validSize, + test::Options::vector_length()}; + EXPECT_EQ(INTRINSICCV_OK, + gaussian_blur_5x5()( + src.data(), src.stride(), dst.data(), dst.stride(), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REVERSE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); +} + +TYPED_TEST(GaussianBlur, UndersizeImage3x3) { + using KernelTestParams = GaussianBlurKernelTestParams; + intrinsiccv_filter_context_t *context = nullptr; + size_t underSize = KernelTestParams::kKernelSize - 2; + size_t validWidth = KernelTestParams::kKernelSize + 10; + size_t validHeight = KernelTestParams::kKernelSize + 5; + TypeParam src[1], dst[1]; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{underSize, underSize})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_3x3()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), underSize, + underSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); + ASSERT_EQ(INTRINSICCV_OK, + intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{underSize, validHeight})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_3x3()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), underSize, + validHeight, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); + ASSERT_EQ(INTRINSICCV_OK, + intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validWidth, underSize})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_3x3()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), validWidth, + underSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); +} + +TYPED_TEST(GaussianBlur, UndersizeImage5x5) { + using KernelTestParams = GaussianBlurKernelTestParams; + intrinsiccv_filter_context_t *context = nullptr; + size_t underSize = KernelTestParams::kKernelSize - 2; + size_t width = KernelTestParams::kKernelSize + 8; + size_t height = KernelTestParams::kKernelSize + 3; + + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{underSize, underSize})); + TypeParam src[1] = {}, dst[1]; + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_5x5()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), underSize, + underSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{underSize, height})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_5x5()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), underSize, + height, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{width, underSize})); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + gaussian_blur_5x5()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), width, + underSize, 1, INTRINSICCV_BORDER_TYPE_REPLICATE, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); +} + TYPED_TEST(GaussianBlur, OversizeImage) { intrinsiccv_filter_context_t *context = nullptr; ASSERT_EQ(INTRINSICCV_OK, @@ -309,72 +471,95 @@ TYPED_TEST(GaussianBlur, OversizeImage) { } TYPED_TEST(GaussianBlur, ChannelNumber) { + using KernelTestParams3x3 = GaussianBlurKernelTestParams; + using KernelTestParams5x5 = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams3x3::kKernelSize - 1; + + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1], dst[1]; EXPECT_EQ(INTRINSICCV_ERROR_RANGE, gaussian_blur_3x3()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, - INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1, + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize, + validSize, INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); + + validSize = KernelTestParams5x5::kKernelSize - 1; EXPECT_EQ(INTRINSICCV_ERROR_RANGE, gaussian_blur_5x5()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, - INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1, + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize, + validSize, INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } TYPED_TEST(GaussianBlur, InvalidContextSizeType) { + using KernelTestParams3x3 = GaussianBlurKernelTestParams; + using KernelTestParams5x5 = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam) + 1, - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams3x3::kKernelSize - 1; + + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam) + 1, + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1], dst[1]; EXPECT_EQ(INTRINSICCV_ERROR_CONTEXT_MISMATCH, gaussian_blur_3x3()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REFLECT, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); + validSize = KernelTestParams5x5::kKernelSize - 1; EXPECT_EQ(INTRINSICCV_ERROR_CONTEXT_MISMATCH, gaussian_blur_5x5()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REFLECT, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } TYPED_TEST(GaussianBlur, InvalidContextChannelNumber) { + using KernelTestParams3x3 = GaussianBlurKernelTestParams; + using KernelTestParams5x5 = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 2, 2 * sizeof(TypeParam), - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams3x3::kKernelSize - 1; + + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 2, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1], dst[1]; EXPECT_EQ(INTRINSICCV_ERROR_CONTEXT_MISMATCH, gaussian_blur_3x3()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REFLECT, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); + + validSize = KernelTestParams5x5::kKernelSize - 1; EXPECT_EQ(INTRINSICCV_ERROR_CONTEXT_MISMATCH, gaussian_blur_5x5()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, 1, - INTRINSICCV_BORDER_TYPE_REFLECT, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize, + validSize, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } TYPED_TEST(GaussianBlur, InvalidContextImageSize) { + using KernelTestParams3x3 = GaussianBlurKernelTestParams; + using KernelTestParams5x5 = GaussianBlurKernelTestParams; intrinsiccv_filter_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, - intrinsiccv_filter_create(&context, 1, 2 * sizeof(TypeParam), - intrinsiccv_rectangle_t{1, 1})); + size_t validSize = KernelTestParams3x3::kKernelSize - 1; + + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_filter_create( + &context, 1, 2 * sizeof(TypeParam), + intrinsiccv_rectangle_t{validSize, validSize})); TypeParam src[1], dst[1]; EXPECT_EQ(INTRINSICCV_ERROR_CONTEXT_MISMATCH, gaussian_blur_3x3()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 2, 2, 1, - INTRINSICCV_BORDER_TYPE_REFLECT, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize + 1, + validSize + 1, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); + + validSize = KernelTestParams5x5::kKernelSize - 1; EXPECT_EQ(INTRINSICCV_ERROR_CONTEXT_MISMATCH, gaussian_blur_5x5()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), 2, 2, 1, - INTRINSICCV_BORDER_TYPE_REFLECT, context)); + src, sizeof(TypeParam), dst, sizeof(TypeParam), validSize + 1, + validSize + 1, 1, INTRINSICCV_BORDER_TYPE_REFLECT, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_filter_release(context)); } @@ -420,3 +605,13 @@ TEST(FilterCreate, ChannelNumber) { 1, intrinsiccv_rectangle_t{1, 1})); ASSERT_EQ(nullptr, context); } + +TEST(FilterCreate, NullPointer) { + EXPECT_EQ( + INTRINSICCV_ERROR_NULL_POINTER, + intrinsiccv_filter_create(nullptr, 1, 1, intrinsiccv_rectangle_t{1, 1})); +} +TEST(FilterRelease, NullPointer) { + EXPECT_EQ(INTRINSICCV_ERROR_NULL_POINTER, + intrinsiccv_filter_release(nullptr)); +} diff --git a/test/api/test_morphology.cpp b/test/api/test_morphology.cpp index ee49801e1..5c25c8d8b 100644 --- a/test/api/test_morphology.cpp +++ b/test/api/test_morphology.cpp @@ -316,6 +316,93 @@ static intrinsiccv_error_t make_minimal_context( intrinsiccv_rectangle_t{1, 1}); } +template +static void test_valid_image_size(intrinsiccv_rectangle_t kernel, + test::Array2D src) { + size_t validSize = kernel.width - 1; + intrinsiccv_rectangle_t image{validSize, validSize}; + intrinsiccv_border_values_t border_values{0, 0, 1, 1}; + + test::Array2D dst{validSize, validSize, + test::Options::vector_length()}; + + for (size_t x = 0; x < kernel.width; x += kernel.width - 1) { + for (size_t y = 0; y < kernel.width; y += kernel.width - 1) { + intrinsiccv_point_t anchor{x, y}; + for (intrinsiccv_border_type_t border : { + INTRINSICCV_BORDER_TYPE_REPLICATE, + INTRINSICCV_BORDER_TYPE_CONSTANT, + }) { + intrinsiccv_morphology_context_t *context = nullptr; + ASSERT_EQ(INTRINSICCV_OK, + intrinsiccv_morphology_create(&context, kernel, anchor, + border, border_values, 1, 1, + sizeof(ElementType), image)); + EXPECT_EQ(INTRINSICCV_OK, + ErodeParams::api()( + src.data(), src.stride(), dst.data(), dst.stride(), + validSize, validSize, context)); + EXPECT_EQ(INTRINSICCV_OK, + DilateParams::api()( + src.data(), src.stride(), dst.data(), dst.stride(), + validSize, validSize, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); + } + } + } +} + +template +static void test_undersize_image(intrinsiccv_rectangle_t kernel) { + size_t underSize = kernel.width - 2; + size_t validWidth = kernel.width + 10; + size_t validHeight = kernel.height + 5; + intrinsiccv_morphology_context_t *context = nullptr; + intrinsiccv_rectangle_t image{underSize, underSize}; + intrinsiccv_rectangle_t imageW{underSize, validHeight}; + intrinsiccv_rectangle_t imageH{validWidth, underSize}; + intrinsiccv_border_type_t border = INTRINSICCV_BORDER_TYPE_REPLICATE; + intrinsiccv_border_values_t border_values{0, 0, 1, 1}; + intrinsiccv_point_t anchor{1, 1}; + ElementType src[1], dst[1]; + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_create( + &context, kernel, anchor, border, border_values, + 1, 1, sizeof(ElementType), image)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + ErodeParams::api()(src, sizeof(ElementType), dst, + sizeof(ElementType), underSize, + underSize, context)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + DilateParams::api()(src, sizeof(ElementType), dst, + sizeof(ElementType), underSize, + underSize, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_create( + &context, kernel, anchor, border, border_values, + 1, 1, sizeof(ElementType), imageW)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + ErodeParams::api()(src, sizeof(ElementType), dst, + sizeof(ElementType), underSize, + validHeight, context)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + DilateParams::api()(src, sizeof(ElementType), dst, + sizeof(ElementType), underSize, + validHeight, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); + ASSERT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_create( + &context, kernel, anchor, border, border_values, + 1, 1, sizeof(ElementType), imageH)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + ErodeParams::api()(src, sizeof(ElementType), dst, + sizeof(ElementType), validWidth, + underSize, context)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + DilateParams::api()(src, sizeof(ElementType), dst, + sizeof(ElementType), validWidth, + underSize, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); +} + TYPED_TEST(Morphology, UnsupportedBorderType) { for (intrinsiccv_border_type_t border : { INTRINSICCV_BORDER_TYPE_REFLECT, @@ -463,11 +550,9 @@ TYPED_TEST(Morphology, DilateNullPointer) { TYPED_TEST(Morphology, ErodeNullPointer) { intrinsiccv_morphology_context_t *context = nullptr; ASSERT_EQ(INTRINSICCV_OK, make_minimal_context(&context, sizeof(TypeParam))); - TypeParam src[1] = {}, dst[1]; test::test_null_args(ErodeParams::api(), src, sizeof(TypeParam), dst, sizeof(TypeParam), 1, 1, context); - EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); } @@ -533,22 +618,6 @@ TYPED_TEST(Morphology, DilateZeroImageSize) { EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); } -TYPED_TEST(Morphology, DilateOversizeImage) { - intrinsiccv_morphology_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, make_minimal_context(&context, sizeof(TypeParam))); - TypeParam src[1], dst[1]; - EXPECT_EQ(INTRINSICCV_ERROR_RANGE, - DilateParams::api()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), - INTRINSICCV_MAX_IMAGE_PIXELS + 1, 1, context)); - EXPECT_EQ( - INTRINSICCV_ERROR_RANGE, - DilateParams::api()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), - INTRINSICCV_MAX_IMAGE_PIXELS, INTRINSICCV_MAX_IMAGE_PIXELS, context)); - EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); -} - TYPED_TEST(Morphology, ErodeZeroImageSize) { intrinsiccv_morphology_context_t *context = nullptr; TypeParam src[1], dst[1]; @@ -575,22 +644,6 @@ TYPED_TEST(Morphology, ErodeZeroImageSize) { EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); } -TYPED_TEST(Morphology, ErodeOversizeImage) { - intrinsiccv_morphology_context_t *context = nullptr; - ASSERT_EQ(INTRINSICCV_OK, make_minimal_context(&context, sizeof(TypeParam))); - TypeParam src[1], dst[1]; - EXPECT_EQ(INTRINSICCV_ERROR_RANGE, - ErodeParams::api()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), - INTRINSICCV_MAX_IMAGE_PIXELS + 1, 1, context)); - EXPECT_EQ( - INTRINSICCV_ERROR_RANGE, - ErodeParams::api()( - src, sizeof(TypeParam), dst, sizeof(TypeParam), - INTRINSICCV_MAX_IMAGE_PIXELS, INTRINSICCV_MAX_IMAGE_PIXELS, context)); - EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); -} - TYPED_TEST(Morphology, DilateInvalidContextSizeType) { intrinsiccv_morphology_context_t *context = nullptr; ASSERT_EQ(INTRINSICCV_OK, @@ -632,3 +685,72 @@ TYPED_TEST(Morphology, ErodeInvalidContextImageSize) { sizeof(TypeParam), 2, 1, context)); EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); } + +TYPED_TEST(Morphology, ValidImageSize) { + intrinsiccv_rectangle_t kernel3x3{3, 3}; + intrinsiccv_rectangle_t kernel5x5{5, 5}; + test::Array2D src2x2{kernel3x3.width - 1, kernel3x3.width - 1, + test::Options::vector_length()}; + src2x2.set(0, 0, {1, 2}); + src2x2.set(1, 0, {1, 2}); + test::Array2D src4x4{kernel5x5.width - 1, kernel5x5.width - 1, + test::Options::vector_length()}; + src4x4.set(0, 0, {1, 2, 3, 4}); + src4x4.set(1, 0, {1, 2, 3, 4}); + src4x4.set(2, 0, {1, 2, 3, 4}); + src4x4.set(3, 0, {1, 2, 3, 4}); + test_valid_image_size(kernel3x3, src2x2); + test_valid_image_size(kernel5x5, src4x4); +} + +TYPED_TEST(Morphology, UndersizeImage) { + intrinsiccv_rectangle_t kernel3x3{3, 3}; + intrinsiccv_rectangle_t kernel5x5{5, 5}; + test_undersize_image(kernel3x3); + test_undersize_image(kernel5x5); +} + +TYPED_TEST(Morphology, DilateOversizeImage) { + intrinsiccv_morphology_context_t *context = nullptr; + ASSERT_EQ(INTRINSICCV_OK, make_minimal_context(&context, sizeof(TypeParam))); + TypeParam src[1], dst[1]; + EXPECT_EQ(INTRINSICCV_ERROR_RANGE, + DilateParams::api()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), + INTRINSICCV_MAX_IMAGE_PIXELS + 1, 1, context)); + EXPECT_EQ( + INTRINSICCV_ERROR_RANGE, + DilateParams::api()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), + INTRINSICCV_MAX_IMAGE_PIXELS, INTRINSICCV_MAX_IMAGE_PIXELS, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); +} + +TYPED_TEST(Morphology, ErodeOversizeImage) { + intrinsiccv_morphology_context_t *context = nullptr; + ASSERT_EQ(INTRINSICCV_OK, make_minimal_context(&context, sizeof(TypeParam))); + TypeParam src[1], dst[1]; + EXPECT_EQ(INTRINSICCV_ERROR_RANGE, + ErodeParams::api()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), + INTRINSICCV_MAX_IMAGE_PIXELS + 1, 1, context)); + EXPECT_EQ( + INTRINSICCV_ERROR_RANGE, + ErodeParams::api()( + src, sizeof(TypeParam), dst, sizeof(TypeParam), + INTRINSICCV_MAX_IMAGE_PIXELS, INTRINSICCV_MAX_IMAGE_PIXELS, context)); + EXPECT_EQ(INTRINSICCV_OK, intrinsiccv_morphology_release(context)); +} + +TEST(MorphologyCreate, NullPointer) { + EXPECT_EQ(INTRINSICCV_ERROR_NULL_POINTER, + intrinsiccv_morphology_create( + nullptr, intrinsiccv_rectangle_t{1, 1}, + intrinsiccv_point_t{0, 0}, INTRINSICCV_BORDER_TYPE_REPLICATE, + intrinsiccv_border_values_t{0, 0, 1, 1}, 1, 1, 1, + intrinsiccv_rectangle_t{1, 1})); +} +TEST(MorphologyRelease, NullPointer) { + EXPECT_EQ(INTRINSICCV_ERROR_NULL_POINTER, + intrinsiccv_morphology_release(nullptr)); +} diff --git a/test/api/test_sobel.cpp b/test/api/test_sobel.cpp index 1d45d5835..756fe9527 100644 --- a/test/api/test_sobel.cpp +++ b/test/api/test_sobel.cpp @@ -151,14 +151,76 @@ TYPED_TEST(Sobel, MisalignmentVertical) { } TYPED_TEST(Sobel, ZeroImageSizeHorizontal) { + using KernelTestParams = SobelKernelTestParams; + typename KernelTestParams::InputType src[1] = {}; + typename KernelTestParams::OutputType dst[1]; + + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_horizontal()(src, sizeof(src), dst, + sizeof(dst), 0, 1, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_horizontal()(src, sizeof(src), dst, + sizeof(dst), 1, 0, 1)); +} + +TYPED_TEST(Sobel, ZeroImageSizeVertical) { using KernelTestParams = SobelKernelTestParams; typename KernelTestParams::InputType src[1] = {}; typename KernelTestParams::OutputType dst[1]; + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), + 0, 1, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), + 1, 0, 1)); +} + +TYPED_TEST(Sobel, ValidImageSize) { + using KernelTestParams = SobelKernelTestParams; + size_t validSize = 2; + + test::Array2D src{ + validSize, validSize, test::Options::vector_length()}; + src.set(0, 0, {1, 2}); + src.set(1, 0, {1, 2}); + + test::Array2D dst{ + validSize, validSize, test::Options::vector_length()}; EXPECT_EQ(INTRINSICCV_OK, sobel_3x3_horizontal()( - src, sizeof(src), dst, sizeof(dst), 0, 1, 1)); - EXPECT_EQ(INTRINSICCV_OK, sobel_3x3_horizontal()( - src, sizeof(src), dst, sizeof(dst), 1, 0, 1)); + src.data(), src.stride(), dst.data(), + dst.stride(), validSize, validSize, 1)); + EXPECT_EQ(INTRINSICCV_OK, sobel_3x3_vertical()( + src.data(), src.stride(), dst.data(), + dst.stride(), validSize, validSize, 1)); +} + +TYPED_TEST(Sobel, UndersizeImage) { + using KernelTestParams = SobelKernelTestParams; + typename KernelTestParams::InputType src[1] = {}; + typename KernelTestParams::OutputType dst[1]; + size_t underSize = 1; + size_t validWidth = 13; + size_t validHeight = 8; + + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_horizontal()( + src, sizeof(src), dst, sizeof(dst), underSize, underSize, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), + underSize, underSize, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_horizontal()( + src, sizeof(src), dst, sizeof(dst), underSize, validHeight, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), + underSize, validHeight, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_horizontal()( + src, sizeof(src), dst, sizeof(dst), validWidth, underSize, 1)); + EXPECT_EQ(INTRINSICCV_ERROR_NOT_IMPLEMENTED, + sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), + validWidth, underSize, 1)); } TYPED_TEST(Sobel, OversizeImageHorizontal) { @@ -166,6 +228,7 @@ TYPED_TEST(Sobel, OversizeImageHorizontal) { using KernelTestParams = SobelKernelTestParams; typename KernelTestParams::InputType src[1] = {}; typename KernelTestParams::OutputType dst[1]; + size_t validSize = 2; EXPECT_EQ(INTRINSICCV_ERROR_RANGE, sobel_3x3_horizontal()( @@ -177,28 +240,18 @@ TYPED_TEST(Sobel, OversizeImageHorizontal) { INTRINSICCV_MAX_IMAGE_PIXELS, INTRINSICCV_MAX_IMAGE_PIXELS, 1)); EXPECT_EQ( INTRINSICCV_ERROR_ALLOCATION, - sobel_3x3_horizontal()(src, sizeof(src), dst, sizeof(dst), - INTRINSICCV_MAX_IMAGE_PIXELS, 1, - INTRINSICCV_MAXIMUM_CHANNEL_COUNT)); + sobel_3x3_horizontal()( + src, sizeof(src), dst, sizeof(dst), INTRINSICCV_MAX_IMAGE_PIXELS / 2, + validSize, INTRINSICCV_MAXIMUM_CHANNEL_COUNT)); MockMallocToFail::disable(); } -TYPED_TEST(Sobel, ZeroImageSizeVertical) { - using KernelTestParams = SobelKernelTestParams; - typename KernelTestParams::InputType src[1] = {}; - typename KernelTestParams::OutputType dst[1]; - - EXPECT_EQ(INTRINSICCV_OK, sobel_3x3_vertical()( - src, sizeof(src), dst, sizeof(dst), 0, 1, 1)); - EXPECT_EQ(INTRINSICCV_OK, sobel_3x3_vertical()( - src, sizeof(src), dst, sizeof(dst), 1, 0, 1)); -} - TYPED_TEST(Sobel, OversizeImageVertical) { MockMallocToFail::enable(); using KernelTestParams = SobelKernelTestParams; typename KernelTestParams::InputType src[1] = {}; typename KernelTestParams::OutputType dst[1]; + size_t validSize = 2; EXPECT_EQ( INTRINSICCV_ERROR_RANGE, @@ -210,29 +263,24 @@ TYPED_TEST(Sobel, OversizeImageVertical) { INTRINSICCV_MAX_IMAGE_PIXELS, 1)); EXPECT_EQ(INTRINSICCV_ERROR_ALLOCATION, sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), - INTRINSICCV_MAX_IMAGE_PIXELS, 1, + INTRINSICCV_MAX_IMAGE_PIXELS / 2, + validSize, INTRINSICCV_MAXIMUM_CHANNEL_COUNT)); MockMallocToFail::disable(); } -TYPED_TEST(Sobel, ChannelNumberHorizontal) { +TYPED_TEST(Sobel, ChannelNumber) { using KernelTestParams = SobelKernelTestParams; typename KernelTestParams::InputType src[1] = {}; typename KernelTestParams::OutputType dst[1]; + size_t validSize = 2; EXPECT_EQ(INTRINSICCV_ERROR_RANGE, sobel_3x3_horizontal()( - src, sizeof(src), dst, sizeof(dst), 1, 1, + src, sizeof(src), dst, sizeof(dst), validSize, validSize, + INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1)); + EXPECT_EQ(INTRINSICCV_ERROR_RANGE, + sobel_3x3_vertical()( + src, sizeof(src), dst, sizeof(dst), validSize, validSize, INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1)); -} - -TYPED_TEST(Sobel, ChannelNumberVertical) { - using KernelTestParams = SobelKernelTestParams; - typename KernelTestParams::InputType src[1] = {}; - typename KernelTestParams::OutputType dst[1]; - - EXPECT_EQ( - INTRINSICCV_ERROR_RANGE, - sobel_3x3_vertical()(src, sizeof(src), dst, sizeof(dst), 1, 1, - INTRINSICCV_MAXIMUM_CHANNEL_COUNT + 1)); } -- GitLab