2019-10-15 17:35:19 +02:00
#include <catch2/catch.hpp>
#include <memory>
#include "libslic3r/GCodeWriter.hpp"
using namespace Slic3r ;
2019-10-18 15:44:13 +02:00
SCENARIO ( "lift() is not ignored after unlift() at normal values of Z" , "[GCodeWriter]" ) {
2019-10-15 17:35:19 +02:00
GIVEN ( "A config from a file and a single extruder." ) {
GCodeWriter writer ;
GCodeConfig & config = writer . config ;
2021-06-27 16:04:23 +02:00
config . load ( std :: string ( TEST_DATA_DIR ) + "/fff_print_tests/test_gcodewriter/config_lift_unlift.ini" , ForwardCompatibilitySubstitutionRule :: Disable );
2019-10-15 17:35:19 +02:00
std :: vector < unsigned int > extruder_ids { 0 };
writer . set_extruders ( extruder_ids );
writer . set_extruder ( 0 );
WHEN ( "Z is set to 203" ) {
double trouble_Z = 203 ;
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" ) {
REQUIRE ( writer . travel_to_z ( trouble_Z + config . retract_lift . values [ 0 ]). size () == 0 );
AND_WHEN ( "GCodeWriter::Unlift() is called" ) {
REQUIRE ( writer . unlift (). size () == 0 ); // we're the same height so no additional move happens.
THEN ( "GCodeWriter::Lift() emits gcode." ) {
REQUIRE ( writer . lift (). size () > 0 );
}
}
}
}
}
WHEN ( "Z is set to 500003" ) {
double trouble_Z = 500003 ;
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" ) {
REQUIRE ( writer . travel_to_z ( trouble_Z + config . retract_lift . values [ 0 ]). size () == 0 );
AND_WHEN ( "GCodeWriter::Unlift() is called" ) {
REQUIRE ( writer . unlift (). size () == 0 ); // we're the same height so no additional move happens.
THEN ( "GCodeWriter::Lift() emits gcode." ) {
REQUIRE ( writer . lift (). size () > 0 );
}
}
}
}
}
WHEN ( "Z is set to 10.3" ) {
double trouble_Z = 10.3 ;
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" ) {
REQUIRE ( writer . travel_to_z ( trouble_Z + config . retract_lift . values [ 0 ]). size () == 0 );
AND_WHEN ( "GCodeWriter::Unlift() is called" ) {
REQUIRE ( writer . unlift (). size () == 0 ); // we're the same height so no additional move happens.
THEN ( "GCodeWriter::Lift() emits gcode." ) {
REQUIRE ( writer . lift (). size () > 0 );
}
}
}
}
}
2019-10-18 15:44:13 +02:00
// The test above will fail for trouble_Z == 9007199254740992, where trouble_Z + 1.5 will be rounded to trouble_Z + 2.0 due to double mantisa overflow.
2019-10-15 17:35:19 +02:00
}
}
2019-10-18 15:44:13 +02:00
SCENARIO ( "set_speed emits values with fixed-point output." , "[GCodeWriter]" ) {
2019-10-15 17:35:19 +02:00
GIVEN ( "GCodeWriter instance" ) {
GCodeWriter writer ;
WHEN ( "set_speed is called to set speed to 99999.123" ) {
THEN ( "Output string is G1 F99999.123" ) {
REQUIRE_THAT ( writer . set_speed ( 99999.123 ), Catch :: Equals ( "G1 F99999.123 \n " ));
}
}
WHEN ( "set_speed is called to set speed to 1" ) {
THEN ( "Output string is G1 F1.000" ) {
REQUIRE_THAT ( writer . set_speed ( 1.0 ), Catch :: Equals ( "G1 F1.000 \n " ));
}
}
WHEN ( "set_speed is called to set speed to 203.200022" ) {
THEN ( "Output string is G1 F203.200" ) {
REQUIRE_THAT ( writer . set_speed ( 203.200022 ), Catch :: Equals ( "G1 F203.200 \n " ));
}
}
WHEN ( "set_speed is called to set speed to 203.200522" ) {
THEN ( "Output string is G1 F203.201" ) {
REQUIRE_THAT ( writer . set_speed ( 203.200522 ), Catch :: Equals ( "G1 F203.201 \n " ));
}
}
}
}