From edf7616b19bd627f75608d396d11630340267a97 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Sat, 25 Apr 2015 22:08:12 +0200 Subject: [PATCH] reorganize c++ tests --- .gitignore | 4 +- Makefile | 19 ++---- SConstruct | 2 +- run_tests | 12 ---- {tests/cxx => test}/build.py | 22 ++++-- {tests/cxx => test}/catch.hpp | 0 .../standalone}/font_registration_test.cpp | 3 +- test/unit/README.md | 11 +++ .../unit/core}/conversions_test.cpp | 0 .../cxx => test/unit/core}/copy_move_test.cpp | 2 +- .../unit/core}/exceptions_test.cpp | 0 .../unit/core}/map_request_test.cpp | 63 +----------------- {tests/cxx => test/unit/core}/params_test.cpp | 0 .../unit/datasource}/datasources.cpp | 0 .../unit/font}/fontset_runtime_test.cpp | 0 .../cxx => test/unit/geometry}/geometry.cpp | 0 .../geometry}/geometry_converters_test.cpp | 0 .../unit/geometry}/geometry_envelope_test.cpp | 0 .../unit/geometry}/geometry_equal.hpp | 0 .../unit/geometry}/geometry_hit_test.cpp | 0 .../unit/geometry}/geometry_is_valid.cpp | 0 .../unit/geometry}/geometry_reprojection.cpp | 0 .../unit/geometry}/geometry_strategy_test.cpp | 0 .../unit/geometry}/label_algo_test.cpp | 0 .../unit/imaging}/image_io_test.cpp | 0 .../unit/imaging}/image_painted_test.cpp | 0 {tests/cxx => test/unit/imaging}/tiff_io.cpp | 2 +- .../unit/pixel}/agg_blend_src_over_test.cpp | 0 test/unit/run.cpp | 17 +++++ .../unit/serialization}/wkb_formats_test.cpp | 0 {tests/cxx => test/unit/sql}/sql_parse.cpp | 0 .../unit/symbolizer}/symbolizer_test.cpp | 0 {tests/cxx => test/unit}/valgrind.supp | 0 .../unit/vertex_adapter}/clipping_test.cpp | 0 .../unit/vertex_adapter}/line_offset_test.cpp | 0 .../simplify_converters_test.cpp | 0 .../unit/vertex_adapter}/vertex_adapter.cpp | 0 ...equest-marker-text-line-expected-cairo.png | Bin 31181 -> 0 bytes .../map-request-marker-text-line-expected.png | Bin 19010 -> 0 bytes tests/cxx/README.md | 11 --- tests/cxx/test_main.cpp | 2 - 41 files changed, 61 insertions(+), 109 deletions(-) delete mode 100755 run_tests rename {tests/cxx => test}/build.py (54%) rename {tests/cxx => test}/catch.hpp (100%) rename {tests/cxx => test/standalone}/font_registration_test.cpp (99%) create mode 100644 test/unit/README.md rename {tests/cxx => test/unit/core}/conversions_test.cpp (100%) rename {tests/cxx => test/unit/core}/copy_move_test.cpp (98%) rename {tests/cxx => test/unit/core}/exceptions_test.cpp (100%) rename {tests/cxx => test/unit/core}/map_request_test.cpp (54%) rename {tests/cxx => test/unit/core}/params_test.cpp (100%) rename {tests/cxx => test/unit/datasource}/datasources.cpp (100%) rename {tests/cxx => test/unit/font}/fontset_runtime_test.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_converters_test.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_envelope_test.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_equal.hpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_hit_test.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_is_valid.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_reprojection.cpp (100%) rename {tests/cxx => test/unit/geometry}/geometry_strategy_test.cpp (100%) rename {tests/cxx => test/unit/geometry}/label_algo_test.cpp (100%) rename {tests/cxx => test/unit/imaging}/image_io_test.cpp (100%) rename {tests/cxx => test/unit/imaging}/image_painted_test.cpp (100%) rename {tests/cxx => test/unit/imaging}/tiff_io.cpp (99%) rename {tests/cxx => test/unit/pixel}/agg_blend_src_over_test.cpp (100%) create mode 100644 test/unit/run.cpp rename {tests/cxx => test/unit/serialization}/wkb_formats_test.cpp (100%) rename {tests/cxx => test/unit/sql}/sql_parse.cpp (100%) rename {tests/cxx => test/unit/symbolizer}/symbolizer_test.cpp (100%) rename {tests/cxx => test/unit}/valgrind.supp (100%) rename {tests/cxx => test/unit/vertex_adapter}/clipping_test.cpp (100%) rename {tests/cxx => test/unit/vertex_adapter}/line_offset_test.cpp (100%) rename {tests/cxx => test/unit/vertex_adapter}/simplify_converters_test.cpp (100%) rename {tests/cxx => test/unit/vertex_adapter}/vertex_adapter.cpp (100%) delete mode 100644 tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png delete mode 100644 tests/cpp_tests/support/map-request-marker-text-line-expected.png delete mode 100644 tests/cxx/README.md delete mode 100644 tests/cxx/test_main.cpp diff --git a/.gitignore b/.gitignore index 9c51d709c..e2c080ff1 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ demo/viewer/release/ demo/viewer/ui_about.h demo/viewer/ui_info.h demo/viewer/ui_layer_info.h -tests/cpp_tests/*-bin -tests/cxx/run +test/standalone/*-bin +test/unit/run diff --git a/Makefile b/Makefile index 326616d7a..c94020792 100755 --- a/Makefile +++ b/Makefile @@ -59,18 +59,12 @@ uninstall: @$(PYTHON) scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1 uninstall test: - ./run_tests + @source localize.sh && ./test/unit/run && \ + for FILE in test/standalone/*-bin; do \ + $${FILE}; \ + done; -test-local: - make test - -test-cpp: - ./tests/cpp_tests/run - -test-cxx: - ./tests/cxx/run - -check: test-local +check: test bench: ./benchmark/run @@ -86,9 +80,10 @@ pep8: @pep8 -r --select=W391 -q --filename=*.py `pwd`/tests/ | xargs ged -i '/./,/^$$/!d' grind: - @for FILE in tests/cpp_tests/*-bin; do \ + @for FILE in test/standalone/*-bin; do \ valgrind --leak-check=full --log-fd=1 $${FILE} | grep definitely; \ done + valgrind --leak-check=full --log-fd=1 ./test/unit/run | grep definitely render: @for FILE in tests/data/good_maps/*xml; do \ diff --git a/SConstruct b/SConstruct index 7ae42e5c2..e54fce9c1 100644 --- a/SConstruct +++ b/SConstruct @@ -1950,7 +1950,7 @@ if not HELP_REQUESTED: SConscript('fonts/build.py') # build C++ tests - SConscript('tests/cxx/build.py') + SConscript('test/build.py') if env['BENCHMARK']: SConscript('benchmark/build.py') diff --git a/run_tests b/run_tests deleted file mode 100755 index 51d9ccf36..000000000 --- a/run_tests +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -failures=0 - -source ./localize.sh - -echo "*** Running C++ tests..." -./tests/cxx/run -failures=$((failures+$?)) -echo - -exit $failures diff --git a/tests/cxx/build.py b/test/build.py similarity index 54% rename from tests/cxx/build.py rename to test/build.py index 6626f03c4..ec6dce5b3 100644 --- a/tests/cxx/build.py +++ b/test/build.py @@ -7,7 +7,7 @@ Import ('env') test_env = env.Clone() if not env['CPP_TESTS']: - for cpp_test_bin in glob.glob('*-bin'): + for cpp_test_bin in glob.glob('./*/*-bin'): os.unlink(cpp_test_bin) else: test_env['LIBS'] = [env['MAPNIK_NAME']] @@ -22,11 +22,23 @@ else: if test_env['HAS_CAIRO']: test_env.PrependUnique(CPPPATH=test_env['CAIRO_CPPPATHS']) test_env.Append(CPPDEFINES = '-DHAVE_CAIRO') + test_env.PrependUnique(CPPPATH=['./']) test_env_local = test_env.Clone() - test_program = test_env_local.Program("run", source=glob.glob('*.cpp')) - Depends(test_program, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME'])) - Depends(test_program, env.subst('../../src/json/libmapnik-json${LIBSUFFIX}')) - Depends(test_program, env.subst('../../src/wkt/libmapnik-wkt${LIBSUFFIX}')) + + + # unit tests + sources = glob.glob('./unit/*/*.cpp') + sources.extend(glob.glob('./unit/*.cpp')) + test_program = test_env_local.Program("./unit/run", source=sources) + Depends(test_program, env.subst('../src/%s' % env['MAPNIK_LIB_NAME'])) + Depends(test_program, env.subst('../src/json/libmapnik-json${LIBSUFFIX}')) + Depends(test_program, env.subst('../src/wkt/libmapnik-wkt${LIBSUFFIX}')) + + # standalone tests + for standalone in glob.glob('./standalone/*cpp'): + test_program = test_env_local.Program(standalone.replace('.cpp','-bin'), source=standalone) + Depends(test_program, env.subst('../src/%s' % env['MAPNIK_LIB_NAME'])) + # build locally if installing if 'install' in COMMAND_LINE_TARGETS: env.Alias('install',test_program) diff --git a/tests/cxx/catch.hpp b/test/catch.hpp similarity index 100% rename from tests/cxx/catch.hpp rename to test/catch.hpp diff --git a/tests/cxx/font_registration_test.cpp b/test/standalone/font_registration_test.cpp similarity index 99% rename from tests/cxx/font_registration_test.cpp rename to test/standalone/font_registration_test.cpp index d39837f77..a876c6a17 100644 --- a/tests/cxx/font_registration_test.cpp +++ b/test/standalone/font_registration_test.cpp @@ -1,3 +1,4 @@ +#define CATCH_CONFIG_MAIN #include "catch.hpp" #include @@ -18,8 +19,6 @@ SECTION("registration") { mapnik::logger logger; mapnik::logger::severity_type original_severity = logger.get_severity(); - - // grab references to global statics of registered/cached fonts auto const& global_mapping = mapnik::freetype_engine::get_mapping(); auto const& global_cache = mapnik::freetype_engine::get_cache(); diff --git a/test/unit/README.md b/test/unit/README.md new file mode 100644 index 000000000..d446edec0 --- /dev/null +++ b/test/unit/README.md @@ -0,0 +1,11 @@ + +## C++ unit tests + +### Building + + python scons/scons.py test/unit/run + + +### Running + + ./test/unit/run \ No newline at end of file diff --git a/tests/cxx/conversions_test.cpp b/test/unit/core/conversions_test.cpp similarity index 100% rename from tests/cxx/conversions_test.cpp rename to test/unit/core/conversions_test.cpp diff --git a/tests/cxx/copy_move_test.cpp b/test/unit/core/copy_move_test.cpp similarity index 98% rename from tests/cxx/copy_move_test.cpp rename to test/unit/core/copy_move_test.cpp index 38d23d2eb..3b38ae76c 100644 --- a/tests/cxx/copy_move_test.cpp +++ b/test/unit/core/copy_move_test.cpp @@ -28,7 +28,7 @@ SECTION("layers") { auto ds1 = ds0; // shared ptr copy REQUIRE( (ds1 == ds0) ); - REQUIRE( (*ds1 != *ds0) ); + REQUIRE( !(*ds1 != *ds0) ); REQUIRE( (ds1.get() == ds0.get()) ); ds1 = mapnik::datasource_cache::instance().create(p); // new with the same parameters REQUIRE( (ds1 != ds0) ); diff --git a/tests/cxx/exceptions_test.cpp b/test/unit/core/exceptions_test.cpp similarity index 100% rename from tests/cxx/exceptions_test.cpp rename to test/unit/core/exceptions_test.cpp diff --git a/tests/cxx/map_request_test.cpp b/test/unit/core/map_request_test.cpp similarity index 54% rename from tests/cxx/map_request_test.cpp rename to test/unit/core/map_request_test.cpp index 59b6033ac..202514d77 100644 --- a/tests/cxx/map_request_test.cpp +++ b/test/unit/core/map_request_test.cpp @@ -20,49 +20,10 @@ #include #include -bool compare_images(std::string const& src_fn,std::string const& dest_fn) -{ - using namespace mapnik; - std::unique_ptr reader1(mapnik::get_image_reader(dest_fn,"png")); - if (!reader1.get()) - { - throw mapnik::image_reader_exception("Failed to load: " + dest_fn); - } - std::shared_ptr image_ptr1 = std::make_shared(reader1->width(),reader1->height()); - reader1->read(0,0,*image_ptr1); - - std::unique_ptr reader2(mapnik::get_image_reader(src_fn,"png")); - if (!reader2.get()) - { - throw mapnik::image_reader_exception("Failed to load: " + src_fn); - } - std::shared_ptr image_ptr2 = std::make_shared(reader2->width(),reader2->height()); - reader2->read(0,0,*image_ptr2); - - image_rgba8 const& dest = *image_ptr1; - image_rgba8 const& src = *image_ptr2; - - unsigned int width = src.width(); - unsigned int height = src.height(); - if ((width != dest.width()) || height != dest.height()) return false; - for (unsigned int y = 0; y < height; ++y) - { - const unsigned int* row_from = src.getRow(y); - const unsigned int* row_to = dest.getRow(y); - for (unsigned int x = 0; x < width; ++x) - { - if (row_from[x] != row_to[x]) return false; - } - } - return true; -} - TEST_CASE("mapnik::request") { SECTION("rendering") { - std::string expected("./tests/cpp_tests/support/map-request-marker-text-line-expected.png"); - std::string expected_cairo("./tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png"); try { mapnik::datasource_cache::instance().register_datasources("plugins/input/csv.input"); @@ -76,12 +37,6 @@ SECTION("rendering") { // render normally with apply() and just map and image mapnik::agg_renderer renderer1(m,im,scale_factor); renderer1.apply(); - std::string actual1("/tmp/map-request-marker-text-line-actual1.png"); - //mapnik::save_to_file(im,expected); - mapnik::save_to_file(im,actual1); - // TODO - re-enable if we can control the freetype/cairo versions used - // https://github.com/mapnik/mapnik/issues/1868 - //REQUIRE(compare_images(actual1,expected)); // reset image mapnik::fill(im, 0); @@ -94,11 +49,6 @@ SECTION("rendering") { mapnik::attributes vars; mapnik::agg_renderer renderer2(m,req,vars,im,scale_factor); renderer2.apply(); - std::string actual2("/tmp/map-request-marker-text-line-actual2.png"); - mapnik::save_to_file(im,actual2); - // TODO - re-enable if we can control the freetype/cairo versions used - // https://github.com/mapnik/mapnik/issues/1868 - //REQUIRE(compare_images(actual2,expected)); // reset image mapnik::fill(im, 0); @@ -128,11 +78,6 @@ SECTION("rendering") { } } renderer3.end_map_processing(m); - std::string actual3("/tmp/map-request-marker-text-line-actual3.png"); - mapnik::save_to_file(im,actual3); - // TODO - re-enable if we can control the freetype/cairo versions used - // https://github.com/mapnik/mapnik/issues/1868 - //REQUIRE(compare_images(actual3,expected)); // also test cairo #if defined(HAVE_CAIRO) @@ -143,11 +88,9 @@ SECTION("rendering") { mapnik::cairo_renderer png_render(m,req,vars,image_context,scale_factor); png_render.apply(); //cairo_surface_write_to_png(&*image_surface, expected_cairo.c_str()); - std::string actual_cairo("/tmp/map-request-marker-text-line-actual4.png"); - cairo_surface_write_to_png(&*image_surface, actual_cairo.c_str()); - // TODO - re-enable if we can control the freetype/cairo versions used - // https://github.com/mapnik/mapnik/issues/1868 - //REQUIRE(compare_images(actual_cairo,expected_cairo)); + //std::string actual_cairo("/tmp/map-request-marker-text-line-actual4.png"); + //cairo_surface_write_to_png(&*image_surface, actual_cairo.c_str()); + // TODO - non visual way to test #endif // TODO - test grid_renderer diff --git a/tests/cxx/params_test.cpp b/test/unit/core/params_test.cpp similarity index 100% rename from tests/cxx/params_test.cpp rename to test/unit/core/params_test.cpp diff --git a/tests/cxx/datasources.cpp b/test/unit/datasource/datasources.cpp similarity index 100% rename from tests/cxx/datasources.cpp rename to test/unit/datasource/datasources.cpp diff --git a/tests/cxx/fontset_runtime_test.cpp b/test/unit/font/fontset_runtime_test.cpp similarity index 100% rename from tests/cxx/fontset_runtime_test.cpp rename to test/unit/font/fontset_runtime_test.cpp diff --git a/tests/cxx/geometry.cpp b/test/unit/geometry/geometry.cpp similarity index 100% rename from tests/cxx/geometry.cpp rename to test/unit/geometry/geometry.cpp diff --git a/tests/cxx/geometry_converters_test.cpp b/test/unit/geometry/geometry_converters_test.cpp similarity index 100% rename from tests/cxx/geometry_converters_test.cpp rename to test/unit/geometry/geometry_converters_test.cpp diff --git a/tests/cxx/geometry_envelope_test.cpp b/test/unit/geometry/geometry_envelope_test.cpp similarity index 100% rename from tests/cxx/geometry_envelope_test.cpp rename to test/unit/geometry/geometry_envelope_test.cpp diff --git a/tests/cxx/geometry_equal.hpp b/test/unit/geometry/geometry_equal.hpp similarity index 100% rename from tests/cxx/geometry_equal.hpp rename to test/unit/geometry/geometry_equal.hpp diff --git a/tests/cxx/geometry_hit_test.cpp b/test/unit/geometry/geometry_hit_test.cpp similarity index 100% rename from tests/cxx/geometry_hit_test.cpp rename to test/unit/geometry/geometry_hit_test.cpp diff --git a/tests/cxx/geometry_is_valid.cpp b/test/unit/geometry/geometry_is_valid.cpp similarity index 100% rename from tests/cxx/geometry_is_valid.cpp rename to test/unit/geometry/geometry_is_valid.cpp diff --git a/tests/cxx/geometry_reprojection.cpp b/test/unit/geometry/geometry_reprojection.cpp similarity index 100% rename from tests/cxx/geometry_reprojection.cpp rename to test/unit/geometry/geometry_reprojection.cpp diff --git a/tests/cxx/geometry_strategy_test.cpp b/test/unit/geometry/geometry_strategy_test.cpp similarity index 100% rename from tests/cxx/geometry_strategy_test.cpp rename to test/unit/geometry/geometry_strategy_test.cpp diff --git a/tests/cxx/label_algo_test.cpp b/test/unit/geometry/label_algo_test.cpp similarity index 100% rename from tests/cxx/label_algo_test.cpp rename to test/unit/geometry/label_algo_test.cpp diff --git a/tests/cxx/image_io_test.cpp b/test/unit/imaging/image_io_test.cpp similarity index 100% rename from tests/cxx/image_io_test.cpp rename to test/unit/imaging/image_io_test.cpp diff --git a/tests/cxx/image_painted_test.cpp b/test/unit/imaging/image_painted_test.cpp similarity index 100% rename from tests/cxx/image_painted_test.cpp rename to test/unit/imaging/image_painted_test.cpp diff --git a/tests/cxx/tiff_io.cpp b/test/unit/imaging/tiff_io.cpp similarity index 99% rename from tests/cxx/tiff_io.cpp rename to test/unit/imaging/tiff_io.cpp index 7f7d798d1..46cf4245f 100644 --- a/tests/cxx/tiff_io.cpp +++ b/test/unit/imaging/tiff_io.cpp @@ -8,7 +8,7 @@ #include #include -#include "../../src/tiff_reader.cpp" +#include "../../../src/tiff_reader.cpp" #define TIFF_ASSERT(filename) \ mapnik::tiff_reader tiff_reader(filename); \ diff --git a/tests/cxx/agg_blend_src_over_test.cpp b/test/unit/pixel/agg_blend_src_over_test.cpp similarity index 100% rename from tests/cxx/agg_blend_src_over_test.cpp rename to test/unit/pixel/agg_blend_src_over_test.cpp diff --git a/test/unit/run.cpp b/test/unit/run.cpp new file mode 100644 index 000000000..613c3adb2 --- /dev/null +++ b/test/unit/run.cpp @@ -0,0 +1,17 @@ +#define CATCH_CONFIG_RUNNER +#include "catch.hpp" + +#include // for xmlInitParser(), xmlCleanupParser() + +int main (int argc, char* const argv[]) +{ + int result = Catch::Session().run( argc, argv ); + if (!result) printf("\x1b[1;32m ✓ \x1b[0m\n"); + + // only call this once, on exit + // to make sure valgrind output is clean + // http://xmlsoft.org/xmlmem.html + xmlCleanupParser(); + + return result; +} diff --git a/tests/cxx/wkb_formats_test.cpp b/test/unit/serialization/wkb_formats_test.cpp similarity index 100% rename from tests/cxx/wkb_formats_test.cpp rename to test/unit/serialization/wkb_formats_test.cpp diff --git a/tests/cxx/sql_parse.cpp b/test/unit/sql/sql_parse.cpp similarity index 100% rename from tests/cxx/sql_parse.cpp rename to test/unit/sql/sql_parse.cpp diff --git a/tests/cxx/symbolizer_test.cpp b/test/unit/symbolizer/symbolizer_test.cpp similarity index 100% rename from tests/cxx/symbolizer_test.cpp rename to test/unit/symbolizer/symbolizer_test.cpp diff --git a/tests/cxx/valgrind.supp b/test/unit/valgrind.supp similarity index 100% rename from tests/cxx/valgrind.supp rename to test/unit/valgrind.supp diff --git a/tests/cxx/clipping_test.cpp b/test/unit/vertex_adapter/clipping_test.cpp similarity index 100% rename from tests/cxx/clipping_test.cpp rename to test/unit/vertex_adapter/clipping_test.cpp diff --git a/tests/cxx/line_offset_test.cpp b/test/unit/vertex_adapter/line_offset_test.cpp similarity index 100% rename from tests/cxx/line_offset_test.cpp rename to test/unit/vertex_adapter/line_offset_test.cpp diff --git a/tests/cxx/simplify_converters_test.cpp b/test/unit/vertex_adapter/simplify_converters_test.cpp similarity index 100% rename from tests/cxx/simplify_converters_test.cpp rename to test/unit/vertex_adapter/simplify_converters_test.cpp diff --git a/tests/cxx/vertex_adapter.cpp b/test/unit/vertex_adapter/vertex_adapter.cpp similarity index 100% rename from tests/cxx/vertex_adapter.cpp rename to test/unit/vertex_adapter/vertex_adapter.cpp diff --git a/tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png b/tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png deleted file mode 100644 index cb8e478268919e8874720ce402b822f813634d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31181 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 diff --git a/tests/cxx/README.md b/tests/cxx/README.md deleted file mode 100644 index 273cade25..000000000 --- a/tests/cxx/README.md +++ /dev/null @@ -1,11 +0,0 @@ - -Catch C++ tests - -### Building - - python scons/scons.py tests/cxx/run - - -### Running - - ./tests/cxx/run \ No newline at end of file diff --git a/tests/cxx/test_main.cpp b/tests/cxx/test_main.cpp deleted file mode 100644 index 0c7c351f4..000000000 --- a/tests/cxx/test_main.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#define CATCH_CONFIG_MAIN -#include "catch.hpp"