综合平台编程器项目的远程存储
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

153 wiersze
5.6 KiB

  1. #include "domain/project_storage.h"
  2. #include "domain/register_repository.h"
  3. #include "services/hmi_editor_service.h"
  4. #include "services/hmi_runtime_service.h"
  5. #include "services/project_service.h"
  6. #include "services/runtime_mode_service.h"
  7. #include "ui/hmi_editor_widget.h"
  8. #include "ui/main_window.h"
  9. #include <QAction>
  10. #include <QApplication>
  11. #include <QDockWidget>
  12. #include <QLabel>
  13. #include <QLineEdit>
  14. #include <iostream>
  15. #include <stdexcept>
  16. #include <string>
  17. namespace {
  18. class TestProjectStorage final : public ProjectStorage
  19. {
  20. public:
  21. ProjectSaveResult save(const Project &, const std::string &) override
  22. {
  23. return {true, ProjectStorageError::None, {}};
  24. }
  25. ProjectLoadResult load(const std::string &) override
  26. {
  27. return {false, {}, ProjectStorageError::FileReadFailed, {}};
  28. }
  29. };
  30. void require(bool condition, const std::string &message)
  31. {
  32. if (!condition)
  33. {
  34. throw std::runtime_error(message);
  35. }
  36. }
  37. template<typename ObjectType>
  38. ObjectType *requiredChild(MainWindow &window, const char *name)
  39. {
  40. ObjectType *child = window.findChild<ObjectType *>(QString::fromLatin1(name));
  41. require(child != nullptr, std::string("missing UI object ") + name);
  42. return child;
  43. }
  44. void testModeActionsControlEditingAvailability()
  45. {
  46. TestProjectStorage storage;
  47. ProjectService project_service(storage);
  48. HmiEditorService editor_service(project_service);
  49. VirtualRegisterRepository repository;
  50. HmiRuntimeService runtime_service(repository);
  51. RuntimeModeService mode_service;
  52. MainWindow window(
  53. mode_service, project_service, editor_service, runtime_service);
  54. window.resize(1000, 640);
  55. window.show();
  56. QApplication::processEvents();
  57. QAction *editing_action = requiredChild<QAction>(window, "editingModeAction");
  58. QAction *offline_action = requiredChild<QAction>(window, "offlineModeAction");
  59. QAction *online_action = requiredChild<QAction>(window, "onlineModeAction");
  60. QAction *add_button_action = requiredChild<QAction>(window, "addButtonAction");
  61. QAction *delete_control_action = requiredChild<QAction>(window, "deleteControlAction");
  62. QDockWidget *project_dock = requiredChild<QDockWidget>(window, "projectDock");
  63. QDockWidget *properties_dock = requiredChild<QDockWidget>(window, "propertiesDock");
  64. QLabel *selection = requiredChild<QLabel>(window, "selectionValueLabel");
  65. QLineEdit *text_edit = requiredChild<QLineEdit>(window, "controlTextEdit");
  66. HmiEditorWidget *hmi_editor = requiredChild<HmiEditorWidget>(
  67. window, "hmiEditorWidget");
  68. const qreal compact_scale = hmi_editor->transform().m11();
  69. window.resize(1600, 900);
  70. QApplication::processEvents();
  71. require(hmi_editor->transform().m11() > compact_scale,
  72. "HMI page must refit when the window becomes larger");
  73. require(editing_action->isChecked(), "editing action must be selected initially");
  74. require(project_dock->isEnabled(), "project dock must be enabled while editing");
  75. require(properties_dock->isEnabled(), "properties dock must be enabled while editing");
  76. add_button_action->trigger();
  77. const std::string page_id = editor_service.firstPageId();
  78. require(editor_service.findPage(page_id)->controls.size() == 1,
  79. "adding a control must update the HMI page model");
  80. require(selection->text() == QStringLiteral("button-1"),
  81. "selecting an added control must update the property panel");
  82. require(text_edit->text() == QStringLiteral("按钮"),
  83. "property panel must show the control text");
  84. delete_control_action->trigger();
  85. require(editor_service.findPage(page_id)->controls.empty(),
  86. "deleting a selected control must update the HMI page model");
  87. offline_action->trigger();
  88. require(mode_service.mode() == ApplicationMode::OfflineRunning,
  89. "offline action must enter offline running");
  90. require(!project_dock->isEnabled(),
  91. "project dock must be disabled while running");
  92. require(!properties_dock->isEnabled(),
  93. "properties dock must be disabled while running");
  94. require(!add_button_action->isEnabled(),
  95. "HMI add controls must be disabled while running");
  96. online_action->trigger();
  97. require(mode_service.mode() == ApplicationMode::OfflineRunning,
  98. "running modes must not switch directly through the UI");
  99. require(offline_action->isChecked(),
  100. "failed mode changes must restore the active action");
  101. editing_action->trigger();
  102. require(mode_service.mode() == ApplicationMode::Editing,
  103. "editing action must return to editing");
  104. require(project_dock->isEnabled(),
  105. "project dock must be restored after returning to editing");
  106. require(properties_dock->isEnabled(),
  107. "properties dock must be restored after returning to editing");
  108. require(add_button_action->isEnabled(),
  109. "HMI add controls must be restored after returning to editing");
  110. online_action->trigger();
  111. require(mode_service.mode() == ApplicationMode::Editing,
  112. "online action must require an initial PLC read");
  113. require(editing_action->isChecked(),
  114. "rejected online running must restore the editing action");
  115. }
  116. } // namespace
  117. int main(int argc, char *argv[])
  118. {
  119. qputenv("QT_QPA_PLATFORM", QByteArrayLiteral("offscreen"));
  120. QApplication application(argc, argv);
  121. try
  122. {
  123. testModeActionsControlEditingAvailability();
  124. }
  125. catch (const std::exception &error)
  126. {
  127. std::cerr << "main window tests failed: " << error.what() << '\n';
  128. return 1;
  129. }
  130. std::cout << "main window tests passed\n";
  131. return 0;
  132. }