综合平台编程器项目的远程存储
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

140 linhas
5.0 KiB

  1. #include "infrastructure/runtime_settings_loader.h"
  2. #include "support/test_support.h"
  3. #include <QCoreApplication>
  4. #include <QFile>
  5. #include <QTemporaryDir>
  6. #include <algorithm>
  7. #include <string>
  8. namespace {
  9. using TestSupport::require;
  10. void writeUtf8(const QString &path, const QByteArray &contents)
  11. {
  12. QFile file(path);
  13. require(file.open(QIODevice::WriteOnly), "runtime settings file must open");
  14. require(file.write(contents) == contents.size(),
  15. "runtime settings file must be written completely");
  16. }
  17. bool containsMessage(
  18. const RuntimeSettingsLoadResult &result,
  19. const std::string &fragment)
  20. {
  21. return std::any_of(
  22. result.messages.cbegin(), result.messages.cend(),
  23. [&fragment](const std::string &message)
  24. {
  25. return message.find(fragment) != std::string::npos;
  26. });
  27. }
  28. void testMissingFileCreatesOnlyPlcDefaults()
  29. {
  30. QTemporaryDir directory;
  31. require(directory.isValid(), "runtime settings directory must be valid");
  32. const QString path = directory.filePath("config/runtime.ini");
  33. const RuntimeSettingsLoadResult result = RuntimeSettingsLoader::load(path);
  34. require(QFile::exists(path) && !result.warningRequired,
  35. "missing runtime settings must be created without warning");
  36. QFile file(path);
  37. require(file.open(QIODevice::ReadOnly), "created runtime settings must be readable");
  38. const QByteArray contents = file.readAll();
  39. require(contents.contains("[PlcDefaults]\n")
  40. && contents.contains("PortName=COM3\n")
  41. && !contents.contains("[ProjectLimits]")
  42. && !contents.contains("[HmiDefaults]")
  43. && !contents.contains("[Config]"),
  44. "runtime settings must contain only PLC defaults");
  45. }
  46. void testRuntimeSettingsLoadsSerialFields()
  47. {
  48. QTemporaryDir directory;
  49. require(directory.isValid(), "runtime settings directory must be valid");
  50. const QString path = directory.filePath("runtime.ini");
  51. writeUtf8(
  52. path,
  53. QByteArrayLiteral(
  54. "[PlcDefaults]\n"
  55. "PortName=COM7\n"
  56. "ServerAddress=2\n"
  57. "BaudRate=19200\n"
  58. "DataBits=7\n"
  59. "Parity=3\n"
  60. "StopBits=2\n"));
  61. const RuntimeSettingsLoadResult result = RuntimeSettingsLoader::load(path);
  62. require(!result.warningRequired
  63. && result.plcDefaults.portName == "COM7"
  64. && result.plcDefaults.serverAddress == 2
  65. && result.plcDefaults.baudRate == 19200
  66. && result.plcDefaults.dataBits == 7
  67. && result.plcDefaults.parity == 3
  68. && result.plcDefaults.stopBits == 2,
  69. "runtime settings must load all six serial fields");
  70. }
  71. void testRuntimeSettingsRejectsInvalidFileAsOneUnit()
  72. {
  73. QTemporaryDir directory;
  74. require(directory.isValid(), "runtime settings directory must be valid");
  75. const QString path = directory.filePath("invalid.ini");
  76. writeUtf8(
  77. path,
  78. QByteArrayLiteral(
  79. "[PlcDefaults]\n"
  80. "PortName=COM7\n"
  81. "ServerAddress=2\n"
  82. "BaudRate=19200\n"
  83. "DataBits=8\n"
  84. "Parity=2\n"
  85. "StopBits=1\n"
  86. "[PlcDefaults]\n"
  87. "PortName=COM8\n"));
  88. const RuntimeSettingsLoadResult result = RuntimeSettingsLoader::load(path);
  89. require(result.warningRequired
  90. && result.plcDefaults.portName == "COM3"
  91. && containsMessage(result, "重复"),
  92. "duplicate runtime settings must fall back to code defaults");
  93. }
  94. void testRuntimeSettingsWritesMinimalFile()
  95. {
  96. QTemporaryDir directory;
  97. require(directory.isValid(), "runtime settings directory must be valid");
  98. const QString path = directory.filePath("config/runtime.ini");
  99. PlcSerialConfiguration configuration;
  100. configuration.portName = "COM9";
  101. configuration.serverAddress = 9;
  102. configuration.baudRate = 38400;
  103. configuration.dataBits = 8;
  104. configuration.parity = 0;
  105. configuration.stopBits = 1;
  106. std::string error;
  107. require(RuntimeSettingsLoader::write(path, configuration, &error),
  108. "runtime settings must write successfully");
  109. const RuntimeSettingsLoadResult loaded = RuntimeSettingsLoader::load(path);
  110. require(!loaded.warningRequired
  111. && loaded.plcDefaults.portName == "COM9"
  112. && loaded.plcDefaults.serverAddress == 9
  113. && loaded.plcDefaults.baudRate == 38400
  114. && loaded.plcDefaults.parity == 0,
  115. "written runtime settings must round trip");
  116. }
  117. } // namespace
  118. int main(int argc, char *argv[])
  119. {
  120. QCoreApplication application(argc, argv);
  121. return TestSupport::runTestSuite("runtime settings tests", {
  122. {"testMissingFileCreatesOnlyPlcDefaults", testMissingFileCreatesOnlyPlcDefaults},
  123. {"testRuntimeSettingsLoadsSerialFields", testRuntimeSettingsLoadsSerialFields},
  124. {"testRuntimeSettingsRejectsInvalidFileAsOneUnit", testRuntimeSettingsRejectsInvalidFileAsOneUnit},
  125. {"testRuntimeSettingsWritesMinimalFile", testRuntimeSettingsWritesMinimalFile},
  126. });
  127. }