Second editing op into the wx frontend. Extract the logic (parse the .bsd,
apply it to the part, record bsdl_path) into core/app/edit.hpp::attach_bsdl
(Part*, path) -> {ok, error, entity, bound, unbound, ports_total}, failing
without mutation when the file can't be parsed.
The TUI `attach-bsdl` command now renders that result (output unchanged); the
wx GUI gains an Edit ▸ Attach BSDL… menu reusing PickPart() + a .bsd file
dialog. Prune the now-dead bsdl_model include from commands.cpp.
tests/test_edit.cpp: parse failure leaves the part untouched; null part. The
success path is covered by a batch run (entity + bound/total ports). 381 core
assertions green; tui + wx build clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
1.7 KiB
C++
57 lines
1.7 KiB
C++
#include <doctest/doctest.h>
|
|
|
|
#include "core/app/edit.hpp"
|
|
#include "core/domain/parts.hpp"
|
|
#include "core/domain/pins.hpp"
|
|
|
|
// app::set_connector_type is pure core: validate the kind, tag the part and
|
|
// apply the connector model. No Print/dialog/FTXUI.
|
|
|
|
TEST_CASE("set_connector_type tags a part with a free-form kind") {
|
|
Part p("J1");
|
|
p.add(new Pin("1"));
|
|
p.add(new Pin("2"));
|
|
|
|
app::SetConnectorTypeResult r = app::set_connector_type(&p, "myconn");
|
|
|
|
CHECK(r.ok);
|
|
CHECK(r.error.empty());
|
|
CHECK(p.connector_type == "myconn");
|
|
}
|
|
|
|
TEST_CASE("set_connector_type refuses a kind the part doesn't fit — no mutation") {
|
|
Part p("J1");
|
|
p.add(new Pin("1"));
|
|
p.add(new Pin("2"));
|
|
p.add(new Pin("3")); // numeric pins don't fit the VPX single-letter columns
|
|
|
|
app::SetConnectorTypeResult r = app::set_connector_type(&p, "vpx-3u-bkp-p0");
|
|
|
|
CHECK_FALSE(r.ok);
|
|
CHECK_FALSE(r.error.empty());
|
|
CHECK(p.connector_type.empty()); // refused before any change
|
|
}
|
|
|
|
TEST_CASE("set_connector_type on a null part fails cleanly") {
|
|
app::SetConnectorTypeResult r = app::set_connector_type(nullptr, "x");
|
|
CHECK_FALSE(r.ok);
|
|
CHECK_FALSE(r.error.empty());
|
|
}
|
|
|
|
TEST_CASE("attach_bsdl reports a parse failure without mutating the part") {
|
|
Part p("J1");
|
|
p.add(new Pin("1"));
|
|
|
|
app::AttachBsdlResult r = app::attach_bsdl(&p, "/nonexistent-xyz/none.bsd");
|
|
|
|
CHECK_FALSE(r.ok);
|
|
CHECK(r.error.find("cannot parse") != std::string::npos);
|
|
CHECK(p.bsdl_path.empty()); // failure leaves the part untouched
|
|
}
|
|
|
|
TEST_CASE("attach_bsdl on a null part fails cleanly") {
|
|
app::AttachBsdlResult r = app::attach_bsdl(nullptr, "x.bsd");
|
|
CHECK_FALSE(r.ok);
|
|
CHECK_FALSE(r.error.empty());
|
|
}
|