#include #include "libslic3r/Preset.hpp" #include "libslic3r/PrintConfig.hpp" #include using namespace Slic3r; // Regression test for the python-plugin branch's intentional divergence from // upstream in add_correct_opts_to_diff() (src/libslic3r/Preset.cpp): a vector // option entry whose index is beyond the reference vector's length is reported // dirty even when it duplicates an existing value. On main these duplicates // were NOT flagged. See the comment on add_correct_opts_to_diff() in src/libslic3r/Preset.cpp. TEST_CASE("deep_diff flags new vector entries that duplicate values[0]", "[PresetDiff][Config]") { // reference: single-extruder vector (one entry) Preset reference(Preset::TYPE_PRINTER, "ref"); reference.config.set_key_value("nozzle_diameter", new ConfigOptionFloats{0.4}); // edited: a second extruder entry was added whose value duplicates the first Preset edited(Preset::TYPE_PRINTER, "edited"); edited.config.set_key_value("nozzle_diameter", new ConfigOptionFloats{0.4, 0.4}); // deep_compare = true routes through deep_diff() -> add_correct_opts_to_diff() std::vector diff = PresetCollection::dirty_options(&edited, &reference, /*deep_compare=*/true); // The new index #1 is reported dirty even though 0.4 == values[0] (0.4). REQUIRE(std::find(diff.begin(), diff.end(), "nozzle_diameter#1") != diff.end()); // Sanity: the unchanged existing index #0 is NOT reported, so the rule is // specific to new indices rather than flagging the whole vector. REQUIRE(std::find(diff.begin(), diff.end(), "nozzle_diameter#0") == diff.end()); } TEST_CASE("deep_diff distinguishes absolute and percentage speeds for each variant", "[PresetDiff][Config]") { const size_t changed_index = GENERATE(size_t(0), size_t(1)); Preset reference(Preset::TYPE_PRINT, "ref"); reference.config.set_key_value("small_perimeter_speed", new ConfigOptionFloatsOrPercents{{50., false}, {50., false}}); Preset edited = reference; edited.config.option("small_perimeter_speed")->values[changed_index].percent = true; const auto diff = PresetCollection::dirty_options(&edited, &reference, /*deep_compare=*/true); REQUIRE(diff == std::vector{"small_perimeter_speed#" + std::to_string(changed_index)}); DynamicPrintConfig transferred = reference.config; transferred.apply_only(edited.config, diff); REQUIRE(*transferred.option("small_perimeter_speed") == *edited.config.option("small_perimeter_speed")); }