diff options
-rw-r--r-- | tests/CMakeLists.txt | 24 | ||||
-rw-r--r-- | tests/opencsgtest.cc | 246 | ||||
-rwxr-xr-x | tests/test_cmdline_tool.py | 57 |
3 files changed, 79 insertions, 248 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ed492be..dca608d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -143,7 +143,7 @@ else() endif() # -# Yangli Hector Yee's comparison aglorithm +# Yangli Hector Yee's PerceptualDiff code # add_executable(yee_compare yee_compare.cpp lodepng.cpp) @@ -199,7 +199,7 @@ target_link_libraries(cgalpngtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${ # opencsgtest # -add_executable(opencsgtest opencsgtest.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} +add_executable(opencsgtest opencsgtest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} ../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc ../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc @@ -209,6 +209,20 @@ set_target_properties(opencsgtest PROPERTIES COMPILE_FLAGS "-DENABLE_OPENCSG -DE target_link_libraries(opencsgtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${QT_LIBRARIES} ${OPENCSG_LIBRARY} ${GLEW_LIBRARY} ${COCOA_LIBRARY} ${OPENGL_LIBRARY}) # +# throwntogethertest +# + +add_executable(throwntogethertest throwntogethertest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} + ../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc + ../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc + ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc + ../src/CGAL_Nef_polyhedron_DxfData.cc ../src/cgaladv_minkowski2.cc ../src/cgaladv_convexhull2.cc + ${COMMON_SOURCES}) +set_target_properties(throwntogethertest PROPERTIES COMPILE_FLAGS "-DENABLE_OPENCSG -DENABLE_CGAL ${CGAL_CXX_FLAGS_INIT}") +target_link_libraries(throwntogethertest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${QT_LIBRARIES} ${OPENCSG_LIBRARY} ${GLEW_LIBRARY} ${COCOA_LIBRARY} ${OPENGL_LIBRARY}) + + +# # This functions adds cmd-line tests given files. # Files are sent as the parameters following TESTSUFFIX # @@ -279,5 +293,9 @@ add_cmdline_test(cgalpngtest png ${CGALPNGTEST_FILES}) LIST(APPEND OPENCSGTEST_FILES ${CGALPNGTEST_FILES}) add_cmdline_test(opencsgtest png ${OPENCSGTEST_FILES}) +# Add throwntogether tests to CTest +LIST(APPEND THROWNTOGETHERTEST_FILES ${CGALPNGTEST_FILES}) +add_cmdline_test(throwntogethertest png ${THROWNTOGETHERTEST_FILES}) + # Add dxfexport tests to CTest -#add_cmdline_test(${CMAKE_SOURCE_DIR}/../test-code/exportdxf dxf ${SCAD_FILES}) +add_cmdline_test(${CMAKE_SOURCE_DIR}/../test-code/exportdxf dxf ${SCAD_FILES}) diff --git a/tests/opencsgtest.cc b/tests/opencsgtest.cc index 4043d4b..2d1f5ac 100644 --- a/tests/opencsgtest.cc +++ b/tests/opencsgtest.cc @@ -1,249 +1,7 @@ -///#include <GL/glew.h> -#include "openscad.h" -#include "handle_dep.h" -#include "builtin.h" -#include "context.h" -#include "node.h" -#include "module.h" -#include "polyset.h" -#include "Tree.h" -#include "CSGTermEvaluator.h" -#include "CGALEvaluator.h" -#include "PolySetCGALEvaluator.h" - -#include "OpenCSGRenderer.h" -#include "ThrownTogetherRenderer.h" - -#include "csgterm.h" -#include "OffscreenView.h" - -#include <QApplication> -#include <QFile> -#include <QDir> -#include <QSet> -#include <QTimer> -#include <sstream> - -using std::cerr; -using std::cout; - -std::string commandline_commands; -QString librarydir; - -//#define DEBUG - -class CsgInfo -{ -public: - CsgInfo(); - CSGTerm *root_norm_term; // Normalized CSG products - class CSGChain *root_chain; - std::vector<CSGTerm*> highlight_terms; - CSGChain *highlights_chain; - std::vector<CSGTerm*> background_terms; - CSGChain *background_chain; - OffscreenView *glview; -}; - -CsgInfo::CsgInfo() -{ - this->root_norm_term = NULL; - this->root_chain = NULL;; - this->highlight_terms = vector<CSGTerm*>(); - this->highlights_chain = NULL; - this->background_terms = vector<CSGTerm*>(); - this->background_chain = NULL; - this->glview = NULL; -} - -AbstractNode *find_root_tag(AbstractNode *n) -{ - foreach(AbstractNode *v, n->children) { - if (v->modinst->tag_root) return v; - if (AbstractNode *vroot = find_root_tag(v)) return vroot; - } - return NULL; -} +#include "csgtestcore.h" int main(int argc, char *argv[]) { - if (argc != 2) { - fprintf(stderr, "Usage: %s <file.scad>\n", argv[0]); - exit(1); - } - - const char *filename = argv[1]; - - initialize_builtin_functions(); - initialize_builtin_modules(); - - QApplication app(argc, argv); - - QDir original_path = QDir::current(); - - QString currentdir = QDir::currentPath(); - - QDir libdir(QApplication::instance()->applicationDirPath()); -#ifdef Q_WS_MAC - libdir.cd("../Resources"); // Libraries can be bundled - if (!libdir.exists("libraries")) libdir.cd("../../.."); -#elif defined(Q_OS_UNIX) - if (libdir.cd("../share/openscad/libraries")) { - librarydir = libdir.path(); - } else - if (libdir.cd("../../share/openscad/libraries")) { - librarydir = libdir.path(); - } else - if (libdir.cd("../../libraries")) { - librarydir = libdir.path(); - } else -#endif - if (libdir.cd("libraries")) { - librarydir = libdir.path(); - } - - Context root_ctx; - root_ctx.functions_p = &builtin_functions; - root_ctx.modules_p = &builtin_modules; - root_ctx.set_variable("$fn", Value(0.0)); - root_ctx.set_variable("$fs", Value(1.0)); - root_ctx.set_variable("$fa", Value(12.0)); - root_ctx.set_variable("$t", Value(0.0)); - - Value zero3; - zero3.type = Value::VECTOR; - zero3.append(new Value(0.0)); - zero3.append(new Value(0.0)); - zero3.append(new Value(0.0)); - root_ctx.set_variable("$vpt", zero3); - root_ctx.set_variable("$vpr", zero3); - - - AbstractModule *root_module; - ModuleInstantiation root_inst; - - QFileInfo fileInfo(filename); - handle_dep(filename); - FILE *fp = fopen(filename, "rt"); - if (!fp) { - fprintf(stderr, "Can't open input file `%s'!\n", filename); - exit(1); - } else { - std::stringstream text; - char buffer[513]; - int ret; - while ((ret = fread(buffer, 1, 512, fp)) > 0) { - buffer[ret] = 0; - text << buffer; - } - fclose(fp); - text << commandline_commands; - root_module = parse(text.str().c_str(), fileInfo.absolutePath().toLocal8Bit(), false); - if (!root_module) { - exit(1); - } - } - - QDir::setCurrent(fileInfo.absolutePath()); - - AbstractNode::resetIndexCounter(); - AbstractNode *absolute_root_node = root_module->evaluate(&root_ctx, &root_inst); - AbstractNode *root_node; - // Do we have an explicit root node (! modifier)? - if (!(root_node = find_root_tag(absolute_root_node))) root_node = absolute_root_node; - - Tree tree(root_node); - - CsgInfo csgInfo = CsgInfo(); - - CGALEvaluator cgalevaluator(tree); - CSGTermEvaluator evaluator(tree, &cgalevaluator.psevaluator); - CSGTerm *root_raw_term = evaluator.evaluateCSGTerm(*root_node, csgInfo.highlight_terms, csgInfo.background_terms); - - if (!root_raw_term) { - cerr << "Error: CSG generation failed! (no top level object found)\n"; - return 1; - } - - // CSG normalization - csgInfo.root_norm_term = root_raw_term->link(); - while (1) { - CSGTerm *n = csgInfo.root_norm_term->normalize(); - csgInfo.root_norm_term->unlink(); - if (csgInfo.root_norm_term == n) - break; - csgInfo.root_norm_term = n; - } - - assert(csgInfo.root_norm_term); - - csgInfo.root_chain = new CSGChain(); - csgInfo.root_chain->import(csgInfo.root_norm_term); - fprintf(stderr, "Normalized CSG tree has %d elements\n", csgInfo.root_chain->polysets.size()); - - if (csgInfo.highlight_terms.size() > 0) { - cerr << "Compiling highlights (" << csgInfo.highlight_terms.size() << " CSG Trees)...\n"; - - csgInfo.highlights_chain = new CSGChain(); - for (unsigned int i = 0; i < csgInfo.highlight_terms.size(); i++) { - while (1) { - CSGTerm *n = csgInfo.highlight_terms[i]->normalize(); - csgInfo.highlight_terms[i]->unlink(); - if (csgInfo.highlight_terms[i] == n) - break; - csgInfo.highlight_terms[i] = n; - } - csgInfo.highlights_chain->import(csgInfo.highlight_terms[i]); - } - } - - if (csgInfo.background_terms.size() > 0) { - cerr << "Compiling background (" << csgInfo.background_terms.size() << " CSG Trees)...\n"; - - csgInfo.background_chain = new CSGChain(); - for (unsigned int i = 0; i < csgInfo.background_terms.size(); i++) { - while (1) { - CSGTerm *n = csgInfo.background_terms[i]->normalize(); - csgInfo.background_terms[i]->unlink(); - if (csgInfo.background_terms[i] == n) - break; - csgInfo.background_terms[i] = n; - } - csgInfo.background_chain->import(csgInfo.background_terms[i]); - } - } - - QDir::setCurrent(original_path.absolutePath()); - - /* - fprintf(stderr, "Dump root chain\n"); - cerr << csgInfo.root_chain->fulldump(); - cerr << csgInfo.highlights_chain; - cerr << csgInfo.background_chain; - fprintf(stderr, "end dump\n"); - */ - - ThrownTogetherRenderer thrownTogetherRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain); - csgInfo.glview = new OffscreenView(512,512); - - - - BoundingBox bbox = csgInfo.root_chain->getBoundingBox(); - Vector3d center = (bbox.min() + bbox.max()) / 2; - double radius = (bbox.max() - bbox.min()).norm() / 2; - Vector3d cameradir(1, 1, -0.5); - Vector3d camerapos = center - radius*1.8*cameradir; - csgInfo.glview->setCamera(camerapos, center); - - - csgInfo.glview->setRenderer(&thrownTogetherRenderer); - //OpenCSGRenderer opencsgRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain, csgInfo.glview->shaderinfo); - //csgInfo.glview->setRenderer(&opencsgRenderer); - csgInfo.glview->paintGL(); - csgInfo.glview->save("/dev/stdout"); - - destroy_builtin_functions(); - destroy_builtin_modules(); - + csgtestcore(argc, argv, TEST_OPENCSG); return 0; } diff --git a/tests/test_cmdline_tool.py b/tests/test_cmdline_tool.py index 07afcc8..7d7f23c 100755 --- a/tests/test_cmdline_tool.py +++ b/tests/test_cmdline_tool.py @@ -24,6 +24,8 @@ import glob import subprocess import re import getopt +import shutil +import platform def initialize_environment(): if not options.generate: options.generate = bool(os.getenv("TEST_GENERATE")) @@ -67,12 +69,56 @@ def compare_default(resultfilename): return False return True +def append_html_output(expectedfilename, resultfilename): + # if html directory & file not there, create them + # copy expected filename and result filename to dir + # append html to show differences + # dump platform.platform() + expectedimg = os.path.basename(expectedfilename) + resultimg = os.path.basename(resultfilename) + template = ''' +<p> +<div style="border:1px solid gray;padding:10px;"> +Test command: <b>///TESTCMD///</b> Test name: <b>///TESTNAME///</b> <br/> + <div style="float: left; width: 50%;"> + <br/> + Expected:<br/> + <img style="border:1px solid gray; width:90%;" src="///EXPECTED///"/> + </div> + + <div style="float: right; width: 50%;"> + Actual:<br/> + (Platform: ///PLATFORM///)<br/> + <img style="border:1px solid gray; width:90%;" src="///RESULT///"/> + </div> +<br style="clear:both;"/> +</div> +<p> +''' + html = template + html = html.replace('///EXPECTED///',expectedimg) + html = html.replace('///RESULT///',resultimg) + html = html.replace('///TESTCMD///',os.path.basename(options.cmd)) + html = html.replace('///TESTNAME///',options.testname) + html = html.replace('///PLATFORM///',platform.platform()) + try: + shutil.copy(expectedfilename,options.imgdiff_dir) + shutil.copy(resultfilename,options.imgdiff_dir) + f = open(options.imgdiff_htmlfile,'a') + f.write(html) + f.close() + print >> sys.stderr, "appended " + options.imgdiff_htmlfile + except: + print >> sys.stderr, "error appending " + options.imgdiff_htmlfile + print >> sys.stderr, sys.exc_info() + def compare_png(resultfilename): if not resultfilename: print >> sys.stderr, "Error: OpenSCAD did not generate an image" return False print >> sys.stderr, 'Yee image compare: ', expectedfilename, ' ', resultfilename if execute_and_redirect("./yee_compare", [expectedfilename, resultfilename], sys.stderr) != 0: + append_html_output(expectedfilename, resultfilename) return False return True @@ -138,6 +184,15 @@ if __name__ == '__main__': options.regressiondir = os.path.join(os.path.split(sys.argv[0])[0], "regression") options.generate = False options.suffix = "txt" + + options.imgdiff_dir = 'imgdiff-fail' + options.imgdiff_htmlfile = os.path.join(options.imgdiff_dir,'failed.html') + try: + if not os.path.isdir(options.imgdiff_dir): + os.mkdir(options.imgdiff_dir) + except: + print >> sys.stderr, "error creating " + options.imgdiff_dir, sys.exc_info() + for o, a in opts: if o in ("-g", "--generate"): options.generate = True elif o in ("-s", "--suffix"): @@ -145,7 +200,7 @@ if __name__ == '__main__': else: options.suffix = a elif o in ("-t", "--test"): options.testname = a - + # <cmdline-tool> and <argument> if len(args) < 2: usage() |