Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

13 refactor logging #33

Merged
merged 4 commits into from
Oct 30, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ endif()
# executable setup
add_executable( one_bit main.cpp script_mode.h script_mode.cpp ${RESOURCES})

target_include_directories( one_bit PUBLIC ${OpenCV_INCLUDE_DIRS} ${DOCTEST_INCLUDE_DIR})
target_include_directories( one_bit PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries( one_bit PUBLIC imaging utilities ${OpenCV_LIBS} )
if( ${USE_QT5} )
target_include_directories( one_bit PUBLIC ${Qt5_DIR} )
target_link_libraries( one_bit PUBLIC qtgui Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Network )
endif()

enable_testing()
if("${DOCTEST_INCLUDE_DIR}")
enable_testing()
endif()

22 changes: 12 additions & 10 deletions imaging/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
find_package( OpenCV REQUIRED )

add_library( pixelator
Pixelator.cpp
Pixelator.h
Expand All @@ -11,16 +12,17 @@ add_library( imaging
ShrinkPixelator.cpp
ShrinkPixelator.h
)
target_include_directories( imaging PUBLIC ${OpenCV_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/utilities "${DOCTEST_INCLUDE_DIR}" )
target_include_directories( imaging PUBLIC ${OpenCV_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/utilities )
target_link_libraries( imaging PUBLIC ${OpenCV_LIBS} pixelator)
target_compile_definitions(imaging PRIVATE -DDOCTEST_CONFIG_DISABLE)

add_executable( pixelator_test Pixelator.cpp )
target_include_directories( pixelator_test PUBLIC ${OpenCV_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/utilities "${DOCTEST_INCLUDE_DIR}" )
target_link_libraries( pixelator_test PUBLIC ${OpenCV_LIBS} )
target_compile_definitions( pixelator_test PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN )
if(${BUILD_TESTING})
add_executable( test_pixelator Pixelator.cpp )
target_include_directories( test_pixelator PUBLIC ${OpenCV_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/utilities "${DOCTEST_INCLUDE_DIR}" )
target_link_libraries( test_pixelator PUBLIC ${OpenCV_LIBS} )
target_compile_definitions( test_pixelator PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN )

add_executable( shrink_pixelator_test ShrinkPixelator.cpp )
target_include_directories( shrink_pixelator_test PUBLIC ${OpenCV_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/utilities "${DOCTEST_INCLUDE_DIR}" )
target_link_libraries( shrink_pixelator_test PUBLIC ${OpenCV_LIBS} pixelator)
target_compile_definitions( shrink_pixelator_test PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN -DIGNORE_BASE_CLASS_TESTS)
add_executable( test_shrink_pixelator ShrinkPixelator.cpp )
target_include_directories( test_shrink_pixelator PUBLIC ${OpenCV_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/utilities "${DOCTEST_INCLUDE_DIR}" )
target_link_libraries( test_shrink_pixelator PUBLIC ${OpenCV_LIBS} pixelator utilities )
target_compile_definitions( test_shrink_pixelator PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN -DIGNORE_BASE_CLASS_TESTS)
endif()
4 changes: 2 additions & 2 deletions imaging/Pixelator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace imaging
}
bool Pixelator::prepare()
{
add_color(PixelValue(255, 255, 255));
add_color(PixelValue(0, 0, 255));
add_color(PixelValue());
return true;
}
Expand Down Expand Up @@ -120,7 +120,7 @@ namespace
return std::sqrt(std::pow(p1.rc - p2.rc, 2) + std::pow(p1.pl - p2.pl, 2) + std::pow(p1.v - p2.v, 2));
}
}
#ifndef IGNORE_BASE_CLASS_TESTS
#if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && (! defined(IGNORE_BASE_CLASS_TESTS))
#include <doctest.h>

class ColorTestPixelator : public imaging::Pixelator
Expand Down
201 changes: 18 additions & 183 deletions imaging/ShrinkPixelator.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
#include "ShrinkPixelator.h"
#include "calculus.h"
#include <optional>

namespace
{
unsigned least_common_multiple(unsigned a, unsigned b);
}
#include <set>

namespace imaging
{
Expand All @@ -17,7 +14,7 @@ namespace imaging
int rows_backup = pictureBuffer.rows;
int columns_backup = pictureBuffer.cols;
double aspect_ratio_old = (rows_backup * 1.) / columns_backup;
unsigned stixelLcm{ least_common_multiple(gauge_rows, gauge_stitches) };
unsigned stixelLcm{ calculus::least_common_multiple(gauge_rows, gauge_stitches) };
unsigned stitchWidth = stixelLcm / gauge_stitches;
unsigned stitchHeight = stixelLcm / gauge_rows;
unsigned stitchCount = (unsigned)(ceil((in_width / 10.) * gauge_stitches));
Expand Down Expand Up @@ -87,183 +84,21 @@ namespace imaging
}
}

namespace
{
std::optional<unsigned> divides(unsigned number, unsigned divisor)
{
unsigned result = number / divisor;
if (result * divisor == number) return result;
return std::optional<unsigned>{};
}

std::vector<unsigned> divisors(unsigned x)
{
std::vector<unsigned> divisors;
for (unsigned factor = 1; factor < sqrt(x); ++factor)
{
auto result = divides(x, factor);
if (result.has_value())
{
divisors.push_back(factor);
divisors.push_back(result.value());
}
}
return divisors;
}

unsigned search_greatest_common_divisor(unsigned smallerValue, unsigned largerValue)
{
auto divisors_smaller = divisors(smallerValue);
auto divisors_larger = divisors(largerValue);
std::sort(divisors_smaller.begin(), divisors_smaller.end(), [](unsigned one, unsigned other) { return other < one; });
std::sort(divisors_larger.begin(), divisors_larger.end());
for (auto divisor : divisors_smaller)
{
if (std::find(divisors_larger.begin(), divisors_larger.end(), divisor) != divisors_larger.end()) return divisor;
}
return 1;
}

unsigned greatest_common_divisor(unsigned a, unsigned b)
{
if (a == b) return a;
if (a < b)
{
if (divides(b, a).has_value()) return a;
return search_greatest_common_divisor(a, b);
}
else
{
if (divides(a, b).has_value()) return b;
return search_greatest_common_divisor(b, a);
}
}

unsigned least_common_multiple(unsigned a, unsigned b)
{
unsigned gcd = greatest_common_divisor(a, b);
return a * b / gcd; //gcd * (a / gcd) * (b / gcd);
}
}

#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include <doctest.h>

TEST_CASE("test divides") {
auto result = divides(25, 3);
CHECK(!result.has_value());

result = divides(24, 3);
CHECK(result.has_value());
CHECK_EQ(result.value(), 8);

result = divides(3, 3);
CHECK(result.has_value());
CHECK_EQ(result.value(), 1);

result = divides(16, 4);
CHECK(result.has_value());
CHECK_EQ(result.value(), 4);

result = divides(0, 2);
CHECK(result.has_value());
CHECK_EQ(result.value(), 0);

result = divides(5, 0);
CHECK(result.has_value());
CHECK_EQ(result.value(), 0);

result = divides(0, 0);
CHECK(result.has_value());
CHECK_EQ(result.value(), 0);

result = divides(1953125, 16777216);
CHECK(!result.has_value());
}

TEST_CASE("test divisors") {
std::vector<unsigned> result;

result = divisors(5);
CHECK_EQ(result.size(), 2);
CHECK_NE(std::find(result.begin(), result.end(), 1), result.end());
CHECK_NE(std::find(result.begin(), result.end(),5), result.end());

result = divisors(16);
CHECK_EQ(result.size(), 5);
CHECK_NE(std::find(result.begin(), result.end(),1), result.end());
CHECK_NE(std::find(result.begin(), result.end(),2), result.end());
CHECK_NE(std::find(result.begin(), result.end(),4), result.end());
CHECK_NE(std::find(result.begin(), result.end(),8), result.end());
CHECK_NE(std::find(result.begin(), result.end(),16), result.end());

result = divisors(24);
CHECK_EQ(result.size(), 8);
CHECK_NE(std::find(result.begin(), result.end(),1), result.end());
CHECK_NE(std::find(result.begin(), result.end(),2), result.end());
CHECK_NE(std::find(result.begin(), result.end(),3), result.end());
CHECK_NE(std::find(result.begin(), result.end(),4), result.end());
CHECK_NE(std::find(result.begin(), result.end(),6), result.end());
CHECK_NE(std::find(result.begin(), result.end(),8), result.end());
CHECK_NE(std::find(result.begin(), result.end(),12), result.end());
CHECK_NE(std::find(result.begin(), result.end(),24), result.end());

result = divisors(36);
CHECK_EQ(result.size(), 9);
CHECK_NE(std::find(result.begin(), result.end(),1), result.end());
CHECK_NE(std::find(result.begin(), result.end(),2), result.end());
CHECK_NE(std::find(result.begin(), result.end(),3), result.end());
CHECK_NE(std::find(result.begin(), result.end(),4), result.end());
CHECK_NE(std::find(result.begin(), result.end(),6), result.end());
CHECK_NE(std::find(result.begin(), result.end(),9), result.end());
CHECK_NE(std::find(result.begin(), result.end(),12), result.end());
CHECK_NE(std::find(result.begin(), result.end(),18), result.end());
CHECK_NE(std::find(result.begin(), result.end(),36), result.end());

result = divisors(8192); // 2^13
CHECK_EQ(result.size(), 14);
unsigned factorInlist = 1;
for (auto i = 0; i < 14; ++i)
{
CHECK_NE(std::find(result.begin(), result.end(),factorInlist), result.end());
factorInlist *= 2;
}

result = divisors(262144); // 2^18
CHECK_EQ(result.size(), 19);
factorInlist = 1;
for (auto i = 0; i < 19; ++i)
{
CHECK_NE(std::find(result.begin(), result.end(),factorInlist), result.end());
factorInlist *= 2;
}
}

TEST_CASE("test search_greatest_common_divisor") {
CHECK_EQ(search_greatest_common_divisor(5, 3), 1);
CHECK_EQ(search_greatest_common_divisor(59049, 262144), 1);
CHECK_EQ(search_greatest_common_divisor(1024, 262144), 1024);
CHECK_EQ(search_greatest_common_divisor(24, 36), 12);
CHECK_EQ(search_greatest_common_divisor(0, 36), 0);
}

TEST_CASE("test greatest_common_divisor") {
CHECK_EQ(greatest_common_divisor(5, 3), 1);
CHECK_EQ(greatest_common_divisor(262144, 59049), 1);
CHECK_EQ(greatest_common_divisor(262144, 1024), 1024);
CHECK_EQ(greatest_common_divisor(1024, 262144), 1024);
CHECK_EQ(greatest_common_divisor(36, 24), 12);
CHECK_EQ(greatest_common_divisor(36, 0), 0);
class TestShrinkPixelator : public imaging::ShrinkPixelator
{
public:
TestShrinkPixelator() : ShrinkPixelator("") { pictureBuffer = ImgData(200, 200, CV_8UC3, cv::Scalar{ 60, 0, 255, 0 }); }
auto pictureColumns() const { return pictureBuffer.cols; }
auto pictureRows() const { return pictureBuffer.rows; }
};

TEST_CASE("test pixelation") {
TestShrinkPixelator pixor;
pixor.prepare();
CHECK(pixor.to_pixels(8, 8, 20, 18, one_bit::CropRegion::CENTER));
MESSAGE("This is a stub. The class must be rewritten in order to be unit testable properly.");
}

TEST_CASE("test pair-based least_common_multiple") {
CHECK_EQ(least_common_multiple(16, 8), 16);
CHECK_EQ(least_common_multiple(8, 16), 16);
CHECK_EQ(least_common_multiple(16, 18), 144);
CHECK_EQ(least_common_multiple(1, 15), 15);
CHECK_EQ(least_common_multiple(36, 24), 72);
CHECK_EQ(least_common_multiple(243, 1024), 243 * 1024); // power of 3 and power of 2 don't share factors

CHECK_EQ(least_common_multiple(0, 18), 0);
CHECK_EQ(least_common_multiple(18, 0), 0);
CHECK_EQ(least_common_multiple(0, 0), 0);
}
#endif
30 changes: 15 additions & 15 deletions qtgui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,23 @@ add_library( qtgui
SourceImage.h
SourceImage.cpp
)
target_include_directories( qtgui PRIVATE ${Qt5_DIR} ${DOCTEST_INCLUDE_DIR})

target_include_directories( qtgui PRIVATE ${Qt5_DIR})
target_link_libraries( qtgui PUBLIC Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Network )
target_include_directories( qtgui PUBLIC ${CMAKE_SOURCE_DIR}/utilities )
target_link_libraries( qtgui PUBLIC utilities )
target_compile_definitions( qtgui PRIVATE -DDOCTEST_CONFIG_DISABLE )
qtquick_compiler_add_resources( RESOURCES resources/one-bit-resources.qrc )

add_executable( qtpixelator_test QtPixelator.cpp )
target_include_directories( qtpixelator_test PRIVATE ${Qt5_DIR} ${DOCTEST_INCLUDE_DIR} )
target_link_libraries( qtpixelator_test PUBLIC Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Network )
target_include_directories( qtpixelator_test PUBLIC ${CMAKE_SOURCE_DIR}/utilities )
target_link_libraries( qtpixelator_test PUBLIC utilities )
target_compile_definitions( qtpixelator_test PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN )

add_executable( source_image_test SourceImage.cpp )
target_include_directories( source_image_test PRIVATE ${Qt5_DIR} ${DOCTEST_INCLUDE_DIR} )
target_link_libraries( source_image_test PUBLIC Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Network )
target_include_directories( source_image_test PUBLIC ${CMAKE_SOURCE_DIR}/utilities )
target_link_libraries( source_image_test PUBLIC utilities )
target_compile_definitions( source_image_test PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN )
if(${BUILD_TESTING})
add_executable( test_qtpixelator QtPixelator.cpp )
target_include_directories( test_qtpixelator PRIVATE ${Qt5_DIR} "${DOCTEST_INCLUDE_DIR}" )
target_include_directories( test_qtpixelator PUBLIC ${CMAKE_SOURCE_DIR}/utilities )
target_link_libraries( test_qtpixelator PUBLIC Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Network utilities )
target_compile_definitions( test_qtpixelator PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN )
add_executable( test_source_image SourceImage.cpp )
target_include_directories( test_source_image PRIVATE ${Qt5_DIR} "${DOCTEST_INCLUDE_DIR}" )
target_include_directories( test_source_image PUBLIC ${CMAKE_SOURCE_DIR}/utilities )
target_link_libraries( test_source_image PUBLIC Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Network utilities )
target_compile_definitions( test_source_image PRIVATE -DDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN )
endif()
Loading