From d1a86e513c31b6a005d4e34599c660e3b58fe146 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 18 Oct 2019 15:44:13 +0200 Subject: [PATCH] Fixing some GCodeExport and Flow unit tests. --- tests/fff_print/test_flow.cpp | 59 ++++++++++++++-------------- tests/fff_print/test_gcodewriter.cpp | 34 ++-------------- 2 files changed, 32 insertions(+), 61 deletions(-) diff --git a/tests/fff_print/test_flow.cpp b/tests/fff_print/test_flow.cpp index dc14d96ee..4541868dc 100644 --- a/tests/fff_print/test_flow.cpp +++ b/tests/fff_print/test_flow.cpp @@ -15,7 +15,7 @@ using namespace Slic3r::Test; using namespace Slic3r; -SCENARIO("Extrusion width specifics", "[!mayfail]") { +SCENARIO("Extrusion width specifics", "[Flow]") { GIVEN("A config with a skirt, brim, some fill density, 3 perimeters, and 1 bottom solid layer and a 20mm cube mesh") { // this is a sharedptr DynamicPrintConfig config = Slic3r::DynamicPrintConfig::full_print_config(); @@ -59,7 +59,7 @@ SCENARIO("Extrusion width specifics", "[!mayfail]") { } } // needs gcode export -SCENARIO(" Bridge flow specifics.", "[!mayfail]") { +SCENARIO(" Bridge flow specifics.", "[Flow]") { GIVEN("A default config with no cooling and a fixed bridge speed, flow ratio and an overhang mesh.") { WHEN("bridge_flow_ratio is set to 1.0") { THEN("Output flow is as expected.") { @@ -92,54 +92,53 @@ SCENARIO(" Bridge flow specifics.", "[!mayfail]") { /// Test the expected behavior for auto-width, /// spacing, etc -SCENARIO("Flow: Flow math for non-bridges", "[!mayfail]") { +SCENARIO("Flow: Flow math for non-bridges", "[Flow]") { GIVEN("Nozzle Diameter of 0.4, a desired width of 1mm and layer height of 0.5") { - ConfigOptionFloatOrPercent width(1.0, false); - float spacing {0.4}; - float nozzle_diameter {0.4}; - float bridge_flow {1.0}; - float layer_height {0.5}; + ConfigOptionFloatOrPercent width(1.0, false); + float spacing = 0.4f; + float nozzle_diameter = 0.4f; + float bridge_flow = 0.f; + float layer_height = 0.5f; // Spacing for non-bridges is has some overlap - THEN("External perimeter flow has spacing fixed to 1.1*nozzle_diameter") { - auto flow = Flow::new_from_config_width(frExternalPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, 0.0f); - REQUIRE(flow.spacing() == Approx((1.1*nozzle_diameter) - layer_height * (1.0 - PI / 4.0))); + THEN("External perimeter flow has spacing fixed to 1.125 * nozzle_diameter") { + auto flow = Flow::new_from_config_width(frExternalPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, bridge_flow); + REQUIRE(flow.spacing() == Approx(1.125 * nozzle_diameter - layer_height * (1.0 - PI / 4.0))); } - THEN("Internal perimeter flow has spacing of 1.05 (minimum)") { - auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, 0.0f); - REQUIRE(flow.spacing() == Approx((1.05*nozzle_diameter) - layer_height * (1.0 - PI / 4.0))); + THEN("Internal perimeter flow has spacing fixed to 1.125 * nozzle_diameter") { + auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, bridge_flow); + REQUIRE(flow.spacing() == Approx(1.125 *nozzle_diameter - layer_height * (1.0 - PI / 4.0))); } THEN("Spacing for supplied width is 0.8927f") { - auto flow = Flow::new_from_config_width(frExternalPerimeter, width, nozzle_diameter, layer_height, 0.0f); + auto flow = Flow::new_from_config_width(frExternalPerimeter, width, nozzle_diameter, layer_height, bridge_flow); REQUIRE(flow.spacing() == Approx(width.value - layer_height * (1.0 - PI / 4.0))); - flow = Flow::new_from_config_width(frPerimeter, width, nozzle_diameter, layer_height, 0.0f); + flow = Flow::new_from_config_width(frPerimeter, width, nozzle_diameter, layer_height, bridge_flow); REQUIRE(flow.spacing() == Approx(width.value - layer_height * (1.0 - PI / 4.0))); } } /// Check the min/max GIVEN("Nozzle Diameter of 0.25") { - float spacing {0.4}; - float nozzle_diameter {0.25}; - float bridge_flow {0.0}; - float layer_height {0.5}; + float spacing = 0.4f; + float nozzle_diameter = 0.25f; + float bridge_flow = 0.f; + float layer_height = 0.5f; WHEN("layer height is set to 0.2") { layer_height = 0.15f; THEN("Max width is set.") { - auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, 0.0f); - REQUIRE(flow.width == Approx(1.4*nozzle_diameter)); + auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, bridge_flow); + REQUIRE(flow.width == Approx(1.125 * nozzle_diameter)); } } WHEN("Layer height is set to 0.2") { layer_height = 0.3f; THEN("Min width is set.") { - auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, 0.0f); - REQUIRE(flow.width == Approx(1.05*nozzle_diameter)); + auto flow = Flow::new_from_config_width(frPerimeter, ConfigOptionFloatOrPercent(0, false), nozzle_diameter, layer_height, bridge_flow); + REQUIRE(flow.width == Approx(1.125 * nozzle_diameter)); } } } - #if 0 /// Check for an edge case in the maths where the spacing could be 0; original /// math is 0.99. Slic3r issue #4654 @@ -159,13 +158,13 @@ SCENARIO("Flow: Flow math for non-bridges", "[!mayfail]") { } /// Spacing, width calculation for bridge extrusions -SCENARIO("Flow: Flow math for bridges", "[!mayfail]") { +SCENARIO("Flow: Flow math for bridges", "[Flow]") { GIVEN("Nozzle Diameter of 0.4, a desired width of 1mm and layer height of 0.5") { auto width = ConfigOptionFloatOrPercent(1.0, false); - double spacing = 0.4; - double nozzle_diameter = 0.4; - double bridge_flow = 1.0; - double layer_height = 0.5; + float spacing = 0.4f; + float nozzle_diameter = 0.4f; + float bridge_flow = 1.0f; + float layer_height = 0.5f; WHEN("Flow role is frExternalPerimeter") { auto flow = Flow::new_from_config_width(frExternalPerimeter, width, nozzle_diameter, layer_height, bridge_flow); THEN("Bridge width is same as nozzle diameter") { diff --git a/tests/fff_print/test_gcodewriter.cpp b/tests/fff_print/test_gcodewriter.cpp index 4f1c550eb..9ee319c94 100644 --- a/tests/fff_print/test_gcodewriter.cpp +++ b/tests/fff_print/test_gcodewriter.cpp @@ -6,36 +6,7 @@ using namespace Slic3r; -SCENARIO("lift() and unlift() behavior with large values of Z", "[!shouldfail]") { - 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 extruder_ids {0}; - writer.set_extruders(extruder_ids); - writer.set_extruder(0); - - WHEN("Z is set to 9007199254740992") { - double trouble_Z = 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") { - 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); - } - } - } - } - } - } -} - -SCENARIO("lift() is not ignored after unlift() at normal values of Z") { +SCENARIO("lift() is not ignored after unlift() at normal values of Z", "[GCodeWriter]") { GIVEN("A config from a file and a single extruder.") { GCodeWriter writer; GCodeConfig &config = writer.config; @@ -93,10 +64,11 @@ SCENARIO("lift() is not ignored after unlift() at normal values of Z") { } } } + // 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. } } -SCENARIO("set_speed emits values with fixed-point output.") { +SCENARIO("set_speed emits values with fixed-point output.", "[GCodeWriter]") { GIVEN("GCodeWriter instance") { GCodeWriter writer;