Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add first tests for convolve functions from Numeric extension (#335)
First stab at convolution tests includes cases with the identity kernel. Move `pixel`-s streaming facility used by Boost.Test (required by `BOOST_TEST` macro) to the common header for re-use in other tests.
- Loading branch information
Showing
9 changed files
with
428 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
// | ||
// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net> | ||
// | ||
// Distributed under the Boost Software License, Version 1.0 | ||
// See accompanying file LICENSE_1_0.txt or copy at | ||
// http://www.boost.org/LICENSE_1_0.txt | ||
// | ||
#include <boost/gil.hpp> | ||
#include <boost/gil/extension/numeric/convolve.hpp> | ||
|
||
#include <tuple> | ||
#include <type_traits> | ||
|
||
#define BOOST_TEST_MODULE test_ext_numeric_colvolve_cols | ||
#include "unit_test.hpp" | ||
#include "test_fixture.hpp" | ||
|
||
namespace gil = boost::gil; | ||
namespace fixture = boost::gil::test::fixture; | ||
|
||
namespace { | ||
|
||
template <typename Pixel, typename SrcView, typename Kernel, typename DstView> | ||
void convolve2d(SrcView const& src_view, Kernel const& kernel, DstView const& dst_view) | ||
{ | ||
gil::convolve_rows<Pixel>(src_view, kernel, dst_view); | ||
gil::convolve_cols<Pixel>(src_view, kernel, dst_view); | ||
} | ||
|
||
} // unnamed namespace | ||
|
||
BOOST_AUTO_TEST_SUITE(convolve_2d) | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_1x1_kernel_1x1_identity, Image, fixture::image_types) | ||
{ | ||
auto const img = fixture::create_image<Image>(1, 1, 7); | ||
Image img_out(img); | ||
|
||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const kernel = fixture::create_kernel<channel_t>({1}); | ||
convolve2d<pixel_t>(const_view(img_out), kernel, view(img_out)); | ||
|
||
// 1x1 kernel reduces convolution to multiplication | ||
BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front()); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_1x1_kernel_3x3_identity, Image, fixture::image_types) | ||
{ | ||
auto const img = fixture::create_image<Image>(1, 1, 7); | ||
Image img_out(img); | ||
|
||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0}); | ||
convolve2d<pixel_t>(const_view(img_out), kernel, view(img_out)); | ||
|
||
BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front()); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_3x3_kernel_3x3_identity, Image, fixture::image_types) | ||
{ | ||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const img = fixture::generate_image<Image>(3, 3, fixture::random_value<channel_t>{}); | ||
Image img_out(img); | ||
|
||
auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0}); | ||
convolve2d<pixel_t>(const_view(img_out), kernel, view(img_out)); | ||
|
||
BOOST_TEST(gil::equal_pixels(gil::const_view(img), gil::const_view(img_out))); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_5x5_kernel_3x3_identity, Image, fixture::image_types) | ||
{ | ||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const img = fixture::generate_image<Image>(5, 5, fixture::random_value<channel_t>{}); | ||
Image img_out(img); | ||
|
||
auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0}); | ||
convolve2d<pixel_t>(const_view(img_out), kernel, view(img_out)); | ||
// TODO: Test different boundary options | ||
|
||
BOOST_TEST(gil::equal_pixels(gil::const_view(img), gil::const_view(img_out))); | ||
} | ||
|
||
BOOST_AUTO_TEST_SUITE_END() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// | ||
// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net> | ||
// | ||
// Distributed under the Boost Software License, Version 1.0 | ||
// See accompanying file LICENSE_1_0.txt or copy at | ||
// http://www.boost.org/LICENSE_1_0.txt | ||
// | ||
#include <boost/gil.hpp> | ||
#include <boost/gil/extension/numeric/convolve.hpp> | ||
|
||
#include <tuple> | ||
#include <type_traits> | ||
|
||
#define BOOST_TEST_MODULE test_ext_numeric_colvolve_cols | ||
#include "unit_test.hpp" | ||
#include "test_fixture.hpp" | ||
|
||
namespace gil = boost::gil; | ||
namespace fixture = boost::gil::test::fixture; | ||
|
||
BOOST_AUTO_TEST_SUITE(convolve_cols) | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_1x1_kernel_1x1_identity, Image, fixture::image_types) | ||
{ | ||
auto const img = fixture::create_image<Image>(1, 1, 7); | ||
auto img_out = fixture::create_image<Image>(1, 1, 0); | ||
|
||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const kernel = fixture::create_kernel<channel_t>({1}); | ||
gil::convolve_cols<pixel_t>(const_view(img), kernel, view(img_out)); | ||
|
||
// 1x1 kernel reduces convolution to multiplication | ||
BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front()); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_1x1_kernel_3x3_identity, Image, fixture::image_types) | ||
{ | ||
auto const img = fixture::create_image<Image>(1, 1, 7); | ||
auto img_out = fixture::create_image<Image>(1, 1, 0); | ||
|
||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0}); | ||
gil::convolve_cols<pixel_t>(const_view(img), kernel, view(img_out)); | ||
|
||
BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front()); | ||
} | ||
|
||
BOOST_AUTO_TEST_SUITE_END() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// | ||
// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net> | ||
// | ||
// Distributed under the Boost Software License, Version 1.0 | ||
// See accompanying file LICENSE_1_0.txt or copy at | ||
// http://www.boost.org/LICENSE_1_0.txt | ||
// | ||
#include <boost/gil.hpp> | ||
#include <boost/gil/extension/numeric/convolve.hpp> | ||
|
||
#include <tuple> | ||
#include <type_traits> | ||
|
||
#define BOOST_TEST_MODULE test_ext_numeric_colvolve_rows | ||
#include "unit_test.hpp" | ||
#include "test_fixture.hpp" | ||
|
||
namespace gil = boost::gil; | ||
namespace fixture = boost::gil::test::fixture; | ||
|
||
BOOST_AUTO_TEST_SUITE(convolve_rows) | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_1x1_kernel_1x1_identity, Image, fixture::image_types) | ||
{ | ||
auto const img = fixture::create_image<Image>(1, 1, 7); | ||
auto img_out = fixture::create_image<Image>(1, 1, 0); | ||
|
||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const kernel = fixture::create_kernel<channel_t>({1}); | ||
gil::convolve_rows<pixel_t>(const_view(img), kernel, view(img_out)); | ||
|
||
// 1x1 kernel reduces convolution to multiplication | ||
BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front()); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE_TEMPLATE(image_1x1_kernel_3x3_identity, Image, fixture::image_types) | ||
{ | ||
auto const img = fixture::create_image<Image>(1, 1, 7); | ||
auto img_out = fixture::create_image<Image>(1, 1, 0); | ||
|
||
using pixel_t = typename Image::value_type; | ||
using channel_t = typename gil::channel_type<pixel_t>::type; | ||
auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0}); | ||
gil::convolve_rows<pixel_t>(const_view(img), kernel, view(img_out)); | ||
|
||
BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front()); | ||
} | ||
|
||
BOOST_AUTO_TEST_SUITE_END() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// | ||
// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net> | ||
// | ||
// Distributed under the Boost Software License, Version 1.0 | ||
// See accompanying file LICENSE_1_0.txt or copy at | ||
// http://www.boost.org/LICENSE_1_0.txt | ||
// | ||
#include <boost/config.hpp> | ||
#include <boost/core/ignore_unused.hpp> | ||
|
||
#if defined(BOOST_CLANG) | ||
#pragma clang diagnostic push | ||
#pragma clang diagnostic ignored "-Wconversion" | ||
#pragma clang diagnostic ignored "-Wfloat-equal" | ||
#pragma clang diagnostic ignored "-Wsign-conversion" | ||
#elif BOOST_GCC >= 40700 | ||
#pragma GCC diagnostic push | ||
#pragma GCC diagnostic ignored "-Wconversion" | ||
#pragma GCC diagnostic ignored "-Wfloat-equal" | ||
#pragma GCC diagnostic ignored "-Wsign-conversion" | ||
#endif | ||
|
||
#include <boost/gil.hpp> | ||
|
||
#include <cstdint> | ||
|
||
#define BOOST_TEST_MODULE test_ext_numeric_test_fixture | ||
#include "unit_test.hpp" | ||
#include "test_fixture.hpp" | ||
|
||
namespace gil = boost::gil; | ||
namespace fixture = boost::gil::test::fixture; | ||
|
||
BOOST_AUTO_TEST_CASE(consecutive_value) | ||
{ | ||
fixture::consecutive_value<std::uint8_t> v(10); | ||
BOOST_TEST(v() = std::uint8_t{11}); | ||
BOOST_TEST(v() = std::uint8_t{12}); | ||
BOOST_TEST(v() = std::uint8_t{13}); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE(reverse_consecutive_value) | ||
{ | ||
fixture::reverse_consecutive_value<std::uint8_t> v(10); | ||
BOOST_TEST(v() = std::uint8_t{9}); | ||
BOOST_TEST(v() = std::uint8_t{8}); | ||
BOOST_TEST(v() = std::uint8_t{7}); | ||
} | ||
|
||
BOOST_AUTO_TEST_CASE(random_value) | ||
{ | ||
fixture::random_value<std::uint8_t> v; | ||
BOOST_TEST(v() != v()); | ||
BOOST_TEST(v() != v()); | ||
BOOST_TEST(v() != v()); | ||
} |
Oops, something went wrong.