综合平台编程器项目的远程存储
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

103 righe
3.2 KiB

  1. #include "domain/project_storage.h"
  2. #include "services/logic_editor_service.h"
  3. #include "services/project_service.h"
  4. #include <exception>
  5. #include <iostream>
  6. #include <stdexcept>
  7. namespace {
  8. class TestProjectStorage final : public ProjectStorage
  9. {
  10. public:
  11. ProjectSaveResult save(const Project &, const std::string &) override
  12. {
  13. return {true, ProjectStorageError::None, {}};
  14. }
  15. ProjectLoadResult load(const std::string &) override
  16. {
  17. return {false, {}, ProjectStorageError::FileReadFailed, {}};
  18. }
  19. };
  20. void require(bool condition, const std::string &message)
  21. {
  22. if (!condition)
  23. {
  24. throw std::runtime_error(message);
  25. }
  26. }
  27. void testEditorOperations()
  28. {
  29. TestProjectStorage storage;
  30. ProjectService project_service(storage);
  31. LogicEditorService service(project_service);
  32. const LogicEditorResult logic_result = service.ensureDefaultLogic();
  33. require(logic_result.succeeded, "default logic must be created");
  34. const std::string logic_id = logic_result.id;
  35. const LogicEditorResult start_result = service.addNode(
  36. logic_id,
  37. ContactNodeConfig{
  38. RegisterAddress{RegisterArea::M, 0},
  39. ContactMode::NormallyOpen},
  40. {80, 80});
  41. const LogicEditorResult coil_result = service.addNode(
  42. logic_id,
  43. CoilNodeConfig{
  44. RegisterAddress{RegisterArea::M, 1},
  45. CoilMode::Normal},
  46. {360, 80});
  47. require(start_result.succeeded && coil_result.succeeded,
  48. "contact and coil must be added");
  49. require(service.connectNodes(logic_id, start_result.id, coil_result.id).succeeded,
  50. "valid nodes must connect");
  51. require(!service.connectNodes(logic_id, start_result.id, coil_result.id).succeeded,
  52. "duplicate node connections must fail");
  53. require(!service.connectNodes(logic_id, coil_result.id, start_result.id).succeeded,
  54. "coil outgoing connection must fail");
  55. const LogicNode *start = service.findNode(logic_id, start_result.id);
  56. require(start != nullptr && start->position.x == 80,
  57. "added node position must be stored");
  58. require(service.moveNode(logic_id, start_result.id, {120, 160}).succeeded,
  59. "node position must be editable");
  60. require(service.updateNodeConfig(
  61. logic_id,
  62. start_result.id,
  63. ContactNodeConfig{
  64. RegisterAddress{RegisterArea::M, 2},
  65. ContactMode::NormallyClosed})
  66. .succeeded,
  67. "contact properties must be editable");
  68. require(service.removeNode(logic_id, start_result.id).succeeded,
  69. "node deletion must succeed");
  70. require(service.findNode(logic_id, start_result.id) == nullptr,
  71. "deleted node must disappear");
  72. require(service.findLogic(logic_id)->connections.empty(),
  73. "deleting a node must remove its connections");
  74. }
  75. } // namespace
  76. int main()
  77. {
  78. try
  79. {
  80. testEditorOperations();
  81. }
  82. catch (const std::exception &error)
  83. {
  84. std::cerr << "logic editor service tests failed: " << error.what() << '\n';
  85. return 1;
  86. }
  87. std::cout << "logic editor service tests passed\n";
  88. return 0;
  89. }