综合平台编程器项目的远程存储
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

98 líneas
3.2 KiB

  1. #include "services/runtime_mode_service.h"
  2. #include "services/offline_simulation_service.h"
  3. #include "services/project_service.h"
  4. #include "domain/project_storage.h"
  5. #include "domain/register_repository.h"
  6. #include <iostream>
  7. #include <stdexcept>
  8. #include <string>
  9. namespace {
  10. class TestProjectStorage final : public ProjectStorage
  11. {
  12. public:
  13. ProjectSaveResult save(const Project &, const std::string &) override
  14. {
  15. return {true, ProjectStorageError::None, {}};
  16. }
  17. ProjectLoadResult load(const std::string &) override
  18. {
  19. return {false, {}, ProjectStorageError::FileReadFailed, {}};
  20. }
  21. };
  22. void require(bool condition, const std::string &message)
  23. {
  24. if (!condition)
  25. {
  26. throw std::runtime_error(message);
  27. }
  28. }
  29. void testModeTransitions()
  30. {
  31. // 验证服务将 PLC 首读状态与领域模式切换规则正确组合
  32. TestProjectStorage storage;
  33. ProjectService project_service(storage);
  34. VirtualRegisterRepository repository;
  35. OfflineSimulationService simulation_service(repository);
  36. RuntimeModeService service(project_service, simulation_service);
  37. require(service.mode() == ApplicationMode::Editing,
  38. "service must start in editing mode");
  39. require(service.policy().allowsProjectEditing,
  40. "editing mode must allow project editing");
  41. require(service.enterOfflineRunning().succeeded,
  42. "editing mode must enter offline running");
  43. require(service.simulationState() == SimulationState::Running,
  44. "offline mode must start the software executor");
  45. require(service.policy().usesVirtualRegisters,
  46. "offline running must use virtual registers");
  47. require(service.enterOnlineRunning().error
  48. == ModeTransitionError::MustReturnToEditing,
  49. "running modes must not switch directly");
  50. require(service.enterEditing().succeeded,
  51. "offline running must return to editing");
  52. require(service.simulationState() == SimulationState::Stopped,
  53. "returning to editing must stop the software executor first");
  54. require(service.enterOnlineRunning().error
  55. == ModeTransitionError::InitialPlcReadRequired,
  56. "online running must require an initial PLC read");
  57. service.setInitialPlcReadCompleted(true);
  58. require(service.initialPlcReadCompleted(),
  59. "service must retain the initial PLC read state");
  60. require(service.enterOnlineRunning().succeeded,
  61. "online running must start after an initial PLC read");
  62. require(service.simulationState() == SimulationState::Stopped,
  63. "online running must never start the software executor");
  64. require(service.policy().usesPlcRegisters,
  65. "online running must use PLC registers");
  66. require(!service.policy().runsLogicExecutor,
  67. "online running must keep the software executor stopped");
  68. }
  69. } // namespace
  70. int main()
  71. {
  72. try
  73. {
  74. // 运行模式只有这一组状态机边界测试
  75. testModeTransitions();
  76. }
  77. catch (const std::exception &error)
  78. {
  79. std::cerr << "runtime mode service tests failed: " << error.what() << '\n';
  80. return 1;
  81. }
  82. std::cout << "runtime mode service tests passed\n";
  83. return 0;
  84. }