2019-10-15 15:35:19 +00:00
# include <catch2/catch.hpp>
# include <memory>
# include "libslic3r/GCodeWriter.hpp"
using namespace Slic3r ;
2019-10-18 13:44:13 +00:00
SCENARIO ( " lift() is not ignored after unlift() at normal values of Z " , " [GCodeWriter] " ) {
2019-10-15 15:35:19 +00:00
GIVEN ( " A config from a file and a single extruder. " ) {
GCodeWriter writer ;
GCodeConfig & config = writer . config ;
config . load ( std : : string ( TEST_DATA_DIR ) + " /fff_print_tests/test_gcodewriter/config_lift_unlift.ini " ) ;
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 13:44:13 +00: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 15:35:19 +00:00
}
}
2019-10-18 13:44:13 +00:00
SCENARIO ( " set_speed emits values with fixed-point output. " , " [GCodeWriter] " ) {
2019-10-15 15:35:19 +00: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 " ) ) ;
}
}
}
}