综合平台编程器项目的远程存储
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

108 строки
3.4 KiB

  1. #include "domain/project_storage.h"
  2. #include "services/data_point_service.h"
  3. #include "services/project_service.h"
  4. #include <iostream>
  5. #include <stdexcept>
  6. namespace {
  7. class TestProjectStorage final : public ProjectStorage
  8. {
  9. public:
  10. ProjectSaveResult save(const Project &, const std::string &) override
  11. {
  12. return {true, ProjectStorageError::None, {}};
  13. }
  14. ProjectLoadResult load(const std::string &) override
  15. {
  16. return {false, {}, ProjectStorageError::FileReadFailed, {}};
  17. }
  18. };
  19. void require(bool condition, const std::string &message)
  20. {
  21. if (!condition)
  22. {
  23. throw std::runtime_error(message);
  24. }
  25. }
  26. void testUniqueDataPointsAndReferences()
  27. {
  28. TestProjectStorage storage;
  29. ProjectService project_service(storage);
  30. DataPointService service(project_service);
  31. const RegisterAddress m0{RegisterArea::M, 0};
  32. const RegisterAddress m1{RegisterArea::M, 1};
  33. const RegisterAddress d0{RegisterArea::D, 0};
  34. require(service.add({m0, "StartCommand", "启动命令"}).succeeded,
  35. "a valid data point must be added");
  36. require(service.add({d0, "Temperature", "温度"}).succeeded,
  37. "M and D data points must coexist");
  38. require(service.add({m0, "DuplicateAddress", {}}).error
  39. == DataPointError::DuplicateAddress,
  40. "duplicate data point addresses must be rejected");
  41. require(service.add({m1, "StartCommand", {}}).error
  42. == DataPointError::DuplicateName,
  43. "duplicate data point names must be rejected");
  44. HmiControl button;
  45. button.id = "start-button";
  46. button.type = HmiControlType::Button;
  47. button.bounds = {0, 0, 100, 40};
  48. button.text = "启动";
  49. button.binding = m0;
  50. HmiPage page;
  51. page.id = "main-page";
  52. page.name = "主画面";
  53. page.controls.push_back(button);
  54. project_service.editProject().hmiPages.push_back(page);
  55. LogicNode contact;
  56. contact.id = "start-contact";
  57. contact.config = ContactNodeConfig{m0, ContactMode::NormallyOpen};
  58. LadderRung rung;
  59. rung.id = "rung-1";
  60. rung.name = "网络 1";
  61. rung.condition = ConditionExpression::fromNode(contact);
  62. ControlLogic logic;
  63. logic.id = "logic-1";
  64. logic.name = "控制逻辑 1";
  65. logic.rungs.push_back(rung);
  66. project_service.editProject().controlLogics.push_back(logic);
  67. const auto references = service.references(m0);
  68. require(references.size() == 2U,
  69. "data point references must include HMI and ladder locations");
  70. require(service.remove(m0).error == DataPointError::AddressInUse,
  71. "referenced data points must not be deleted");
  72. require(service.update(m0, {m1, "StartCommand", "启动命令"}).error
  73. == DataPointError::AddressInUse,
  74. "referenced data point addresses must not change");
  75. require(service.update(m0, {m0, "Start", "启动命令"}).succeeded,
  76. "referenced data point names and comments may change");
  77. require(service.remove(RegisterAddress{RegisterArea::D, 99}).error
  78. == DataPointError::NotFound,
  79. "removing an unknown data point must report not found");
  80. }
  81. } // namespace
  82. int main()
  83. {
  84. try
  85. {
  86. testUniqueDataPointsAndReferences();
  87. }
  88. catch (const std::exception &error)
  89. {
  90. std::cerr << "data point service tests failed: " << error.what() << '\n';
  91. return 1;
  92. }
  93. std::cout << "data point service tests passed\n";
  94. return 0;
  95. }