Fix fff_print_tests and add documentation (PR#13886 from @jalapenopuzzle)

PrusaSlicer/src/libslic3r/GCodeReader.cpp:24: char Slic3r::get_extrusion_axis_char(const Slic3r::GCodeConfig&): Assertion `axis.size() <= 1' failed.
The set_deserialise_strict() method converts 'A' to the string "65" instead of "A". Perhaps this should be fixed more robustly.

Fix fff_print_tests test name Temeperatures -> Temperatures

Fix fff_print_tests All travel moves happen within skirt

Remove the last travel_moves point which returns to the origin (0,0) which is outside the convex hull. This point was causing CHECK(convex_hull.contains(travel_move)) to fail.

Fix fff_print_tests "Used Filament" test Assertion `std::abs(length) < 1000.0' failed

The test configured a retract_length of 10000000 which is larger than the asserted maximum retraction length of 1000.
PrusaSlicer/src/libslic3r/GCode/GCodeWriter.cpp:473: std::string Slic3r::GCodeWriter::_retract(double, double, std::string_view): Assertion `std::abs(length) < 1000.0' failed.
Fixed by doing the print with two different (legal) retraction lengths and checking that the total_used_filament agrees in both cases.

Fix fff_print_tests "Slicing with retraction and lifting" remove illegal negative restart_extra test case

Negative restart_extra is asserted against at PrusaSlicer/src/libslic3r/Extrucer.cpp:58

How to build - add instructions on how to run the unit tests
This commit is contained in:
jalapenopuzzle 2025-02-03 10:36:00 +11:00 committed by Lukas Matena
parent 4c5f3502cb
commit 944844131c
5 changed files with 87 additions and 16 deletions

View File

@ -73,8 +73,27 @@ And that's it. It is now possible to run the freshly built PrusaSlicer binary:
cd src cd src
./prusa-slicer ./prusa-slicer
#### 4. Running Unit Tests
For the most complete unit testing, use the Debug build option `-DCMAKE_BUILD_TYPE=Debug` when running cmake.
Without the Debug build, internal assert statements are not tested.
To run the unit tests:
cd build
make test
To run a specific unit test:
cd build/tests/
The unit tests can be found by
`ls */*_tests`
Any of these unit tests can be run directly e.g.
`./fff_print/fff_print_tests`
## Useful CMake flags when building dependencies ## Useful CMake flags when building dependencies

View File

@ -63,6 +63,28 @@ Alternatively, if you would like to use XCode GUI, modify the `cmake` command to
and then open the `PrusaSlicer.xcodeproj` file. and then open the `PrusaSlicer.xcodeproj` file.
This should open up XCode where you can perform build using the GUI or perform other tasks. This should open up XCode where you can perform build using the GUI or perform other tasks.
### Running Unit Tests
For the most complete unit testing, use the Debug build option `-DCMAKE_BUILD_TYPE=Debug` when running cmake.
Without the Debug build, internal assert statements are not tested.
To run all the unit tests:
cd build
make test
To run a specific unit test:
cd build/tests/
The unit tests can be found by
`ls */*_tests`
Any of these unit tests can be run directly e.g.
`./fff_print/fff_print_tests`
### Note on Mac OS X SDKs ### Note on Mac OS X SDKs
By default PrusaSlicer builds against whichever SDK is the default on the current system. By default PrusaSlicer builds against whichever SDK is the default on the current system.

View File

@ -58,8 +58,28 @@ Debug->Start Debugging or press F5
PrusaSlicer should start. You're up and running! PrusaSlicer should start. You're up and running!
### Running Unit Tests
For the most complete unit testing, use the Debug build option `-DCMAKE_BUILD_TYPE=Debug` when running cmake.
Without the Debug build, internal assert statements are not tested.
To run the unit tests:
cd build
make test
To run a specific unit test:
cd build\tests
The unit tests can be found by
`dir *\*_tests`
Any of these unit tests can be run directly e.g.
`.\fff_print\fff_print_tests`
## 2.B Run the automatic build script ## 2.B Run the automatic build script

View File

@ -119,12 +119,12 @@ std::optional<double> parse_axis(const std::string& line, const std::string& axi
* - no travel moves go outside skirt * - no travel moves go outside skirt
* - temperatures are set correctly * - temperatures are set correctly
*/ */
TEST_CASE("Extrusion, travels, temeperatures", "[GCode]") { TEST_CASE("Extrusion, travels, temperatures", "[GCode]") {
DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config(); DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config();
config.set_deserialize_strict({ config.set_deserialize_strict({
{ "gcode_comments", 1 }, { "gcode_comments", 1 },
{ "complete_objects", 1 }, { "complete_objects", 1 },
{ "extrusion_axis", 'A' }, { "extrusion_axis", "A" },
{ "start_gcode", "" }, // prevent any default extra Z move { "start_gcode", "" }, // prevent any default extra Z move
{ "layer_height", 0.4 }, { "layer_height", 0.4 },
{ "first_layer_height", 0.4 }, { "first_layer_height", 0.4 },
@ -174,6 +174,11 @@ TEST_CASE("Extrusion, travels, temeperatures", "[GCode]") {
} }
}); });
// Remove last travel_moves returning to origin
if (travel_moves.back().x() == 0 && travel_moves.back().y() == 0) {
travel_moves.pop_back();
}
const unsigned layer_count = 20 / 0.4; const unsigned layer_count = 20 / 0.4;
INFO("Complete_objects generates the correct number of Z moves."); INFO("Complete_objects generates the correct number of Z moves.");
CHECK(z_moves.size() == layer_count * 2); CHECK(z_moves.size() == layer_count * 2);
@ -192,20 +197,30 @@ TEST_CASE("Extrusion, travels, temeperatures", "[GCode]") {
TEST_CASE("Used filament", "[GCode]") { TEST_CASE("Used filament", "[GCode]") {
DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config(); DynamicPrintConfig config1 = Slic3r::DynamicPrintConfig::full_print_config();
config.set_deserialize_strict({ config1.set_deserialize_strict({
{ "retract_length", "1000000" }, { "retract_length", "0" },
{ "use_relative_e_distances", 1 }, { "use_relative_e_distances", 1 },
{ "layer_gcode", "G92 E0\n" }, { "layer_gcode", "G92 E0\n" },
}); });
GCodeReader parser; Print print1;
Print print; Model model1;
Model model; Test::init_print({TestMesh::cube_20x20x20}, print1, model1, config1);
Test::init_print({TestMesh::cube_20x20x20}, print, model, config); Test::gcode(print1);
Test::gcode(print);
DynamicPrintConfig config2 = Slic3r::DynamicPrintConfig::full_print_config();
config2.set_deserialize_strict({
{ "retract_length", "999" },
{ "use_relative_e_distances", 1 },
{ "layer_gcode", "G92 E0\n" },
});
Print print2;
Model model2;
Test::init_print({TestMesh::cube_20x20x20}, print2, model2, config2);
Test::gcode(print2);
INFO("Final retraction is not considered in total used filament"); INFO("Final retraction is not considered in total used filament");
CHECK(print.print_statistics().total_used_filament > 0); CHECK(print1.print_statistics().total_used_filament == print2.print_statistics().total_used_filament);
} }
void check_m73s(Print& print){ void check_m73s(Print& print){

View File

@ -135,11 +135,6 @@ void test_slicing(std::initializer_list<TestMesh> meshes, DynamicPrintConfig& co
check_gcode(meshes, config, duplicate); check_gcode(meshes, config, duplicate);
} }
SECTION("Negative restart extra length") {
config.set_deserialize_strict({{ "retract_restart_extra", "-1" }});
check_gcode(meshes, config, duplicate);
}
SECTION("Retract_lift") { SECTION("Retract_lift") {
config.set_deserialize_strict({{ "retract_lift", "1,2" }}); config.set_deserialize_strict({{ "retract_lift", "1,2" }});
check_gcode(meshes, config, duplicate); check_gcode(meshes, config, duplicate);