综合平台编程器项目的远程存储
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

88 lines
2.6 KiB

  1. #include "services/runtime_mode_service.h"
  2. #include "services/project_service.h"
  3. #include "domain/project_storage.h"
  4. #include <iostream>
  5. #include <stdexcept>
  6. #include <string>
  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 testModeTransitions()
  28. {
  29. // 验证服务将 PLC 首读状态与领域模式切换规则正确组合
  30. TestProjectStorage storage;
  31. ProjectService project_service(storage);
  32. RuntimeModeService service(project_service);
  33. require(service.mode() == ApplicationMode::Editing,
  34. "service must start in editing mode");
  35. require(service.policy().allowsProjectEditing,
  36. "editing mode must allow project editing");
  37. require(service.enterOfflineRunning().succeeded,
  38. "editing mode must enter offline running");
  39. require(service.policy().usesVirtualRegisters,
  40. "offline running must use virtual registers");
  41. require(service.enterOnlineRunning().error
  42. == ModeTransitionError::MustReturnToEditing,
  43. "running modes must not switch directly");
  44. require(service.enterEditing().succeeded,
  45. "offline running must return to editing");
  46. require(service.enterOnlineRunning().error
  47. == ModeTransitionError::InitialPlcReadRequired,
  48. "online running must require an initial PLC read");
  49. service.setInitialPlcReadCompleted(true);
  50. require(service.initialPlcReadCompleted(),
  51. "service must retain the initial PLC read state");
  52. require(service.enterOnlineRunning().succeeded,
  53. "online running must start after an initial PLC read");
  54. require(service.policy().usesPlcRegisters,
  55. "online running must use PLC registers");
  56. require(!service.policy().runsLogicExecutor,
  57. "online running must keep the software executor stopped");
  58. }
  59. } // namespace
  60. int main()
  61. {
  62. try
  63. {
  64. // 运行模式只有这一组状态机边界测试
  65. testModeTransitions();
  66. }
  67. catch (const std::exception &error)
  68. {
  69. std::cerr << "runtime mode service tests failed: " << error.what() << '\n';
  70. return 1;
  71. }
  72. std::cout << "runtime mode service tests passed\n";
  73. return 0;
  74. }