diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b1fb3668..0c6295465 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -213,6 +213,7 @@ set(SLIC3R_TEST_SOURCES ${TESTDIR}/libslic3r/test_skirt_brim.cpp ${TESTDIR}/libslic3r/test_test_data.cpp ${TESTDIR}/libslic3r/test_geometry.cpp + ${TESTDIR}/libslic3r/test_gcodewriter.cpp ) add_executable(slic3r slic3r.cpp) diff --git a/src/test/inputs/test_gcodewriter/config_lift_unlift.ini b/src/test/inputs/test_gcodewriter/config_lift_unlift.ini new file mode 100644 index 000000000..3e811b663 --- /dev/null +++ b/src/test/inputs/test_gcodewriter/config_lift_unlift.ini @@ -0,0 +1,38 @@ +# generated by Slic3r 1.3.1-dev on 2018-07-27 01:40:55 +before_layer_gcode = +between_objects_gcode = +end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" +end_gcode = M104 S0 ; turn off temperature\nG28 X0 ; home X axis\nM84 ; disable motors\n +extrusion_axis = E +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 3 +filament_max_volumetric_speed = 0 +filament_notes = "" +gcode_comments = 0 +gcode_flavor = reprap +label_printed_objects = 0 +layer_gcode = +max_print_speed = 80 +max_volumetric_speed = 0 +notes = +pressure_advance = 0 +printer_notes = +retract_length = 2 +retract_length_toolchange = 10 +retract_lift = 1.5 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 40 +start_filament_gcode = "; Filament gcode\n" +start_gcode = G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n +toolchange_gcode = +travel_speed = 130 +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_set_and_wait_bed = 0 +use_set_and_wait_extruder = 0 +use_volumetric_e = 0 diff --git a/src/test/libslic3r/test_gcodewriter.cpp b/src/test/libslic3r/test_gcodewriter.cpp new file mode 100644 index 000000000..fb756aa9f --- /dev/null +++ b/src/test/libslic3r/test_gcodewriter.cpp @@ -0,0 +1,37 @@ +#include +#include + +#include "GCodeWriter.hpp" +#include "test_options.hpp" + +using namespace Slic3r; +using namespace std::literals::string_literals; + +SCENARIO("lift() is not ignored after unlift() at large values of Z", "[!mayfail]") { + GIVEN("A config from a file and a single extruder.") + auto writer {std::make_unique(GCodeWriter())}; // ensure cleanup later + auto& config {writer->config}; + config.set_defaults(); + config.load(std::string(testfile_dir) + "test_gcodewriter/config_lift_unlift.ini"s); + + std::vector extruder_ids {0}; + writer->set_extruders(extruder_ids); + writer->set_extruder(0); + + double trouble_Z = 9007199254740992; + WHEN("Z is set to 9007199254740992") { + writer->travel_to_z(trouble_Z); + AND_WHEN("GcodeWriter::Lift() is called") { + REQUIRE(writer->lift().size() > 0); + AND_WHEN("Z is moved post-lift to the same delta as the config Z lift") { + writer->travel_to_z(trouble_z + config.retract_lift); + AND_WHEN("GCodeWriter::Lift() is called after GCodeWriter::Unlift()") { + REQUIRE(writer->unlift().size() > 0); + THEN("GCodeWriter::Lift() emits gcode.") { + REQUIRE(writer->lift().size() > 0); + } + } + } + } + } +}