diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..490de28 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,35 @@ +# модули +* text=auto +*.bsl text eol=crlf +*.cai text eol=crlf +*.cmi text eol=crlf +*.dcs text eol=crlf +*.dcss text eol=crlf +*.dcssca text eol=crlf +*.form text eol=crlf +*.hpwa text eol=crlf +*.mdo text eol=crlf +*.mxlx text eol=crlf +*.pnrs text eol=crlf +*.rights text eol=crlf +*.schedule text eol=crlf + +# картинки + +*.bmp binary diff=exif +*.gif binary diff=exif +*.ico binary +*.jpeg binary diff=exif +*.jpg binary diff=exif +*.png binary diff=exif +*.svg text + +# картинки + +*.bin binary +*.1CD binary + +# Binary file extensions that should not be modified. +*.bin binary +*.axdt binary +*.addin binary \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d605a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +*.cfu +src/.project +*.cfl +*.lgd +*.orig + +/src/Configuration/ConfigDumpInfo.xml + +/allure-reports +/autotest-bia +/ci4onec +/spec/build/ib +/tys + +autotest.json +VBParams.json + +/allure-report/* +/buildstatus.log + + +/*_pid*.log + +*.*.bak + +# IDE +*/.settings/com._1c.g5.v8.dt.platform.services.core.prefs +*/.settings/EnvLaunchModeIndex.prefs + +# Binary +*/bin/* + +#wsdl +/fixtures/wsdl + diff --git a/sonarlint.json b/sonarlint.json new file mode 100644 index 0000000..9dddae6 --- /dev/null +++ b/sonarlint.json @@ -0,0 +1,4 @@ +{ + "serverId": "sonar", + "projectKey": "yaxunit:develop" +} \ No newline at end of file diff --git a/СтандартныеПодсистемыБеллераж/.project b/src/cf/.project similarity index 100% rename from СтандартныеПодсистемыБеллераж/.project rename to src/cf/.project diff --git a/СтандартныеПодсистемыБеллераж/.settings/ManagedEnvironments.prefs b/src/cf/.settings/ManagedEnvironments.prefs similarity index 100% rename from СтандартныеПодсистемыБеллераж/.settings/ManagedEnvironments.prefs rename to src/cf/.settings/ManagedEnvironments.prefs diff --git a/СтандартныеПодсистемыБеллераж/.settings/RuntimePropertyLaunch.prefs b/src/cf/.settings/RuntimePropertyLaunch.prefs similarity index 100% rename from СтандартныеПодсистемыБеллераж/.settings/RuntimePropertyLaunch.prefs rename to src/cf/.settings/RuntimePropertyLaunch.prefs diff --git a/СтандартныеПодсистемыБеллераж/.settings/com.e1c.v8codestyle.autosort.prefs b/src/cf/.settings/com.e1c.v8codestyle.autosort.prefs similarity index 100% rename from СтандартныеПодсистемыБеллераж/.settings/com.e1c.v8codestyle.autosort.prefs rename to src/cf/.settings/com.e1c.v8codestyle.autosort.prefs diff --git a/СтандартныеПодсистемыБеллераж/.settings/com.e1c.v8codestyle.bsl.prefs b/src/cf/.settings/com.e1c.v8codestyle.bsl.prefs similarity index 100% rename from СтандартныеПодсистемыБеллераж/.settings/com.e1c.v8codestyle.bsl.prefs rename to src/cf/.settings/com.e1c.v8codestyle.bsl.prefs diff --git a/СтандартныеПодсистемыБеллераж/.settings/com.e1c.v8codestyle.prefs b/src/cf/.settings/com.e1c.v8codestyle.prefs similarity index 100% rename from СтандартныеПодсистемыБеллераж/.settings/com.e1c.v8codestyle.prefs rename to src/cf/.settings/com.e1c.v8codestyle.prefs diff --git a/СтандартныеПодсистемыБеллераж/.settings/org.eclipse.core.resources.prefs b/src/cf/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from СтандартныеПодсистемыБеллераж/.settings/org.eclipse.core.resources.prefs rename to src/cf/.settings/org.eclipse.core.resources.prefs diff --git a/СтандартныеПодсистемыБеллераж/DT-INF/PROJECT.PMF b/src/cf/DT-INF/PROJECT.PMF similarity index 100% rename from СтандартныеПодсистемыБеллераж/DT-INF/PROJECT.PMF rename to src/cf/DT-INF/PROJECT.PMF diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTO/Module.bsl b/src/cf/src/CommonModules/бф_ВосстановлениеXDTO/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTO/Module.bsl rename to src/cf/src/CommonModules/бф_ВосстановлениеXDTO/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTO/бф_ВосстановлениеXDTO.mdo b/src/cf/src/CommonModules/бф_ВосстановлениеXDTO/бф_ВосстановлениеXDTO.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTO/бф_ВосстановлениеXDTO.mdo rename to src/cf/src/CommonModules/бф_ВосстановлениеXDTO/бф_ВосстановлениеXDTO.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/Module.bsl b/src/cf/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/Module.bsl rename to src/cf/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/бф_ВосстановлениеXDTOПереопределяемый.mdo b/src/cf/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/бф_ВосстановлениеXDTOПереопределяемый.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/бф_ВосстановлениеXDTOПереопределяемый.mdo rename to src/cf/src/CommonModules/бф_ВосстановлениеXDTOПереопределяемый/бф_ВосстановлениеXDTOПереопределяемый.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Кеширование/Module.bsl b/src/cf/src/CommonModules/бф_Кеширование/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Кеширование/Module.bsl rename to src/cf/src/CommonModules/бф_Кеширование/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Кеширование/бф_Кеширование.mdo b/src/cf/src/CommonModules/бф_Кеширование/бф_Кеширование.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Кеширование/бф_Кеширование.mdo rename to src/cf/src/CommonModules/бф_Кеширование/бф_Кеширование.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КоннекторХТТП/Module.bsl b/src/cf/src/CommonModules/бф_КоннекторХТТП/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КоннекторХТТП/Module.bsl rename to src/cf/src/CommonModules/бф_КоннекторХТТП/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КоннекторХТТП/бф_КоннекторХТТП.mdo b/src/cf/src/CommonModules/бф_КоннекторХТТП/бф_КоннекторХТТП.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КоннекторХТТП/бф_КоннекторХТТП.mdo rename to src/cf/src/CommonModules/бф_КоннекторХТТП/бф_КоннекторХТТП.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Константы/Module.bsl b/src/cf/src/CommonModules/бф_Константы/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Константы/Module.bsl rename to src/cf/src/CommonModules/бф_Константы/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Константы/бф_Константы.mdo b/src/cf/src/CommonModules/бф_Константы/бф_Константы.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_Константы/бф_Константы.mdo rename to src/cf/src/CommonModules/бф_Константы/бф_Константы.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КонстантыПовтИсп/Module.bsl b/src/cf/src/CommonModules/бф_КонстантыПовтИсп/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КонстантыПовтИсп/Module.bsl rename to src/cf/src/CommonModules/бф_КонстантыПовтИсп/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КонстантыПовтИсп/бф_КонстантыПовтИсп.mdo b/src/cf/src/CommonModules/бф_КонстантыПовтИсп/бф_КонстантыПовтИсп.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_КонстантыПовтИсп/бф_КонстантыПовтИсп.mdo rename to src/cf/src/CommonModules/бф_КонстантыПовтИсп/бф_КонстантыПовтИсп.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_МодификацияФорм/Module.bsl b/src/cf/src/CommonModules/бф_МодификацияФорм/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_МодификацияФорм/Module.bsl rename to src/cf/src/CommonModules/бф_МодификацияФорм/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_МодификацияФорм/бф_МодификацияФорм.mdo b/src/cf/src/CommonModules/бф_МодификацияФорм/бф_МодификацияФорм.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_МодификацияФорм/бф_МодификацияФорм.mdo rename to src/cf/src/CommonModules/бф_МодификацияФорм/бф_МодификацияФорм.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаHTTPЗапросов/Module.bsl b/src/cf/src/CommonModules/бф_ОбработкаHTTPЗапросов/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаHTTPЗапросов/Module.bsl rename to src/cf/src/CommonModules/бф_ОбработкаHTTPЗапросов/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаHTTPЗапросов/бф_ОбработкаHTTPЗапросов.mdo b/src/cf/src/CommonModules/бф_ОбработкаHTTPЗапросов/бф_ОбработкаHTTPЗапросов.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаHTTPЗапросов/бф_ОбработкаHTTPЗапросов.mdo rename to src/cf/src/CommonModules/бф_ОбработкаHTTPЗапросов/бф_ОбработкаHTTPЗапросов.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/Module.bsl b/src/cf/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/Module.bsl rename to src/cf/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/бф_ОбработкаЗапросовПереопределяемый.mdo b/src/cf/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/бф_ОбработкаЗапросовПереопределяемый.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/бф_ОбработкаЗапросовПереопределяемый.mdo rename to src/cf/src/CommonModules/бф_ОбработкаЗапросовПереопределяемый/бф_ОбработкаЗапросовПереопределяемый.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/Module.bsl b/src/cf/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/Module.bsl rename to src/cf/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/бф_ОбработкаЗапросовПовтИсп.mdo b/src/cf/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/бф_ОбработкаЗапросовПовтИсп.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/бф_ОбработкаЗапросовПовтИсп.mdo rename to src/cf/src/CommonModules/бф_ОбработкаЗапросовПовтИсп/бф_ОбработкаЗапросовПовтИсп.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекций/Module.bsl b/src/cf/src/CommonModules/бф_ПроцессорыКоллекций/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекций/Module.bsl rename to src/cf/src/CommonModules/бф_ПроцессорыКоллекций/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекций/бф_ПроцессорыКоллекций.mdo b/src/cf/src/CommonModules/бф_ПроцессорыКоллекций/бф_ПроцессорыКоллекций.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекций/бф_ПроцессорыКоллекций.mdo rename to src/cf/src/CommonModules/бф_ПроцессорыКоллекций/бф_ПроцессорыКоллекций.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/Module.bsl b/src/cf/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/Module.bsl rename to src/cf/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/бф_ПроцессорыКоллекцийСлужебный.mdo b/src/cf/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/бф_ПроцессорыКоллекцийСлужебный.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/бф_ПроцессорыКоллекцийСлужебный.mdo rename to src/cf/src/CommonModules/бф_ПроцессорыКоллекцийСлужебный/бф_ПроцессорыКоллекцийСлужебный.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_РегулярныеВыражения/Module.bsl b/src/cf/src/CommonModules/бф_РегулярныеВыражения/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_РегулярныеВыражения/Module.bsl rename to src/cf/src/CommonModules/бф_РегулярныеВыражения/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_РегулярныеВыражения/бф_РегулярныеВыражения.mdo b/src/cf/src/CommonModules/бф_РегулярныеВыражения/бф_РегулярныеВыражения.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_РегулярныеВыражения/бф_РегулярныеВыражения.mdo rename to src/cf/src/CommonModules/бф_РегулярныеВыражения/бф_РегулярныеВыражения.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СервисыОбщее/Module.bsl b/src/cf/src/CommonModules/бф_СервисыОбщее/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СервисыОбщее/Module.bsl rename to src/cf/src/CommonModules/бф_СервисыОбщее/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СервисыОбщее/бф_СервисыОбщее.mdo b/src/cf/src/CommonModules/бф_СервисыОбщее/бф_СервисыОбщее.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СервисыОбщее/бф_СервисыОбщее.mdo rename to src/cf/src/CommonModules/бф_СервисыОбщее/бф_СервисыОбщее.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФорм/Module.bsl b/src/cf/src/CommonModules/бф_СобытияФорм/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФорм/Module.bsl rename to src/cf/src/CommonModules/бф_СобытияФорм/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФорм/бф_СобытияФорм.mdo b/src/cf/src/CommonModules/бф_СобытияФорм/бф_СобытияФорм.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФорм/бф_СобытияФорм.mdo rename to src/cf/src/CommonModules/бф_СобытияФорм/бф_СобытияФорм.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФормКлиент/Module.bsl b/src/cf/src/CommonModules/бф_СобытияФормКлиент/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФормКлиент/Module.bsl rename to src/cf/src/CommonModules/бф_СобытияФормКлиент/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФормКлиент/бф_СобытияФормКлиент.mdo b/src/cf/src/CommonModules/бф_СобытияФормКлиент/бф_СобытияФормКлиент.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СобытияФормКлиент/бф_СобытияФормКлиент.mdo rename to src/cf/src/CommonModules/бф_СобытияФормКлиент/бф_СобытияФормКлиент.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапроса/Module.bsl b/src/cf/src/CommonModules/бф_СхемаЗапроса/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапроса/Module.bsl rename to src/cf/src/CommonModules/бф_СхемаЗапроса/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапроса/бф_СхемаЗапроса.mdo b/src/cf/src/CommonModules/бф_СхемаЗапроса/бф_СхемаЗапроса.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапроса/бф_СхемаЗапроса.mdo rename to src/cf/src/CommonModules/бф_СхемаЗапроса/бф_СхемаЗапроса.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапросаСлужебный/Module.bsl b/src/cf/src/CommonModules/бф_СхемаЗапросаСлужебный/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапросаСлужебный/Module.bsl rename to src/cf/src/CommonModules/бф_СхемаЗапросаСлужебный/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапросаСлужебный/бф_СхемаЗапросаСлужебный.mdo b/src/cf/src/CommonModules/бф_СхемаЗапросаСлужебный/бф_СхемаЗапросаСлужебный.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_СхемаЗапросаСлужебный/бф_СхемаЗапросаСлужебный.mdo rename to src/cf/src/CommonModules/бф_СхемаЗапросаСлужебный/бф_СхемаЗапросаСлужебный.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ХТТПСлужебный/Module.bsl b/src/cf/src/CommonModules/бф_ХТТПСлужебный/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ХТТПСлужебный/Module.bsl rename to src/cf/src/CommonModules/бф_ХТТПСлужебный/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ХТТПСлужебный/бф_ХТТПСлужебный.mdo b/src/cf/src/CommonModules/бф_ХТТПСлужебный/бф_ХТТПСлужебный.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonModules/бф_ХТТПСлужебный/бф_ХТТПСлужебный.mdo rename to src/cf/src/CommonModules/бф_ХТТПСлужебный/бф_ХТТПСлужебный.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/CommonTemplates/бф_RegEx/Template.addin b/src/cf/src/CommonTemplates/бф_RegEx/Template.addin similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonTemplates/бф_RegEx/Template.addin rename to src/cf/src/CommonTemplates/бф_RegEx/Template.addin diff --git a/СтандартныеПодсистемыБеллераж/src/CommonTemplates/бф_RegEx/бф_RegEx.mdo b/src/cf/src/CommonTemplates/бф_RegEx/бф_RegEx.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/CommonTemplates/бф_RegEx/бф_RegEx.mdo rename to src/cf/src/CommonTemplates/бф_RegEx/бф_RegEx.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/ClientApplicationInterface.cai b/src/cf/src/Configuration/ClientApplicationInterface.cai similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Configuration/ClientApplicationInterface.cai rename to src/cf/src/Configuration/ClientApplicationInterface.cai diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/CommandInterface.cmi b/src/cf/src/Configuration/CommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Configuration/CommandInterface.cmi rename to src/cf/src/Configuration/CommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/Configuration.mdo b/src/cf/src/Configuration/Configuration.mdo similarity index 97% rename from СтандартныеПодсистемыБеллераж/src/Configuration/Configuration.mdo rename to src/cf/src/Configuration/Configuration.mdo index fe36550..3c0b398 100644 --- a/СтандартныеПодсистемыБеллераж/src/Configuration/Configuration.mdo +++ b/src/cf/src/Configuration/Configuration.mdo @@ -40,7 +40,7 @@ Managed NotAutoFree DontUse - DontUse + UseWithWarnings 8.3.20 Русский diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/ExternalConnectionModule.bsl b/src/cf/src/Configuration/ExternalConnectionModule.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Configuration/ExternalConnectionModule.bsl rename to src/cf/src/Configuration/ExternalConnectionModule.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/MainSectionCommandInterface.cmi b/src/cf/src/Configuration/MainSectionCommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Configuration/MainSectionCommandInterface.cmi rename to src/cf/src/Configuration/MainSectionCommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/ManagedApplicationModule.bsl b/src/cf/src/Configuration/ManagedApplicationModule.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Configuration/ManagedApplicationModule.bsl rename to src/cf/src/Configuration/ManagedApplicationModule.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/Configuration/SessionModule.bsl b/src/cf/src/Configuration/SessionModule.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Configuration/SessionModule.bsl rename to src/cf/src/Configuration/SessionModule.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_МодельЗапроса/ObjectModule.bsl b/src/cf/src/DataProcessors/бф_МодельЗапроса/ObjectModule.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_МодельЗапроса/ObjectModule.bsl rename to src/cf/src/DataProcessors/бф_МодельЗапроса/ObjectModule.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_МодельЗапроса/бф_МодельЗапроса.mdo b/src/cf/src/DataProcessors/бф_МодельЗапроса/бф_МодельЗапроса.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_МодельЗапроса/бф_МодельЗапроса.mdo rename to src/cf/src/DataProcessors/бф_МодельЗапроса/бф_МодельЗапроса.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_ПроцессорКоллекций/ObjectModule.bsl b/src/cf/src/DataProcessors/бф_ПроцессорКоллекций/ObjectModule.bsl similarity index 99% rename from СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_ПроцессорКоллекций/ObjectModule.bsl rename to src/cf/src/DataProcessors/бф_ПроцессорКоллекций/ObjectModule.bsl index 245c283..9f2215f 100644 --- a/СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_ПроцессорКоллекций/ObjectModule.bsl +++ b/src/cf/src/DataProcessors/бф_ПроцессорКоллекций/ObjectModule.bsl @@ -155,7 +155,7 @@ // Конвейерный метод. // // Параметры: -// ФункцияРазворачивания - Строка, бф_ПроцессорыКоллекций.НовыйОписаниеОповещения - функция разворачивания. +// ФункцияРазворачивания - Строка - бф_ПроцессорыКоллекций.НовыйОписаниеОповещения - функция разворачивания. // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные // "Результат", "ДополнительныеПараметры", "Элемент". // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра diff --git a/СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_ПроцессорКоллекций/бф_ПроцессорКоллекций.mdo b/src/cf/src/DataProcessors/бф_ПроцессорКоллекций/бф_ПроцессорКоллекций.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/DataProcessors/бф_ПроцессорКоллекций/бф_ПроцессорКоллекций.mdo rename to src/cf/src/DataProcessors/бф_ПроцессорКоллекций/бф_ПроцессорКоллекций.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Form.form b/src/cf/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Form.form similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Form.form rename to src/cf/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Form.form diff --git a/СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Module.bsl b/src/cf/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Module.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Module.bsl rename to src/cf/src/InformationRegisters/бф_ЗначенияКонстант/Forms/ФормаЗаписи/Module.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/RecordSetModule.bsl b/src/cf/src/InformationRegisters/бф_ЗначенияКонстант/RecordSetModule.bsl similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/RecordSetModule.bsl rename to src/cf/src/InformationRegisters/бф_ЗначенияКонстант/RecordSetModule.bsl diff --git a/СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/бф_ЗначенияКонстант.mdo b/src/cf/src/InformationRegisters/бф_ЗначенияКонстант/бф_ЗначенияКонстант.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/InformationRegisters/бф_ЗначенияКонстант/бф_ЗначенияКонстант.mdo rename to src/cf/src/InformationRegisters/бф_ЗначенияКонстант/бф_ЗначенияКонстант.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/CommandInterface.cmi b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/CommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/CommandInterface.cmi rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/CommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/CommandInterface.cmi b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/CommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/CommandInterface.cmi rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/CommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.suppress b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.suppress similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.suppress rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/КоннекторХТТП/КоннекторХТТП.suppress diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/CommandInterface.cmi b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/CommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/CommandInterface.cmi rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/CommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/Константы.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/Константы.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/Константы.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/Константы/Константы.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодельЗапроса/МодельЗапроса.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодельЗапроса/МодельЗапроса.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодельЗапроса/МодельЗапроса.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодельЗапроса/МодельЗапроса.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/CommandInterface.cmi b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/CommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/CommandInterface.cmi rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/CommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/МодификацияФорм.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/МодификацияФорм.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/МодификацияФорм.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/МодификацияФорм/МодификацияФорм.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ПроцессорыКоллекций/ПроцессорыКоллекций.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ПроцессорыКоллекций/ПроцессорыКоллекций.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ПроцессорыКоллекций/ПроцессорыКоллекций.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ПроцессорыКоллекций/ПроцессорыКоллекций.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/CommandInterface.cmi b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/CommandInterface.cmi similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/CommandInterface.cmi rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/CommandInterface.cmi diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/РегулярныеВыражения.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/РегулярныеВыражения.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/РегулярныеВыражения.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/РегулярныеВыражения/РегулярныеВыражения.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ХТТП/ХТТП.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ХТТП/ХТТП.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ХТТП/ХТТП.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/Subsystems/ХТТП/ХТТП.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/бф_СтандартныеПодсистемы.mdo b/src/cf/src/Subsystems/бф_СтандартныеПодсистемы/бф_СтандартныеПодсистемы.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/Subsystems/бф_СтандартныеПодсистемы/бф_СтандартныеПодсистемы.mdo rename to src/cf/src/Subsystems/бф_СтандартныеПодсистемы/бф_СтандартныеПодсистемы.mdo diff --git a/СтандартныеПодсистемыБеллераж/src/XDTOPackages/ОбщегоНазначенияХТТП/Package.xdto b/src/cf/src/XDTOPackages/ОбщегоНазначенияХТТП/Package.xdto similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/XDTOPackages/ОбщегоНазначенияХТТП/Package.xdto rename to src/cf/src/XDTOPackages/ОбщегоНазначенияХТТП/Package.xdto diff --git a/СтандартныеПодсистемыБеллераж/src/XDTOPackages/ОбщегоНазначенияХТТП/ОбщегоНазначенияХТТП.mdo b/src/cf/src/XDTOPackages/ОбщегоНазначенияХТТП/ОбщегоНазначенияХТТП.mdo similarity index 100% rename from СтандартныеПодсистемыБеллераж/src/XDTOPackages/ОбщегоНазначенияХТТП/ОбщегоНазначенияХТТП.mdo rename to src/cf/src/XDTOPackages/ОбщегоНазначенияХТТП/ОбщегоНазначенияХТТП.mdo diff --git a/src/cfe/yaxunit/.project b/src/cfe/yaxunit/.project new file mode 100644 index 0000000..a686448 --- /dev/null +++ b/src/cfe/yaxunit/.project @@ -0,0 +1,18 @@ + + + yaxunit + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + + org.eclipse.xtext.ui.shared.xtextNature + com._1c.g5.v8.dt.core.V8ExtensionNature + + diff --git a/src/cfe/yaxunit/.settings/Default.cset b/src/cfe/yaxunit/.settings/Default.cset new file mode 100644 index 0000000..e17003c --- /dev/null +++ b/src/cfe/yaxunit/.settings/Default.cset @@ -0,0 +1,8 @@ +{ + "version": 1, + "settings": { + "common-module-type": { + "enabled": false + } + } +} \ No newline at end of file diff --git a/src/cfe/yaxunit/.settings/ManagedEnvironments.prefs b/src/cfe/yaxunit/.settings/ManagedEnvironments.prefs new file mode 100644 index 0000000..5bcbfaa --- /dev/null +++ b/src/cfe/yaxunit/.settings/ManagedEnvironments.prefs @@ -0,0 +1,11 @@ +CLIENT=false +EXTERNAL_CONN=false +MNG_CLIENT=true +MOBILE_AUTONOMOUS_SERVER=false +MOBILE_CLIENT=false +MOBILE_SERVER=false +MOBILE_THIN_CLIENT=false +SERVER=true +THIN_CLIENT=true +WEB_CLIENT=true +eclipse.preferences.version=1 diff --git a/src/cfe/yaxunit/.settings/com.e1c.g5.v8.dt.formatter.bsl.prefs b/src/cfe/yaxunit/.settings/com.e1c.g5.v8.dt.formatter.bsl.prefs new file mode 100644 index 0000000..b50f7cd --- /dev/null +++ b/src/cfe/yaxunit/.settings/com.e1c.g5.v8.dt.formatter.bsl.prefs @@ -0,0 +1,17 @@ +alwaysEndWithSemicolon=true +autowrapBinary=indent_on_wrap +autowrapInvocation=alignment_on_wrap +autowrapMethodParameters=alignment_on_wrap +creatorEmptyBrackets=never brackets +defaultValuesInitialized=true +eclipse.preferences.version=1 +formattingOn=true +indentMethodInternal=true +invocationEmptyParamsDelimited=true +keywordStandard=CamelCase +noindent_preprocessor=true +projectSpecificSettingsInited=true +showWhitespaceCharacters=true +softFormatassignmentStatement=true +spacesForTabs=false +whitespaceMethodParamsDelimited=true diff --git a/src/cfe/yaxunit/.settings/com.e1c.g5.v8.dt.lcore.ui.templates.prefs b/src/cfe/yaxunit/.settings/com.e1c.g5.v8.dt.lcore.ui.templates.prefs new file mode 100644 index 0000000..81d79eb --- /dev/null +++ b/src/cfe/yaxunit/.settings/com.e1c.g5.v8.dt.lcore.ui.templates.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +yaxunit={"templates"\:[]} diff --git a/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.autosort.prefs b/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.autosort.prefs new file mode 100644 index 0000000..37dbed4 --- /dev/null +++ b/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.autosort.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +subordinate/commands=true +subordinate/forms=true +subordinate/methods=true +subordinate/operations=true +subordinate/tabularSections=true +subordinate/templates=true +subordinate/urlTemplates=true +topObjects=true diff --git a/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.bsl.prefs b/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.bsl.prefs new file mode 100644 index 0000000..c634a6b --- /dev/null +++ b/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.bsl.prefs @@ -0,0 +1,3 @@ +addModuleStrictTypesAnnotation=true +createModuleStructure=true +eclipse.preferences.version=1 diff --git a/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.prefs b/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.prefs new file mode 100644 index 0000000..9e9b57e --- /dev/null +++ b/src/cfe/yaxunit/.settings/com.e1c.v8codestyle.prefs @@ -0,0 +1,3 @@ +commonChecks=true +eclipse.preferences.version=1 +standardChecks=true diff --git a/src/cfe/yaxunit/.settings/org.eclipse.core.resources.prefs b/src/cfe/yaxunit/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/src/cfe/yaxunit/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/src/cfe/yaxunit/.settings/templates/common_module.bsl b/src/cfe/yaxunit/.settings/templates/common_module.bsl new file mode 100644 index 0000000..bcd4e60 --- /dev/null +++ b/src/cfe/yaxunit/.settings/templates/common_module.bsl @@ -0,0 +1,62 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИсполняемыеСценарии() Экспорт + + ЮТТесты + .ДобавитьТест("ТестовыйМетод") + .ДобавитьТест("ТестовыйМетод").СПараметрами(1, 2, 3); + ; + +КонецПроцедуры + +#Область События + +Процедура ПередВсемиТестами() Экспорт + +КонецПроцедуры + +Процедура ПередКаждымТестом() Экспорт + +КонецПроцедуры + +Процедура ПослеКаждогоТеста() Экспорт + +КонецПроцедуры + +Процедура ПослеВсехТестов() Экспорт + +КонецПроцедуры + +#КонецОбласти + +Процедура ТестовыйМетод() Экспорт + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/DT-INF/PROJECT.PMF b/src/cfe/yaxunit/DT-INF/PROJECT.PMF new file mode 100644 index 0000000..4f8152e --- /dev/null +++ b/src/cfe/yaxunit/DT-INF/PROJECT.PMF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Runtime-Version: 8.3.10 +Base-Project: СтандартныеПодсистемыБеллераж diff --git a/src/cfe/yaxunit/src/CommonModules/Мокито/Module.bsl b/src/cfe/yaxunit/src/CommonModules/Мокито/Module.bsl new file mode 100644 index 0000000..c8ffb84 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/Мокито/Module.bsl @@ -0,0 +1,181 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Обучение. +// Начинает обучение мокито для регистрации правил подмены вызовов методов +// +// Параметры: +// Объект - Произвольный - Объект, методы которого хотим подменить +// +// Возвращаемое значение: +// ОбщийМодуль +// Пример: +// Для работы Мокито необходимо добавить обрабатываемые методы в расширение по следующей схеме +// +// &Вместо("ВыполнитьЗапрос") +// Функция ЮТВыполнитьЗапрос(ПараметрыПодключения, Ресурс, HTTPМетод, Параметры, ОписаниеТела, Заголовки) Экспорт +// +// ПараметрыМетода = Мокито.МассивПараметров(ПараметрыПодключения, Ресурс, HTTPМетод, Параметры, ОписаниеТела, Заголовки); +// +// ПрерватьВыполнение = Ложь; +// Результат = Мокито.АнализВызова(РаботаСHTTP, "ВыполнитьЗапрос", ПараметрыМетода, ПрерватьВыполнение); +// +// Если НЕ ПрерватьВыполнение Тогда +// Возврат ПродолжитьВызов(ПараметрыПодключения, Ресурс, HTTPМетод, Параметры, ОписаниеТела, Заголовки); +// Иначе +// Возврат Результат; +// КонецЕсли; +// +// КонецФункции +Функция Обучение(Объект) Экспорт + + Режимы = МокитоСлужебный.РежимыРаботы(); + МокитоСлужебный.УстановитьРежим(Режимы.Обучение); + + Возврат МокитоОбучение.Обучение(Объект); + +КонецФункции + +// Прогон +// Переводит мокито в режим прогона тестов +// Вызов этого метода обязателен перед выполнением тестового прогона метода +Процедура Прогон() Экспорт + + Режимы = МокитоСлужебный.РежимыРаботы(); + МокитоСлужебный.УстановитьРежим(Режимы.Тестирование); + +КонецПроцедуры + +// Проверить. +// Переводит мокито в режим проверки вызовов +// Параметры: +// Объект - Произвольный - Устанавливает проверяемый объект, вызовы методов которого будем проверять +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Проверить(Объект) Экспорт + + Режимы = МокитоСлужебный.РежимыРаботы(); + МокитоСлужебный.УстановитьРежим(Режимы.Проверка); + + Возврат МокитоПроверки.Проверить(Объект); + +КонецФункции + +// Сбросить +// Сбрасывает настройки, переинициализирует мокито +Процедура Сбросить() Экспорт + + МокитоСлужебный.СброситьПараметры(); + +КонецПроцедуры + +#Область КонструкторыПараметров + +// Любой параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться любой параметр +// Возвращаемое значение: +// см. МокитоСлужебный.ОписаниеМаскиПараметра +Функция ЛюбойПараметр() Экспорт + + МаскаПараметра = МокитоСлужебный.ОписаниеМаскиПараметра(МокитоСлужебный.ТипыУсловийПараметров().Любой, 0); + + Возврат МаскаПараметра; + +КонецФункции + +// Числовой параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться числовой параметр +// Возвращаемое значение: +// см. Мокито.ТипизированныйПараметр +Функция ЧисловойПараметр() Экспорт + + Возврат ТипизированныйПараметр(Тип("Число")); + +КонецФункции + +// Строковый параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться строковый параметр +// Возвращаемое значение: +// см. Мокито.ТипизированныйПараметр +Функция СтроковыйПараметр() Экспорт + + Возврат ТипизированныйПараметр(Тип("Строка")); + +КонецФункции + +// Типизированный параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться параметр указанного типа +// +// Параметры: +// Тип - Тип - Ограничение типа параметра +// +// Возвращаемое значение: +// см. МокитоСлужебный.ОписаниеМаскиПараметра +Функция ТипизированныйПараметр(Тип) Экспорт + + МаскаПараметра = МокитоСлужебный.ОписаниеМаскиПараметра(МокитоСлужебный.ТипыУсловийПараметров().Тип, 1); + МаскаПараметра.Вставить("Тип", Тип); + + Возврат МаскаПараметра; + +КонецФункции + +Функция МассивПараметров(Параметр1 = "_!%*", + Параметр2 = "_!%*", + Параметр3 = "_!%*", + Параметр4 = "_!%*", + Параметр5 = "_!%*", + Параметр6 = "_!%*", + Параметр7 = "_!%*", + Параметр8 = "_!%*", + Параметр9 = "_!%*", + Параметр10 = "_!%*") Экспорт + + Возврат ЮТОбщий.ЗначениеВМассиве(Параметр1, + Параметр2, + Параметр3, + Параметр4, + Параметр5, + Параметр6, + Параметр7, + Параметр8, + Параметр9, + Параметр10); + +КонецФункции + +#КонецОбласти + +Функция АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение) Экспорт + + Возврат МокитоСлужебный.АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение); + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/Мокито/Мокито.mdo b/src/cfe/yaxunit/src/CommonModules/Мокито/Мокито.mdo new file mode 100644 index 0000000..96b905d --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/Мокито/Мокито.mdo @@ -0,0 +1,11 @@ + + + Мокито + + ru + Мокито + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl b/src/cfe/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl new file mode 100644 index 0000000..9f46021 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl @@ -0,0 +1,276 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Обучение. +// Начинает обучение мокито для регистрации правил подмены вызовов методов +// +// Параметры: +// Объект - Произвольный - Объект, методы которого хотим подменить +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Обучение(Объект) Экспорт + + УстановитьПараметрыОбучения(Объект); + + Возврат МокитоОбучение; + +КонецФункции + +// Наблюдать. +// +// Параметры: +// ИмяМетода - Строка - Имя метода обучаемого объекта +// - Произвольный - Вызов метода обучаемого объекта +// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода обучаемого объекта +// Варианты вызова: +// Мокито.Обучение(Произвольный).Когда(Строка, Массив); // Вызов через указание имени метода и параметров +// Мокито.Обучение(Произвольный).Когда(Произвольный); // Вызов через явное выполнение наблюдаемого метода +// +// Возвращаемое значение: +// ОбщийМодуль +// Пример: +// Мокито.Обучение(ОбщегоНазначения).Наблюдать("ЭтоДопустимоеИмяПеременной", Мокито.МассивПараметров("")); +// Мокито.Обучение(ОбщегоНазначения).Наблюдать(ОбщегоНазначения.ЭтоДопустимоеИмяПеременной("")); +Функция Наблюдать(ИмяМетода, ПараметрыВызова = Неопределено) Экспорт + + ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова); + + Возврат МокитоОбучение; + +КонецФункции + +// Когда. +// +// Параметры: +// ИмяМетода - Строка - Имя метода обучаемого объекта +// - Произвольный - Вызов метода обучаемого объекта +// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода обучаемого объекта +// Варианты вызова: +// Мокито.Обучение(Произвольный).Когда(Строка, Массив); // Вызов через указание имени метода и параметров +// Мокито.Обучение(Произвольный).Когда(Произвольный); // Вызов через явное выполнение наблюдаемого метода +// +// Возвращаемое значение: +// ОбщийМодуль +// Пример: +// Мокито.Обучение(ОбщегоНазначения).Когда("ЭтоДопустимоеИмяПеременной", Мокито.МассивПараметров("")); +// Мокито.Обучение(ОбщегоНазначения).Когда(ОбщегоНазначения.ЭтоДопустимоеИмяПеременной("")); +Функция Когда(ИмяМетода, ПараметрыВызова = Неопределено) Экспорт + + Возврат Наблюдать(ИмяМетода, ПараметрыВызова); + +КонецФункции + +// Вернуть. +// Указывает, что при соблюдении условий метод должен вернуть переданное значение +// Параметры: +// Результат - Произвольный - Результат, который должен вернуть метод +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Вернуть(Результат) Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия, Результат", МокитоСлужебный.ТипыДействийРеакций().ВернутьРезультат, Результат)); + + Возврат МокитоОбучение; + +КонецФункции + +// Выбросить исключение. +// Указывает, что при соблюдении условий метод должен выбросить исключение +// +// Параметры: +// ТекстИсключения - Строка +// +// Возвращаемое значение: +// ОбщийМодуль +Функция ВыброситьИсключение(ТекстИсключения) Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия, Ошибка", МокитоСлужебный.ТипыДействийРеакций().ВыброситьИсключение, ТекстИсключения)); + + Возврат МокитоОбучение; + +КонецФункции + +// Пропустить. +// Указывает, что при соблюдении условий метод не должен выполняться, его вызов пропускается +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Пропустить() Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия", МокитоСлужебный.ТипыДействийРеакций().Пропустить)); + + Возврат МокитоОбучение; + +КонецФункции + +// Выполнить метод. +// Указывает, что при соблюдении условий метод должен выполняться +// +// Возвращаемое значение: +// ОбщийМодуль +Функция ВыполнитьМетод() Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия", МокитоСлужебный.ТипыДействийРеакций().ВызватьОсновнойМетод)); + + Возврат МокитоОбучение; + +КонецФункции + +// Прогон +// Переводит мокито в режим прогона тестов +// Вызов этого метода обязателен перед выполнением тестового прогона метода +Процедура Прогон() Экспорт + + Мокито.Прогон(); + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +Процедура ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова) + + Объект = ОбучаемыйОбъект(); + ДанныеПерехвата = МокитоСлужебный.ДанныеПерехвата(Объект); + + Если ДанныеПерехвата = Неопределено Тогда + Сообщение = СтрШаблон("Не найдены настройки перехвата для %1. Необходимо предварительно вызвать метод Мокито.Обучение(Объект)", Объект); + ВызватьИсключение Сообщение; + КонецЕсли; + + Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда + СтруктураВызоваМетода = ИмяМетода; + Иначе + СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыВызова); + КонецЕсли; + + Методы = ДанныеПерехвата.Методы; + + Если НЕ Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда + Методы.Вставить(СтруктураВызоваМетода.ИмяМетода, ОписаниеПараметровПерехватаМетода()); + КонецЕсли; + + Реакция = СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода); + + Методы[СтруктураВызоваМетода.ИмяМетода].Реакции.Добавить(Реакция); + + ПараметрыОбучения().РеакцияТекущегоВыражения = Реакция; + +КонецПроцедуры + +Функция ОписаниеПараметровПерехватаМетода() + + Возврат Новый Структура("Реакции", Новый Массив); + +КонецФункции + +#Область Реакции + +Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода) + + Возврат Новый Структура("УсловиеРеакции, Действие", УсловиеРеакции(СтруктураВызоваМетода), Неопределено); + +КонецФункции + +Функция УсловиеРеакции(СтруктураВызоваМетода) + + Параметры = СтруктураВызоваМетода.Параметры; + + Если Параметры = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Условия = Новый Массив; + + Для Каждого Параметр Из Параметры Цикл + + Если МокитоСлужебный.ЭтоМаскаПарамера(Параметр) Тогда + + Условия.Добавить(Параметр); + + Иначе + + Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 10)); + + КонецЕсли; + + КонецЦикла; + + Возврат Условия; + +КонецФункции + +#КонецОбласти + +#Область Параметры + +Функция ОбучаемыйОбъект() + + ПараметрыОбучения = ПараметрыОбучения(); + + Возврат ПараметрыОбучения.ОбучаемыйОбъект; + +КонецФункции + +Функция ПараметрыОбучения() + + Параметры = МокитоСлужебный.Настройки().ПараметрыОбучения; + + Возврат Параметры; + +КонецФункции + +Процедура УстановитьПараметрыОбучения(Объект) + + ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения", Объект, Неопределено); + + МокитоСлужебный.Настройки().ПараметрыОбучения = ПараметрыОбучения; + МокитоСлужебный.ЗарегистрироватьПерехватОбъекта(Объект); + +КонецПроцедуры + +Процедура ЗарегистрироватьРеакцию(Действие) + + Действие.Вставить("Обработано", Ложь); + + ПараметрыОбучения().РеакцияТекущегоВыражения.Действие = Действие; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/МокитоОбучение/МокитоОбучение.mdo b/src/cfe/yaxunit/src/CommonModules/МокитоОбучение/МокитоОбучение.mdo new file mode 100644 index 0000000..bbbbe02 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/МокитоОбучение/МокитоОбучение.mdo @@ -0,0 +1,11 @@ + + + МокитоОбучение + + ru + Мокито обучение + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl b/src/cfe/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl new file mode 100644 index 0000000..1b80928 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl @@ -0,0 +1,272 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Проверить. +// Переводит мокито в режим проверки вызовов +// Параметры: +// Объект - Произвольный - Устанавливает проверяемый объект, вызовы методов которого будем проверять +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Проверить(Объект) Экспорт + + УстановитьПараметрыПроверки(Объект); + Возврат МокитоПроверки; + +КонецФункции + +// Количество вызовов. +// Считает вызовы метода по переданным параметрам +// Параметры: +// ИмяМетода - Строка - Имя метода проверяемого объекта +// - Произвольный - Вызов метода проверяемого объекта +// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода проверяемого объекта, необходим при указании имени метода +// Возвращаемое значение: +// ОбщийМодуль +Функция КоличествоВызовов(ИмяМетода = Неопределено, ПараметрыВызова = Неопределено) Экспорт + + Параметры = ПараметрыПроверки(); + + Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда + СтруктураВызоваМетода = ИмяМетода; + Иначе + СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова); + КонецЕсли; + + Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда + ВызватьИсключение "Установлен другой проверяемый объект"; + КонецЕсли; + + Параметры.СтруктураВызоваМетода = СтруктураВызоваМетода; + + Возврат МокитоПроверки; + +КонецФункции + +// Равно. +// Проверяет подобранные вызовы. Их количество должно быть равно переданному значение, иначе вызывается исключение +// Параметры: +// Количество - Число - Ожидаемое количество вызовов +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Равно(Количество, Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .ИмеетДлину(Количество); + + Возврат МокитоПроверки; + +КонецФункции + +// Больше. +// Проверяет подобранные вызовы. Их количество должно быть больше переданного значения, иначе вызывается исключение +// Параметры: +// Количество - Число +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Больше(Количество, Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .ИмеетДлинуБольше(Количество); + + Возврат МокитоПроверки; + +КонецФункции + +// Меньше. +// Проверяет подобранные вызовы. Их количество должно быть меньше переданного значения, иначе вызывается исключение +// Параметры: +// Количество - Число +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Меньше(Количество, Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .ИмеетДлинуМеньше(Количество); + + Возврат МокитоПроверки; + +КонецФункции + +// Заполнено. +// Проверяет, что есть вызовы метода, соответствующие условию +// Параметры: +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Заполнено(Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(Истина); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .Заполнено(); + + Возврат МокитоПроверки; + +КонецФункции + +// Пусто. +// Проверяет, что нет вызовов метода, соответствующих условию +// Параметры: +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Пусто(Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(Истина); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .НеЗаполнено(); + + Возврат МокитоПроверки; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#Область Параметры + +// Параметры проверки. +// +// Возвращаемое значение: +// Структура: +// * ПроверяемыйОбъект - Произвольный +// * СтруктураВызоваМетода - см. МокитоСлужебный.СтруктураВызоваМетода +Функция ПараметрыПроверки() + + Параметры = МокитоСлужебный.Настройки().ПараметрыПроверки; + + Возврат Параметры; + +КонецФункции + +Процедура УстановитьПараметрыПроверки(Объект = Неопределено, СтруктураВызоваМетода = Неопределено) + + ПараметрыОбучения = Новый Структура("ПроверяемыйОбъект, СтруктураВызоваМетода", Объект, СтруктураВызоваМетода); + + МокитоСлужебный.Настройки().ПараметрыПроверки = ПараметрыОбучения; + +КонецПроцедуры + +#КонецОбласти + +Функция СтатистикаВызовов(Первый = Ложь) + + Параметры = ПараметрыПроверки(); + СтруктураВызоваМетода = Параметры.СтруктураВызоваМетода; + + ВызовыМетода = МокитоСлужебный.СтатистикаВызовов(СтруктураВызоваМетода.Объект, СтруктураВызоваМетода.ИмяМетода); + + Если ВызовыМетода = Неопределено Тогда + Возврат Новый Массив(); + КонецЕсли; + + Если ЗначениеЗаполнено(СтруктураВызоваМетода.Параметры) Тогда + + Результат = Новый Массив(); + + Для Каждого ВызовМетода Из ВызовыМетода Цикл + + Если ВызовМетода.Параметры.Количество() < СтруктураВызоваМетода.Параметры.Количество() Тогда + ВызватьИсключение "Сигнатура метода содержит меньше параметров"; + КонецЕсли; + + КоличествоПараметров = СтруктураВызоваМетода.Параметры.Количество(); + Успешно = Истина; + + Для Инд = 0 По КоличествоПараметров - 1 Цикл + + Параметр = ВызовМетода.Параметры[Инд]; + Условие = СтруктураВызоваМетода.Параметры[Инд]; + + Если МокитоСлужебный.ЭтоМаскаПарамера(Условие) Тогда + Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие); + Иначе + Успешно = Параметр = Условие; + КонецЕсли; + + Если НЕ Успешно Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если Успешно Тогда + Результат.Добавить(ВызовМетода); + Если Первый Тогда + Прервать; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ВызовыМетода = Результат; + + КонецЕсли; + + Возврат ВызовыМетода; + +КонецФункции + +Функция ОписаниеПроверяемогоОбъекта() + + СтруктураВызоваМетода = ПараметрыПроверки().СтруктураВызоваМетода; + Объект = СтруктураВызоваМетода.Объект; + ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗнч(Объект)); + Возврат СтрШаблон(" - вызовы метода `%1(%2).%3`,", Объект, ПредставлениеТипа, СтруктураВызоваМетода.ИмяМетода); + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/МокитоПроверки/МокитоПроверки.mdo b/src/cfe/yaxunit/src/CommonModules/МокитоПроверки/МокитоПроверки.mdo new file mode 100644 index 0000000..cbc12b5 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/МокитоПроверки/МокитоПроверки.mdo @@ -0,0 +1,11 @@ + + + МокитоПроверки + + ru + Мокито проверки + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl b/src/cfe/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl new file mode 100644 index 0000000..0f2c290 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl @@ -0,0 +1,512 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Функция Включен() Экспорт + + Возврат ЮТКонтекст.ДанныеКонтекста() <> Неопределено; + +КонецФункции + +Процедура УстановитьРежим(Режим) Экспорт + + Контекст = Настройки(); + Контекст.Режим = Режим; + ОчиститьСлужебныеПараметры(); + +КонецПроцедуры + +Функция Настройки() Экспорт + + Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек()); + + Если Настройки = Неопределено Тогда + ВызватьИсключение "Что-то пошло не так, настройки Мокито не инициализированы"; + КонецЕсли; + + Возврат Настройки; + +КонецФункции + +#Область СтруктурыДанных + +Функция РежимыРаботы() Экспорт + + Режимы = Новый Структура(); + Режимы.Вставить("Обучение", "Обучение"); + Режимы.Вставить("Тестирование", "Тестирование"); + Режимы.Вставить("Проверка", "Проверка"); + + Возврат Новый ФиксированнаяСтруктура(Режимы); + +КонецФункции + +Функция ТипыДействийРеакций() Экспорт + + ТипыРеакций = Новый Структура(); + ТипыРеакций.Вставить("ВернутьРезультат", "ВернутьРезультат"); + ТипыРеакций.Вставить("ВыброситьИсключение", "ВыброситьИсключение"); + ТипыРеакций.Вставить("Пропустить", "Пропустить"); + ТипыРеакций.Вставить("ВызватьОсновнойМетод", "ВызватьОсновнойМетод"); + + Возврат Новый ФиксированнаяСтруктура(ТипыРеакций); + +КонецФункции + +#КонецОбласти + +Функция АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение) Экспорт + + ПрерватьВыполнение = Ложь; + + Если НЕ Включен() Тогда + Возврат Неопределено; + КонецЕсли; + + Настройки = Настройки(); + + ПараметрыПерехвата = ДанныеПерехвата(Объект); + + Если ПараметрыПерехвата = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + РежимыРаботы = РежимыРаботы(); + + СтруктураВызоваМетода = СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыМетода); + + Если Настройки.Режим = РежимыРаботы.Обучение ИЛИ Настройки.Режим = РежимыРаботы.Проверка Тогда + + ПрерватьВыполнение = Истина; + Возврат СтруктураВызоваМетода; + + ИначеЕсли Настройки.Режим = РежимыРаботы.Тестирование Тогда + + ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода); + Возврат ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение); + + КонецЕсли; + +КонецФункции + +// Структура вызова метода. +// +// Параметры: +// Объект - Произвольный - Объект, которому принадлежит метод +// ИмяМетода - Строка - Имя вызванного метода +// ПараметрыМетода - Массив из Произвольный - Набор параметров, с которыми был вызван метод +// +// Возвращаемое значение: +// Структура - Информация о вызове метода: +// * Объект - Произвольный - Объект, которому принадлежит метод +// * ИмяМетода - Строка - Имя вызванного метода +// * Параметры - Массив из Произвольный - Набор параметров, с которыми был вызван метод +// * Контекст - Строка - Контекст вызова метода +Функция СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыМетода) Экспорт + + Если ЭтоСтруктураВызоваМетода(Объект) Тогда + Возврат Объект; + КонецЕсли; + + СтруктураВызоваМетода = Новый Структура("Объект, ИмяМетода, Параметры", Объект, ИмяМетода, ПараметрыМетода); + СтруктураВызоваМетода.Вставить("Контекст"); + + Возврат СтруктураВызоваМетода; + +КонецФункции + +Функция ЭтоСтруктураВызоваМетода(Объект) Экспорт + + Возврат ТипЗнч(Объект) = Тип("Структура"); + +КонецФункции + +#Область Предикаты + +Функция ТипыУсловийПараметров() Экспорт + + Типы = Новый Структура; + Типы.Вставить("Любой", "Любой"); + Типы.Вставить("Значение", "Значение"); + Типы.Вставить("Тип", "Тип"); + Типы.Вставить("ОписаниеТипа", "ОписаниеТипа"); + + Возврат Новый ФиксированнаяСтруктура(Типы); + +КонецФункции + +Функция ОписаниеМаскиПараметра(ТипУсловия, Приоритет) Экспорт + + МаскаПараметра = Новый Структура("МаскаСопоставленияПараметров", Истина); + МаскаПараметра.Вставить("Режим", ТипУсловия); + МаскаПараметра.Вставить("Приоритет", Приоритет); + + Возврат МаскаПараметра; + +КонецФункции + +Функция ЭтоМаскаПарамера(Параметр) Экспорт + + Возврат ТипЗнч(Параметр) = Тип("Структура") И Параметр.Свойство("МаскаСопоставленияПараметров") И Параметр.МаскаСопоставленияПараметров; + +КонецФункции + +Функция ПроверитьПараметр(Параметр, Условие) Экспорт + + ТипыУсловий = ТипыУсловийПараметров(); + Совпадает = Ложь; + + Если Условие.Режим = ТипыУсловий.Любой Тогда + + Совпадает = Истина; + + ИначеЕсли Условие.Режим = ТипыУсловий.Значение Тогда + + Совпадает = Условие.Значение = Параметр; + + ИначеЕсли Условие.Режим = ТипыУсловий.Тип Тогда + + Совпадает = Условие.Тип = ТипЗнч(Параметр); + + ИначеЕсли Условие.Режим = ТипыУсловий.ОписаниеТипа Тогда + + Совпадает = Условие.Тип.СодержитТип(ТипЗнч(Параметр)); + + КонецЕсли; + + Возврат Совпадает; + +КонецФункции + +#КонецОбласти + +#Область Перехват + +Функция ПараметрыПерехвата() Экспорт + + Возврат Настройки().Перехват; + +КонецФункции + +// Данные перехвата. +// +// Параметры: +// Объект - Произвольный +// +// Возвращаемое значение: +// см. МокитоСлужебный.ОписаниеПараметровПерехватаОбъекта +Функция ДанныеПерехвата(Объект) Экспорт + + ПараметрыПерехвата = ПараметрыПерехвата(); + + Если ТипЗнч(Объект) = Тип("Структура") Тогда + Ключ = Объект.Объект; + Иначе + Ключ = Объект; + КонецЕсли; + + ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ]; + + Если ПараметрыПерехватаОбъекта = Неопределено И ЭтоОбъект(Ключ) Тогда + ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ.Ссылка]; + + Если ПараметрыПерехватаОбъекта = Неопределено Тогда + + ПолноеИмя = СтрРазделить(Ключ.Метаданные().ПолноеИмя(), "."); + + Менеджер = Новый(СтрШаблон("%1Менеджер.%2", ПолноеИмя[0], ПолноеИмя[1])); + ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Менеджер]; + + КонецЕсли; + + КонецЕсли; + + Возврат ПараметрыПерехватаОбъекта; + +КонецФункции + +Процедура ЗарегистрироватьПерехватОбъекта(Знач Объект) Экспорт + + Если ЭтоОбъект(Объект) Тогда + Объект = Объект.Ссылка; + КонецЕсли; + + ПараметрыПерехвата = ПараметрыПерехвата(); + ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект)); + +КонецПроцедуры + +Функция ОписаниеПараметровПерехватаОбъекта(Объект) Экспорт + + Возврат Новый Структура("Объект, Методы", Объект, Новый Структура); + +КонецФункции + +#КонецОбласти + +Функция СтатистикаВызовов(Знач Объект, ИмяМетода) Экспорт + + Если ЭтоОбъект(Объект) Тогда + Объект = Объект.Ссылка; + КонецЕсли; + + Статистика = Настройки().Статистика.Вызовы[Объект]; + + Если Статистика = Неопределено ИЛИ НЕ Статистика.Свойство(ИмяМетода) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Статистика[ИмяМетода]; + +КонецФункции + +#Область ОбработчикиСобытий + +Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт + + ИнициализироватьНастройки(); + +КонецПроцедуры + +Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт + + ОчиститьНастройки(); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#Область ОбработкаВызовов + +// Зарегистрировать вызов метода. +// +// Параметры: +// Настройки - см. ИнициализироватьНастройки +// ПараметрыПерехвата - см. ДанныеПерехвата +// СтруктураВызоваМетода - см. СтруктураВызоваМетода +Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода) + + Объект = ПараметрыПерехвата.Объект; + ИмяМетода = СтруктураВызоваМетода.ИмяМетода; + Статистика = Настройки.Статистика.Вызовы[Объект]; + + Если Статистика = Неопределено Тогда + + Статистика = Новый Структура; + Настройки.Статистика.Вызовы.Вставить(Объект, Статистика); + + КонецЕсли; + + Если НЕ Статистика.Свойство(ИмяМетода) Тогда + + Статистика.Вставить(ИмяМетода, Новый Массив); + + КонецЕсли; + + Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода); + +КонецПроцедуры + +Функция ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение) + + Если НЕ ПараметрыПерехвата.Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыПерехватаМетода = ПараметрыПерехвата.Методы[СтруктураВызоваМетода.ИмяМетода]; + + Реакция = НайтиРеакцию(ПараметрыПерехватаМетода, СтруктураВызоваМетода); + + Если Реакция = Неопределено ИЛИ Реакция.Действие = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ПрерватьВыполнение = Истина; + + ТипыДействий = ТипыДействийРеакций(); + + Если Реакция.Действие.ТипДействия = ТипыДействий.ВернутьРезультат Тогда + + Реакция.Действие.Обработано = Истина; + Возврат Реакция.Действие.Результат; + + ИначеЕсли Реакция.Действие.ТипДействия = ТипыДействий.ВыброситьИсключение Тогда + + Реакция.Действие.Обработано = Истина; + ВызватьИсключение Реакция.Действие.Ошибка; + + ИначеЕсли Реакция.Действие.ТипДействия = ТипыДействий.Пропустить Тогда + + Реакция.Действие.Обработано = Истина; + Возврат Неопределено; + + ИначеЕсли Реакция.Действие.ТипДействия = ТипыДействий.ВызватьОсновнойМетод Тогда + + Реакция.Действие.Обработано = Истина; + ПрерватьВыполнение = Ложь; + + Иначе + + ВызватьИсключение "Неизвестный тип действия реакции"; + + КонецЕсли; + +КонецФункции + +#КонецОбласти + +Функция НайтиРеакцию(ПараметрыПерехватаМетода, СтруктураВызоваМетода) + + Реакция = Неопределено; + Приоритет = 0; + ПараметрыВызова = СтруктураВызоваМетода.Параметры; + + Для Каждого ВозможнаяРеакция Из ПараметрыПерехватаМетода.Реакции Цикл + + ПриоритетВозможнойРеакции = ПроверитьРеакцию(ВозможнаяРеакция, ПараметрыВызова); + + Если ПриоритетВозможнойРеакции > Приоритет Тогда + + Реакция = ВозможнаяРеакция; + Приоритет = ПриоритетВозможнойРеакции; + + КонецЕсли; + + КонецЦикла; + + Возврат Реакция; + +КонецФункции + +Функция ПроверитьРеакцию(Реакция, ПараметрыМетода) + + Приоритет = 1; + + Если Реакция.УсловиеРеакции = Неопределено Тогда + Возврат Приоритет; + КонецЕсли; + + Для Инд = 0 По Реакция.УсловиеРеакции.ВГраница() Цикл + + Если НЕ ПроверитьПараметр(ПараметрыМетода[Инд], Реакция.УсловиеРеакции[Инд]) Тогда + + Возврат 0; + + КонецЕсли; + + Приоритет = Приоритет + Реакция.УсловиеРеакции[Инд].Приоритет; + + КонецЦикла; + + Возврат Приоритет; + +КонецФункции + +#Область Настройки + +Процедура ИнициализироватьНастройки() Экспорт + + Настройки = Новый Структура; + Настройки.Вставить("Метод"); + Настройки.Вставить("Реакция"); + Настройки.Вставить("Настройки"); + Настройки.Вставить("Перехват", Новый Соответствие); + Настройки.Вставить("Режим", "НеУстановлен"); + Настройки.Вставить("Статистика", Новый Структура("Вызовы", Новый Соответствие)); + + Настройки.Вставить("ПараметрыОбучения", Неопределено); + Настройки.Вставить("ПараметрыПроверки", Неопределено); + + ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Настройки); + +КонецПроцедуры + +Процедура ОчиститьНастройки() Экспорт + + ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Неопределено); + +КонецПроцедуры + +Процедура СброситьПараметры() Экспорт + + ИнициализироватьНастройки(); + +КонецПроцедуры + +Функция КлючНастроек() + + Возврат "Mockito"; + +КонецФункции + +Процедура ОчиститьСлужебныеПараметры() + + Настройки = Настройки(); + + Настройки.ПараметрыОбучения = Неопределено; + Настройки.ПараметрыПроверки = Неопределено; + +КонецПроцедуры + +#КонецОбласти + +Функция ЭтоСсылка(Значение) Экспорт + + Если Значение <> Неопределено Тогда + + ТипыСсылок = ЮТОбщий.ОписаниеТиповЛюбаяСсылка(); + Результат = ТипыСсылок.СодержитТип(ТипЗнч(Значение)); + + Иначе + + Результат = Ложь; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ЭтоОбъект(Значение) Экспорт + + Если Значение <> Неопределено И ЮТОбщий.ПеременнаяСодержитСвойство(Значение, "Ссылка") Тогда + + Возврат ЭтоСсылка(Значение.Ссылка); + + Иначе + + Результат = Ложь; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/МокитоСлужебный/МокитоСлужебный.mdo b/src/cfe/yaxunit/src/CommonModules/МокитоСлужебный/МокитоСлужебный.mdo new file mode 100644 index 0000000..d562e12 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/МокитоСлужебный/МокитоСлужебный.mdo @@ -0,0 +1,11 @@ + + + МокитоСлужебный + + ru + Мокито служебный + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/src/cfe/yaxunit/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl new file mode 100644 index 0000000..1d79c08 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -0,0 +1,1547 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2022, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину. +// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы, +// рекомендуется использовать функцию платформы СтрРазделить. +// +// Параметры: +// Значение - Строка - текст с разделителями. +// Разделитель - Строка - разделитель строк текста, минимум 1 символ. +// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. +// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: +// > для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// включаются в результат; +// > если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а +// при других разделителях результатом функции будет пустой массив. +// СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок. +// +// Возвращаемое значение: +// Массив из Строка +// +// Пример: +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") +// - возвратит массив из 5 элементов, три из которых - пустые: "", "один", "", "два", ""; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) +// - возвратит массив из двух элементов: "один", "два"; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один два ", " ") +// - возвратит массив из двух элементов: "один", "два"; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("") +// - возвратит пустой массив; +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь) +// - возвратит массив с одним элементом: ""(пустая строка); +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ") +// - возвратит массив с одним элементом: "" (пустая строка). +// +Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, + СокращатьНепечатаемыеСимволы = Ложь) Экспорт + + Если СтрДлина(Разделитель) = 1 + И ПропускатьПустыеСтроки = Неопределено + И СокращатьНепечатаемыеСимволы Тогда + + Результат = СтрРазделить(Значение, Разделитель, Ложь); + Для Индекс = 0 По Результат.ВГраница() Цикл + Результат[Индекс] = СокрЛП(Результат[Индекс]) + КонецЦикла; + Возврат Результат; + + КонецЕсли; + + Результат = Новый Массив; + + // Для обеспечения обратной совместимости. + Если ПропускатьПустыеСтроки = Неопределено Тогда + ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); + Если ПустаяСтрока(Значение) Тогда + Если Разделитель = " " Тогда + Результат.Добавить(""); + КонецЕсли; + Возврат Результат; + КонецЕсли; + КонецЕсли; + // + + Позиция = СтрНайти(Значение, Разделитель); + Пока Позиция > 0 Цикл + Подстрока = Лев(Значение, Позиция - 1); + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда + Если СокращатьНепечатаемыеСимволы Тогда + Результат.Добавить(СокрЛП(Подстрока)); + Иначе + Результат.Добавить(Подстрока); + КонецЕсли; + КонецЕсли; + Значение = Сред(Значение, Позиция + СтрДлина(Разделитель)); + Позиция = СтрНайти(Значение, Разделитель); + КонецЦикла; + + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда + Если СокращатьНепечатаемыеСимволы Тогда + Результат.Добавить(СокрЛП(Значение)); + Иначе + Результат.Добавить(Значение); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Определяет, является ли символ разделителем. +// +// Параметры: +// КодСимвола - Число - код проверяемого символа; +// РазделителиСлов - Строка - символы разделителей. Если параметр не указан, то +// разделителем считаются все символы, не являющиеся цифрами, +// латинскими и кириллическими буквами, а также знаком подчеркивания. +// +// Возвращаемое значение: +// Булево - Истина, если символ с кодом КодСимвола является разделителем. +// +Функция ЭтоРазделительСлов(КодСимвола, РазделителиСлов = Неопределено) Экспорт + + Если РазделителиСлов <> Неопределено Тогда + Возврат СтрНайти(РазделителиСлов, Символ(КодСимвола)) > 0; + КонецЕсли; + + Диапазоны = Новый Массив; + Диапазоны.Добавить(Новый Структура("Мин,Макс", 48, 57)); // цифры + Диапазоны.Добавить(Новый Структура("Мин,Макс", 65, 90)); // латиница большие + Диапазоны.Добавить(Новый Структура("Мин,Макс", 97, 122)); // латиница маленькие + Диапазоны.Добавить(Новый Структура("Мин,Макс", 1040, 1103)); // кириллица + Диапазоны.Добавить(Новый Структура("Мин,Макс", 1025, 1025)); // символ "Ё" + Диапазоны.Добавить(Новый Структура("Мин,Макс", 1105, 1105)); // символ "ё" + Диапазоны.Добавить(Новый Структура("Мин,Макс", 95, 95)); // символ "_" + + Для Каждого Диапазон Из Диапазоны Цикл + Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Разбивает строку на несколько строк, используя заданный набор разделителей. +// Если параметр РазделителиСлов не задан, то разделителем слов считается любой из символов, +// не относящихся к символам латиницы, кириллицы, цифры, подчеркивания. +// +// Параметры: +// Значение - Строка - исходная строка, которую необходимо разложить на слова. +// РазделителиСлов - Строка - перечень символов-разделителей. Например, ".,;". +// +// Возвращаемое значение: +// Массив - список слов. +// +// Пример: +// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три") возвратит массив значений: "один", +// "два2_", "три"; СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три", "#@!_") возвратит массив +// значений: "один-", "два2", "три". +// +Функция РазложитьСтрокуВМассивСлов(Знач Значение, РазделителиСлов = Неопределено) Экспорт + + Слова = Новый Массив; + + РазмерТекста = СтрДлина(Значение); + НачалоСлова = 1; + Для Позиция = 1 По РазмерТекста Цикл + КодСимвола = КодСимвола(Значение, Позиция); + Если ЭтоРазделительСлов(КодСимвола, РазделителиСлов) Тогда + Если Позиция <> НачалоСлова Тогда + Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова)); + КонецЕсли; + НачалоСлова = Позиция + 1; + КонецЕсли; + КонецЦикла; + + Если Позиция <> НачалоСлова Тогда + Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова)); + КонецЕсли; + + Возврат Слова; + +КонецФункции + +// Подставляет параметры в строку. Максимально возможное число параметров - 9. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. +// +// Параметры: +// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", +// например "%1 пошел в %2"); +// Параметр1 - Строка - значение подставляемого параметра. +// Параметр2 - Строка +// Параметр3 - Строка +// Параметр4 - Строка +// Параметр5 - Строка +// Параметр6 - Строка +// Параметр7 - Строка +// Параметр8 - Строка +// Параметр9 - Строка +// +// Возвращаемое значение: +// Строка - текстовая строка с подставленными параметрами. +// +// Пример: +// СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел +// в Зоопарк". +// +Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт + + ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%") + Или СтрНайти(Параметр2, "%") + Или СтрНайти(Параметр3, "%") + Или СтрНайти(Параметр4, "%") + Или СтрНайти(Параметр5, "%") + Или СтрНайти(Параметр6, "%") + Или СтрНайти(Параметр7, "%") + Или СтрНайти(Параметр8, "%") + Или СтрНайти(Параметр9, "%"); + + Если ЕстьПараметрыСПроцентом Тогда + Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1, + Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); + КонецЕсли; + + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8); + ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9); + Возврат ШаблонСтроки; + +КонецФункции + +// Подставляет параметры в строку. Число параметров в строке не ограничено. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров +// начинается с единицы. +// +// Параметры: +// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", +// например "%1 пошел в %2"); +// Параметры - Массив - значения параметров в строке ШаблонСтроки. +// +// Возвращаемое значение: +// Строка - строка с подставленными значениями параметрами. +// +// Пример: +// ЗначенияПараметров = Новый Массив; +// ЗначенияПараметров.Добавить("Вася"); +// ЗначенияПараметров.Добавить("Зоопарк"); +// Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(НСтр("ru='%1 пошел в %2'"), ЗначенияПараметров); +// - вернет строку "Вася пошел в Зоопарк". +// +Функция ПодставитьПараметрыВСтрокуИзМассива(Знач ШаблонСтроки, Знач Параметры) Экспорт + + СтрокаРезультата = ШаблонСтроки; + + Индекс = Параметры.Количество(); + Пока Индекс > 0 Цикл + Значение = Параметры[Индекс-1]; + Если Не ПустаяСтрока(Значение) Тогда + СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%" + Формат(Индекс, "ЧГ="), Значение); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Возврат СтрокаРезультата; + +КонецФункции + +// Заменяет в шаблоне строки имена параметров на их значения. Параметры в строке выделяются с двух сторон квадратными +// скобками. +// +// Параметры: +// ШаблонСтроки - Строка - строка, в которую необходимо вставить значения. +// Параметры - Структура - подставляемые значения параметров, где ключ - имя параметра без спецсимволов, +// значение - вставляемое значение. +// +// Возвращаемое значение: +// Строка - строка со вставленными значениями. +// +// Пример: +// Значения = Новый Структура("Фамилия,Имя", "Пупкин", "Вася"); +// Результат = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Значения); +// - возвращает: "Здравствуй, Вася Пупкин". +// +Функция ВставитьПараметрыВСтроку(Знач ШаблонСтроки, Знач Параметры) Экспорт + Результат = ШаблонСтроки; + Для Каждого Параметр Из Параметры Цикл + Результат = СтрЗаменить(Результат, "[" + Параметр.Ключ + "]", Параметр.Значение); + КонецЦикла; + Возврат Результат; +КонецФункции + +// Получает значения параметров из строки. +// +// Параметры: +// СтрокаПараметров - Строка - строка, содержащая параметры, каждый из которых представляет собой +// фрагмент вида <Имя параметра>=<Значение>, где: +// Имя параметра - имя параметра; +// Значение - его значение. +// Фрагменты отделяются друг от друга символами ';'. +// Если значение содержит пробельные символы, то оно должно быть заключено в двойные +// кавычки ("). +// Например: +// "File=""c:\InfoBases\Trade""; Usr=""Director"";" +// Разделитель - Строка - символ, которым фрагменты отделяются друг от друга. +// +// Возвращаемое значение: +// Структура - значения параметров, где ключ - имя параметра, значение - значение параметра. +// +// Пример: +// Результат = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки("File=""c:\InfoBases\Trade""; Usr=""Director"";""", ";"); +// - вернет структуру: +// ключ "File" и значение "c:\InfoBases\Trade" +// ключ "Usr" и значение "Director". +// +Функция ПараметрыИзСтроки(Знач СтрокаПараметров, Знач Разделитель = ";") Экспорт + Результат = Новый Структура; + + ОписаниеПараметра = ""; + НайденоНачалоСтроки = Ложь; + НомерПоследнегоСимвола = СтрДлина(СтрокаПараметров); + Для НомерСимвола = 1 По НомерПоследнегоСимвола Цикл + Символ =Сред(СтрокаПараметров, НомерСимвола, 1); + Если Символ = """" Тогда + НайденоНачалоСтроки = Не НайденоНачалоСтроки; + КонецЕсли; + Если Символ <> Разделитель Или НайденоНачалоСтроки Тогда + ОписаниеПараметра = ОписаниеПараметра + Символ; + КонецЕсли; + Если Символ = Разделитель И Не НайденоНачалоСтроки Или НомерСимвола = НомерПоследнегоСимвола Тогда + Позиция = СтрНайти(ОписаниеПараметра, "="); + Если Позиция > 0 Тогда + ИмяПараметра = СокрЛП(Лев(ОписаниеПараметра, Позиция - 1)); + ЗначениеПараметра = СокрЛП(Сред(ОписаниеПараметра, Позиция + 1)); + ЗначениеПараметра = СократитьДвойныеКавычки(ЗначениеПараметра); + Результат.Вставить(ИмяПараметра, ЗначениеПараметра); + КонецЕсли; + ОписаниеПараметра = ""; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Проверяет, содержит ли строка только цифры. +// +// Параметры: +// Значение - Строка - проверяемая строка. +// Устаревший - Булево - устаревший параметр, не используется. +// ПробелыЗапрещены - Булево - если Ложь, то в строке допустимо наличие пробелов. +// +// Возвращаемое значение: +// Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы. +// +// Пример: +// Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("0123"); // Истина +// Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("0123abc"); // Ложь +// Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("01 2 3",, Ложь); // Истина +// +Функция ТолькоЦифрыВСтроке(Знач Значение, Знач Устаревший = Истина, Знач ПробелыЗапрещены = Истина) Экспорт + + Если ТипЗнч(Значение) <> Тип("Строка") Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ПробелыЗапрещены Тогда + Значение = СтрЗаменить(Значение, " ", ""); + КонецЕсли; + + Если СтрДлина(Значение) = 0 Тогда + Возврат Истина; + КонецЕсли; + + // Если содержит только цифры, то в результате замен должна быть получена пустая строка. + // Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы. + Возврат СтрДлина( + СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( + СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( + Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0; + +КонецФункции + +// Проверяет, содержит ли строка только символы латинского алфавита. +// +// Параметры: +// СтрокаПроверки - Строка - проверяемая строка. +// УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением. +// ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме латиницы. +// +// Возвращаемое значение: +// Булево - Истина, если строка содержит только латинские (или допустимые) символы; +// Ложь, если строка содержит иные символы. +// +Функция ТолькоЛатиницаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт + + Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда + Возврат Истина; + КонецЕсли; + + КодыДопустимыхСимволов = Новый Массив; + + Для Индекс = 1 По СтрДлина(ДопустимыеСимволы) Цикл + КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, Индекс, 1))); + КонецЦикла; + + Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл + КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1)); + Если ((КодСимвола < 65) Или (КодСимвола > 90 И КодСимвола < 97) Или (КодСимвола > 122)) + И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено) + И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Удаляет двойные кавычки с начала и конца строки, если они есть. +// +// Параметры: +// Значение - Строка - входная строка. +// +// Возвращаемое значение: +// Строка - строка без двойных кавычек. +// +Функция СократитьДвойныеКавычки(Знач Значение) Экспорт + + Пока СтрНачинаетсяС(Значение, """") Цикл + Значение = Сред(Значение, 2); + КонецЦикла; + + Пока СтрЗаканчиваетсяНа(Значение, """") Цикл + Значение = Лев(Значение, СтрДлина(Значение) - 1); + КонецЦикла; + + Возврат Значение; + +КонецФункции + +// Удаляет из строки указанное количество символов справа. +// +// Параметры: +// Текст - Строка - строка, в которой необходимо удалить последние символы; +// ЧислоСимволов - Число - количество удаляемых символов. +// +Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов = 1) Экспорт + + Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов); + +КонецПроцедуры + +// Проверяет, является ли строка уникальным идентификатором. +// В качестве уникального идентификатора предполагается строка вида +// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f]. +// +// Параметры: +// Значение - Строка - проверяемая строка. +// +// Возвращаемое значение: +// Булево - Истина, если переданная строка является уникальным идентификатором. +// +Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт + + Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; + + Если СтрДлина(Шаблон) <> СтрДлина(Значение) Тогда + Возврат Ложь; + КонецЕсли; + Для Позиция = 1 По СтрДлина(Значение) Цикл + Если КодСимвола(Шаблон, Позиция) = 88 // X + И ((КодСимвола(Значение, Позиция) < 48 Или КодСимвола(Значение, Позиция) > 57) // 0..9 + И (КодСимвола(Значение, Позиция) < 97 Или КодСимвола(Значение, Позиция) > 102) // a..f + И (КодСимвола(Значение, Позиция) < 65 Или КодСимвола(Значение, Позиция) > 70)) // A..F + Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Значение, Позиция) <> 45 Тогда // - + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Формирует строку повторяющихся символов заданной длины. +// +// Параметры: +// Символ - Строка - символ, из которого будет формироваться строка. +// ДлинаСтроки - Число - требуемая длина результирующей строки. +// +// Возвращаемое значение: +// Строка - строка, состоящая из повторяющихся символов. +// +Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт + + Результат = ""; + Для Счетчик = 1 По ДлинаСтроки Цикл + Результат = Результат + Символ; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Дополняет строку символами слева или справа до заданной длины и возвращает ее. +// При этом удаляются незначащие символы слева и справа (подробнее про незначащие символы +// см. синтакс-помощник к методу платформы СокрЛП). +// По умолчанию функция дополняет строку символами "0" (ноль) слева. +// +// Параметры: +// Значение - Строка - исходная строка, которую необходимо дополнить символами; +// ДлинаСтроки - Число - требуемая результирующая длина строки; +// Символ - Строка - символ, которым необходимо дополнить строку; +// Режим - Строка - "Слева" или "Справа" - вариант добавления символов к исходной строке. +// +// Возвращаемое значение: +// Строка - строка, дополненная символами. +// +// Пример: +// 1. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку("1234", 10, "0", "Слева"); +// Возвращает: "0000001234". +// +// 2. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(" 1234 ", 10, "#", "Справа"); +// Строка = " 1234 "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа" +// Возвращает: "1234######". +// +Функция ДополнитьСтроку(Знач Значение, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт + + // Длина символа не должна превышать единицы. + Символ = Лев(Символ, 1); + + // Удаляем крайние пробелы слева и справа строки. + Значение = СокрЛП(Значение); + КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Значение); + + Если КоличествоСимволовНадоДобавить > 0 Тогда + + СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить); + Если ВРег(Режим) = "СЛЕВА" Тогда + Значение = СтрокаДляДобавления + Значение; + ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда + Значение = Значение + СтрокаДляДобавления; + КонецЕсли; + + КонецЕсли; + + Возврат Значение; + +КонецФункции + +// Удаляет крайние повторяющиеся символы слева или справа в строке. +// +// Параметры: +// Значение - Строка - исходная строка, из которой необходимо удалить крайние повторяющиеся символы; +// УдаляемыйСимвол - Строка - искомый символ для удаления; +// Режим - Строка - "Слева" или "Справа" - режим удаления символов в исходной строке. +// +// Возвращаемое значение: +// Строка - обрезанная строка. +// +Функция УдалитьПовторяющиесяСимволы(Знач Значение, Знач УдаляемыйСимвол, Знач Режим = "Слева") Экспорт + + Если ВРег(Режим) = "СЛЕВА" Тогда + Пока Лев(Значение, 1) = УдаляемыйСимвол Цикл + Значение = Сред(Значение, 2); + КонецЦикла; + ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда + Пока Прав(Значение, 1) = УдаляемыйСимвол Цикл + Значение = Лев(Значение, СтрДлина(Значение) - 1); + КонецЦикла; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +// Выполняет замену символов в строке. +// Предназначена для простых случаев - например, для замены латиницы на похожие кириллические символы. +// +// Параметры: +// ЗаменяемыеСимволы - Строка - строка символов, каждый из которых требует замены; +// Значение - Строка - исходная строка, в которой требуется замена символов; +// СимволыЗамены - Строка - строка символов, на каждый из которых нужно заменить символы параметра +// ЗаменяемыеСимволы. +// +// Возвращаемое значение: +// Строка - строка после замены символов. +// +Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Значение, СимволыЗамены) Экспорт + + Результат = Значение; + + Для НомерСимвола = 1 По СтрДлина(ЗаменяемыеСимволы) Цикл + Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, НомерСимвола, 1), Сред(СимволыЗамены, НомерСимвола, 1)); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Выполняет преобразование арабского числа в римское. +// +// Параметры: +// АрабскоеЧисло - Число - число, целое, от 0 до 999; +// ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу. +// +// Возвращаемое значение: +// Строка - число в римской нотации. +// +// Пример: +// СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВРимскуюНотацию(17) = "ХVII". +// +Функция ПреобразоватьЧислоВРимскуюНотацию(АрабскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт + + РимскоеЧисло = ""; + АрабскоеЧисло = ДополнитьСтроку(АрабскоеЧисло, 3); + + Если ИспользоватьКириллицу Тогда + c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 ="С"; c500 = "Д"; c1000 = "М"; + + Иначе + c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 ="C"; c500 = "D"; c1000 = "M"; + + КонецЕсли; + + Единицы = Число(Сред(АрабскоеЧисло, 3, 1)); + Десятки = Число(Сред(АрабскоеЧисло, 2, 1)); + Сотни = Число(Сред(АрабскоеЧисло, 1, 1)); + + РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Сотни, c100, c500, c1000); + РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Десятки, c10, c50, c100); + РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Единицы, c1, c5, c10); + + Возврат РимскоеЧисло; + +КонецФункции + +// Выполняет преобразование римского числа в арабское. +// +// Параметры: +// РимскоеЧисло - Строка - число, записанное римскими цифрами; +// ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу. +// +// Возвращаемое значение: +// Число - преобразованное число. +// +// Пример: +// СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВАрабскуюНотацию("ХVII") = 17. +// +Функция ПреобразоватьЧислоВАрабскуюНотацию(РимскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт + + АрабскоеЧисло = 0; + + Если ИспользоватьКириллицу Тогда + c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 ="С"; c500 = "Д"; c1000 = "М"; + Иначе + c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 ="C"; c500 = "D"; c1000 = "M"; + КонецЕсли; + + РимскоеЧисло = СокрЛП(РимскоеЧисло); + ЧислоСимволов = СтрДлина(РимскоеЧисло); + + Для Сч = 1 По ЧислоСимволов Цикл + Если Сред(РимскоеЧисло,Сч,1) = c1000 Тогда + АрабскоеЧисло = АрабскоеЧисло+1000; + ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c500 Тогда + АрабскоеЧисло = АрабскоеЧисло+500; + ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c100 Тогда + Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c500) Или (Сред(РимскоеЧисло,Сч+1,1) = c1000)) Тогда + АрабскоеЧисло = АрабскоеЧисло-100; + Иначе + АрабскоеЧисло = АрабскоеЧисло+100; + КонецЕсли; + ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c50 Тогда + АрабскоеЧисло = АрабскоеЧисло+50; + ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c10 Тогда + Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c50) Или (Сред(РимскоеЧисло,Сч+1,1) = c100)) Тогда + АрабскоеЧисло = АрабскоеЧисло-10; + Иначе + АрабскоеЧисло = АрабскоеЧисло+10; + КонецЕсли; + ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c5 Тогда + АрабскоеЧисло = АрабскоеЧисло+5; + ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c1 Тогда + Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c5) Или (Сред(РимскоеЧисло,Сч+1,1) = c10)) Тогда + АрабскоеЧисло = АрабскоеЧисло-1; + Иначе + АрабскоеЧисло = АрабскоеЧисло+1; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат АрабскоеЧисло; + +КонецФункции + +// Очищает текст в формате HTML от тегов и возвращает неформатированный текст. +// +// Параметры: +// ИсходныйТекст - Строка - текст в формате HTML. +// +// Возвращаемое значение: +// Строка - текст, очищенный от тегов, скриптов и заголовков. +// +Функция ИзвлечьТекстИзHTML(Знач ИсходныйТекст) Экспорт + Результат = ""; + + Текст = НРег(ИсходныйТекст); + + // отрезаем все что не body + Позиция = СтрНайти(Текст, " 0 Тогда + Текст = Сред(Текст, Позиция + 5); + ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 5); + Позиция = СтрНайти(Текст, ">"); + Если Позиция > 0 Тогда + Текст = Сред(Текст, Позиция + 1); + ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1); + КонецЕсли; + КонецЕсли; + + Позиция = СтрНайти(Текст, ""); + Если Позиция > 0 Тогда + Текст = Лев(Текст, Позиция - 1); + ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1); + КонецЕсли; + + // вырезаем скрипты + Позиция = СтрНайти(Текст, " 0 Цикл + ПозицияЗакрывающегоТега = СтрНайти(Текст, ""); + Если ПозицияЗакрывающегоТега = 0 Тогда + // Не найден закрывающий тег - вырезаем оставшийся текст. + ПозицияЗакрывающегоТега = СтрДлина(Текст); + КонецЕсли; + Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 9); + ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 9); + Позиция = СтрНайти(Текст, " 0 Цикл + ПозицияЗакрывающегоТега = СтрНайти(Текст, ""); + Если ПозицияЗакрывающегоТега = 0 Тогда + // Не найден закрывающий тег - вырезаем оставшийся текст. + ПозицияЗакрывающегоТега = СтрДлина(Текст); + КонецЕсли; + Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 8); + ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 8); + Позиция = СтрНайти(Текст, " 0 Цикл + Результат = Результат + Лев(ИсходныйТекст, Позиция-1); + Текст = Сред(Текст, Позиция + 1); + ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1); + Позиция = СтрНайти(Текст, ">"); + Если Позиция > 0 Тогда + Текст = Сред(Текст, Позиция + 1); + ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1); + КонецЕсли; + Позиция = СтрНайти(Текст, "<"); + КонецЦикла; + Результат = Результат + ИсходныйТекст; + МассивСтрок = РазложитьСтрокуВМассивПодстрок(Результат, Символы.ПС, Истина, Истина); + Возврат СокрЛП(СтрСоединить(МассивСтрок, Символы.ПС)); +КонецФункции + +// Преобразует исходную строку в число без вызова исключений. +// +// Параметры: +// Значение - Строка - строка, которую необходимо привести к числу. +// Например, "10", "+10", "010", вернет 10; +// "(10)", "-10",вернет -10; +// "10,2", "10.2",вернет 10.2; +// "000", " ", "",вернет 0; +// "10текст", вернет Неопределено. +// +// Возвращаемое значение: +// Число, Неопределено - полученное число, либо Неопределено, если строка не является числом. +// +Функция СтрокаВЧисло(Знач Значение) Экспорт + + Значение = СтрЗаменить(Значение, " ", ""); + Если СтрНачинаетсяС(Значение, "(") Тогда + Значение = СтрЗаменить(Значение, "(", "-"); + Значение = СтрЗаменить(Значение, ")", ""); + КонецЕсли; + + СтрокаБезНулей = СтрЗаменить(Значение, "0", ""); + Если ПустаяСтрока(СтрокаБезНулей) Или СтрокаБезНулей = "-" Тогда + Возврат 0; + КонецЕсли; + + ТипЧисло = Новый ОписаниеТипов("Число"); + Результат = ТипЧисло.ПривестиЗначение(Значение); + + Возврат ?(Результат <> 0 И Не ПустаяСтрока(СтрокаБезНулей), Результат, Неопределено); + +КонецФункции + +// Преобразует исходную строку в дату. +// Если дату не удалось распознать, то возвращается пустая дата (01.01.01 00:00:00). +// +// Параметры: +// Значение - Строка - строка, которую необходимо привести к дате. +// Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ" или "ДД-ММ-ГГ ЧЧ:ММ:CC", +// Например, "23.02.1980" или "23/02/80 09:15:45". +// ЧастьДаты - ЧастиДаты - определяет допустимые части даты. По умолчанию, ЧастиДаты.Дата. +// +// Возвращаемое значение: +// Дата - полученная дата. +// +Функция СтрокаВДату(Знач Значение, ЧастьДаты = Неопределено) Экспорт + + НаборЦифр = "1234567890"; + + Если ТипЗнч(ЧастьДаты) <> Тип("ЧастиДаты") Тогда + ЧастьДаты = ЧастиДаты.Дата; + КонецЕсли; + + ПараметрыДаты = Новый КвалификаторыДаты(ЧастьДаты); + ОписаниеТипаДата = Новый ОписаниеТипов("Дата",,, ПараметрыДаты); + + Значение = ВРег(СтрСоединить(СтрРазделить(СокрЛП(Значение), Символы.НПП + Символы.ПС + Символы.Таб), " ")); + Результат = ОписаниеТипаДата.ПривестиЗначение(Значение); + + Для НомерМесяца = 1 По 12 Цикл + Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=MMММ")), Формат(НомерМесяца, "ЧЦ=2; ЧВН=")); + Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=MMM")), Формат(НомерМесяца, "ЧЦ=2; ЧВН=")); + КонецЦикла; + + МассивНеЦифр = СтрРазделить(Значение, НаборЦифр); + Если МассивНеЦифр.Количество() < 2 Тогда + Возврат Результат; + КонецЕсли; + + ПозицияПервойЦифры = СтрДлина(МассивНеЦифр[0]); + ПозицияПоследнейЦифры = СтрДлина(Значение) - СтрДлина(МассивНеЦифр[МассивНеЦифр.ВГраница()]); + Значение = Сред(Значение, ПозицияПервойЦифры, ПозицияПоследнейЦифры - ПозицияПервойЦифры); + Если ПустаяСтрока(Значение) Тогда + Возврат Результат; + КонецЕсли; + + ЗначениеМассивом = СтрРазделить(Значение, " "); + Элемент = ЗначениеМассивом[ЗначениеМассивом.ВГраница()]; + Если ЗначениеМассивом.Количество() > 1 Тогда + Если СтрДлина(Элемент) = 2 Или СтрДлина(Элемент) = 4 Тогда + + ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0; + Если ЭтоТолькоЦифры Тогда + ЗначениеДата = Значение; + ЗначениеВремя = ""; + Иначе + ЗначениеВремя = Элемент; + ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница()); + ЗначениеДата = СтрСоединить(ЗначениеМассивом, " "); + КонецЕсли; + Иначе + + ЗначениеВремя = Элемент; + ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница()); + ЗначениеДата = СтрСоединить(ЗначениеМассивом, " "); + КонецЕсли; + Иначе + + ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0; + Если ЭтоТолькоЦифры Тогда + + Результат = ОписаниеТипаДата.ПривестиЗначение(Элемент); + Если Не ЗначениеЗаполнено(Результат) Тогда + + Если СтрДлина(Элемент) = 6 Тогда + + ПеревернутаяДата = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2); + Год = СтрокаВЧисло(Лев(ПеревернутаяДата, 2)); + Если Год <> Неопределено Тогда + ПеревернутаяДата = ?(Год > 29, "19", "20") + ПеревернутаяДата; + Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата); + КонецЕсли; + + ИначеЕсли СтрДлина(Элемент) > 7 Тогда + + ПеревернутаяДата = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2); + Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + + ИначеЕсли СтрНайти(Элемент, ":") > 0 Тогда + + ЗначениеДата = ""; + ЗначениеВремя = Элемент; + Иначе + ЗначениеДата = Элемент; + ЗначениеВремя = ""; + КонецЕсли; + КонецЕсли; + + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + + Если ЗначениеЗаполнено(ЗначениеДата) И ЧастьДаты <> ЧастиДаты.Время Тогда + + НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеДата, НаборЦифр, Ложь), ""); + ЗначениеДатаМассивом = СтрРазделить(ЗначениеДата, НаборРазделителей, Ложь); + + ЭтоТолькоЦифры = СтрРазделить(ЗначениеДата, НаборЦифр, Ложь).Количество() = 0; + Если НЕ ЭтоТолькоЦифры Тогда + + Год = 1; + Месяц = 1; + День = 1; + + Если СтрДлина(ЗначениеДатаМассивом[0]) = 4 Тогда + Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]); + ГодВНачале = Истина; + Иначе + День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]); + ГодВНачале = Ложь; + КонецЕсли; + + Если ЗначениеДатаМассивом.Количество() = 2 Тогда + Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);; + ИначеЕсли ЗначениеДатаМассивом.Количество() > 2 Тогда + Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]); + Если ГодВНачале Тогда + День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]); + Иначе + Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]); + КонецЕсли; + КонецЕсли; + + Если СтрДлина(Год) < 3 Тогда + ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год); + Год = ?(ГодЧислом < 30, 2000, 1900) + ГодЧислом; + Иначе + Год = ОписаниеТипаЧисло.ПривестиЗначение(Год); + КонецЕсли; + + ЗначениеДата = Формат(Год, "ЧЦ=4; ЧН=0001; ЧВН=; ЧГ=0") + + Формат(Месяц, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0") + + Формат(День, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0"); + Иначе + + Если СтрДлина(ЗначениеДата) = 6 Тогда + + Год = Прав(ЗначениеДата, 2); + ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год); + ЗначениеДата = ?(ГодЧислом < 30, 2000, 1900) + Год + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2) ; + + ИначеЕсли СтрДлина(ЗначениеДата) = 8 Тогда + + Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата); + + Если Не ЗначениеЗаполнено(Результат) Тогда + ПеревернутаяДата = Сред(ЗначениеДата, 5) + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2); + Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата); + Если ЗначениеЗаполнено(Результат) Тогда + ЗначениеДата = ПеревернутаяДата; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Иначе + ЗначениеДата = "00010101"; + КонецЕсли; + + Если ЗначениеЗаполнено(ЗначениеВремя) И ЧастьДаты <> ЧастиДаты.Дата Тогда + + ЭтоТолькоЦифры = СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь).Количество() = 0; + Если НЕ ЭтоТолькоЦифры Тогда + + НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь), ""); + ЗначениеВремяМассивом = СтрРазделить(ЗначениеВремя, НаборРазделителей, Ложь); + + Час = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[0]); + Минута = 0; + Секунда = 0; + + Если ЗначениеВремяМассивом.Количество() = 2 Тогда + Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]); + ИначеЕсли ЗначениеВремяМассивом.Количество() > 2 Тогда + Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]); + Секунда = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[2]); + КонецЕсли; + + ШаблонФормата = "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0"; + ЗначениеВремя = Формат(Час, ШаблонФормата) + + Формат(Минута, ШаблонФормата) + + Формат(Секунда, ШаблонФормата); + + КонецЕсли; + + Иначе + ЗначениеВремя = "000000"; + КонецЕсли; + + Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата + ЗначениеВремя); + + Возврат Результат; + +КонецФункции + +// Формирует представление числа для определенного языка и параметров числа. +// Представление параметров: +// ┌──────┬──────┬─────────────────┬────────────────┬───────────────────┬───────────────────────┬────────────────┐ +// │ Lang │ Zero │ One │ Two │ Few │ Many │ Other │ +// ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤ +// │ ru │ │ XX1 / X11 │ │ XX2─XX4 / X12─X14 │ XX0, XX5─XX9, X11─X14 │ дробные │ +// │ Card.│ │ остался %1 день │ │ осталось %1 дня │ осталось %1 дней │ осталось %1 дня│ +// │ │ │ вижу %1 рыбу │ │ вижу %1─х рыб │ вижу %5 рыб │ вижу %1 рыбы │ +// ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤ +// │ ru │ │ │ │ │ │ других нет │ +// │ Ord. │ │ │ │ │ │ %1─й день │ +// ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤ +// │ en │ │ для 1 │ │ │ │ остальное │ +// │ Card.│ │ left %1 day │ │ │ │ left %1 days │ +// ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤ +// │ en │ │ XX1 / X11 │ XX2 / X12 │ XX3 / X13 │ │ остальное │ +// │ Ord. │ │ %1st day │ %1nd day │ %1rd day │ │ %1th day. │ +// └──────┴──────┴─────────────────┴────────────────┴───────────────────┴───────────────────────┴────────────────┘ +// ┌──────┬───────────────────────────┐ +// │Card. │ Cardinal ─ Количественное;│ +// │ Ord. │ Ordinal - Порядковое; │ +// ├──────┼───────────────────────────┤ +// │ X │ любая цифра; │ +// │ / │ кроме. │ +// └──────┴───────────────────────────┘ +// +// Параметры: +// Шаблон - Строка - строка, содержит перечисленные через точку с запятой 6 форм строки +// для каждой категории числительного: +// %1 обозначает позицию числа; +// Число - Число - число, которое будет подставлено в строку вместо параметра "%1". +// Вид - ВидЧисловогоЗначения - определяет вид числового значения, для которого формируется представление. +// Количественное (по умолчанию) или Порядковое. +// ФорматнаяСтрока - Строка - строка параметров форматирования. См. аналогичный параметр в СтрокаСЧислом. +// +// Возвращаемое значение: +// Строка - представление строки числа в требуемой форме. +// +// Пример: +// +// Строка = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка( +// НСтр("ru=';остался %1 день;;осталось %1 дня;осталось %1 дней;осталось %1 дня'; +// |en=';%1 day left;;;;%1 days left'"), +// 0.05,, "ЧДЦ=1"); +// +Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = Неопределено) Экспорт + + Если ПустаяСтрока(Шаблон) Тогда + Возврат Формат(Число, ФорматнаяСтрока); + КонецЕсли; + + Если Вид = Неопределено Тогда + Вид = ВидЧисловогоЗначения.Количественное; + КонецЕсли; + + Возврат СтрокаСЧислом(Шаблон, Число, Вид, ФорматнаяСтрока); + +КонецФункции + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать см. СтроковыеФункции.ФорматированнаяСтрока +// или см. СтроковыеФункцииКлиент.ФорматированнаяСтрока. +// +// Форматирует строку в соответствии с заданным шаблоном. +// Возможные значения тегов в шаблоне: +// - Строка - выделяет строку жирным шрифтом. +// - Строка - добавляет гиперссылку. +// Например, "Минимальная версия программы 1.1. Обновите программу.". +// +// Параметры: +// СтрокаСТегами - Строка - строка, содержащая теги форматирования. +// +// Возвращаемое значение: +// ФорматированнаяСтрока - преобразованная строка. +// +Функция ФорматированнаяСтрока(Знач СтрокаСТегами) Экспорт + + СтрокиСВыделением = Новый СписокЗначений; + Пока СтрНайти(СтрокаСТегами, "") <> 0 Цикл + НачалоВыделения = СтрНайти(СтрокаСТегами, ""); + СтрокаДоОткрывающегоТега = Лев(СтрокаСТегами, НачалоВыделения - 1); + СтрокиСВыделением.Добавить(СтрокаДоОткрывающегоТега); + СтрокаПослеОткрывающегоТега = Сред(СтрокаСТегами, НачалоВыделения + 3); + КонецВыделения = СтрНайти(СтрокаПослеОткрывающегоТега, ""); + ВыделенныйФрагмент = Лев(СтрокаПослеОткрывающегоТега, КонецВыделения - 1); + СтрокиСВыделением.Добавить(ВыделенныйФрагмент,, Истина); + СтрокаПослеВыделения = Сред(СтрокаПослеОткрывающегоТега, КонецВыделения + 4); + СтрокаСТегами = СтрокаПослеВыделения; + КонецЦикла; + СтрокиСВыделением.Добавить(СтрокаСТегами); + + СтрокиСоСсылками = Новый СписокЗначений; + Для Каждого ЧастьСтроки Из СтрокиСВыделением Цикл + + СтрокаСТегами = ЧастьСтроки.Значение; + + Если ЧастьСтроки.Пометка Тогда + СтрокиСоСсылками.Добавить(СтрокаСТегами,, Истина); + Продолжить; + КонецЕсли; + + НачалоВыделения = СтрНайти(СтрокаСТегами, ""); + + Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2)); + Если СтрНачинаетсяС(Ссылка, """") Тогда + Ссылка = Сред(Ссылка, 2, СтрДлина(Ссылка) - 1); + КонецЕсли; + Если СтрЗаканчиваетсяНа(Ссылка, """") Тогда + Ссылка = Сред(Ссылка, 1, СтрДлина(Ссылка) - 1); + КонецЕсли; + + СтрокаПослеСсылки = Сред(СтрокаПослеОткрывающегоТега, ЗакрывающийТег + 1); + КонецВыделения = СтрНайти(СтрокаПослеСсылки, ""); + ТекстСсылки = Лев(СтрокаПослеСсылки, КонецВыделения - 1); + СтрокиСоСсылками.Добавить(ТекстСсылки, Ссылка); + + СтрокаПослеВыделения = Сред(СтрокаПослеСсылки, КонецВыделения + 4); + СтрокаСТегами = СтрокаПослеВыделения; + + НачалоВыделения = СтрНайти(СтрокаСТегами, "СтрокаСЧисломДляЛюбогоЯзыка(";%1 минуту;;%1 минуты;%1 минут;%1 минуты ", Значение); +// +// ЧислоЦифрамиПредметИсчисленияПрописью(1.5, "минуту,минуты,минут ", Ложь); +// ->СтрокаСЧисломДляЛюбогоЯзыка(";минуту;;минуты;минут;минуты", Значение); +// +// Возвращает текстовое представление числа с единицей измерения в правильном склонении и числе. +// +// Параметры: +// Значение - Число - любое целое число. +// ПараметрыПредметаИсчисления - Строка - варианты написания единицы измерения для одной, +// для двух и для пяти единиц, разделитель - запятая. +// ДобавлятьЧислоКРезультату - Булево - при передаче значения Ложь число не будет добавлено к строке. +// +// Возвращаемое значение: +// Строка - текстовое представление количества единиц, число записывается цифрами. +// +// Пример: +// ЧислоЦифрамиПредметИсчисленияПрописью(23, "минуту,минуты,минут") = "23 минуты"; +// ЧислоЦифрамиПредметИсчисленияПрописью(15, "минуту,минуты,минут") = "15 минут". +// +Функция ЧислоЦифрамиПредметИсчисленияПрописью(Знач Значение, Знач ПараметрыПредметаИсчисления, + Знач ДобавлятьЧислоКРезультату = Истина) Экспорт + + Результат = ?(ДобавлятьЧислоКРезультату, Формат(Значение, "ЧН=0") + " ", ""); + ПредставленияПредмета = Новый Массив; + + ПараметрыПредметаИсчисления = СтрРазделить(ПараметрыПредметаИсчисления, ","); + Для Каждого Параметр Из ПараметрыПредметаИсчисления Цикл + ПредставленияПредмета.Добавить(СокрЛП(Параметр)); + КонецЦикла; + + Значение = Значение % 100; + Если Значение > 20 Тогда + Значение = Значение % 10; + КонецЕсли; + + Индекс = ?(Значение = 1, 0, ?(Значение > 1 И Значение < 5, 1, 2)); + Результат = Результат + ПредставленияПредмета[Индекс]; + + Возврат Результат; + +КонецФункции + +// Устарела. Следует использовать см. СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка. +// +// ФормаМножественногоЧисла("минуту", "минуты", "минут", 1.5); +// -> СтрокаСЧисломДляЛюбогоЯзыка(";минуту;;минуты;минут;минуты", Значение); +// +// Возвращает единицу измерения в нужном склонении в зависимости от количества единиц. +// +// Параметры: +// ФормаДля1 - Строка - форма слова для одной единицы; +// ФормаДля2 - Строка - форма слова для двух единиц; +// ФормаДля5 - Строка - форма слова для пяти единиц; +// Значение - Число - любое целое число. +// +// Возвращаемое значение: +// Строка - единица изменения в нужном склонении. +// +// Пример: +// СтроковыеФункцииКлиентСервер.ФормаМножественногоЧисла("шкаф", "шкафа", "шкафов", 3); возвращает "шкафа". +// +Функция ФормаМножественногоЧисла(ФормаДля1, ФормаДля2, ФормаДля5, Знач Значение) Экспорт + Возврат ЧислоЦифрамиПредметИсчисленияПрописью(Значение, ФормаДля1 + "," + ФормаДля2 + "," + ФормаДля5, Ложь); +КонецФункции + +// Устарела. Следует использовать см. СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке +// Проверяет, содержит ли строка только символы кириллического алфавита. +// +// Параметры: +// СтрокаПроверки - Строка - проверяемая строка. +// УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением. +// ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме кириллицы. +// +// Возвращаемое значение: +// Булево - Истина, если строка содержит только кириллические (или допустимые) символы или пустая; +// Ложь, если строка содержит иные символы. +// +Функция ТолькоКириллицаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт + + Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда + Возврат Истина; + КонецЕсли; + + КодыДопустимыхСимволов = Новый Массив; + КодыДопустимыхСимволов.Добавить(1105); // "ё" + КодыДопустимыхСимволов.Добавить(1025); // "Ё" + + Для Индекс = 1 По СтрДлина(ДопустимыеСимволы) Цикл + КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, Индекс, 1))); + КонецЦикла; + + Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл + КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1)); + Если ((КодСимвола < 1040) Или (КодСимвола > 1103)) + И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено) + И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Устарела. Следует использовать см. СтроковыеФункции.СтрокаЛатиницей +// или см. СтроковыеФункцииКлиент.СтрокаЛатиницей. +// +// Преобразует исходную строку в транслит. +// Может использоваться для отправки SMS-сообщений латиницей или для сохранения +// файлов и папок, чтобы обеспечить возможность их переноса между разными операционными системами. +// Обратное преобразование из латинских символов не предусмотрено. +// +// Параметры: +// Значение - Строка - произвольная строка. +// +// Возвращаемое значение: +// Строка - строка, в которой кириллица заменена на транслит. +// +Функция СтрокаЛатиницей(Знач Значение) Экспорт + + Результат = ""; + + Соответствие = Новый Соответствие; + + ТолькоЗаглавныеВСтроке = ТолькоЗаглавныеВСтроке(Значение); + + Для Позиция = 1 По СтрДлина(Значение) Цикл + Символ = Сред(Значение, Позиция, 1); + СимволЛатиницей = Соответствие[НРег(Символ)]; // Поиск соответствия без учета регистра. + Если СимволЛатиницей = Неопределено Тогда + // Другие символы остаются "как есть". + СимволЛатиницей = Символ; + Иначе + Если ТолькоЗаглавныеВСтроке Тогда + СимволЛатиницей = ВРег(СимволЛатиницей); // восстанавливаем регистр + ИначеЕсли Символ = ВРег(Символ) Тогда + СимволЛатиницей = ТРег(СимволЛатиницей); // восстанавливаем регистр + КонецЕсли; + КонецЕсли; + Результат = Результат + СимволЛатиницей; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ФорматированнаяСтрока + +Функция СформироватьФорматированнуюСтроку(ШаблонСтроки, ЭлементыСтиля, + Знач Параметр1, Знач Параметр2, Знач Параметр3, Знач Параметр4, Знач Параметр5) Экспорт + + HTMLСтрока = ПодставитьПараметрыВСтроку(ШаблонСтроки, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5); + + НаборСтрок = Новый Массив; + + ТекущийШрифт = Неопределено; + ТекущийЦвет = Неопределено; + ТекущийФон = Неопределено; + ТекущаяСсылка = Неопределено; + + ФрагментыСтроки = СтрРазделить(HTMLСтрока, "<", Истина); + Для каждого Фрагмент Из ФрагментыСтроки Цикл + + ТелоСтроки = ""; + ПозицияТэг = СтрНайти(Фрагмент, ">"); + + Если ПозицияТэг = 0 Тогда + ТелоСтроки = Фрагмент; + + ИначеЕсли СтрНачинаетсяС(Фрагмент, "/") Тогда + ТелоСтроки = Сред(Фрагмент, ПозицияТэг + 1); + + ТекущийШрифт = Неопределено; + ТекущийЦвет = Неопределено; + ТекущийФон = Неопределено; + ТекущаяСсылка = Неопределено; + + Иначе + + ОписаниеТэга = Лев(Фрагмент, ПозицияТэг - 1); + ПервыйПробел = СтрНайти(ОписаниеТэга, " "); + + Если ПервыйПробел > 0 Тогда + ИмяТега = СокрЛП(Лев(ОписаниеТэга, ПервыйПробел)); + + ОписаниеАтрибутов = Сред(ОписаниеТэга, ПервыйПробел + 1); + ОписаниеАтрибутов = СтрЗаменить(ОписаниеАтрибутов , """", "'"); + + ПозицияРавно = СтрНайти(ОписаниеАтрибутов, "="); + Пока ПозицияРавно > 0 Цикл + + ИмяАтрибута = СокрЛП(Лев(ОписаниеАтрибутов, ПозицияРавно - 1)); + ПозицияПерваяКавычка = СтрНайти(ОписаниеАтрибутов, "'",, ПозицияРавно + 1); + Если ПозицияПерваяКавычка = 0 Тогда + ПозицияПерваяКавычка = ПозицияРавно; + КонецЕсли; + ПозицияВтораяКавычка = СтрНайти(ОписаниеАтрибутов, "'",, ПозицияПерваяКавычка + 1); + Если ПозицияВтораяКавычка = 0 Тогда + ПозицияВтораяКавычка = СтрДлина(ОписаниеАтрибутов) + 1; + КонецЕсли; + ЗначениеАтрибута = СокрЛП(Сред(ОписаниеАтрибутов, ПозицияПерваяКавычка + 1, ПозицияВтораяКавычка - ПозицияПерваяКавычка - 1)); + + Если СтрСравнить(ИмяАтрибута, "style") = 0 Тогда + УстановитьСтилиПоЗначениюАтрибута(ЗначениеАтрибута, ЭлементыСтиля, ТекущийФон, ТекущийЦвет, ТекущийШрифт); + ИначеЕсли СтрСравнить(ИмяАтрибута, "href") = 0 И СтрСравнить(ИмяТега, "a") = 0 Тогда + ТекущаяСсылка = ЗначениеАтрибута; + ИначеЕсли СтрСравнить(ИмяАтрибута, "src") = 0 И СтрСравнить(ИмяТега, "img") = 0 Тогда + НаборСтрок.Добавить(Новый ФорматированнаяСтрока(БиблиотекаКартинок[ЗначениеАтрибута], ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка)); + КонецЕсли; + + ОписаниеАтрибутов = Сред(ОписаниеАтрибутов, ПозицияВтораяКавычка + 1); + ПозицияРавно = СтрНайти(ОписаниеАтрибутов, "="); + + КонецЦикла; + Иначе + ИмяТега = ОписаниеТэга; + КонецЕсли; + + Если ИмяТега = "b" Тогда + ТекущийШрифт = ЭлементыСтиля["ВажнаяНадписьШрифт"]; + КонецЕсли; + + ТелоСтроки = Сред(Фрагмент, ПозицияТэг + 1); + + КонецЕсли; + + ТелоСтроки = СтрЗаменить(ТелоСтроки, "<", "<"); + Если СтрДлина(ТелоСтроки) > 0 Тогда + НаборСтрок.Добавить(Новый ФорматированнаяСтрока(ТелоСтроки, ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка)); + КонецЕсли; + + КонецЦикла; + + Возврат Новый ФорматированнаяСтрока(НаборСтрок); // АПК:1356 - можно использовать составную форматированную строку, + // так как массив строк формируется из переданного в функцию текста. + +КонецФункции + +Процедура УстановитьСтилиПоЗначениюАтрибута(Знач ОписаниеСтиля, ЭлементыСтиля, ТекущийФон, ТекущийЦвет, ТекущийШрифт) + + Стили = СтрРазделить(ОписаниеСтиля, ";"); + + Для каждого Стиль Из Стили Цикл + + ЗначенияСтиля = СтрРазделить(стиль, ":"); + ИмяСтиля = СокрЛП(ЗначенияСтиля[0]); + ЗначениеСтиля = СокрЛП(ЗначенияСтиля[1]); + + Если СтрСравнить(ИмяСтиля, "color") = 0 Тогда + ТекущийЦвет = ЭлементыСтиля[ЗначениеСтиля]; + ИначеЕсли СтрСравнить(ИмяСтиля, "background-color") = 0 Тогда + ТекущийФон = ЭлементыСтиля[ЗначениеСтиля]; + ИначеЕсли СтрСравнить(ИмяСтиля, "font") = 0 Тогда + ТекущийШрифт = ЭлементыСтиля[ЗначениеСтиля]; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ПреобразоватьЧислоВРимскуюНотацию + +// Выполняет преобразование цифры в римскую нотацию. +// +// Параметры: +// Цифра - Число - цифра от 0 до 9. +// РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка - Строка - символы, соответствующие римским цифрам. +// +// Возвращаемое значение +// Строка - цифра в римской нотации. +// +// Пример: +// СтроковыеФункцииКлиентСервер.ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII". +// +Функция ПреобразоватьЦифруВРимскуюНотацию(Цифра, РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка) + + РимскаяЦифра=""; + Если Цифра = 1 Тогда + РимскаяЦифра = РимскаяЕдиница + ИначеЕсли Цифра = 2 Тогда + РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница; + ИначеЕсли Цифра = 3 Тогда + РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница; + ИначеЕсли Цифра = 4 Тогда + РимскаяЦифра = РимскаяЕдиница + РимскаяПятерка; + ИначеЕсли Цифра = 5 Тогда + РимскаяЦифра = РимскаяПятерка; + ИначеЕсли Цифра = 6 Тогда + РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница; + ИначеЕсли Цифра = 7 Тогда + РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница; + ИначеЕсли Цифра = 8 Тогда + РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница; + ИначеЕсли Цифра = 9 Тогда + РимскаяЦифра = РимскаяЕдиница + РимскаяДесятка; + КонецЕсли; + Возврат РимскаяЦифра; + +КонецФункции + +#КонецОбласти + +#Область ПодставитьПараметрыВСтроку + +// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. +Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + Результат = ""; + Позиция = СтрНайти(СтрокаПодстановки, "%"); + Пока Позиция > 0 Цикл + Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); + СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); + ПодставляемыйПараметр = Неопределено; + Если СимволПослеПроцента = "1" Тогда + ПодставляемыйПараметр = Параметр1; + ИначеЕсли СимволПослеПроцента = "2" Тогда + ПодставляемыйПараметр = Параметр2; + ИначеЕсли СимволПослеПроцента = "3" Тогда + ПодставляемыйПараметр = Параметр3; + ИначеЕсли СимволПослеПроцента = "4" Тогда + ПодставляемыйПараметр = Параметр4; + ИначеЕсли СимволПослеПроцента = "5" Тогда + ПодставляемыйПараметр = Параметр5; + ИначеЕсли СимволПослеПроцента = "6" Тогда + ПодставляемыйПараметр = Параметр6; + ИначеЕсли СимволПослеПроцента = "7" Тогда + ПодставляемыйПараметр = Параметр7 + ИначеЕсли СимволПослеПроцента = "8" Тогда + ПодставляемыйПараметр = Параметр8; + ИначеЕсли СимволПослеПроцента = "9" Тогда + ПодставляемыйПараметр = Параметр9; + КонецЕсли; + Если ПодставляемыйПараметр = Неопределено Тогда + Результат = Результат + "%"; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); + Иначе + Результат = Результат + ПодставляемыйПараметр; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); + КонецЕсли; + Позиция = СтрНайти(СтрокаПодстановки, "%"); + КонецЦикла; + Результат = Результат + СтрокаПодстановки; + + Возврат Результат; +КонецФункции + +#КонецОбласти + +#Область СтрокаЛатиницей + +Функция ТолькоЗаглавныеВСтроке(Значение) + + Для Позиция = 1 По СтрДлина(Значение) Цикл + Символ = Сред(Значение, Позиция, 1); + Если Символ <> ВРег(Символ) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo b/src/cfe/yaxunit/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo new file mode 100644 index 0000000..8a2f195 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + СтроковыеФункцииКлиентСервер + + ru + Строковые функции клиент сервер + + true + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТИсполнитель/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнитель/Module.bsl new file mode 100644 index 0000000..bd89cdb --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнитель/Module.bsl @@ -0,0 +1,342 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#Если Клиент Тогда + +// ВыполнитьМодульноеТестирование +// Метод, по параметрам запуска, запускает выполнение всего процесса тестирования. +// +// Параметры: +// Параметры - См. ЮТФабрика.ПараметрыЗапуска +Процедура ВыполнитьМодульноеТестирование(Параметры = Неопределено) Экспорт + + Если Параметры = Неопределено Тогда + Параметры = ЮТПараметры.ПараметрыЗапуска(ПараметрЗапуска); + КонецЕсли; + + Если НЕ Параметры.ВыполнятьМодульноеТестирование Тогда + Возврат; + КонецЕсли; + + ЮТКонтекст.ИнициализироватьКонтекст(); + ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings); + ЮТСобытия.Инициализация(Параметры); + // Повторно сохраним для передачи на сервер + ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения()); + ЮТКонтекст.УстановитьКонтекстИсполнения(ДанныеКонтекстаИсполнения()); + + ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Параметры); + + РезультатыТестирования = Новый Массив(); + + Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл + + КатегорииНаборов = КатегорииНаборовТестовМодуля(ТестовыйМодуль); + + Результат = ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, ТестовыйМодуль); + ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат); + + Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, ТестовыйМодуль); + ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат); + + ЮТОбщий.ДополнитьМассив(РезультатыТестирования, КатегорииНаборов.Пропущенные); + + КонецЦикла; + + ЮТОтчет.СформироватьОтчет(РезультатыТестирования, Параметры); + + Если Параметры.showReport Тогда + ПоказатьОтчет(РезультатыТестирования, Параметры); + ИначеЕсли Параметры.CloseAfterTests Тогда + ПрекратитьРаботуСистемы(Ложь); + КонецЕсли; + +КонецПроцедуры + +#КонецЕсли + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер) +// Параметры: +// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// +// Возвращаемое значение: +// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении +Функция ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль) Экспорт + + Если Наборы.Количество() = 0 Тогда + Возврат Наборы; + КонецЕсли; + + Уровни = ЮТФабрика.УровниИсполнения(); + ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль; + + ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль); + + Если ЕстьОшибки(ТестовыйМодуль) Тогда + СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки); + Возврат Наборы; + КонецЕсли; + + Для Каждого Набор Из Наборы Цикл + + Результат = ВыполнитьНаборТестов(Набор, ТестовыйМодуль); + + Если Результат <> Неопределено Тогда + Набор.Тесты = Результат; + КонецЕсли; + + КонецЦикла; + + ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль; + + ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль); + + Если ЕстьОшибки(ТестовыйМодуль) Тогда + СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки); + КонецЕсли; + + ТестовыйМодуль.Ошибки.Очистить(); // Эти ошибки используются как буфер и уже скопированы в наборы, но ломают последующие наборы + + Возврат Наборы; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль) + + Уровни = ЮТФабрика.УровниИсполнения(); + ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов; + + Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах(); + ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор); + + Если ЕстьОшибки(Набор) Тогда + Возврат Неопределено; + КонецЕсли; + + Результаты = Новый Массив(); + ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест; + + Для Каждого Тест Из Набор.Тесты Цикл + + Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест); + ВыполнитьТестовыйМетод(Тест); + ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест); + + ОбработатьЗавершениеТеста(Тест); + + Результаты.Добавить(Тест); + + КонецЦикла; + + ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов; + ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор); + + Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта; + + Возврат Результаты; + +КонецФункции + +Процедура ОбработатьЗавершениеТеста(Тест) + + Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта; + Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест); + +КонецПроцедуры + +Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль) + + ИсполняемыеТестовыеНаборы = Новый Массив; + + Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл + + НаборыКонтекстов = Новый Структура; + + ТестыНабора = ЮТОбщий.ЗначениеСтруктуры(ТестовыйНабор, "Тесты", Новый Массив()); + + Для Каждого Тест Из ТестыНабора Цикл + + Для Каждого Контекст Из Тест.КонтекстВызова Цикл + + Если НЕ НаборыКонтекстов.Свойство(Контекст) Тогда + ИсполняемыйНабор = ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль); + ИсполняемыйНабор.Режим = Контекст; + НаборыКонтекстов.Вставить(Контекст, ИсполняемыйНабор); + Иначе + ИсполняемыйНабор = НаборыКонтекстов[Контекст]; + КонецЕсли; + + ИсполняемыйТест = ЮТФабрика.ОписаниеИсполняемогоТеста(Тест, Контекст, ТестовыйМодуль); + ИсполняемыйНабор.Тесты.Добавить(ИсполняемыйТест); + + КонецЦикла; + + КонецЦикла; + + Если НаборыКонтекстов.Количество() Тогда + + Для Каждого Элемент Из НаборыКонтекстов Цикл + ИсполняемыеТестовыеНаборы.Добавить(Элемент.Значение); + КонецЦикла; + + Иначе + + // TODO. Корякин А. 2021.11.24 А надо ли добавлять при отсутствии тестов + ИсполняемыеТестовыеНаборы.Добавить(ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль)); + + КонецЕсли; + + КонецЦикла; + + КатегорииНаборов = Новый Структура(); + КатегорииНаборов.Вставить("Клиентские", Новый Массив()); + КатегорииНаборов.Вставить("Серверные", Новый Массив()); + КатегорииНаборов.Вставить("Пропущенные", Новый Массив()); + + КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения(); + КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля); + КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения(); + + Для Каждого Набор Из ИсполняемыеТестовыеНаборы Цикл + + КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим); + + ОшибкаКонтекста = Неопределено; + Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда + ОшибкаКонтекста = "Неподдерживаемый режим запуска"; + ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда + ОшибкаКонтекста = "Модуль не доступен в этом контексте"; + ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда + ОшибкаКонтекста = "Неизвестный контекст/режим исполнения"; + КонецЕсли; + + Если ОшибкаКонтекста <> Неопределено Тогда + Набор.Выполнять = Ложь; + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста); + Для Каждого Тест Из Набор.Тесты Цикл + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста); + КонецЦикла; + КонецЕсли; + + Если НЕ Набор.Выполнять Тогда + КатегорииНаборов.Пропущенные.Добавить(Набор); + Продолжить; + КонецЕсли; + + Если КонтекстИсполнения = КонтекстыИсполнения.Сервер Тогда + + КатегорииНаборов.Серверные.Добавить(Набор); + + ИначеЕсли КонтекстИсполнения = КонтекстыИсполнения.Клиент Тогда + + КатегорииНаборов.Клиентские.Добавить(Набор); + + КонецЕсли; + + КонецЦикла; + + Возврат КатегорииНаборов; + +КонецФункции + +Функция ЕстьОшибки(Объект) + Возврат ЗначениеЗаполнено(Объект.Ошибки); +КонецФункции + +Процедура ВыполнитьТестовыйМетод(Тест) + + Если ЕстьОшибки(Тест) Тогда + Возврат; + КонецЕсли; + + СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста(); + Тест.Статус = СтатусыИсполненияТеста.Исполнение; + + Ошибка = ЮТОбщий.ВыполнитьМетод(Тест.ПолноеИмяМетода, Тест.Параметры); + + Если Ошибка <> Неопределено Тогда + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуВыполненияТеста(Тест, Ошибка); + КонецЕсли; + +КонецПроцедуры + +Процедура СкопироватьОшибкиВ(Объекты, Ошибки) + + Для Каждого Объект Из Объекты Цикл + + ЮТОбщий.ДополнитьМассив(Объект.Ошибки, Ошибки); + + Если Объект.Свойство("Статус") Тогда + Объект.Статус = ЮТФабрика.СтатусыИсполненияТеста().Сломан; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Данные контекста исполнения. +// +// Возвращаемое значение: +// Структура - Данные контекста исполнения: +// * Уровень - Строка +Функция ДанныеКонтекстаИсполнения() + + Контекст = Новый Структура(); + Контекст.Вставить("Уровень", ""); + + Возврат Контекст; + +КонецФункции + +#Если Клиент Тогда +Процедура ПоказатьОтчет(РезультатыТестирования, Параметры) + + Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры); + АдресДанных = ПоместитьВоВременноеХранилище(Данные); + + ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная", Новый Структура("АдресХранилища", АдресДанных)); + +КонецПроцедуры +#КонецЕсли + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТИсполнитель/ЮТИсполнитель.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнитель/ЮТИсполнитель.mdo new file mode 100644 index 0000000..c5f3c33 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнитель/ЮТИсполнитель.mdo @@ -0,0 +1,11 @@ + + + ЮТИсполнитель + + ru + Исполнитель + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТИсполнительСервер/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнительСервер/Module.bsl new file mode 100644 index 0000000..3b350dc --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнительСервер/Module.bsl @@ -0,0 +1,54 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// ПрогонНаборов +// Выполняет тесты наборов модуля. Возвращает результат прогона +// Это обертка для прогона на сервере +// Параметры: +// Наборы - Массив - Наборы исполняемых тестов, структуру набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// +// Возвращаемое значение: +// Массив - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +Функция ВыполнитьГруппуНаборовТестов(Знач Наборы, Знач ТестовыйМодуль) Экспорт + + Возврат ЮТИсполнитель.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТИсполнительСервер/ЮТИсполнительСервер.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнительСервер/ЮТИсполнительСервер.mdo new file mode 100644 index 0000000..cc95142 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТИсполнительСервер/ЮТИсполнительСервер.mdo @@ -0,0 +1,10 @@ + + + ЮТИсполнительСервер + + ru + Исполнитель сервер + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонструкторВариантов/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТКонструкторВариантов/Module.bsl new file mode 100644 index 0000000..f0fc021 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонструкторВариантов/Module.bsl @@ -0,0 +1,89 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Варианты. +// +// Параметры: +// Реквизиты - Строка - Реквизиты +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Варианты(Реквизиты) Экспорт + + Варианты = Новый Структура("Реквизиты, Варианты, КоличествоРеквизитов", Реквизиты, Новый Массив()); + Вариант = Новый Структура(Реквизиты); + Варианты.КоличествоРеквизитов = Вариант.Количество(); + + ЮТКонтекст.УстановитьЗначениеКонтекста(КлючКонтекста(), Варианты); + + Возврат ЮТКонструкторВариантов; + +КонецФункции + +Функция Добавить(Параметр1, Параметр2 = Неопределено, Параметр3 = Неопределено, Параметр4 = Неопределено, Параметр5 = Неопределено) Экспорт + + Варианты = ЮТКонтекст.ЗначениеКонтекста(КлючКонтекста()); + + Если Варианты.КоличествоРеквизитов = 1 Тогда + Вариант = Новый Структура(Варианты.Реквизиты, Параметр1); + ИначеЕсли Варианты.КоличествоРеквизитов = 2 Тогда + Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2); + ИначеЕсли Варианты.КоличествоРеквизитов = 3 Тогда + Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3); + ИначеЕсли Варианты.КоличествоРеквизитов = 4 Тогда + Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3, Параметр4); + ИначеЕсли Варианты.КоличествоРеквизитов = 5 Тогда + Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5); + КонецЕсли; + + Варианты.Варианты.Добавить(Вариант); + + Возврат ЮТКонструкторВариантов; + +КонецФункции + +// Список вариантов. +// +// Возвращаемое значение: +// Массив из Структура +Функция СписокВариантов() Экспорт + + Возврат ЮТКонтекст.ЗначениеКонтекста(КлючКонтекста()).Варианты; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +Функция КлючКонтекста() + + Возврат "ВариантыТеста"; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонструкторВариантов/ЮТКонструкторВариантов.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТКонструкторВариантов/ЮТКонструкторВариантов.mdo new file mode 100644 index 0000000..07e9504 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонструкторВариантов/ЮТКонструкторВариантов.mdo @@ -0,0 +1,11 @@ + + + ЮТКонструкторВариантов + + ru + Конструктор вариантов + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl new file mode 100644 index 0000000..1958b43 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl @@ -0,0 +1,307 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// ИнициализироватьКонтекст +// Выполняет начальную настройку для работы с хранимым контекстом +Процедура ИнициализироватьКонтекст() Экспорт + +#Если Клиент Тогда + ЮТКонтекстКлиент.ИнициализироватьКонтекст(); +#КонецЕсли + ЮТКонтекстСервер.ИнициализироватьКонтекст(); + +КонецПроцедуры + +// ДанныеКонтекста +// Возвращает хранимые данные контекста. +// Существует отдельно контекст сервера, отдельно клиента, эти контексты никак не связаны и никак не синхронизируются +// Возвращаемое значение: +// Структура - Данные контекста +Функция ДанныеКонтекста() Экспорт + +#Если Клиент Тогда + Возврат ЮТКонтекстКлиент.ДанныеКонтекста(); +#Иначе + Возврат ЮТКонтекстСервер.ДанныеКонтекста(); +#КонецЕсли + +КонецФункции + +// ЗначениеКонтекста +// Возвращает значение вложенного контекста, вложенного реквизита контекста +// Параметры: +// ИмяРеквизита - Строка - Имя реквизита/вложенного контекста +// +// Возвращаемое значение: +// Структура, Неопределено - Значение реквизита/вложенного контекста +Функция ЗначениеКонтекста(ИмяРеквизита) Экспорт + + ДанныеКонтекста = ДанныеКонтекста(); + + Возврат ЮТОбщий.ЗначениеСтруктуры(ДанныеКонтекста, ИмяРеквизита); + +КонецФункции + +// УстановитьЗначениеКонтекста +// Устанавливает значение вложенного контекста, вложенного реквизита контекста +// +// Параметры: +// ИмяРеквизита - Строка - Имя реквизита/вложенного контекста +// Значение - Произвольный - Новое значение реквизита/вложенного контекста +// УстановитьНаСервер - Булево - Установить также на сервер +Процедура УстановитьЗначениеКонтекста(Знач ИмяРеквизита, Знач Значение, Знач УстановитьНаСервер = Ложь) Экспорт + + ДанныеКонтекста = ДанныеКонтекста(); + + ДанныеКонтекста.Вставить(ИмяРеквизита, Значение); + +#Если НЕ Сервер Тогда + Если УстановитьНаСервер Тогда + ЮТКонтекстСервер.УстановитьЗначениеКонтекста(ИмяРеквизита, Значение); + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +// КонтекстТеста +// Возвращает структуру, в которой можно хранить данные используемые в тесте +// Данные живут в рамках одного теста, но доступны в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста` +// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста` +// Возвращаемое значение: +// Структура - Контекст теста +// Неопределено - Если метод вызывается за рамками теста +Функция КонтекстТеста() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаТеста()); + +КонецФункции + +// КонтекстНабора +// Возвращает структуру, в которой можно хранить данные используемые в тестах набора +// Данные живут в рамках одного набора тестов (данные между клиентом и сервером не синхронизируются) +// Доступны в каждом тесте набора и в обработчиках событий +// + `ПередТестовымНабором` +// + `ПослеТестовогоНабора` +// + `ПередКаждымТестом` +// + `ПослеКаждогоТеста` +// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста` +// Возвращаемое значение: +// Структура - Контекст набора тестов +// Неопределено - Если метод вызывается за рамками тестового набора +Функция КонтекстНабора() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаНабораТестов()); + +КонецФункции + +// КонтекстМодуля +// Возвращает структуру, в которой можно хранить данные используемые в тестах модуля +// Данные живут в рамках одного тестового модуля (данные между клиентом и сервером не синхронизируются) +// Доступны в каждом тесте модуля и в обработчиках событий +// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеВсехТестов` +// Возвращаемое значение: +// Структура - Контекст тестового модуля +// Неопределено - Если метод вызывается за рамками тестового модуля +Функция КонтекстМодуля() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаМодуля()); + +КонецФункции + +Функция ГлобальныеНастройкиВыполнения() Экспорт + + Возврат ЗначениеКонтекста(ИмяГлобальныеНастройкиВыполнения()); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +// КонтекстОшибки +// Возвращает служебный контекст, содержит дополнительные детали ошибки теста +// +// Возвращаемое значение: +// Неопределено, Структура - Контекст ошибки, см. ЮТРегистрацияОшибок.НовыйКонтекстОшибки +Функция КонтекстОшибки() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаОшибки()); + +КонецФункции + +// КонтекстПроверки +// Возвращает служебный контекста, данные выполняемой проверки +// Возвращаемое значение: +// Неопределено, Структура - Контекст проверки +Функция КонтекстПроверки() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаУтверждений()); + +КонецФункции + +// КонтекстЧитателя +// Возвращает служебный контекста, данные необходимые на этапе загрузки тестов +// Возвращаемое значение: +// Неопределено, Структура - Контекст проверки +Функция КонтекстЧитателя() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаЧитателя()); + +КонецФункции + +// КонтекстЧитателя +// Возвращает служебный контекста, данные используемые исполнителем тестов +// Возвращаемое значение: +// см. ЮТИсполнитель.ДанныеКонтекстаИсполнения +Функция КонтекстИсполнения() Экспорт + + Возврат ЗначениеКонтекста(ИмяКонтекстаИсполнения()); + +КонецФункции + +Функция ОписаниеКонтекста() Экспорт + + Описание = Новый Структура; + + Возврат Описание; + +КонецФункции + +Процедура УстановитьКонтекстОшибки() Экспорт + + ДанныеОшибки = ЮТФабрика.ОписаниеКонтекстаОшибки(); + УстановитьЗначениеКонтекста(ИмяКонтекстаОшибки(), ДанныеОшибки); + +КонецПроцедуры + +Процедура УстановитьКонтекстУтверждений(Знач ДанныеКонтекста) Экспорт + + УстановитьЗначениеКонтекста(ИмяКонтекстаУтверждений(), ДанныеКонтекста); + +КонецПроцедуры + +Процедура УстановитьКонтекстНабораТестов(Знач ДанныеКонтекста) Экспорт + + УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), ДанныеКонтекста); + +КонецПроцедуры + +Процедура УстановитьКонтекстМодуля(Знач ДанныеКонтекста) Экспорт + + УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), ДанныеКонтекста); + +КонецПроцедуры + +Процедура УстановитьКонтекстТеста(Знач ДанныеКонтекста) Экспорт + + УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), ДанныеКонтекста); + +КонецПроцедуры + +Процедура УстановитьКонтекстЧитателя(Знач ДанныеКонтекста) Экспорт + + УстановитьЗначениеКонтекста(ИмяКонтекстаЧитателя(), ДанныеКонтекста, Истина); + +КонецПроцедуры + +Процедура УстановитьКонтекстИсполнения(Знач ДанныеКонтекста) Экспорт + + УстановитьЗначениеКонтекста(ИмяКонтекстаИсполнения(), ДанныеКонтекста, Истина); + +КонецПроцедуры + +Процедура УстановитьГлобальныеНастройкиВыполнения(Знач Настройки) Экспорт + + УстановитьЗначениеКонтекста(ИмяГлобальныеНастройкиВыполнения(), Настройки, Истина); + +КонецПроцедуры + +Процедура УдалитьКонтекст() Экспорт + +#Если Клиент Тогда + ЮТКонтекстКлиент.УдалитьКонтекст(); +#КонецЕсли + ЮТКонтекстСервер.УдалитьКонтекст(); + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +Функция ИмяКонтекстаОшибки() + + Возврат "ДанныеОшибки"; + +КонецФункции + +Функция ИмяКонтекстаУтверждений() + + Возврат "КонтекстУтверждения"; + +КонецФункции + +Функция ИмяКонтекстаНабораТестов() + + Возврат "КонтекстНабора"; + +КонецФункции + +Функция ИмяКонтекстаМодуля() + + Возврат "КонтекстМодуля"; + +КонецФункции + +Функция ИмяКонтекстаТеста() + + Возврат "КонтекстТеста"; + +КонецФункции + +Функция ИмяКонтекстаЧитателя() + + Возврат "КонтекстЧитателя"; + +КонецФункции + +Функция ИмяГлобальныеНастройкиВыполнения() + + Возврат "ГлобальныеНастройкиВыполнения"; + +КонецФункции + +Функция ИмяКонтекстаИсполнения() + + Возврат "КонтекстИсполнения"; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекст/ЮТКонтекст.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекст/ЮТКонтекст.mdo new file mode 100644 index 0000000..08f140f --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекст/ЮТКонтекст.mdo @@ -0,0 +1,11 @@ + + + ЮТКонтекст + + ru + Контекст + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстКлиент/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстКлиент/Module.bsl new file mode 100644 index 0000000..00d4bf1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстКлиент/Module.bsl @@ -0,0 +1,57 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИнициализироватьКонтекст() Экспорт + + ЮТДанныеКонтекста = ЮТКонтекст.ОписаниеКонтекста(); + +КонецПроцедуры + +Функция ДанныеКонтекста() Экспорт + + Возврат ЮТДанныеКонтекста; + +КонецФункции + +Процедура УдалитьКонтекст() Экспорт + + ЮТДанныеКонтекста = Неопределено; + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстКлиент/ЮТКонтекстКлиент.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстКлиент/ЮТКонтекстКлиент.mdo new file mode 100644 index 0000000..8eaff54 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстКлиент/ЮТКонтекстКлиент.mdo @@ -0,0 +1,10 @@ + + + ЮТКонтекстКлиент + + ru + Контекст клиент + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстСервер/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстСервер/Module.bsl new file mode 100644 index 0000000..7969bcf --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстСервер/Module.bsl @@ -0,0 +1,105 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИнициализироватьКонтекст() Экспорт + + Контекст = ЮТКонтекст.ОписаниеКонтекста(); + + АдресХранилища = ПоместитьВоВременноеХранилище(Контекст, Новый УникальныйИдентификатор()); + + ХранилищеОбщихНастроек.Сохранить(КлючНастроекКонтекста(), "АдресХранилища", АдресХранилища); + +КонецПроцедуры + +Функция ДанныеКонтекста() Экспорт + + Адрес = АдресСерверногоКонтекста(); + + Если ЭтоАдресВременногоХранилища(Адрес) Тогда + + Возврат ПолучитьИзВременногоХранилища(АдресСерверногоКонтекста()); + + КонецЕсли; + +КонецФункции + +// УстановитьЗначениеКонтекста +// Устанавливает значение вложенного контекста, вложенного реквизита контекста +// +// Параметры: +// ИмяРеквизита - Строка - Имя реквизита/вложенного контекста +// Значение - Произвольный - Новое значение реквизита/вложенного контекста +Процедура УстановитьЗначениеКонтекста(Знач ИмяРеквизита, Знач Значение) Экспорт + + ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяРеквизита, Значение); + +КонецПроцедуры + +Функция КлючНастроекКонтекста() Экспорт + + Возврат СтрШаблон("ЮТ%1.Контекста", НомерСеансаИнформационнойБазы()); + +КонецФункции + +Функция АдресСерверногоКонтекста(Кэшировать = Истина) Экспорт + + Если Кэшировать Тогда + + Возврат ЮТПовторногоИспользования.АдресСерверногоКонтекста(); + + Иначе + + Возврат ХранилищеОбщихНастроек.Загрузить(КлючНастроекКонтекста(), "АдресХранилища"); + + КонецЕсли; + +КонецФункции + +Процедура УдалитьКонтекст() Экспорт + + Адрес = АдресСерверногоКонтекста(); + + Если ЭтоАдресВременногоХранилища(Адрес) Тогда + УдалитьИзВременногоХранилища(Адрес); + ХранилищеОбщихНастроек.Удалить(КлючНастроекКонтекста(), "АдресХранилища", Неопределено); + ОбновитьПовторноИспользуемыеЗначения(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстСервер/ЮТКонтекстСервер.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстСервер/ЮТКонтекстСервер.mdo new file mode 100644 index 0000000..80e812c --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстСервер/ЮТКонтекстСервер.mdo @@ -0,0 +1,10 @@ + + + ЮТКонтекстСервер + + ru + Контекст сервер + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl new file mode 100644 index 0000000..f3931b6 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl @@ -0,0 +1,93 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Возвращает значение контекста +// +// Параметры: +// ИмяЗначения - Строка +// +// Возвращаемое значение: +// Произвольный +Функция Значение(ИмяЗначения) Экспорт + + Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень; + Уровни = ЮТФабрика.УровниИсполнения(); + + Если Уровень = Уровни.Тест И ЮТКонтекст.КонтекстТеста().Свойство(ИмяЗначения) Тогда + + Возврат ЮТКонтекст.КонтекстТеста()[ИмяЗначения]; + + ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов) + И ЮТКонтекст.КонтекстНабора().Свойство(ИмяЗначения) Тогда + + Возврат ЮТКонтекст.КонтекстНабора()[ИмяЗначения]; + + ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Модуль) + И ЮТКонтекст.КонтекстМодуля().Свойство(ИмяЗначения) Тогда + + Возврат ЮТКонтекст.КонтекстМодуля()[ИмяЗначения]; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + +КонецФункции + +// Установить значение. +// Устанавливает значение в контекст тестов. +// Установка происходит в соответствии с уровнем исполнения +// Параметры: +// ИмяЗначения - Строка +// Значение - Произвольный +Процедура УстановитьЗначение(ИмяЗначения, Значение) Экспорт + + Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень; + Уровни = ЮТФабрика.УровниИсполнения(); + + Если Уровень = Уровни.Тест Тогда + + ЮТКонтекст.КонтекстТеста().Вставить(ИмяЗначения, Значение); + + ИначеЕсли Уровень = Уровни.НаборТестов Тогда + + ЮТКонтекст.КонтекстНабора().Вставить(ИмяЗначения, Значение); + + ИначеЕсли Уровень = Уровни.Модуль Тогда + + ЮТКонтекст.КонтекстМодуля().Вставить(ИмяЗначения, Значение); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстТеста/ЮТКонтекстТеста.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстТеста/ЮТКонтекстТеста.mdo new file mode 100644 index 0000000..71285f1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТКонтекстТеста/ЮТКонтекстТеста.mdo @@ -0,0 +1,11 @@ + + + ЮТКонтекстТеста + + ru + Контекст теста + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl new file mode 100644 index 0000000..c63a93b --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl @@ -0,0 +1,145 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// РасширенияКонфигурации +// Возвращает список имен установленных расширений +// Возвращаемое значение: +// Массив - Расширения конфигурации +Функция РасширенияКонфигурации() Экспорт + + Расширения = РасширенияКонфигурации.Получить(); + + Возврат ЮТОбщий.ВыгрузитьЗначения(Расширения, "Имя"); + +КонецФункции + +// МодулиРасширений +// Выполняет чтение метаданных общих модулей, которые предположительно могут являться тестами +// +// Возвращаемое значение: +// Массив из см. ЮТФабрика.ОписаниеМодуля - Коллекция описаний моделей, структуру элемента см. ЮТФабрика.ОписаниеМодуля +Функция МодулиРасширений() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + МетаданныеМодулей = Новый Массив; + + Для Каждого Модуль Из Метаданные.ОбщиеМодули Цикл + + Если Модуль.РасширениеКонфигурации() <> Неопределено Тогда + + МетаданныеМодуля = МетаданныеМодуля(Модуль); + МетаданныеМодулей.Добавить(МетаданныеМодуля); + + КонецЕсли; + + КонецЦикла; + + Возврат МетаданныеМодулей; + +КонецФункции + +// Модули подсистемы. +// Возвращает список модулей подсистемы +// Подсистема должна находится в подсистеме "ЮТФункциональность" +// Параметры: +// ИмяПодсистемы - Строка - Имя подсистемы +// +// Возвращаемое значение: +// Массив из Строка - Имена модулей входящих в подсистему +Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт + + Подсистема = Метаданные.Подсистемы.ЮТФункциональность.Подсистемы.Найти(ИмяПодсистемы); + + Если Подсистема = Неопределено Тогда + + ВызватьИсключение СтрШаблон("Подсистема ""%1"" не найдена", ИмяПодсистемы); + + КонецЕсли; + + Модули = Новый Массив(); + + Для Каждого Объект Из Подсистема.Состав Цикл + + Если Метаданные.ОбщиеМодули.Содержит(Объект) Тогда + + Модули.Добавить(Объект.Имя); + + КонецЕсли; + + КонецЦикла; + + Возврат Модули; + +КонецФункции + +// МетаданныеМодуля +// Создает описание метаданных модуля +// +// Параметры: +// Модуль - ОбъектМетаданныхОбщийМодуль, Структура, Строка - Общий модуль либо структура с аналогичными атрибутами или имя модуля +// +// Возвращаемое значение: +// Структура - см. ЮТФабрика.ОписаниеМодуля +Функция МетаданныеМодуля(Знач Модуль) Экспорт + + Если ТипЗнч(Модуль) = Тип("Строка") Тогда + ИмяМодуля = Модуль; + Модуль = Метаданные.ОбщиеМодули.Найти(ИмяМодуля); + + Если Модуль = Неопределено Тогда + ВызватьИсключение "Не найден модуль с именем " + ИмяМодуля; + КонецЕсли; + КонецЕсли; + + Описание = ЮТФабрика.ОписаниеМодуля(); + Описание.Имя = Модуль.Имя; + Описание.КлиентУправляемоеПриложение = Модуль.КлиентУправляемоеПриложение; + Описание.КлиентОбычноеПриложение = Модуль.КлиентОбычноеПриложение; + Описание.Сервер = Модуль.Сервер; + Описание.ВызовСервера = Модуль.ВызовСервера; + Описание.Расширение = Модуль.РасширениеКонфигурации().Имя; + Описание.ПолноеИмя = СтрШаблон("%1.%2", Описание.Расширение, Модуль.Имя); + + Возврат Описание; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТМетаданныеСервер/ЮТМетаданныеСервер.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТМетаданныеСервер/ЮТМетаданныеСервер.mdo new file mode 100644 index 0000000..f178b80 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТМетаданныеСервер/ЮТМетаданныеСервер.mdo @@ -0,0 +1,11 @@ + + + ЮТМетаданныеСервер + + ru + Метаданные сервер + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl new file mode 100644 index 0000000..a3fd531 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl @@ -0,0 +1,989 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#Область Строки + +// ДобавитьСтроку +// Конкатенирует строки, разделяя их разделителем +// +// Параметры: +// ИсходнаяСтрока - Строка - Исходная строка +// ДополнительнаяСтрока - Строка - Добавляемая строка +// Разделитель - Строка - Строка разделитель, любой набор символов - разделитель между подстроками +// +// Возвращаемое значение: +// Строка - Результат конкатенации строк +// +Функция ДобавитьСтроку(Знач ИсходнаяСтрока, Знач ДополнительнаяСтрока, Знач Разделитель = ";") Экспорт + + Если Не ПустаяСтрока(ДополнительнаяСтрока) Тогда + + Если Не ПустаяСтрока(ИсходнаяСтрока) Тогда + + Возврат Строка(ИсходнаяСтрока) + Разделитель + Строка(ДополнительнаяСтрока); + + Иначе + + Возврат Строка(ДополнительнаяСтрока); + + КонецЕсли; + + КонецЕсли; + + Возврат Строка(ИсходнаяСтрока); + +КонецФункции + +// РазложитьСтрокуВМассивПодстрок +// Возвращает массив на основании строки +// +// Параметры: +// Значение - Строка - преобразуемая строка +// Разделитель - Строка - строка-разделитель +// УдалятьКонцевыеПробелы - Булево - удалять или нет концевые пробелы между элементами в строке +// Фиксированный - Булево - возвращать фиксированный или обычный массив +// +// Возвращаемое значение: +// Массив, ФиксированныйМассив - массив строк +// +Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Разделитель = ";", УдалятьКонцевыеПробелы = Ложь, + Фиксированный = Ложь) Экспорт + + Результат = Новый Массив; + + КодУниверсальногоРазделителя = 5855; + УниверсальныйРазделитель = Символ(КодУниверсальногоРазделителя); + МодифицированнаяСтрока = СтрЗаменить(Значение, Разделитель, УниверсальныйРазделитель); + + МассивСтрок = ?(МодифицированнаяСтрока = "", Новый Массив, СтрРазделить(МодифицированнаяСтрока, + УниверсальныйРазделитель)); + + Если УдалятьКонцевыеПробелы Тогда + + Для Индекс = 0 По МассивСтрок.ВГраница() Цикл + + МассивСтрок[Индекс] = СокрЛП(МассивСтрок[Индекс]); + + КонецЦикла; + + КонецЕсли; + + Если Фиксированный Тогда + + Результат = Новый ФиксированныйМассив(МассивСтрок); + + Иначе + + Результат = МассивСтрок; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область Числа + +// Инкрементирует значение +// +// Параметры: +// Значение - Число +// Шаг - Число +Процедура Инкремент(Значение, Знач Шаг = 1) Экспорт + + Значение = Значение + Шаг; + +КонецПроцедуры + +Функция ЧислоВСтроку(Значение) Экспорт + + Возврат Формат(Значение, "ЧН = 0; ЧГ="); + +КонецФункции + +#КонецОбласти + +#Область ДатаВремя + +// Человекочитаемое представление продолжительности +// +// Параметры: +// Продолжительность - Число - Продолжительность в миллисекундах +// +// Возвращаемое значение: +// Строка - Представление продолжительности +Функция ПредставлениеПродолжительности(Знач Продолжительность) Экспорт + + Представление = ЧислоВСтроку(Цел(Продолжительность / 1000)); + Представление = ДобавитьСтроку(Представление, Продолжительность % 1000, "."); + + Инкремент(Представление, " сек"); + + Возврат Представление; + +КонецФункции + +#КонецОбласти + +#Область Коллекции + +// ЗначениеСтруктуры +// Возвращает требуемое поле структуры. В случае отсутствия поля возвращает значение по умолчанию +// +// Параметры: +// ИсходнаяСтруктура - Структура - Исходная структура +// ИмяПоля - Строка - Имя поля структуры +// ЗначениеПоУмолчанию - Произвольный - Значение, которое будет возвращено, если поля в структуре нет +// ПроверятьЗаполненность - Булево - Необходимость проверять значение на заполненность. Если не заполнено, +// то возвращается значение по умолчанию +// +// Возвращаемое значение: +// Произвольный -- Значение искомого поля структуры +Функция ЗначениеСтруктуры(Знач ИсходнаяСтруктура, ИмяПоля, Знач ЗначениеПоУмолчанию = Неопределено, ПроверятьЗаполненность = Ложь) Экспорт + + Если ПустаяСтрока(ИмяПоля) Тогда + + Возврат ЗначениеПоУмолчанию; + + КонецЕсли; + + ЗначениеПоля = Неопределено; + Если ИсходнаяСтруктура.Свойство(ИмяПоля, ЗначениеПоля) Тогда + Если ПроверятьЗаполненность И ЗначениеЗаполнено(ЗначениеПоля) Или Не ПроверятьЗаполненность Тогда + Возврат ЗначениеПоля; + КонецЕсли; + + КонецЕсли; + + Возврат ЗначениеПоУмолчанию; + +КонецФункции + +// ЗначениеСоответствия +// Возвращает требуемое поле соответствия. В случае отсутствия поля возвращает значение по умолчанию +// +// Параметры: +// ИсходноеСоответствие - Соответствие - Исходное соответствия +// ИмяПоля - Строка - Имя поля соответствия +// ЗначениеПоУмолчанию - Произвольный - Значение, которое будет возвращено, если поля в соответствии нет +// +// Возвращаемое значение: +// Произвольный - Значение искомого поля структуры +// +Функция ЗначениеСоответствия(Знач ИсходноеСоответствие, ИмяПоля, Знач ЗначениеПоУмолчанию = Неопределено) Экспорт + + Если ПустаяСтрока(ИмяПоля) Тогда + + Возврат ЗначениеПоУмолчанию; + + КонецЕсли; + + ЗначениеПоля = ИсходноеСоответствие.Получить(ИмяПоля); + Если ЗначениеПоля <> Неопределено Тогда + + Возврат ЗначениеПоля; + + КонецЕсли; + + Возврат ЗначениеПоУмолчанию; + +КонецФункции + +// ОбъединитьВСтруктуру +// Функция, объединяющая две коллекции( с типами Структура или Соответствие) в одну структуру, если это возможно +// +// Параметры: +// Коллекция1 - Соответствие, Структура - Коллекция с типом структура или соответствие +// Коллекция2 - Соответствие, Структура - Коллекция с типом структура или соответствие +// РезультатВФиксированнуюКоллекцию - Булево - Признак фиксированной коллекции, необязательный, по умолчанию Ложь, +// если Истина, возвращает фиксированная коллекция +// +// Возвращаемое значение: +// Структура - Результат объединения двух коллекций +// +Функция ОбъединитьВСтруктуру(Знач Коллекция1, Коллекция2, РезультатВФиксированнуюКоллекцию = Ложь) Экспорт + + Если ТипЗнч(Коллекция1) <> Тип("Структура") Тогда + + Коллекция1 = СкопироватьСтруктуру(Коллекция1); + + КонецЕсли; + + СтруктураРезультат = ДобавитьКлючИЗначениеВКоллекцию(Коллекция1, Коллекция2); + + Возврат ?(РезультатВФиксированнуюКоллекцию, Новый ФиксированнаяСтруктура(СтруктураРезультат), СтруктураРезультат); + +КонецФункции + +// СкопироватьРекурсивно +// Создает копию экземпляра указанного объекта. +// Примечание: +// Функцию нельзя использовать для объектных типов (СправочникОбъект, ДокументОбъект и т.п.). +// +// Параметры: +// Источник - Произвольный - объект, который необходимо скопировать. +// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная +// +// Возвращаемое значение: +// Произвольный - копия объекта, переданного в параметре Источник. +// +Функция СкопироватьРекурсивно(Знач Источник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт + + Перем Приемник; + + СкопироватьПрисвоением = Ложь; + + ТипИсточника = ТипЗнч(Источник); + Если ТипИсточника = Тип("Структура") Или ТипИсточника = Тип("ФиксированнаяСтруктура") Тогда + + Приемник = СкопироватьСтруктуру(Источник, ФиксированнаяКоллекцияВОбычную); + + ИначеЕсли ТипИсточника = Тип("Соответствие") Или ТипИсточника = Тип("ФиксированноеСоответствие") Тогда + + Приемник = СкопироватьСоответствие(Источник, ФиксированнаяКоллекцияВОбычную); + + ИначеЕсли ТипИсточника = Тип("Массив") Или ТипИсточника = Тип("ФиксированныйМассив") Тогда + + Приемник = СкопироватьМассив(Источник, ФиксированнаяКоллекцияВОбычную); + + ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда + + Приемник = СкопироватьСписокЗначений(Источник, ФиксированнаяКоллекцияВОбычную); + + Иначе + + СкопироватьПрисвоением = Истина; +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ТипИсточника = Тип("ТаблицаЗначений") Или ТипИсточника = Тип("ДеревоЗначений") Тогда + + СкопироватьПрисвоением = Ложь; + Приемник = Источник.Скопировать(); + + КонецЕсли; +#КонецЕсли + + КонецЕсли; + + Если СкопироватьПрисвоением Тогда + + Приемник = Источник; + + КонецЕсли; + + Возврат Приемник; + +КонецФункции + +// СкопироватьСтруктуру +// Создает копию значения типа Структура +// +// Параметры: +// СтруктураИсточник - Структура - копируемая структура +// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная +// +// Возвращаемое значение: +// Структура - копия исходной структуры. +// +Функция СкопироватьСтруктуру(СтруктураИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт + + СтруктураРезультат = Новый Структура; + + Для Каждого КлючИЗначение Из СтруктураИсточник Цикл + + СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, + ФиксированнаяКоллекцияВОбычную)); + + КонецЦикла; + + Если ТипЗнч(СтруктураИсточник) = Тип("ФиксированнаяСтруктура") И Не ФиксированнаяКоллекцияВОбычную Тогда + + СтруктураРезультат = Новый ФиксированнаяСтруктура(СтруктураРезультат); + + КонецЕсли; + + Возврат СтруктураРезультат; + +КонецФункции + +// СкопироватьСоответствие +// Создает копию значения типа Соответствие. +// +// Параметры: +// СоответствиеИсточник - Соответствие - соответствие, копию которого необходимо получить. +// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная +// +// Возвращаемое значение: +// Соответствие - копия исходного соответствия. +// +Функция СкопироватьСоответствие(СоответствиеИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт + + СоответствиеРезультат = Новый Соответствие; + + Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл + + СоответствиеРезультат.Вставить(СкопироватьРекурсивно(КлючИЗначение.Ключ, ФиксированнаяКоллекцияВОбычную), + СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксированнаяКоллекцияВОбычную)); + + КонецЦикла; + + Если ТипЗнч(СоответствиеИсточник) = Тип("ФиксированноеСоответствие") И Не ФиксированнаяКоллекцияВОбычную Тогда + + СоответствиеРезультат = Новый ФиксированноеСоответствие(СоответствиеРезультат); + + КонецЕсли; + + Возврат СоответствиеРезультат; + +КонецФункции + +// СкопироватьМассив +// Создает копию значения типа Массив. +// +// Параметры: +// МассивИсточник - Массив - массив, копию которого необходимо получить +// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная +// +// Возвращаемое значение: +// Массив - копия исходного массива. +// +Функция СкопироватьМассив(МассивИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт + + МассивРезультат = Новый Массив; + + Для Каждого Элемент Из МассивИсточник Цикл + + МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент, ФиксированнаяКоллекцияВОбычную)); + + КонецЦикла; + + Если ТипЗнч(МассивИсточник) = Тип("ФиксированныйМассив") И Не ФиксированнаяКоллекцияВОбычную Тогда + + МассивРезультат = Новый ФиксированныйМассив(МассивРезультат); + + КонецЕсли; + + Возврат МассивРезультат; + +КонецФункции + +// СкопироватьСписокЗначений +// Создает копию значения типа СписокЗначений. +// +// Параметры: +// СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить +// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная +// +// Возвращаемое значение: +// СписокЗначений - копия исходного списка значений +// +Функция СкопироватьСписокЗначений(СписокИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт + + СписокРезультат = Новый СписокЗначений; + + Для Каждого ЭлементСписка Из СписокИсточник Цикл + + СписокРезультат.Добавить( + СкопироватьРекурсивно(ЭлементСписка.Значение, ФиксированнаяКоллекцияВОбычную), ЭлементСписка.Представление, + ЭлементСписка.Пометка, ЭлементСписка.Картинка); + + КонецЦикла; + + Возврат СписокРезультат; + +КонецФункции + +// СтруктурыРавны +// Выполняет сравнение структур между собой +// Параметры: +// Структура1 - Структура - Первая структура +// Структура2 - Структура - Вторая структура +// СравниватьТолькоКлючи - Булево - Сравнивать только ключи либо и значения +// +// Возвращаемое значение: +// Булево - Равнозначность структур +Функция СтруктурыРавны(Структура1, Структура2, СравниватьТолькоКлючи = Истина) Экспорт + Если Структура1.Количество() <> Структура2.Количество() Тогда + Возврат Ложь; + Иначе + Для Каждого Свойство Из Структура1 Цикл + Если Не Структура2.Свойство(Свойство.Ключ) Или Не СравниватьТолькоКлючи И ЗначениеСтруктуры(Структура2, + Свойство.Ключ) <> Свойство.Значение Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Истина; +КонецФункции + +Функция ВыгрузитьЗначения(Знач Коллекция, Знач ИмяРеквизита) Экспорт + + Результат = Новый Массив(); + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Результат.Добавить(ЭлементКоллекции[ИмяРеквизита]); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПересечениеМассивов(Коллекция1, Коллекция2) Экспорт + + Результат = Новый Массив; + + Для Каждого Элемент Из Коллекция1 Цикл + + Если Коллекция2.Найти(Элемент) <> Неопределено Тогда + Результат.Добавить(Элемент); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ЗначениеВМассиве(Значение, + Значение2 = "_!%*", + Значение3 = "_!%*", + Значение4 = "_!%*", + Значение5 = "_!%*", + Значение6 = "_!%*", + Значение7 = "_!%*", + Значение8 = "_!%*", + Значение9 = "_!%*", + Значение10 = "_!%*") Экспорт + + Массив = Новый Массив; + Массив.Добавить(Значение); + + ФлагОкончания = "_!%*"; + + Значения = Новый Массив; + + Если Значение <> ФлагОкончания Тогда + Значения.Добавить(Значение); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение2 <> ФлагОкончания Тогда + Значения.Добавить(Значение2); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение3 <> ФлагОкончания Тогда + Значения.Добавить(Значение3); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение4 <> ФлагОкончания Тогда + Значения.Добавить(Значение4); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение5 <> ФлагОкончания Тогда + Значения.Добавить(Значение5); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение6 <> ФлагОкончания Тогда + Значения.Добавить(Значение6); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение7 <> ФлагОкончания Тогда + Значения.Добавить(Значение7); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение8 <> ФлагОкончания Тогда + Значения.Добавить(Значение8); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение9 <> ФлагОкончания Тогда + Значения.Добавить(Значение9); + Иначе + Возврат Значения; + КонецЕсли; + + Если Значение10 <> ФлагОкончания Тогда + Значения.Добавить(Значение10); + Иначе + Возврат Значения; + КонецЕсли; + + Возврат Значения; + +КонецФункции + +Процедура ДополнитьМассив(Приемник, Источник) Экспорт + + Для Каждого Элемент Из Источник Цикл + + Приемник.Добавить(Элемент); + + КонецЦикла; + +КонецПроцедуры + +// КоллекцияВСоответствие +// Возвращает соответствие элементов переданной коллекции, в качестве ключей выступают значения указанного поля элементов коллекции. +// +// Параметры: +// Коллекция - Произвольный - значение, для которого определен итератор, и возможно обращение к полям элементов через квадратные скобки. +// ИмяПоляКлюча - Строка - имя поля элемента коллекции, которое будет ключом соответствия. +// ИмяПоляЗначения - Строка - если указан, значениями результата будут не элементы, а значения соответствующих полей элементов коллекции. +// Возвращаемое значение: +// Соответствие - полученное соответствие. +Функция КоллекцияВСоответствие(Коллекция, ИмяПоляКлюча, ИмяПоляЗначения = Неопределено) Экспорт + + Результат = Новый Соответствие(); + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Значение = ?(ИмяПоляЗначения = Неопределено, ЭлементКоллекции, ЭлементКоллекции[ИмяПоляЗначения]); + + Результат.Вставить(ЭлементКоллекции[ИмяПоляКлюча], Значение); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ЧтениеДанных + +Функция ДанныеТекстовогоФайла(ИмяФайла) Экспорт + +#Если НЕ ВебКлиент Тогда + Чтение = Новый ЧтениеТекста; + Чтение.Открыть(ИмяФайла, "UTF-8"); + Текст = Чтение.Прочитать(); + Чтение.Закрыть(); + + Возврат Текст; +#Иначе + ВызватьИсключение "Чтение данных текстовых файлов в веб-клиенте не поддерживается"; +#КонецЕсли + +КонецФункции + +Функция ЗначениеИзJSON(СтрокаJSON) Экспорт + +#Если НЕ ВебКлиент Тогда + Чтение = Новый ЧтениеJSON; + Чтение.УстановитьСтроку(СтрокаJSON); + Значение = ПрочитатьJSON(Чтение); + Чтение.Закрыть(); + Возврат Значение; +#Иначе + ВызватьИсключение "Разбор JSON строки в веб-клиенте не поддерживается"; +#КонецЕсли + +КонецФункции + +#КонецОбласти + +#Область Файлы + +// Возвращает путь к каталогу, в котором находится файл +// +// Параметры: +// ПолноеИмяФайла - Строка +// +// Возвращаемое значение: +// Строка - Каталог +Функция Каталог(ПолноеИмяФайла) Экспорт + + Файл = Новый Файл(ПолноеИмяФайла); + Возврат Файл.Путь; + +КонецФункции + +// Возвращает путь к вложенному элементу +// +// Параметры: +// Путь1 - Строка - базовый путь к каталогу +// Путь2 - Строка - относительный путь к вложенному элементу +// +// Возвращаемое значение: +// Строка - Объединенный путь +Функция ОбъединитьПути(Путь1, Путь2) Экспорт + + Возврат ДобавитьСтроку(Путь1, Путь2, ПолучитьРазделительПути()); + +КонецФункции + +// Проверяет существование файла +// +// Параметры: +// ПутьКФайлу - Строка +// +// Возвращаемое значение: +// Булево - Файл существует +Функция ФайлСуществует(ПутьКФайлу) Экспорт + + Файл = Новый Файл(ПутьКФайлу); + Возврат Файл.Существует(); + +КонецФункции + +// Проверяет, что по указанному пути находится каталог +// +// Параметры: +// ПутьКФайлу - Строка +// +// Возвращаемое значение: +// Булево - Это каталог +Функция ЭтоКаталог(ПутьКФайлу) Экспорт + + Файл = Новый Файл(ПутьКФайлу); + Возврат Файл.Существует() И Файл.ЭтоКаталог(); + +КонецФункции + +#КонецОбласти +// МетодМодуляСуществует +// Проверяет существование публичного (экспортного) метода у объекта +// +// Параметры: +// ИмяМодуля - Строка - Имя модуля, метод которого нужно поискать +// ИмяМетода - Строка - Имя метода, который ищем +// КоличествоПараметров - Число - Количество параметров метода, увы это никак не влияет на проверку +// Кешировать - Булево - Признак кеширования результата проверки +// +// Возвращаемое значение: +// Булево -- Метод найден +Функция МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров = 0, Кешировать = Истина) Экспорт + + Если Кешировать Тогда + Возврат ЮТПовторногоИспользования.МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров); + КонецЕсли; + + Алгоритм = СтрШаблон("%1.%2(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)", ИмяМодуля, ИмяМетода); + + Ошибка = ВыполнитьМетод(Алгоритм); + МетодСуществует = СтрНайти(НРег(Ошибка.Описание), "(" + НРег(ИмяМетода) + ")") = 0; + + Возврат МетодСуществует; + +КонецФункции + +Функция ВыполнитьМетод(ПолноеИмяМетода, Параметры = Неопределено) Экспорт + + Если СтрЗаканчиваетсяНа(ПолноеИмяМетода, ")") Тогда + + Алгоритм = ПолноеИмяМетода; + + ИначеЕсли НЕ ЗначениеЗаполнено(Параметры) Тогда + + Алгоритм = ПолноеИмяМетода + "()"; + + Иначе + + Алгоритм = ""; + Для Инд = 0 По Параметры.ВГраница() Цикл + + Алгоритм = ДобавитьСтроку(Алгоритм, СтрШаблон("Параметры[%1]", Инд), ", "); + + КонецЦикла; + + Алгоритм = СтрШаблон("%1(%2)", ПолноеИмяМетода, Алгоритм); + + КонецЕсли; + + Попытка + Выполнить(Алгоритм); + Исключение + Возврат ИнформацияОбОшибке(); + КонецПопытки; + + Возврат Неопределено; + +КонецФункции + +// ПеременнаяСодержитСвойство +// функция проверяет наличие свойства у значения любого типа данных. Если передано НЕОПРЕДЕЛЕНО, то ф-ия всегда вернет Ложь +// +// Параметры: +// Переменная - Произвольный - переменная любого типа, для которой необходимо проверить наличие свойства +// ИмяСвойства - Строка - переменная типа "Строка", содержащая искомое свойства +// +// Возвращаемое значение: +// Булево - признак наличия свойства у значения +// +Функция ПеременнаяСодержитСвойство(Переменная, ИмяСвойства) Экспорт + + Если Переменная = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + // Инициализируем структуру для теста с ключом (значение переменной "ИмяСвойства") и значением произвольного GUID'а + GUIDПроверка = Новый УникальныйИдентификатор; + СтруктураПроверка = Новый Структура; + СтруктураПроверка.Вставить(ИмяСвойства, GUIDПроверка); + // Заполняем созданную структуру из переданного значения переменной + ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная); + // Если значение для свойства структуры осталось GUIDПроверка, то искомое свойство не найдено, и наоборот. + Возврат СтруктураПроверка[ИмяСвойства] <> GUIDПроверка; + +КонецФункции + +// СообщитьПользователю +// Формирует и выводит сообщение, которое может быть связано с элементом +// управления формы. +// +// Параметры: +// ТекстСообщенияПользователю - Строка - текст сообщения. +// Поле - Строка - наименование реквизита формы +// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы) +// ОбъектИлиСсылка - Объект, Ссылка - Ссылка на объект ИБ или объект +// ИдентификаторНазначения - Строка, УникальныйИдентификатор - Уникальный идентификатор экземпляра формы +// к которой должно быть "привязано" сообщение +// +Процедура СообщитьПользователю(ТекстСообщенияПользователю = "", Поле = "", + ПутьКДанным = "", ОбъектИлиСсылка = Неопределено, + Знач ИдентификаторНазначения = "") Экспорт + + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = СокрЛП(ТекстСообщенияПользователю); + Сообщение.Поле = Поле; + + Если ЗначениеЗаполнено(ИдентификаторНазначения) Тогда + + Если ТипЗнч(ИдентификаторНазначения) = Тип("Строка") Тогда + + ИдентификаторНазначения = Новый УникальныйИдентификатор(ИдентификаторНазначения); + + КонецЕсли; + + Сообщение.ИдентификаторНазначения = ИдентификаторНазначения; + + КонецЕсли; + + Если Не ПустаяСтрока(ПутьКДанным) Тогда + + Сообщение.ПутьКДанным = ПутьКДанным; + + КонецЕсли; + + Если ОбъектИлиСсылка <> Неопределено Тогда + + Сообщение.УстановитьДанные(ОбъектИлиСсылка); + + КонецЕсли; + + Сообщение.Сообщить(); + +КонецПроцедуры + +Функция СтрокаJSON(Значение) Экспорт + + ЗаписьJSON = Новый ЗаписьJSON(); + ЗаписьJSON.УстановитьСтроку(); + СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение); + + Возврат ЗаписьJSON.Закрыть(); + +КонецФункции // СтрокаJSON + +Функция ПредставлениеЗначения(Значение) Экспорт + + Попытка + Возврат СтрокаJSON(Значение); + Исключение + Возврат Строка(Значение); + КонецПопытки; + +КонецФункции + +Функция ПредставлениеТипа(Тип) Экспорт + + ТипXML = СериализаторXDTO.XMLТип(Тип); + + Если ТипXML = Неопределено Тогда + Возврат Строка(Тип); + Иначе + Возврат ТипXML.ИмяТипа; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ОписаниеТиповЛюбаяСсылка() Экспорт + + Возврат ЮТОбщийВызовСервера.ОписаниеТиповЛюбаяСсылка(); + +КонецФункции + +Процедура ВызовУстаревшегоМетода(УстаревшийМетод, РекомендуемыйМетод = Неопределено) Экспорт + + Сообщение = СтрШаблон("Используется устаревший метод '%1'. В следующий релизах метод будет удален", УстаревшийМетод); + + Если ЗначениеЗаполнено(РекомендуемыйМетод) Тогда + Сообщение = СтрШаблон("%1. Рекомендуется использовать '%2'", Сообщение, РекомендуемыйМетод); + КонецЕсли; + + СообщитьПользователю(Сообщение); + +КонецПроцедуры + +Функция УстановленБезопасныйРежим() Экспорт + + Возврат ЮТОбщийВызовСервера.УстановленБезопасныйРежим(); + +КонецФункции + +Функция МестноеВремяПоВременнойМетке(Метка) Экспорт + + Если ЗначениеЗаполнено(Метка) Тогда + Возврат МестноеВремя('00010101' + Метка / 1000); + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция ПродолжительностьВСекундах(Продолжительность) Экспорт + + Возврат Продолжительность / 1000; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ДобавитьКлючИЗначениеВКоллекцию(КоллекцияРезультат, Коллекция) + + Для Каждого Элемент Из Коллекция Цикл + + КоллекцияРезультат.Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + Возврат КоллекцияРезультат; + +КонецФункции + +Функция Модуль(ИмяМодуля) Экспорт + + Возврат Вычислить(ИмяМодуля); + +КонецФункции + +Функция ПредставлениеОбъекта(Объект, Знач Уровень = 1, ПредставлениеОбъекта = Неопределено) + + ТипОбъекта = ТипЗнч(Объект); + + Шаблон = "%1 (%2)"; + Представление = ""; + ПредставлениеТипа = ТипОбъекта; + + Если ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда + СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов(" ", Уровень * 4); + Шаблон = "%2: + |%1"; + Представление = СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов(" ", Уровень * 4) + ПредставлениеСтруктуры(Объект, Уровень); + + ИначеЕсли ТипОбъекта = Тип("Массив") Тогда + + Шаблон = "[%1] (%2)"; + Представление = СтрСоединить(Объект, ", "); + + ИначеЕсли ТипОбъекта = Тип("Число") Тогда + + Представление = ЧислоВСтроку(Объект); + + ИначеЕсли ТипОбъекта = Тип("Дата") Тогда + + Представление = Формат(Объект, "ДФ=""dd.MM.yyyy ЧЧ:мм:сс"""); + + ИначеЕсли ТипОбъекта = Тип("Булево") Тогда + + Представление = Строка(Объект); + + ИначеЕсли ТипОбъекта = Тип("Строка") Тогда + + Представление = Объект; + + Иначе + + Представление = Строка(Объект); + ПредставлениеТипа = ПредставлениеТипа(ТипОбъекта); // Для ссылочных + + КонецЕсли; + + Если ПустаяСтрока(Представление) Тогда + + Представление = "<Пусто>"; + + КонецЕсли; + + Возврат СтрШаблон(Шаблон, Представление, ?(ПредставлениеОбъекта = Неопределено, ПредставлениеТипа, ПредставлениеОбъекта)); + +КонецФункции + +Функция ПредставлениеСтруктуры(Значение, Уровень) + + Строки = Новый Массив(); + + Для Каждого Элемент Из Значение Цикл + + Строки.Добавить(СтрШаблон("%1: %2", Элемент.Ключ, ПредставлениеОбъекта(Элемент.Значение, Уровень + 1))); + + КонецЦикла; + + Возврат СтрСоединить(Строки, Символы.ПС + СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов(" ", Уровень * 4)); + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОбщий/ЮТОбщий.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТОбщий/ЮТОбщий.mdo new file mode 100644 index 0000000..1c605d8 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОбщий/ЮТОбщий.mdo @@ -0,0 +1,12 @@ + + + ЮТОбщий + + ru + Общий + + Набор общих (во всех контекстах) методов + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОбщийВызовСервера/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТОбщийВызовСервера/Module.bsl new file mode 100644 index 0000000..b7571c8 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОбщийВызовСервера/Module.bsl @@ -0,0 +1,59 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ОписаниеТиповЛюбаяСсылка() Экспорт + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку( + " + | cc:AnyRef + |"); + + Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML); + +КонецФункции + +Функция УстановленБезопасныйРежим() Экспорт + + Возврат БезопасныйРежим(); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОбщийВызовСервера/ЮТОбщийВызовСервера.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТОбщийВызовСервера/ЮТОбщийВызовСервера.mdo new file mode 100644 index 0000000..51c23d1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОбщийВызовСервера/ЮТОбщийВызовСервера.mdo @@ -0,0 +1,11 @@ + + + ЮТОбщийВызовСервера + + ru + Общий вызов сервера + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОтчет/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТОтчет/Module.bsl new file mode 100644 index 0000000..b80f0eb --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОтчет/Module.bsl @@ -0,0 +1,105 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// СформироватьОтчет +// Формирует отчет о результатах тестирования по заданным параметрам +// Параметры: +// РезультатВыполнения - Массив - Коллекция результатов выполнения, каждый элемент - структура, см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// ПараметрыЗапуска - Структура - Параметры запуска, см. ЮТФабрика.ПараметрыЗапуска +Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска) Экспорт + + Модули = ЮТРасширения.ГенераторыОтчетов(); + МодульОтчета = Неопределено; + + Для Каждого Модуль Из Модули Цикл + + Если Модуль.РеализуетФормат(ПараметрыЗапуска.reportFormat) Тогда + МодульОтчета = Модуль; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если МодульОтчета = Неопределено Тогда + + ВызватьИсключение СтрШаблон("Отчет в формате %1 не поддерживается", ПараметрыЗапуска.reportFormat); + + КонецЕсли; + + ИмяФайлаОтчета = ИмяФайлаОтчета(Модуль, ПараметрыЗапуска); + ДанныеОтчета = Модуль.ДанныеОтчета(РезультатВыполнения); + + Если ДанныеОтчета = Неопределено Тогда + + ВызватьИсключение "Не удалось получить данные отчета"; + + ИначеЕсли НЕ ЗначениеЗаполнено(ИмяФайлаОтчета) Тогда + + ВызватьИсключение "Не удалось сформировать имя файла отчета"; + + Иначе + + ДанныеОтчета.Записать(ИмяФайлаОтчета); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ИмяФайлаОтчета(Модуль, ПараметрыЗапуска) + + ИмяФайла = Неопределено; + + ПутьКОтчету = ПараметрыЗапуска.reportPath; + + Если НЕ ЗначениеЗаполнено(ПутьКОтчету) Тогда + ВызватьИсключение "Не указан путь сохранения отчета"; + КонецЕсли; + + Если ЮТОбщий.ЭтоКаталог(ПутьКОтчету) Тогда + ИмяФайла = ЮТОбщий.ОбъединитьПути(ПутьКОтчету, Модуль.ИмяФайлаПоУмолчанию()); + Иначе + ИмяФайла = ПутьКОтчету; + КонецЕсли; + + Возврат ИмяФайла; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОтчет/ЮТОтчет.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТОтчет/ЮТОтчет.mdo new file mode 100644 index 0000000..45a1b30 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОтчет/ЮТОтчет.mdo @@ -0,0 +1,10 @@ + + + ЮТОтчет + + ru + Отчет + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJSON/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJSON/Module.bsl new file mode 100644 index 0000000..6e902d1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJSON/Module.bsl @@ -0,0 +1,71 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция РеализуетФормат(ФорматОтчета) Экспорт + + Возврат СтрСравнить(ФорматОтчета, "json") = 0; + +КонецФункции + +Функция ИмяФайлаПоУмолчанию() Экспорт + + Возврат "report.json"; + +КонецФункции + +Функция ДанныеОтчета(РезультатВыполнения) Экспорт + +#Если ВебКлиент Тогда + ВызватьИсключение "Формирование отчета в формате JSON не поддерживается в web-клиенте"; +#Иначе + Поток = Новый ПотокВПамяти(); + Запись = Новый ЗаписьJSON(); + Запись.ОткрытьПоток(Поток, "UTF-8", Ложь); + + ЗаписатьJSON(Запись, РезультатВыполнения); + + Запись.Закрыть(); + + Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные(); +#КонецЕсли + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJSON/ЮТОтчетJSON.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJSON/ЮТОтчетJSON.mdo new file mode 100644 index 0000000..c2f49de --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJSON/ЮТОтчетJSON.mdo @@ -0,0 +1,10 @@ + + + ЮТОтчетJSON + + ru + Отчет JSON + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJUnit/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJUnit/Module.bsl new file mode 100644 index 0000000..bd121d2 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJUnit/Module.bsl @@ -0,0 +1,343 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция РеализуетФормат(ФорматОтчета) Экспорт + + Возврат СтрСравнить(ФорматОтчета, "jUnit") = 0; + +КонецФункции + +Функция ИмяФайлаПоУмолчанию() Экспорт + + Возврат "junit.xml"; + +КонецФункции + +Функция ДанныеОтчета(Знач РезультатВыполнения) Экспорт + + Возврат СформироватьОтчетОТестировании(РезультатВыполнения); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// СформироватьОтчетОТестировании +// Формирует отчет (xml-файл) и возвращает его в виде двоичных данных +// +// Параметры: +// РезультатТестирования - Массив - результаты всех сценариев теста +// Возвращаемое значение: +// ДвоичныеДанные - полученный отчет +Функция СформироватьОтчетОТестировании(РезультатТестирования) Экспорт + + Поток = Новый ПотокВПамяти(); + ЗаписьXML = Новый ЗаписьXML; + + ЗаписьXML.ОткрытьПоток(Поток, "UTF-8", Ложь); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + ЗаписьXML.ЗаписатьНачалоЭлемента("testsuites"); + + Номер = 0; + + Для Каждого Набор Из РезультатТестирования Цикл + ЗаписатьНабор(ЗаписьXML, Набор, Номер); + Номер = Номер + 1; + КонецЦикла; + + ЗаписатьСвойства(ЗаписьXML, Новый Структура("executor, reportDate", "BIA YAXUnit", ТекущаяДатаСеанса())); + + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.Закрыть(); + + Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные(); + +КонецФункции + +// ЗаписатьРезультатТеста +// +// Параметры: +// ЗаписьXML - ЗаписьXML - Запись XML +// РезультатТеста - Структура - Результат теста +Процедура ЗаписатьТест(ЗаписьXML, РезультатТеста) + + Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); + ЗаписьXML.ЗаписатьАтрибут("name", РезультатТеста.Имя); + ЗаписьXML.ЗаписатьАтрибут("classname", РезультатТеста.ПолноеИмяМетода); + ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ЮТОбщий.ПродолжительностьВСекундах(РезультатТеста.Длительность))); + ЗаписьXML.ЗаписатьАтрибут("context", РезультатТеста.Режим); + + Для Каждого ОписаниеОшибки Из РезультатТеста.Ошибки Цикл + + Статус = ЮТРегистрацияОшибок.СтатусОшибки(ОписаниеОшибки.ТипОшибки); + + ИмяУзла = Неопределено; + ЗаписатьЗначения = Ложь; + ЗаписатьСтек = Ложь; + Если Статус = Статусы.Ошибка Тогда + ИмяУзла = "failure"; + ЗаписатьЗначения = Истина; + ЗаписатьСтек = Истина; + ИначеЕсли Статус = Статусы.Пропущен Тогда + ИмяУзла = "skipped"; + ЗаписатьСтек = Истина; + ИначеЕсли Статус = Статусы.Ожидание Тогда + ИмяУзла = "skipped"; + ЗаписатьСтек = Истина; + ИначеЕсли Статус <> Статусы.Успешно Тогда + ИмяУзла = "error"; + ЗаписатьСтек = Истина; + КонецЕсли; + + Сообщение = СообщениеОбОшибке(ОписаниеОшибки); + ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяУзла); + ЗаписьXML.ЗаписатьАтрибут("message", Сообщение); + + Если ЗначениеЗаполнено(ОписаниеОшибки.ТипОшибки) Тогда + ЗаписьXML.ЗаписатьАтрибут("type", XMLСтрока(ОписаниеОшибки.ТипОшибки)); + КонецЕсли; + + Если ЗаписатьЗначения Тогда + Если ОписаниеОшибки.ОжидаемоеЗначение <> Неопределено Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента("expected"); + ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуjUnit(ОписаниеОшибки.ОжидаемоеЗначение)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + + Если ОписаниеОшибки.ПроверяемоеЗначение <> Неопределено Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента("actual"); + ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуjUnit(ОписаниеОшибки.ПроверяемоеЗначение)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + КонецЕсли; + + Если ЗаписатьСтек И ОписаниеОшибки.Стек <> Неопределено Тогда + ЗаписьXML.ЗаписатьТекст(ОписаниеОшибки.Стек); + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + Если РезультатТеста.Ошибки.Количество() = 0 И РезультатТеста.Статус <> Статусы.Успешно Тогда + Если РезультатТеста.Статус = Статусы.Ожидание Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("skipped"); + ЗаписьXML.ЗаписатьАтрибут("message", "Тест не был вызван"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Иначе + + Для Каждого ОписаниеОшибки Из РезультатТеста.Ошибки Цикл + ЗаписатьОшибку(ЗаписьXML, ОписаниеОшибки); + КонецЦикла; + + КонецЕсли; + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры + +Процедура ЗаписатьОшибку(ЗаписьXML, ОписаниеОшибки) + Сообщение = СообщениеОбОшибке(ОписаниеОшибки); + ЗаписьXML.ЗаписатьНачалоЭлемента("error"); + ЗаписьXML.ЗаписатьАтрибут("message", Сообщение); + + Если ЗначениеЗаполнено(ОписаниеОшибки.ТипОшибки) Тогда + ЗаписьXML.ЗаписатьАтрибут("type", XMLСтрока(ОписаниеОшибки.ТипОшибки)); + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки.Стек) Тогда + ЗаписьXML.ЗаписатьТекст(ОписаниеОшибки.Стек); + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); +КонецПроцедуры + +Процедура ЗаписатьНабор(ЗаписьXML, Набор, Номер) + + КоличествоТестов = 0; + КоличествоПропущенных = 0; + КоличествоУпавших = 0; + КоличествоСломанных = 0; + + Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + + Для Каждого РезультатТеста Из Набор.Тесты Цикл + + КоличествоТестов = КоличествоТестов + 1; + + Если РезультатТеста.Статус = Статусы.Ошибка Тогда + КоличествоУпавших = КоличествоУпавших + 1; + ИначеЕсли РезультатТеста.Статус = Статусы.Пропущен ИЛИ РезультатТеста.Статус = Статусы.Ожидание Тогда + КоличествоПропущенных = КоличествоПропущенных + 1; + ИначеЕсли РезультатТеста.Статус <> Статусы.Успешно Тогда + КоличествоСломанных = КоличествоСломанных + 1; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьНачалоЭлемента("testsuite"); + ЗаписьXML.ЗаписатьАтрибут("id", XMLСтрока(Номер)); + ЗаписьXML.ЗаписатьАтрибут("name", СтрШаблон("%1 [%2]", Набор.Представление, Набор.Режим)); + ЗаписьXML.ЗаписатьАтрибут("tests", XMLСтрока(КоличествоТестов)); + ЗаписьXML.ЗаписатьАтрибут("errors", XMLСтрока(КоличествоСломанных)); + ЗаписьXML.ЗаписатьАтрибут("skipped", XMLСтрока(КоличествоПропущенных)); + ЗаписьXML.ЗаписатьАтрибут("failures", XMLСтрока(КоличествоУпавших)); + ЗаписьXML.ЗаписатьАтрибут("timestamp", XMLСтрока(ЮТОбщий.МестноеВремяПоВременнойМетке(Набор.ДатаСтарта))); + ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ЮТОбщий.ПродолжительностьВСекундах(Набор.Длительность))); + ЗаписьXML.ЗаписатьАтрибут("package", Набор.МетаданныеМодуля.Расширение); + ЗаписьXML.ЗаписатьАтрибут("context", Набор.Режим); + + Для Каждого ОписаниеОшибки Из Набор.Ошибки Цикл + ЗаписатьОшибку(ЗаписьXML, ОписаниеОшибки); + КонецЦикла; + + Для Каждого РезультатТеста Из Набор.Тесты Цикл + + ЗаписатьТест(ЗаписьXML, РезультатТеста); + + КонецЦикла; + + ЗаписатьСвойства(ЗаписьXML, Новый Структура("context", Набор.Режим)); + ЗаписьXML.ЗаписатьКонецЭлемента(); // testsuite + +КонецПроцедуры + +Функция ЗначениеВСтрокуjUnit(Знач Значение) + + ТипЗначения = ТипЗнч(Значение); + + Если ТипЗначения = Тип("Строка") Тогда + + Возврат XMLСтрока(Значение); + + ИначеЕсли ТипЗначения = Тип("Массив") Тогда + + Возврат ЗначениеВСтрокуМассивjUnit(Значение); + + ИначеЕсли ТипЗначения = Тип("Структура") Или ТипЗначения = Тип("Соответствие") Или ТипЗначения = Тип("СписокЗначений") Тогда + + Возврат ЗначениеВСтрокуПростаяКоллекцияjUnit(Значение); + + ИначеЕсли ТипЗначения = Тип("Тип") Или ТипЗначения = Тип("СтандартныйПериод") Тогда + + Возврат Строка(Значение); + + Иначе + + Попытка + + Возврат XMLСтрока(Значение); + + Исключение + + Возврат Строка(Значение); + + КонецПопытки; + + КонецЕсли; + +КонецФункции + +Функция ЗначениеВСтрокуМассивjUnit(Коллекция) + + Стр = ""; + + Для Ккк = 0 По Коллекция.Количество() - 1 Цикл + + Стр = Стр + ЗначениеВСтрокуjUnit(Коллекция[Ккк]); + + Если Ккк < Коллекция.Количество() - 1 Тогда + + Стр = Стр + Символы.ПС; + + КонецЕсли; + + КонецЦикла; + + Возврат Стр; + +КонецФункции + +Функция ЗначениеВСтрокуПростаяКоллекцияjUnit(Коллекция) + + Стр = "|"; + + Для Каждого Элем Из Коллекция Цикл + + Стр = " " + Стр + Элем.Значение + " |"; + + КонецЦикла; + + Возврат Стр; + +КонецФункции + +Функция СообщениеОбОшибке(ОписаниеОшибки) + + Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда + Сообщение = ОписаниеОшибки.Сообщение; + ИначеЕсли ЗначениеЗаполнено(ОписаниеОшибки) Тогда + Сообщение = Строка(ОписаниеОшибки); + Иначе + Сообщение = Неопределено; + КонецЕсли; + + Возврат Сообщение; + +КонецФункции + +Процедура ЗаписатьСвойства(ЗаписьXML, Свойства) + + ЗаписьXML.ЗаписатьНачалоЭлемента("properties"); + + Для Каждого Свойство Из Свойства Цикл + ЗаписьXML.ЗаписатьНачалоЭлемента("property"); + ЗаписьXML.ЗаписатьАтрибут("name", Свойство.Ключ); + ЗаписьXML.ЗаписатьАтрибут("value", ЗначениеВСтрокуjUnit(Свойство.Значение)); + ЗаписьXML.ЗаписатьКонецЭлемента(); // property + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); // properties + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJUnit/ЮТОтчетJUnit.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJUnit/ЮТОтчетJUnit.mdo new file mode 100644 index 0000000..3605a0d --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТОтчетJUnit/ЮТОтчетJUnit.mdo @@ -0,0 +1,11 @@ + + + ЮТОтчетJUnit + + ru + Отчет jUnit + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТПараметры/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТПараметры/Module.bsl new file mode 100644 index 0000000..147ef7b --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТПараметры/Module.bsl @@ -0,0 +1,207 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// ПараметрыЗапуска +// Возвращает загруженные параметры запуска тестирования +// Параметры: +// ПараметрыЗапускаСтрокой - Строка - Параметры запуска приложения +// +// Возвращаемое значение: +// см. ЮТФабрика.ПараметрыЗапуска +Функция ПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой) Экспорт + + Попытка + + Параметры = ПрочитатьПараметрыЗапуска(ПараметрыЗапускаСтрокой); + + Исключение + + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуИнициализацииДвижка(ИнформацияОбОшибке(), "Ошибка чтения параметров запуска"); + Параметры = ЮТФабрика.ПараметрыЗапуска(); + + КонецПопытки; + + Возврат Параметры; + +КонецФункции + +Функция КлючЗапуска() Экспорт + + Возврат "RunUnitTests"; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ЗначениеНастройкиТеста(ИмяНастройки, ОписаниеТеста, ОписаниеТестовогоНабора, ЗначениеПоУмолчанию) Экспорт + + Значение = ЗначениеПоУмолчанию; + + Если ОписаниеТеста.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда + Значение = ОписаниеТеста.НастройкиВыполнения[ИмяНастройки]; + ИначеЕсли ОписаниеТестовогоНабора.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда + Значение = ОписаниеТестовогоНабора.НастройкиВыполнения[ИмяНастройки]; + Иначе + + ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения(); + Если ГлобальныеНастройки.Свойство(ИмяНастройки) Тогда + Значение = ГлобальныеНастройки[ИмяНастройки]; + КонецЕсли; + + КонецЕсли; + + Возврат Значение; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// ПрочитатьПараметрыЗапуска +// Читает параметры из строки запуска +// Параметры: +// ПараметрыЗапускаСтрокой - Строка - Строка с параметрами запуска. +// Содержит ключ запуска и строку с конфигурационным файлом. +// Формат строки "RunUnitTests=/путь/к/конфигурационному/файлу", где ключ указывается обязательно, а путь - по желанию +// +// Возвращаемое значение: +// см. ЮТФабрика.ПараметрыЗапуска +Функция ПрочитатьПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой) + + Параметры = ЮТФабрика.ПараметрыЗапуска(); + + Если Не ЗначениеЗаполнено(ПараметрыЗапускаСтрокой) Тогда + Возврат Параметры; + КонецЕсли; + + ПарыКлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ПараметрыЗапускаСтрокой, ";", Истина); + + ПараметрыЗапуска = Новый Структура; + + Для Каждого Пара Из ПарыКлючЗначение Цикл + + КлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Пара, "=", Истина); + + Если КлючЗначение.Количество() = 1 Тогда + ПараметрыЗапуска.Вставить(КлючЗначение[0], Истина); + Иначе + ПараметрыЗапуска.Вставить(КлючЗначение[0], КлючЗначение[1]); + КонецЕсли; + + КонецЦикла; + + ЗначениеКлючаЗапуска = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска, КлючЗапуска(), Ложь); + + Если ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Булево") Тогда + + Параметры.ВыполнятьМодульноеТестирование = ЗначениеКлючаЗапуска; + Возврат Параметры; + + ИначеЕсли ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Строка") Тогда + + Параметры.ВыполнятьМодульноеТестирование = Истина; + КонфигурационныйФайл = ЗначениеКлючаЗапуска; + + КонецЕсли; + + Если ЗначениеЗаполнено(КонфигурационныйФайл) Тогда + + ПараметрыИзФайла = ПрочитатьКонфигурационныйФайл(КонфигурационныйФайл); + + ДополнитьПараметрыПрочитанными(Параметры, ПараметрыИзФайла); + + КонецЕсли; + + Возврат Параметры; + +КонецФункции + +Функция ПрочитатьКонфигурационныйФайл(ПутьКФайлу) + +#Если НЕ ВебКлиент Тогда + + Если ЮТОбщий.УстановленБезопасныйРежим() Тогда + ВызватьИсключение "Расширение подключено в безопасном режиме. Чтение конфигурационного файла недоступно"; + КонецЕсли; + + Если Не ЮТОбщий.ФайлСуществует(ПутьКФайлу) Тогда + ВызватьИсключение СтрШаблон("Ошибка загрузки настроек из файла: Файл '%1' не существует", ПутьКФайлу); + КонецЕсли; + + ДанныеФайла = Неопределено; + + Попытка + + Текст = ЮТОбщий.ДанныеТекстовогоФайла(ПутьКФайлу); + + Если ЗначениеЗаполнено(Текст) Тогда + ДанныеФайла = ЮТОбщий.ЗначениеИзJSON(Текст); + КонецЕсли; + + Исключение + + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение СтрШаблон("Ошибка загрузки настроек из файла: '%1'", Ошибка); + + КонецПопытки; + + Возврат ДанныеФайла; + +#Иначе + // будут использованы параметры по умолчанию + Возврат Новый Структура; +#КонецЕсли + +КонецФункции + +Процедура ДополнитьПараметрыПрочитанными(Параметры, ДанныеДополнения) + + Для Каждого Параметр Из ДанныеДополнения Цикл + + Если НЕ Параметры.Свойство(Параметр.Ключ) Тогда + Продолжить; + КонецЕсли; + + Если ТипЗнч(Параметры[Параметр.Ключ]) = ТипЗнч(Параметр.Значение) Тогда + + Параметры[Параметр.Ключ] = Параметр.Значение; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТПараметры/ЮТПараметры.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТПараметры/ЮТПараметры.mdo new file mode 100644 index 0000000..f0d3ef0 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТПараметры/ЮТПараметры.mdo @@ -0,0 +1,12 @@ + + + ЮТПараметры + + ru + Параметры + + Используется для обработки и дополнения параметров запуска тестов + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТПовторногоИспользования/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТПовторногоИспользования/Module.bsl new file mode 100644 index 0000000..5b9c794 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТПовторногоИспользования/Module.bsl @@ -0,0 +1,57 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Функция АдресСерверногоКонтекста() Экспорт + + Возврат ЮТКонтекстСервер.АдресСерверногоКонтекста(Ложь); + +КонецФункции + +Функция МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров = 0) Экспорт + + Возврат ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров, Ложь); + +КонецФункции + +Функция ПараметрыТиповОшибок() Экспорт + + Возврат ЮТФабрика.ПараметрыТиповОшибок(Ложь); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТПовторногоИспользования/ЮТПовторногоИспользования.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТПовторногоИспользования/ЮТПовторногоИспользования.mdo new file mode 100644 index 0000000..444108f --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТПовторногоИспользования/ЮТПовторногоИспользования.mdo @@ -0,0 +1,12 @@ + + + ЮТПовторногоИспользования + + ru + Повторного использования + + true + true + true + DuringSession + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТРасширения/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТРасширения/Module.bsl new file mode 100644 index 0000000..d6975ab --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТРасширения/Module.bsl @@ -0,0 +1,68 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Функция ГенераторыОтчетов() Экспорт + + Возврат МодулиПодсистемы("ЮТФормированиеОтчета"); + +КонецФункции + +Функция ОбработчикиСобытий() Экспорт + + Возврат ЮТМетаданныеСервер.МодулиПодсистемы("ЮТОбработчикиСобытий"); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +Функция МодулиПодсистемы(ИмяПодсистемы) + + ИменаМодулей = ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы); + + Модули = Новый Массив(); + + Для Каждого ИмяМодуля Из ИменаМодулей Цикл + + Модуль = ЮТОбщий.Модуль(ИмяМодуля); + Модули.Добавить(Модуль); + + КонецЦикла; + + Возврат Модули; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТРасширения/ЮТРасширения.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТРасширения/ЮТРасширения.mdo new file mode 100644 index 0000000..148aca6 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТРасширения/ЮТРасширения.mdo @@ -0,0 +1,11 @@ + + + ЮТРасширения + + ru + Расширения + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl new file mode 100644 index 0000000..799433c --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl @@ -0,0 +1,533 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#Область ФиксацияОшибокВРезультате + +// Регистрирует ошибку обработки события исполнения тестов +// +// Параметры: +// ИмяСобытия - Строка +// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов +// Ошибка - ИнформацияОбОшибке +Процедура ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка) Экспорт + + ТипОшибки = ЮТФабрика.ТипыОшибок().ОшибкаОбработкиСобытия; + Пояснение = СтрШаблон("%1 '%2': %3", ТипОшибки, ИмяСобытия, Ошибка.Описание); + ДанныеОшибки = ДанныеОшибки(Ошибка, Пояснение, ТипОшибки); + + Если ОписаниеСобытия.Тест <> Неопределено Тогда + Объект = ОписаниеСобытия.Тест; + ИначеЕсли ОписаниеСобытия.Набор <> Неопределено Тогда + Объект = ОписаниеСобытия.Набор; + Иначе + Объект = ОписаниеСобытия.Модуль; + КонецЕсли; + + Объект.Ошибки.Добавить(ДанныеОшибки); + +КонецПроцедуры + +// Регистрирует ошибку загрузки тестов +// +// Параметры: +// Объект - Структура - см. ЮТФабрика.ОписаниеТестовогоМодуля или см. ЮТФабрика.ОписаниеТестовогоНабора или см. ЮТФабрика.ОписаниеТеста +// Описание - Строка - Описания ошибки, места возникновения +// Ошибка - ИнформацияОбОшибке +Процедура ЗарегистрироватьОшибкуЧтенияТестов(Объект, Описание, Ошибка) Экспорт + + ДанныеОшибки = ДанныеОшибки(Ошибка, Описание, ЮТФабрика.ТипыОшибок().ЧтенияТестов); + Объект.Ошибки.Добавить(ДанныеОшибки); + +КонецПроцедуры + +// Регистрирует ошибку выполнения теста +// Параметры: +// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста +// Ошибка - ИнформацияОбОшибке +Процедура ЗарегистрироватьОшибкуВыполненияТеста(Тест, Ошибка) Экспорт + + ТипОшибки = ТипОшибки(Ошибка, Тест.ПолноеИмяМетода); + + Если ТипОшибки = ЮТФабрика.ТипыОшибок().Утверждений Тогда + ДанныеОшибки = ДанныеОшибкиУтверждений(Ошибка); + ИначеЕсли ТипОшибки = ЮТФабрика.ТипыОшибок().Пропущен Тогда + ДанныеОшибки = ДанныеОшибкиПропуска(Ошибка); + Иначе + ДанныеОшибки = ДанныеОшибки(Ошибка, Ошибка.Описание, ТипОшибки); + КонецЕсли; + + Тест.Ошибки.Добавить(ДанныеОшибки); + +КонецПроцедуры + +// Регистрирует ошибку режима выполнения теста +// Параметры: +// Объект - см. ЮТФабрика.ОписаниеИсполняемогоТеста +// Ошибка - Строка +Процедура ЗарегистрироватьОшибкуРежимаВыполнения(Объект, Ошибка) Экспорт + + ДанныеОшибки = ДанныеОшибки(Неопределено, Ошибка, ЮТФабрика.ТипыОшибок().НекорректныйКонтекстИсполнения); + Объект.Ошибки.Добавить(ДанныеОшибки); + +КонецПроцедуры + +#КонецОбласти + +// Вызывает ошибку выполнения теста, на основании перехваченной ошибки +// +// Параметры: +// ИнформацияОбОшибке - ИнформацияОбОшибке +Процедура СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке) Экспорт + + СтруктураОшибки = ЮТКонтекст.КонтекстОшибки(); + СтруктураОшибки.ОшибкаУтверждения = Ложь; + + ВызватьОшибкуИсполнения(ИнформацияОбОшибке); + +КонецПроцедуры + +// Вызывает ошибку сравнения значений +// При этом сохраняет в контекст состояние, для дальнейшей обработки +// +// Параметры: +// Сообщение - Строка +// ПроверяемоеЗначение - Произвольный +// ОжидаемоеЗначение - Произвольный +// ОбъектПроверки - Строка - Человекочитаемое описание проверяемого значения +Процедура СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОжидаемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт + + УстановитьДанныеОшибкиСравнения(ПроверяемоеЗначение, ОжидаемоеЗначение); + ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ПроверяемоеЗначение, Сообщение, ОбъектПроверки); + ВызватьОшибкуПроверки(ТекстСообщения); + +КонецПроцедуры + +// Вызывает ошибку проверки утверждений +// При этом сохраняет в контекст состояние, для дальнейшей обработки +// +// Параметры: +// Сообщение - Строка +// ПроверяемоеЗначение - Произвольный +// ОбъектПроверки - Строка - Человекочитаемое описание проверяемого значения +Процедура СгенерироватьОшибкуУтверждения(Сообщение, ПроверяемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт + + УстановитьДанныеОшибкиУтверждения(ПроверяемоеЗначение); + ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ПроверяемоеЗначение, Сообщение, ОбъектПроверки); + ВызватьОшибкуПроверки(ТекстСообщения); + +КонецПроцедуры + +Процедура Пропустить(Сообщение) Экспорт + + СтруктураОшибки = ЮТКонтекст.КонтекстОшибки(); + СтруктураОшибки.ОшибкаУтверждения = Ложь; + + СообщениеОбОшибке = СообщениеОбОшибке(Сообщение, ПрефиксОшибкиПропуска()); + ВызватьИсключение СообщениеОбОшибке; + +КонецПроцедуры + +Функция ПредставлениеОшибки(Знач Описание, Знач Ошибка) Экспорт + + Если ТипЗнч(Ошибка) = Тип("ИнформацияОбОшибке") Тогда + Ошибка = Символы.ПС + ПодробноеПредставлениеОшибки(Ошибка); + КонецЕсли; + + Возврат СтрШаблон("%1: %2", Описание, Ошибка); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +// Вызывает ошибку выполнения теста +// Служебный метод, предварительно нужно самостоятельно настроить контекст (см. ЮТКонтекст.КонтекстОшибки) +// Параметры: +// ТекстСообщения - Строка +Процедура ВызватьОшибкуПроверки(Знач ТекстСообщения) Экспорт + + СообщениеОбОшибке = СообщениеОбОшибке(ТекстСообщения, ПрефиксОшибкиУтверждений()); + ВызватьИсключение СообщениеОбОшибке; + +КонецПроцедуры + +Процедура ЗарегистрироватьОшибкуИнициализацииДвижка(Ошибка, Описание) Экспорт + + Ошибка(Ошибка, Описание); + +КонецПроцедуры + +// Возвращает тип ошибки +// +// Параметры: +// Ошибка - ИнформацияОбОшибке +// ИмяВызываемогоМетода - Строка - Имя вызываемого метода +// +// Возвращаемое значение: +// Строка - см. ЮТФабрика.ТипыОшибок +Функция ТипОшибки(Ошибка, ИмяВызываемогоМетода) Экспорт + + ТипыОшибок = ЮТФабрика.ТипыОшибок(); + + Описание = Ошибка.Описание; + + ИмяМетода = Сред(ИмяВызываемогоМетода, СтрНайти(ИмяВызываемогоМетода, ".") + 1); + + Если Описание = СтрШаблон("Метод объекта не обнаружен (%1)", ИмяМетода) + И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда + + ТипОшибки = ТипыОшибок.ТестНеРеализован; + + ИначеЕсли Описание = "Слишком мало фактических параметров" И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда + + ТипОшибки = ТипыОшибок.МалоПараметров; + + ИначеЕсли Описание = "Слишком много фактических параметров" И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда + + ТипОшибки = ТипыОшибок.МногоПараметров; + + ИначеЕсли СтрНачинаетсяС(Описание, ПрефиксОшибкиУтверждений()) Тогда + + ТипОшибки = ТипыОшибок.Утверждений; + + ИначеЕсли СтрНачинаетсяС(Описание, ПрефиксОшибкиПропуска()) Тогда + + ТипОшибки = ТипыОшибок.Пропущен; + + Иначе + + ТипОшибки = ТипыОшибок.Исполнения; + + КонецЕсли; + + Возврат ТипОшибки; + +КонецФункции + +Функция ПрефиксОшибкиУтверждений() Экспорт + + Возврат "[Failed]"; + +КонецФункции + +Функция ПрефиксОшибкиВыполнения() Экспорт + + Возврат "[Broken]"; + +КонецФункции + +Функция ПрефиксОшибкиПропуска() Экспорт + + Возврат "[Skip]"; + +КонецФункции + +Функция СтатусВыполненияТеста(Тест) Экспорт + + СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста(); + + Если Тест.Ошибки.КОличество() = 0 Тогда + Возврат СтатусыИсполненияТеста.Успешно; + КонецЕсли; + + ПорядокСтатусов = Новый Массив(); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.Успешно); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.Исполнение); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.НеРеализован); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.Ожидание); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.Пропущен); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.Ошибка); + ПорядокСтатусов.Добавить(СтатусыИсполненияТеста.Сломан); + + Статус = Тест.Статус; + + Для Каждого Ошибка Из Тест.Ошибки Цикл + + СтатусОшибки = СтатусОшибки(Ошибка.ТипОшибки); + + Если ПорядокСтатусов.Найти(СтатусОшибки) > ПорядокСтатусов.Найти(Статус) Тогда + Статус = СтатусОшибки; + КонецЕсли; + + Если Статус = СтатусыИсполненияТеста.Сломан Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Возврат Статус; + +КонецФункции + +Функция СтатусОшибки(ТипОшибки) Экспорт + + СтатусОшибки = ЮТФабрика.ПараметрыТиповОшибок()[ТипОшибки].Статус; + + Если СтатусОшибки = Неопределено Тогда + СтатусОшибки = ЮТФабрика.СтатусыИсполненияТеста().Сломан; + КонецЕсли; + + Возврат СтатусОшибки; + +КонецФункции + +Процедура УстановитьДанныеОшибкиСравнения(ПроверяемоеЗначение, ОжидаемоеЗначение) Экспорт + + СтруктураОшибки = ЮТКонтекст.КонтекстОшибки(); + + СтруктураОшибки.ОшибкаУтверждения = Истина; + СтруктураОшибки.ПроверяемоеЗначение = ЮТОбщий.ПредставлениеЗначения(ПроверяемоеЗначение); + СтруктураОшибки.ОжидаемоеЗначение = ЮТОбщий.ПредставлениеЗначения(ОжидаемоеЗначение); + +КонецПроцедуры + +Процедура УстановитьДанныеОшибкиУтверждения(ПроверяемоеЗначение) Экспорт + + СтруктураОшибки = ЮТКонтекст.КонтекстОшибки(); + + СтруктураОшибки.ОшибкаУтверждения = Истина; + СтруктураОшибки.ПроверяемоеЗначение = ЮТОбщий.ПредставлениеЗначения(ПроверяемоеЗначение); + СтруктураОшибки.ОжидаемоеЗначение = Неопределено; + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#Область КонструкторыОписанийОшибки + +Функция ДанныеОшибки(Ошибка, Сообщение, ТипОшибки) + + ДанныеОшибки = ЮТФабрика.ОписаниеВозникшейОшибки(ТипОшибки + ": " + Сообщение); + + Если Ошибка <> Неопределено Тогда + ДанныеОшибки.Стек = ПодробноеПредставлениеОшибки(Ошибка); + КонецЕсли; + ДанныеОшибки.ТипОшибки = ТипОшибки; + ДобавитьСообщенияПользователю(ДанныеОшибки); + + Возврат ДанныеОшибки; + +КонецФункции + +Функция ДанныеОшибкиУтверждений(Ошибка) + + Описание = ИзвлечьТекстОшибки(Ошибка, ПрефиксОшибкиУтверждений()); + + ДанныеОшибки = ЮТФабрика.ОписаниеОшибкиСравнения(Описание); + + ДанныеОшибки.Стек = ПодробноеПредставлениеОшибки(Ошибка); + ДобавитьСообщенияПользователю(ДанныеОшибки); + + СтруктураОшибки = ЮТКонтекст.КонтекстОшибки(); + + Если СтруктураОшибки <> Неопределено И СтруктураОшибки.ОшибкаУтверждения Тогда + ДанныеОшибки.ПроверяемоеЗначение = СтруктураОшибки.ПроверяемоеЗначение; + ДанныеОшибки.ОжидаемоеЗначение = СтруктураОшибки.ОжидаемоеЗначение; + КонецЕсли; + + Возврат ДанныеОшибки; + +КонецФункции + +Функция ДанныеОшибкиПропуска(Ошибка) + + Описание = ИзвлечьТекстОшибки(Ошибка, ПрефиксОшибкиПропуска()); + + ДанныеОшибки = ЮТФабрика.ОписаниеОшибкиПропуска(Описание); + + Возврат ДанныеОшибки; + +КонецФункции + +Функция ИзвлечьТекстОшибки(Ошибка, Префикс) + + ДлинаПрефикса = СтрДлина(Префикс); + + Описание = Сред(Ошибка.Описание, ДлинаПрефикса + 1); + Описание = СокрЛП(Описание); + + Если СтрНачинаетсяС(Описание, "<") И СтрЗаканчиваетсяНа(Описание, ">") Тогда + Описание = Сред(Описание, 2, СтрДлина(Описание) - 2); + КонецЕсли; + + Возврат Описание; + +КонецФункции + +#КонецОбласти + + Функция МодулиУтверждений() + + Возврат ЮТОбщий.ЗначениеВМассиве("ЮТУтверждения"); + +КонецФункции + +Процедура Ошибка(Ошибка, Описание) + + ТекстОшибки = ПредставлениеОшибки(Описание, Ошибка); + ЮТОбщий.СообщитьПользователю(ТекстОшибки); + +КонецПроцедуры + +Функция ИнформациюОбОшибкеВСтроку(Ошибка, НомерПричины = 0) + + ТекстОшибки = ""; + + Если Ошибка = Неопределено Тогда + + ТекстОшибки = "Неизвестная ошибка."; + + ИначеЕсли ТипЗнч(Ошибка) = Тип("Строка") Тогда + + ТекстОшибки = Ошибка; + + ИначеЕсли ЭтоОшибкаСлужебногоМодуля(Ошибка) Тогда + + Если Ошибка.Причина = Неопределено Тогда + + ТекстОшибки = Ошибка.Описание; + + Иначе + + ТекстОшибки = ИнформациюОбОшибкеВСтроку(Ошибка.Причина, НомерПричины); + + КонецЕсли; + + Иначе + + Если Не ПустаяСтрока(Ошибка.ИмяМодуля) Тогда + + ТекстОшибки = ТекстОшибки + "{" + + Ошибка.ИмяМодуля + "(" + + Ошибка.НомерСтроки + ")}: "; + + КонецЕсли; + + ТекстОшибки = ТекстОшибки + Ошибка.Описание + ?(ПустаяСтрока(Ошибка.ИсходнаяСтрока), "", " + |" + Ошибка.ИсходнаяСтрока); + + Если Ошибка.Причина <> Неопределено Тогда + + ТекстОшибки = ТекстОшибки + " + | + |ПРИЧИНА №" + Формат(НомерПричины + 1, "ЧГ=0") + " + |" + ИнформациюОбОшибкеВСтроку(Ошибка.Причина, НомерПричины + 1); + + КонецЕсли; + + КонецЕсли; + + Возврат ТекстОшибки; + +КонецФункции + +Функция ЭтоОшибкаСлужебногоМодуля(Ошибка) + + Если НЕ ЗначениеЗаполнено(Ошибка.ИмяМодуля) Тогда + Возврат Ложь; + КонецЕсли; + + Для Каждого ИмяМодуля Из МодулиУтверждений() Цикл + Если СтрНайти(Ошибка.ИмяМодуля, ИмяМодуля) > 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ФорматированныйТекстОшибкиУтверждения(Знач ПроверяемоеЗначение, ТекстОжидания, ОбъектПроверки) + + Контекст = ЮТКонтекст.КонтекстПроверки(); + ИмяСвойства = Контекст.ИмяСвойства; + + Если ЗначениеЗаполнено(ИмяСвойства) Тогда + ВставкаСвойство = СтрШаблон(" содержит свойство `%1`, которое", ИмяСвойства); + Иначе + ВставкаСвойство = ""; + КонецЕсли; + + Если ЗначениеЗаполнено(Контекст.ПредставлениеПроверяемогоЗначения) Тогда + ПредставлениеЗначения = Контекст.ПредставлениеПроверяемогоЗначения; + Иначе + ПредставлениеЗначения = СтрШаблон("`%1`", Контекст.ПроверяемоеЗначение); + КонецЕсли; + + // Заголовок сообщения + ТекстСообщения = ""; + // Тело сообщения + ТекстСообщения = СтрШаблон("ожидали, что %1 %2%3 %4, но это не так.", + ОбъектПроверки, + ПредставлениеЗначения, + ВставкаСвойство, + ТекстОжидания); + + Возврат ТекстСообщения; + +КонецФункции + +Процедура ДобавитьСообщенияПользователю(ДанныеОшибки) + +#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + Сообщения = ЮТОбщий.ВыгрузитьЗначения(ПолучитьСообщенияПользователю(Истина), "Текст"); + Если Сообщения.Количество() Тогда + ДанныеОшибки.Стек = СтрШаблон("%1 + |Сообщения пользователю: + | %2", ДанныеОшибки.Стек, СтрСоединить(Сообщения, Символы.ПС)); + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +Процедура ВызватьОшибкуИсполнения(Знач ИнформацияОбОшибке) + + ТекстОшибки = ИнформациюОбОшибкеВСтроку(ИнформацияОбОшибке); + СообщениеОбОшибке = СообщениеОбОшибке(ТекстОшибки, ПрефиксОшибкиВыполнения()); + ВызватьИсключение СообщениеОбОшибке; + +КонецПроцедуры + +Функция СообщениеОбОшибке(ТекстОшибки, ПрефиксТипаОшибки) + + Контекст = ЮТКонтекст.КонтекстПроверки(); + ПрефиксОшибки = ЮТОбщий.ДобавитьСтроку(Контекст.ПрефиксОшибки, Контекст.ОписаниеПроверки, " "); + + СообщениеОбОшибке = ЮТОбщий.ДобавитьСтроку(ПрефиксОшибки, ТекстОшибки, ": "); + СообщениеОбОшибке = ВРег(Лев(СообщениеОбОшибке, 1)) + Сред(СообщениеОбОшибке, 2); + + Возврат СтрШаблон("%1 <%2>", ПрефиксТипаОшибки, СообщениеОбОшибке);; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/ЮТРегистрацияОшибок.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/ЮТРегистрацияОшибок.mdo new file mode 100644 index 0000000..dc27eee --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/ЮТРегистрацияОшибок.mdo @@ -0,0 +1,11 @@ + + + ЮТРегистрацияОшибок + + ru + Регистрация ошибок + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl new file mode 100644 index 0000000..6ca37f4 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl @@ -0,0 +1,250 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура Инициализация(ПараметрыЗапуска) Экспорт + + Параметры = ЮТОбщий.ЗначениеВМассиве(ПараметрыЗапуска); + ВызватьОбработчикРасширения("Инициализация", Параметры); + +КонецПроцедуры + +#Область СобытияИсполненияТестов + +// Обработчик события "ПередВсемиТестамиМодуля" +// +// Параметры: +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +Процедура ПередВсемиТестамиМодуля(ТестовыйМодуль) Экспорт + + ЮТКонтекст.УстановитьКонтекстМодуля(Новый Структура()); + + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль); + ВызватьОбработкуСобытия("ПередВсемиТестами", ОписаниеСобытия); + +КонецПроцедуры + +// Обработчик события "ПередТестовымНабором" +// +// Параметры: +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +Процедура ПередТестовымНабором(ТестовыйМодуль, Набор) Экспорт + + ЮТКонтекст.УстановитьКонтекстНабораТестов(Новый Структура()); + + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор); + ВызватьОбработкуСобытия("ПередТестовымНабором", ОписаниеСобытия); + +КонецПроцедуры + +// Обработчик события "ПередКаждымТестом" +// +// Параметры: +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста +Процедура ПередКаждымТестом(ТестовыйМодуль, Набор, Тест) Экспорт + + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест); + ЮТКонтекст.УстановитьКонтекстТеста(Новый Структура()); + +#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + ПолучитьСообщенияПользователю(Истина); +#КонецЕсли + +#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + Если ВТранзакции(ОписаниеСобытия) Тогда + НачатьТранзакцию(); + КонецЕсли; +#КонецЕсли + + ВызватьОбработкуСобытия("ПередКаждымТестом", ОписаниеСобытия); + ВызватьОбработкуСобытия("ПередТестом", ОписаниеСобытия); + +КонецПроцедуры + +// Обработчик события "ПослеКаждогоТеста" +// +// Параметры: +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста +Процедура ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест) Экспорт + + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест); + + ВызватьОбработкуСобытия("ПослеТеста", ОписаниеСобытия); + ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия); + +#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + Если ВТранзакции(ОписаниеСобытия) Тогда + ОтменитьТранзакцию(); + Пока ТранзакцияАктивна() Цикл + ОтменитьТранзакцию(); + ЮТОбщий.СообщитьПользователю("Обнаружена незакрытая транзакция"); + КонецЦикла; + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +// Обработчик события "ПослеТестовогоНабора" +// +// Параметры: +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +Процедура ПослеТестовогоНабора(ТестовыйМодуль, Набор) Экспорт + + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор); + ВызватьОбработкуСобытия("ПослеТестовогоНабора", ОписаниеСобытия); + +КонецПроцедуры + +// Обработчик события "ПослеВсехТестовМодуля" +// +// Параметры: +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +Процедура ПослеВсехТестовМодуля(ТестовыйМодуль) Экспорт + + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль); + ВызватьОбработкуСобытия("ПослеВсехТестов", ОписаниеСобытия); + +КонецПроцедуры + +#КонецОбласти + +#Область СобытияЗагрузкиТестов + +// Обработчик события "ПередЧтениемСценариевМодуля" +// Позволяет настроить базовые параметры перед чтением настроек тестов модуля +// Параметры: +// МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля +Процедура ПередЧтениемСценариевМодуля(МетаданныеМодуля) Экспорт + + Параметры = ЮТОбщий.ЗначениеВМассиве(МетаданныеМодуля); + ВызватьОбработчикРасширения("ПередЧтениемСценариевМодуля", Параметры); + +КонецПроцедуры + +// После чтения сценариев модуля. +// Позволяет настроить/обработать параметры загруженных настроек тестов модуля +// Параметры: +// МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля +// ИсполняемыеСценарии - см. ЮТТесты.СценарииМодуля +Процедура ПослеЧтенияСценариевМодуля(МетаданныеМодуля, ИсполняемыеСценарии) Экспорт + + Параметры = ЮТОбщий.ЗначениеВМассиве(МетаданныеМодуля, ИсполняемыеСценарии); + ВызватьОбработчикРасширения("ПослеЧтенияСценариевМодуля", Параметры); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия) + + ЭтоСобытиеПеред = СтрНачинаетсяС(ИмяСобытия, "Перед"); + + Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия); + + Если ЭтоСобытиеПеред Тогда + Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры); + ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия); + Иначе + ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия); + Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры); + КонецЕсли; + + Для Каждого Ошибка Из Ошибки Цикл + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка); + КонецЦикла; + +КонецПроцедуры + +Функция ВызватьОбработчикРасширения(ИмяСобытия, ПараметрыСобытия) + + Ошибки = Новый Массив(); + + Для Каждого ИмяМодуля Из ЮТРасширения.ОбработчикиСобытий() Цикл + + Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяСобытия) Тогда + ПолноеИмяМетода = СтрШаблон("%1.%2", ИмяМодуля, ИмяСобытия); + Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ПараметрыСобытия); + КонецЕсли; + + Если Ошибка <> Неопределено Тогда + Ошибки.Добавить(Ошибка); + КонецЕсли; + + КонецЦикла; + + Возврат Ошибки; + +КонецФункции + +// Вызвать обработчик модуля. +// +// Параметры: +// ИмяСобытия - Строка - Имя вызываемого метода обработки события +// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов +// +Процедура ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия) + + ИмяМодуля = ОписаниеСобытия.Модуль.МетаданныеМодуля.Имя; + Ошибка = Неопределено; + Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяСобытия) Тогда + + Команда = СтрШаблон("%1.%2()", ИмяМодуля, ИмяСобытия); + Ошибка = ЮТОбщий.ВыполнитьМетод(Команда); + + КонецЕсли; + + Если Ошибка <> Неопределено Тогда + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка); + КонецЕсли; + +КонецПроцедуры + +Функция ВТранзакции(ОписаниеСобытия) + + ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции; + + Возврат ЮТПараметры.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь); + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТСобытия/ЮТСобытия.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТСобытия/ЮТСобытия.mdo new file mode 100644 index 0000000..14f583a --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТСобытия/ЮТСобытия.mdo @@ -0,0 +1,11 @@ + + + ЮТСобытия + + ru + Расширение исполнителя + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl new file mode 100644 index 0000000..9418ec0 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl @@ -0,0 +1,421 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// СоздатьЭлемент +// Создает новый элемент и возвращает его ссылку +// Параметры: +// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд. +// Наименование - Строка, Неопределено - Наименование элемента +// Реквизиты - Структура, Неопределено - Значения реквизитов элемента +// +// Возвращаемое значение: +// ЛюбаяСсылка - Ссылка на созданный объект +Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт + + Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты); + +КонецФункции + +// СоздатьДокумент +// Создает новый документ и возвращает его ссылку +// Параметры: +// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд. +// Реквизиты - Структура, Неопределено - Значения реквизитов элемента +// +// Возвращаемое значение: +// ДокументСсылка - Ссылка на созданный объект +Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт + + Возврат ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты); + +КонецФункции + +// СлучайноеЧисло +// Генерирует и возвращает случайное число +// Параметры: +// Минимум - Неопределено, Число - Минимальное значение +// Максимум - Неопределено, Число - Максимальное значение +// ЗнаковПослеЗапятой - Число - Количество знаков после запятой +// +// Возвращаемое значение: +// Число - Случайное число +Функция СлучайноеЧисло(Минимум = 0, Максимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт + + Генератор = ЮТКонтекст.ЗначениеКонтекста("ГенераторСлучайныхЧисел"); + + Если Генератор = Неопределено Тогда + Генератор = Новый ГенераторСлучайныхЧисел(); + ЮТКонтекст.УстановитьЗначениеКонтекста("ГенераторСлучайныхЧисел", Генератор); + КонецЕсли; + + Если Максимум = Неопределено Тогда + Результат = Генератор.СлучайноеЧисло(Минимум); + Иначе + Результат = Генератор.СлучайноеЧисло(Минимум, Максимум); + КонецЕсли; + + Если ЗнаковПослеЗапятой > 0 Тогда + Множитель = Pow(10, ЗнаковПослеЗапятой); + Результат = Результат + Окр(Генератор.СлучайноеЧисло(0, Множитель) / Множитель, ЗнаковПослеЗапятой); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// СлучайноеПоложительноеЧисло +// Генерирует и возвращает случайное положительное число +// Параметры: +// Максимум - Неопределено, Число - Максимальное значение +// ЗнаковПослеЗапятой - Число - Знаков после запятой +// +// Возвращаемое значение: +// Число - Случайное положительное число +Функция СлучайноеПоложительноеЧисло(Максимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт + + Возврат СлучайноеЧисло(1, Максимум, ЗнаковПослеЗапятой); + +КонецФункции + +// СлучайноеОтрицательноеЧисло +// +// Параметры: +// Минимум - Неопределено, Число - Минимальное значение +// ЗнаковПослеЗапятой - Число - Знаков после запятой +// +// Возвращаемое значение: +// Число - Случайное отрицательное число +Функция СлучайноеОтрицательноеЧисло(Минимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт + + Возврат -СлучайноеЧисло(Минимум, 0, ЗнаковПослеЗапятой); + +КонецФункции + +// СлучайнаяСтрока +// Генерирует и возвращает случайную строку указанной длины, строка может содержать цифры, английские и русские буквы в разных регистрах +// Параметры: +// Префикс - Строка - Префикс строки +// Длина - Число - Длина генерируемой строки, без учета префикса +// +// Возвращаемое значение: +// Строка - Случайная строка +Функция СлучайнаяСтрока(Префикс = "", Длина = 10) Экспорт + + Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + Результат = ""; + КоличествоСимволов = СтрДлина(Строка); + + Для Инд = 1 По Длина Цикл + + Результат = Результат + Сред(Строка, СлучайноеЧисло(1, КоличествоСимволов), 1); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция СлучайнаяДата(Знач Минимум = Неопределено, Знач Максимум = Неопределено) Экспорт + + Если Минимум = Неопределено Тогда + Минимум = '00010101'; + КонецЕсли; + + Если Максимум = Неопределено Тогда + Максимум = '39991231'; + КонецЕсли; + + СекундВДне = 86400; + КоличествоДней = Цел((Максимум - Минимум) / СекундВДне); + Возврат Минимум + СлучайноеЧисло(0, КоличествоДней) + СекундВДне + СлучайноеЧисло(0, СекундВДне); + +КонецФункции + +// СлучайныйIPАдрес +// Генерирует и возвращает случайный IP адрес +// Возвращаемое значение: +// Строка - Случайный IP адрес +Функция СлучайныйIPАдрес() Экспорт + + Части = Новый Массив(); + Части.Добавить(СлучайноеЧисло(1, 253)); + Части.Добавить(СлучайноеЧисло(1, 253)); + Части.Добавить(СлучайноеЧисло(1, 253)); + Части.Добавить(СлучайноеЧисло(1, 253)); + + Возврат СтрСоединить(Части, "."); + +КонецФункции + +// УникальнаяСтрока +// Генерирует и возвращает уникальную строку +// Параметры: +// Префикс - Строка - Префикс строки +// +// Возвращаемое значение: +// Строка - Уникальная строка +Функция УникальнаяСтрока(Префикс = "") Экспорт + + Возврат Префикс + Новый УникальныйИдентификатор(); + +КонецФункции + +// СлучайноеЗначениеИзСписка +// Возвращает случайный элемент списка +// Параметры: +// Список - Массив из Произвольный - Коллекция возможных значений +// +// Возвращаемое значение: +// Произвольный - случайное значение из списка +Функция СлучайноеЗначениеИзСписка(Список) Экспорт + + Индекс = СлучайноеЧисло(0, Список.ВГраница()); + + Возврат Список[Индекс]; + +КонецФункции + +Функция НовыйФайл(Содержимое = Неопределено, ТолькоЧтение = Ложь, Расширение = Неопределено) Экспорт + + Результат = НовоеИмяВременногоФайла(Расширение); + + ЗаписьДанных = Новый ЗаписьДанных(Результат); + + Если Содержимое <> Неопределено Тогда + ЗаписьДанных.ЗаписатьСимволы(Содержимое); + КонецЕсли; + + ЗаписьДанных.Закрыть(); + + Если ТолькоЧтение Тогда + СозданныйФайл = Новый Файл(Результат); + СозданныйФайл.УстановитьТолькоЧтение(Истина); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает имя нового файла. +// По окончании выполнения теста этот файл будет удален +// Параметры: +// Расширение - Строка - Расширение нового файла +// +// Возвращаемое значение: +// Строка +Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт + + Результат = ПолучитьИмяВременногоФайла(Расширение); + ЮТКонтекст.КонтекстТеста().ВременныеФайлы.Добавить(Результат); + Возврат Результат; + +КонецФункции + +Функция ТаблицаMarkDown(Строки) Экспорт + + ЗагрузилиЗаголовок = Ложь; + Результат = Новый Массив(); + Ключи = ""; + + Разделитель = "|"; + + Кодировка = КодировкаТекста.UTF8; + Поток = ПолучитьДвоичныеДанныеИзСтроки(Строки, Кодировка).ОткрытьПотокДляЧтения(); + Чтение = Новый ЧтениеТекста(Поток, Кодировка); + + Пока Истина Цикл + + Строка = Чтение.ПрочитатьСтроку(); + Если Строка = Неопределено Тогда + Прервать; + КонецЕсли; + + Строка = СокрЛП(Строка); + + Если ПустаяСтрока(Строка) Тогда + Продолжить; + ИначеЕсли НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда + Если ЗагрузилиЗаголовок Тогда + Прервать; + Иначе + Продолжить; + КонецЕсли; + КонецЕсли; + + Блоки = СтрРазделить(Строка, Разделитель); + + Если ЗагрузилиЗаголовок Тогда + + Если Блоки.Количество() <> Ключи.Количество() Тогда + ВызватьИсключение СтрШаблон("Количество значений в строке (%1) Markdown не совпадает с количеством заголовков (2): + |%3", Блоки.Количество(), Ключи.Количество(), Строка); + КонецЕсли; + + СтрокаРезультата = Новый Структура(); + Для Инд = 1 По Блоки.ВГраница() - 1 Цикл + СтрокаРезультата.Вставить(Ключи[Инд], СокрЛП(Блоки[Инд])); + КонецЦикла; + Результат.Добавить(СтрокаРезультата); + Иначе + Ключи = Новый Массив(); + Для Инд = 0 По Блоки.ВГраница() Цикл + Ключи.Добавить(СокрЛП(Блоки[Инд])); + КонецЦикла; + Чтение.ПрочитатьСтроку(); // Пропуск строки разделителя + ЗагрузилиЗаголовок = Истина; + КонецЕсли; + + КонецЦикла; + + Чтение.Закрыть(); + Поток.Закрыть(); + + Возврат Результат; + +КонецФункции + +// Формирует структуру на основании таблицы Markdown +// +// Параметры: +// Ключ - Строка - Имя ключевой колонки +// Строки - Строка - Строки таблицы Markdown +// +// Возвращаемое значение: +// Структура +Функция СтруктураMarkDown(Ключ, Строки) Экспорт + + Таблица = ТаблицаMarkDown(Строки); + + Результат = Новый Структура(); + + Для Каждого Строка Из Таблица Цикл + Результат.Вставить(Строка[Ключ], Строка); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция СобратьМассивВариантов(БазоваяСтруктура, ЗначенияПараметров) Экспорт + + Варианты = Новый Массив; + Ключи = ЮТОбщий.ВыгрузитьЗначения(ЗначенияПараметров, "Ключ"); + + ДобавитьВарианты(Варианты, БазоваяСтруктура, ЗначенияПараметров, Ключи, 0); + + Возврат Варианты; + +КонецФункции + +#КонецОбласти +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Обработчик события "ПередКаждымТестом" +// +// Параметры: +// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов +Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт + + ЮТКонтекст.КонтекстТеста().Вставить("ВременныеФайлы", Новый Массив); + +КонецПроцедуры + +// Обработчик события "ПослеКаждогоТеста" +// +// Параметры: +// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов +Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт + + ВременныеФайлы = ЮТКонтекст.КонтекстТеста().ВременныеФайлы; + + Если ВременныеФайлы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Ошибки = Новый Массив(); + + Для Каждого УдаляемыйФайл Из ВременныеФайлы Цикл + + Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда + УдаляемыйФайл = Новый Файл(УдаляемыйФайл); + КонецЕсли; + + Попытка + Если УдаляемыйФайл.Существует() Тогда + + Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда + УдаляемыйФайл.УстановитьТолькоЧтение(Ложь); + КонецЕсли; + + УдалитьФайлы(УдаляемыйФайл.ПолноеИмя); + + КонецЕсли; + Исключение + + Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке())); + + КонецПопытки; + + КонецЦикла; + + Если ЗначениеЗаполнено(Ошибки) Тогда + ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Процедура ДобавитьВарианты(Варианты, БазоваяСтруктура, ЗначенияПараметров, Ключи, Инд) + + Если Инд > Ключи.ВГраница() Тогда + Возврат; + КонецЕсли; + + Ключ = Ключи[Инд]; + Для Каждого Значение Из ЗначенияПараметров[Ключ] Цикл + + Вариант = ЮТОбщий.СкопироватьСтруктуру(БазоваяСтруктура); + Вариант[Ключ] = Значение; + Варианты.Добавить(Вариант); + + ДобавитьВарианты(Варианты, Вариант, ЗначенияПараметров, Ключи, Инд + 1); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанные/ЮТТестовыеДанные.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанные/ЮТТестовыеДанные.mdo new file mode 100644 index 0000000..2222f83 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанные/ЮТТестовыеДанные.mdo @@ -0,0 +1,11 @@ + + + ЮТТестовыеДанные + + ru + ЮТТестовые данные + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl new file mode 100644 index 0000000..ee1e2c5 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl @@ -0,0 +1,102 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// СоздатьЭлемент +// Создает новый элемент и возвращает его ссылку +// Параметры: +// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд. +// Наименование - Строка, Неопределено - Наименование элемента +// Реквизиты - Структура, Неопределено - Значения реквизитов элемента +// +// Возвращаемое значение: +// ЛюбаяСсылка - Ссылка на созданный объект +Функция СоздатьЭлемент(Знач Менеджер, Знач Наименование = Неопределено, Знач Реквизиты = Неопределено) Экспорт + + Если ТипЗнч(Менеджер) = Тип("Строка") Тогда + Менеджер = Вычислить(Менеджер); + КонецЕсли; + + Объект = Менеджер.СоздатьЭлемент(); + + Если ЗначениеЗаполнено(Наименование) Тогда + Объект.Наименование = Наименование; + ИначеЕсли Объект.Метаданные().ДлинаНаименования > 0 Тогда + Объект.Наименование = ЮТТестовыеДанные.УникальнаяСтрока(); + КонецЕсли; + + Если Реквизиты <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Объект, Реквизиты); + КонецЕсли; + + Объект.Записать(); + + Возврат Объект.Ссылка; + +КонецФункции + +// СоздатьДокумент +// Создает новый документ и возвращает его ссылку +// Параметры: +// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд. +// Реквизиты - Структура, Неопределено - Значения реквизитов элемента +// +// Возвращаемое значение: +// ДокументСсылка - Ссылка на созданный объект +Функция СоздатьДокумент(Знач Менеджер, Знач Реквизиты = Неопределено) Экспорт + + Если ТипЗнч(Менеджер) = Тип("Строка") Тогда + Менеджер = Вычислить(Менеджер); + КонецЕсли; + + Объект = Менеджер.СоздатьДокумент(); + Объект.Дата = ТекущаяДатаСеанса(); + Объект.УстановитьНовыйНомер(); + + Если Реквизиты <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Объект, Реквизиты); + КонецЕсли; + + Объект.Записать(); + + Возврат Объект.Ссылка; + +КонецФункции + +#КонецОбласти +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/ЮТТестовыеДанныеВызовСервера.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/ЮТТестовыеДанныеВызовСервера.mdo new file mode 100644 index 0000000..00f3748 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/ЮТТестовыеДанныеВызовСервера.mdo @@ -0,0 +1,10 @@ + + + ЮТТестовыеДанныеВызовСервера + + ru + Тестовые данные вызов сервера + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТТесты/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТТесты/Module.bsl new file mode 100644 index 0000000..e93c016 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТТесты/Module.bsl @@ -0,0 +1,405 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Содержит методы создания тестов и тестовых наборов +///////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// ДобавитьТестовыйНабор +// Создает и регистрирует набор, в который будут добавлятся последующие тесты +// Параметры: +// Имя - Строка - Имя набора тестов +// ТегиСтрокой - Строка - Теги относящиеся к набору и вложенным тестам. Это строка разделенная запятыми +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ДобавитьТестовыйНабор(Имя, ТегиСтрокой = "") Экспорт + + ИсполняемыеСценарии = СценарииМодуля(); + + Если Не ЭтоИсполняемыеСценарии(ИсполняемыеСценарии) Тогда + ВызватьИсключение "Первый параметр должен быть результатом метода ЮТТесты.ИсполняемыеСценарии"; + КонецЕсли; + + Если ПустаяСтрока(Имя) Тогда + ВызватьИсключение "Имя тестового набора не может быть пустым"; + КонецЕсли; + + Контекст = Контекст(); + НовыйТестовыйНабор = ЮТФабрика.ОписаниеТестовогоНабора(Имя, ТегиСтрокой); + + ИсполняемыеСценарии.ТестовыеНаборы.Добавить(НовыйТестовыйНабор); + Контекст.ТекущийНабор = НовыйТестовыйНабор; + Контекст.ТекущийЭлемент = НовыйТестовыйНабор; + + Возврат ЮТТесты; + +КонецФункции + +// ДобавитьТест +// Регистрирует тест, исполняемый в контекстах, в которых доступен тестовый модуль +// Напрмер если модуль с тестами клиент-серверный, то тест будет вызван и на клиенте и на сервере +// Если клиентский, то только на клиенте +// Если клиент обычное приложение, то только при запуске в режиме обычного приложения +// Параметры: +// ИмяТестовогоМетода - Строка - Имя тестового метода +// ПредставлениеТеста - Строка - Представление теста +// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми +// Контексты - Строка - Контексты, строка перечисления контекстов вызова, разделенных запятой. +// Возможные значения см. ЮТФабрика.КонтекстыВызова +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ДобавитьТест(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "", Контексты = Неопределено) Экспорт + + Контекст = Контекст(); + Набор = Контекст.ТекущийНабор; + + ЭтоИсполняемыеСценарии = ЭтоИсполняемыеСценарии(Набор); + ЭтоТестовыйНабор = ЭтоТестовыйНабор(Набор); + + Если Не (ЭтоИсполняемыеСценарии Или ЭтоТестовыйНабор) Тогда + ВызватьИсключение "Первый параметр должен быть результатом метода ЮТТесты.ИсполняемыеСценарии или ЮТТесты.ТестовыйНабор"; + КонецЕсли; + + Если ПустаяСтрока(ИмяТестовогоМетода) Тогда + ВызватьИсключение "Имя тестового метода не может быть пустым"; + КонецЕсли; + + Тест = ОписаниеТеста(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, Контексты); + Набор.Тесты.Добавить(Тест); + Контекст.ТекущийЭлемент = Тест; + + Возврат ЮТТесты; + +КонецФункции + +// ДобавитьКлиентскийТест +// Регистрирует текст исполняемый на клиенте +// Параметры: +// ИмяТестовогоМетода - Строка - Имя тестового метода +// ПредставлениеТеста - Строка - Представление теста +// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ДобавитьКлиентскийТест(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "") Экспорт + + ДобавитьТест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, КонтекстыВызоваКлиента()); + Возврат ЮТТесты; + +КонецФункции + +// Регистрирует текст исполняемый на сервере +// Параметры: +// ИмяТестовогоМетода - Строка - Имя тестового метода +// ПредставлениеТеста - Строка - Представление теста +// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ДобавитьСерверныйТест(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "") Экспорт + + Режимы = ЮТФабрика.КонтекстыВызова(); + + Тест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, Режимы.Сервер); + + Возврат ЮТТесты; + +КонецФункции + +// Устанавливает настройку выполнения тестового метода +// +// Параметры: +// ИмяПараметра - Строка +// Значение - Произвольный - Значение настройки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция НастройкаИсполнения(ИмяПараметра, Значение) Экспорт + + Контекст = Контекст(); + + Если Контекст.ТекущийЭлемент = Неопределено Тогда + ВызватьИсключение "Не инициализированы настройки регистрации тестов"; + КонецЕсли; + + Контекст.ТекущийЭлемент.НастройкиВыполнения.Вставить(ИмяПараметра, Значение); + + Возврат ЮТТесты; + +КонецФункции + +// Устанавливает настройку выполнения тестового метода в транзакции. +// +// Параметры: +// ВыполнятьВТранзакции - Булево +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ВТранзакции(ВыполнятьВТранзакции = Истина) Экспорт + + НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции, ВыполнятьВТранзакции); + + Возврат ЮТТесты; + +КонецФункции + +Функция СПараметрами(Параметр1 = "_!%*", + Параметр2 = "_!%*", + Параметр3 = "_!%*", + Параметр4 = "_!%*", + Параметр5 = "_!%*", + Параметр6 = "_!%*", + Параметр7 = "_!%*", + Параметр8 = "_!%*", + Параметр9 = "_!%*", + Параметр10 = "_!%*") Экспорт + + Параметры = ЮТОбщий.ЗначениеВМассиве(Параметр1, + Параметр2, + Параметр3, + Параметр4, + Параметр5, + Параметр6, + Параметр7, + Параметр8, + Параметр9, + Параметр10); + + Контекст = Контекст(); + + Если Контекст.ТекущийЭлемент = Неопределено Тогда + ВызватьИсключение "Не инициализированы настройки регистрации тестов"; + ИначеЕсли НЕ ЭтоОписаниеТеста(Контекст.ТекущийЭлемент) Тогда + ВызватьИсключение "Параметры устанавливаются только для теста"; + КонецЕсли; + + Контекст.ТекущийЭлемент.Параметры = Параметры; + + Возврат ЮТТесты; + +КонецФункции + +#Область Устаревшие + +// Тест +// Регистрирует тест +// Параметры: +// ИмяТестовогоМетода - Строка - Имя тестового метода +// ПредставлениеТеста - Строка - Представление теста +// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми +// Контексты - Строка - Контексты, строка перечисления контекстов вызова, разделенных запятой. +// Возможные значения см. ЮТФабрика.КонтекстыВызова +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция Тест(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "", Контексты = Неопределено) Экспорт + + ЮТОбщий.ВызовУстаревшегоМетода("ЮТТесты.Тест", "ЮТТесты.ДобавитьТест"); + Возврат ДобавитьТест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, Контексты); + +КонецФункции + +// ТестКлиент +// Регистрирует текст вызывемый на клиенте +// Параметры: +// ИмяТестовогоМетода - Строка - Имя тестового метода +// ПредставлениеТеста - Строка - Представление теста +// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ТестКлиент(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "") Экспорт + + ЮТОбщий.ВызовУстаревшегоМетода("ЮТТесты.ТестКлиент", "ЮТТесты.ДобавитьКлиентскийТест"); + Возврат ДобавитьКлиентскийТест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой); + +КонецФункции + +// Тест сервер. +// Регистрирует текст вызывемый на сервере +// Параметры: +// ИмяТестовогоМетода - Строка - Имя тестового метода +// ПредставлениеТеста - Строка - Представление теста +// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ТестСервер(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "") Экспорт + + ЮТОбщий.ВызовУстаревшегоМетода("ЮТТесты.ТестСервер", "ЮТТесты.ДобавитьСерверныйТест"); + Возврат ДобавитьСерверныйТест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой); + +КонецФункции + +// ТестовыйНабор +// Создает и регистрирует набор, в который будут добавлятся последующие тесты +// Параметры: +// Имя - Строка - Имя набора тестов +// ТегиСтрокой - Строка - Теги относящиеся к набору и вложенным тестам. Это строка разделенная запятыми +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция ТестовыйНабор(Имя, ТегиСтрокой = "") Экспорт + + ЮТОбщий.ВызовУстаревшегоМетода("ЮТТесты.ТестовыйНабор", "ЮТТесты.ДобавитьТестовыйНабор"); + Возврат ДобавитьТестовыйНабор(Имя, ТегиСтрокой); + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПередЧтениемСценариевМодуля(МетаданныеМодуля) Экспорт + + ИнициализироватьКонтекст(МетаданныеМодуля); + + ЮТСобытия.ПередЧтениемСценариевМодуля(МетаданныеМодуля); + +КонецПроцедуры + +Процедура ПослеЧтенияСценариевМодуля() Экспорт + + Контекст = Контекст(); + ЮТСобытия.ПослеЧтенияСценариевМодуля(Контекст.МетаданныеМодуля, Контекст.ИсполняемыеСценарии); + +КонецПроцедуры + +// Описание сценариев модуля +// +// Возвращаемое значение: +// Структура - см. ИсполняемыеСценарии +Функция СценарииМодуля() Экспорт + + Возврат Контекст().ИсполняемыеСценарии; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// Исполняемые сценарии. +// +// Параметры: +// МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля +// +// Возвращаемое значение: +// Структура -- Исполняемые сценарии:: +// * ТестовыеНаборы - Массив из см. ЮТФабрика.ОписаниеТестовогоНабора - Тестовые наборы модуля +Функция ИсполняемыеСценарии(МетаданныеМодуля) + + Структура = Новый Структура; + Структура.Вставить("ТестовыеНаборы", Новый Массив()); + + Набор = ЮТФабрика.ОписаниеТестовогоНабора(МетаданныеМодуля.Имя); + Структура.ТестовыеНаборы.Добавить(Набор); + + Возврат Структура; + +КонецФункции + +Функция КонтекстыВызоваКлиента() + + Режимы = ЮТФабрика.КонтекстыВызова(); + Возврат ЮТОбщий.ЗначениеВМассиве(Режимы.КлиентУправляемоеПриложение, Режимы.КлиентОбычноеПриложение); + +КонецФункции + +Функция КонтекстыВызоваПоУмолчанию() + + Возврат ЮТФабрика.КонтекстыМодуля(Контекст().МетаданныеМодуля); + +КонецФункции + +Функция ОписаниеТеста(Имя, Знач Представление, ТегиСтрокой, Знач Контексты) + + Если НЕ ЗначениеЗаполнено(Контексты) Тогда + Контексты = КонтекстыВызоваПоУмолчанию(); + ИначеЕсли ТипЗнч(Контексты) = Тип("Строка") Тогда + Контексты = СтрРазделить(Контексты, ", ", Ложь); + КонецЕсли; + + Возврат ЮТФабрика.ОписаниеТеста(Имя, Представление, Контексты, ТегиСтрокой); + +КонецФункции + +Функция ЭтоИсполняемыеСценарии(ИсполняемыеСценарии) + + Возврат ТипЗнч(ИсполняемыеСценарии) = Тип("Структура") + И ТипЗнч(ЮТОбщий.ЗначениеСтруктуры(ИсполняемыеСценарии, "ТестовыеНаборы")) = Тип("Массив"); + +КонецФункции + +Функция ЭтоТестовыйНабор(ТестовыйНабор) + + Возврат ТипЗнч(ТестовыйНабор) = Тип("Структура") + И ТипЗнч(ЮТОбщий.ЗначениеСтруктуры(ТестовыйНабор, "Тесты")) = Тип("Массив"); + +КонецФункции + +Функция ЭтоОписаниеТеста(Описание) + + Возврат ТипЗнч(Описание) = Тип("Структура") + И ТипЗнч(ЮТОбщий.ЗначениеСтруктуры(Описание, "КонтекстВызова")) = Тип("Массив"); + +КонецФункции + +#Область Контекст + +Функция Контекст() + + Возврат ЮТКонтекст.ЗначениеКонтекста("КонтекстРегистрацияТестов"); + +КонецФункции + +Процедура ИнициализироватьКонтекст(МетаданныеМодуля) + + ИсполняемыеСценарии = ИсполняемыеСценарии(МетаданныеМодуля); + Набор = ИсполняемыеСценарии.ТестовыеНаборы[0]; + + Контекст = Новый Структура(); + + Контекст.Вставить("МетаданныеМодуля", МетаданныеМодуля); + Контекст.Вставить("ИсполняемыеСценарии", ИсполняемыеСценарии); + Контекст.Вставить("ТекущийНабор", Набор); + Контекст.Вставить("ТекущийЭлемент", Набор); + + ЮТКонтекст.УстановитьЗначениеКонтекста("КонтекстРегистрацияТестов", Контекст); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТТесты/ЮТТесты.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТТесты/ЮТТесты.mdo new file mode 100644 index 0000000..1850b45 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТТесты/ЮТТесты.mdo @@ -0,0 +1,11 @@ + + + ЮТТесты + + ru + Тесты + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl new file mode 100644 index 0000000..6fd26af --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl @@ -0,0 +1,1781 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#Область УтвержденияBDD + +// Что +// Подготавливает Контекст для проверки утверждения. +// Проверка выполнения выполняется через вызов другого метода +// Например: ЮТУтверждения.Что(...).ЭтоИстина(...); +// +// Параметры: +// ПроверяемоеЗначение - Произвольный - Проверяемое фактическое значение +// Сообщение - Строка - Описание проверки, которое будет выведено при возникновении ошибки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Что(Знач ПроверяемоеЗначение, Знач Сообщение = "") Экспорт + + Контекст = ИнициализироватьКонтекстУтверждения(); + Контекст.ПроверяемоеЗначение = ПроверяемоеЗначение; + Контекст.ПрефиксОшибки = Сообщение; + + Возврат ЮТУтверждения; + +КонецФункции + +// Метод +// Запоминает описание метода (имя и параметры) для последующей проверки +// +// Параметры: +// ИмяМетода - Строка - Наименование метода +// ПараметрыМетода - Массив из Произвольный - Параметры вызываемого метода +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Метод(Знач ИмяМетода, Знач ПараметрыМетода = Неопределено) Экспорт + + ПроверитьТипЗначения(ИмяМетода, "Строка", "имени метода", Истина); + ПроверитьТипЗначения(ПараметрыМетода, "Массив", "параметров метода", Истина); + + Контекст = Контекст(); + Контекст.ИмяМетода = ИмяМетода; + Контекст.ПараметрыМетода = ПараметрыМетода; + + Возврат ЮТУтверждения; + +КонецФункции + +// Параметр +// Добавляет параметр метода для последующего вызова метода и проверки +// +// Параметры: +// ЗначениеПараметра - Произвольный - Параметр вызываемого метода +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Параметр(Знач ЗначениеПараметра) Экспорт + + Контекст = Контекст(); + + Если НЕ ЗначениеЗаполнено(Контекст.ИмяМетода) Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения("Перед установкой параметров нужно указать метод"); + КонецЕсли; + + Если Контекст.ПараметрыМетода = Неопределено Тогда + Контекст.ПараметрыМетода = ЮТОбщий.ЗначениеВМассиве(ЗначениеПараметра); + Иначе + Контекст.ПараметрыМетода.Добавить(ЗначениеПараметра); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +Функция ИмеющееПредставление(Представление) Экспорт + + Контекст().ПредставлениеПроверяемогоЗначения = Представление; + Возврат ЮТУтверждения; + +КонецФункции + +// Свойство +// Проверяет наличие свойства и запоминает имя свойства для последующей проверки +// Следующие проверки будет относится к этому свойству +// +// Параметры: +// ИмяСвойства - Строка - Наименование свойства объекта. +// Возможно обращение к вложенным свойствам через точку +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Свойство(Знач ИмяСвойства, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Контекст = Контекст(); + Контекст.ИмяСвойства = Неопределено; // Очищаем для формирования корректного сообщения об ошибке + + Путь = НормализованныйПутьКСвойству(Контекст.ПроверяемоеЗначение, ИмяСвойства, Истина); + + Контекст.ИмяСвойства = ИмяСвойства; + Контекст.НормализованныйПутьКСвойству = Путь; + + Возврат ЮТУтверждения; + +КонецФункции + +// НетСвойства +// Проверяет отсутствие свойства основного объекта +// И сбрасывает ранее установленное проверяемое свойство +// +// Параметры: +// ИмяСвойства - Строка - Наименование свойства объекта. +// Возможно обращение к вложенным свойствам через точку +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НетСвойства(Знач ИмяСвойства, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Контекст = Контекст(); + Контекст.ИмяСвойства = Неопределено; // Очищаем для формирования корректного сообщения об ошибке + + Если ЗначениеСодержитСвойство(Контекст.ПроверяемоеЗначение, ИмяСвойства) Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(СтрШаблон("не содержит свойство `%1`", ИмяСвойства), Неопределено, ИмяСвойства); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет наличие элемента с указанным индексом и позиционируется на нем для последующих проверок +// +// Параметры: +// Индекс - Число - Индекс элемента коллекции +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Элемент(Знач Индекс, Знач ОписаниеПроверки = Неопределено) Экспорт + + Возврат Свойство(Индекс, ОписаниеПроверки); + +КонецФункции + +// Используется после вызова метода "Свойство", для переключения с ранее указанного свойства на объект +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Объект() Экспорт + + Контекст = Контекст(); + Контекст.ИмяСвойства = Неопределено; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет наличие свойства у объекта/его свойства +// В отличии от метода `Свойство`, не позиционируется на указанное свойство +// Параметры: +// ИмяСвойства - Строка - Наименование свойства объекта. +// Возможно обращение к вложенным свойствам через точку +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетСвойство(Знач ИмяСвойства, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + НормализованныйПутьКСвойству(ПроверяемоеЗначение, ИмяСвойства, Истина); + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет отсутствие свойства у объекта/его свойства +// +// Параметры: +// ИмяСвойства - Строка - Наименование свойства объекта. +// Возможно обращение к вложенным свойствам через точку +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеИмеетСвойства(Знач ИмяСвойства, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + + Если ЗначениеСодержитСвойство(ПроверяемоеЗначение, ИмяСвойства) Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(СтрШаблон("не содержит свойство `%1`", ИмяСвойства), Неопределено, ИмяСвойства); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет наличие свойств у проверяемого объекта (или его свойства), а также их соответствие их значениям параметра +// +// Параметры: +// ОжидаемоеЗначение - Структура - Проверяемый объект должен иметь свойства указанные в параметре +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетСвойстваРавные(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ОбъектыРавны(ПроверяемоеЗначение, ОжидаемоеЗначение); + + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоИстина +// Проверяет установленное значение Контекста (или его свойство) на равенство "Истина" (Булево). +// При сравнении также проверяется совпадение типов проверяемого и ожидаемого значения +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоИстина(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Истина, Ложь, "является истиной"); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоНеИстина +// Проверяет установленное значение Контекста (или его свойство)на НЕ равенство "Истина" (Булево). +// При сравнении также проверяется совпадение типов проверяемого и ожидаемого значения +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоНеИстина(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Истина, Истина, "является истиной"); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоЛожь +// Проверяет установленное значение Контекста (или его свойство) на равенство "Ложь" (Булево). +// При сравнении также проверяется совпадение типов проверяемого и ожидаемого значения +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоЛожь(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Ложь, Ложь, "является ложью"); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоНеЛожь +// Проверяет установленное значение Контекста (или его свойство) на НЕ равенство "Ложь" (Булево). +// При сравнении также проверяется совпадение типов проверяемого и ожидаемого значения +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоНеЛожь(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Ложь, Истина, "является ложью"); + Возврат ЮТУтверждения; + +КонецФункции + +// Равно +// Проверяет установленное значение Контекста (или его свойство) на равенство ожидаемому. +// При сравнении также проверяется совпадение типов проверяемого и ожидаемого значения +// Для сериализуемых объектов проверяется равенство по значению +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) равно этому значению +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Равно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(ОжидаемоеЗначение, Ложь, СтрШаблон("равно `%1`", ОжидаемоеЗначение)); + Возврат ЮТУтверждения; + +КонецФункции + +// НеРавно +// Проверяет установленное значение Контекста (или его свойство) на НЕ равенство ожидаемому. +// При сравнении также проверяется совпадение типов проверяемого и ожидаемого значения +// Для сериализуемых значений проверяется равенство по значению +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) НЕ равно этому значению +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеРавно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(ОжидаемоеЗначение, Истина, СтрШаблон("равно `%1`", ОжидаемоеЗначение)); + Возврат ЮТУтверждения; + +КонецФункции + +// Больше +// Проверяет установленное значение Контекста (или его свойство), оно должно быть больше ожидаемого. +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) Больше этого значения +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Больше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ПроверяемоеЗначение > ОжидаемоеЗначение; + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не Результат Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(СтрШаблон("больше чем `%1`", ОжидаемоеЗначение), ПроверяемоеЗначение, ОжидаемоеЗначение); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// БольшеИлиРавно +// Проверяет установленное значение Контекста (или его свойство), оно должно быть больше или равно ожидаемому. +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) Больше этого значения или равно ему +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция БольшеИлиРавно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ПроверяемоеЗначение >= ОжидаемоеЗначение; + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не Результат Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(СтрШаблон("больше или равно `%1`", ОжидаемоеЗначение), ПроверяемоеЗначение, ОжидаемоеЗначение); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Меньше +// Проверяет установленное значение Контекста (или его свойство), оно должно быть меньше ожидаемого. +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) меньше этого значения +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Меньше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ПроверяемоеЗначение < ОжидаемоеЗначение; + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не Результат Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(СтрШаблон("меньше чем `%1`", ОжидаемоеЗначение), ПроверяемоеЗначение, ОжидаемоеЗначение); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// МеньшеИлиРавно +// Проверяет установленное значение Контекста (или его свойство), оно должно быть меньше или равно ожидаемому. +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) меньше этого значения или равно ему +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция МеньшеИлиРавно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ПроверяемоеЗначение <= ОжидаемоеЗначение; + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не Результат Тогда + Сообщение = СтрШаблон("меньше или равно `%1`", ОжидаемоеЗначение); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОжидаемоеЗначение); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Заполнено +// Проверяет установленное значение Контекста (или его свойство) на "заполненность" (обертка для ЗначениеЗаполнено) +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Заполнено(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьЗаполненность(Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// НеЗаполнено +// Проверяет установленное значение Контекста (или его свойство) на "не заполненность" (обертка для ЗначениеЗаполнено) +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеЗаполнено(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьЗаполненность(Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// Существует +// Проверяет установленное значение Контекста (или его свойство) на "существование", т.е. отличие от Null и Неопределено. +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Существует(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьСуществование(Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// НеСуществует +// Проверяет установленное значение Контекста (или его свойство) на "не существование", т.е. оно равно Null или Неопределено. +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеСуществует(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьСуществование(Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоНеопределено +// Проверяет установленное значение Контекста (или его свойство) не равенство `Неопределено`. +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоНеопределено(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Неопределено, Ложь, "является неопределено"); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоНеНеопределено +// Проверяет установленное значение Контекста (или его свойство) на не равенство `Неопределено` +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоНеНеопределено(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Неопределено, Истина, "является неопределено"); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоNull +// Проверяет установленное значение Контекста (или его свойство) на равенство `Null`. +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоNull(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Null, Ложь, "является null"); + Возврат ЮТУтверждения; + +КонецФункции + +// ЭтоНеNull +// Проверяет установленное значение Контекста (или его свойство) на не равенство `Null` +// +// Параметры: +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЭтоНеNull(Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + СравнитьЗначения(Null, Истина, "является null"); + Возврат ЮТУтверждения; + +КонецФункции + +// ИмеетТип +// Проверяет установленное значение Контекста (или его свойство) на соответствие переданному типу. +// +// Параметры: +// ОжидаемоеЗначение - Строка, Тип - Ожидается, что значение Контекста (или его свойство) имеет данный тип +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетТип(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипПараметра(ОжидаемоеЗначение, Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// НеИмеетТип +// Проверяет установленное значение Контекста (или его свойство) на несоответствие переданному типу. +// +// Параметры: +// ОжидаемоеЗначение - Строка, Тип - Ожидается, что значение Контекста (или его свойство) НЕ имеет данный тип +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеИмеетТип(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипПараметра(ОжидаемоеЗначение, Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// Содержит +// Проверяет установленное значение Контекста (или его свойство) на наличие в нем искомого. +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка - по вхождению +// - Массив - по наличию равного элемента +// - Структура - по наличию равного значения +// - Соответствие - по наличию равного значения +// - СписокЗначений - по наличию равного значения +// - ФиксированныйМассив - по наличию равного значения +// - ФиксированнаяСтруктура - по наличию равного значения +// - ФиксированноеСоответствие - по наличию равного значения +// При сравнении также проверяется совпадение типов +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) содержит указанное значение +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция Содержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьСодержание(ОжидаемоеЗначение, Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// НеСодержит +// Проверяет установленное значение Контекста (или его свойство) на наличие в нем искомого. +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка - по отсутствию вхождению +// - Массив - по отсутствию равного элемента +// - Структура - по отсутствию равного значения +// - Соответствие - по отсутствию равного значения +// - СписокЗначений - по отсутствию равного значения +// - ФиксированныйМассив - по отсутствию равного значения +// - ФиксированнаяСтруктура - по отсутствию равного значения +// - ФиксированноеСоответствие - по отсутствию равного значения +// При сравнении также проверяется совпадение типов +// +// Параметры: +// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) НЕ содержит указанное +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеСодержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьСодержание(ОжидаемоеЗначение, Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// ИмеетДлину +// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка +// - Массив +// - Структура +// - Соответствие +// - СписокЗначений +// - ФиксированныйМассив +// - ФиксированнаяСтруктура +// - ФиксированноеСоответствие +// - ТаблицаЗначения +// +// Параметры: +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную длину или размер +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетДлину(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьДлину(ОжидаемоеЗначение, Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// ИмеетДлинуБольше +// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка +// - Массив +// - Структура +// - Соответствие +// - СписокЗначений +// - ФиксированныйМассив +// - ФиксированнаяСтруктура +// - ФиксированноеСоответствие +// - ТаблицаЗначения +// +// Параметры: +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную длину или размер +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетДлинуБольше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); + + ФактическаяДлина = ДлинаПроверяемогоЗначения(); + Результат = ФактическаяДлина > ОжидаемоеЗначение; + + Сообщение = СтрШаблон("имеет длину (размер) больше `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Ложь, ФактическаяДлина, ОжидаемоеЗначение); + Возврат ЮТУтверждения; + +КонецФункции + +// ИмеетДлинуМеньше +// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка +// - Массив +// - Структура +// - Соответствие +// - СписокЗначений +// - ФиксированныйМассив +// - ФиксированнаяСтруктура +// - ФиксированноеСоответствие +// - ТаблицаЗначения +// +// Параметры: +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную длину или размер +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетДлинуМеньше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); + + ФактическаяДлина = ДлинаПроверяемогоЗначения(); + Результат = ФактическаяДлина < ОжидаемоеЗначение; + + Сообщение = СтрШаблон("имеет длину (размер) меньше `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Ложь, ФактическаяДлина, ОжидаемоеЗначение); + Возврат ЮТУтверждения; + +КонецФункции + +// НеИмеетДлину +// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции, которые не должны совпадать с указанным значением +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка +// - Массив +// - Структура +// - Соответствие +// - СписокЗначений +// - ФиксированныйМассив +// - ФиксированнаяСтруктура +// - ФиксированноеСоответствие +// - ТаблицаЗначения +// +// Параметры: +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) не имеет указанную дину или размер +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеИмеетДлину(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьДлину(ОжидаемоеЗначение, Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// ВыбрасываетИсключение +// Проверяет установленный для проверки метод Контекста на то, что метод упадет по исключению, +// далее текст исключения проверяется на ожидаемый. +// +// Параметры: +// ОжидаемоеЗначение - Строка - Ожидается, что сообщение об ошибке будет содержать данный текст +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ВыбрасываетИсключение(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Попытка + Контекст = Контекст(); + Модуль = ПроверяемоеЗначение(); + Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Не Результат.ИсключениеВозникло Тогда + ТекстОшибки = СтрШаблон("ожидали, что метод `%1` вызовет исключение `%2`, но это не так.", Контекст.ИмяМетода, ОжидаемоеЗначение); + ЮТРегистрацияОшибок.УстановитьДанныеОшибкиСравнения(Результат.ТекстИсключения, ОжидаемоеЗначение); + ЮТРегистрацияОшибок.ВызватьОшибкуПроверки(ТекстОшибки); + ИначеЕсли СтрНайти(Результат.ТекстИсключения, ОжидаемоеЗначение) = 0 Тогда + ТекстОшибки = СтрШаблон("ожидали, что метод `%1` вызовет исключение `%2`, но получили `%3`.", + Контекст.ИмяМетода, + ОжидаемоеЗначение, + Результат.ТекстИсключения); + ЮТРегистрацияОшибок.УстановитьДанныеОшибкиСравнения(Результат.ТекстИсключения, ОжидаемоеЗначение); + ЮТРегистрацияОшибок.ВызватьОшибкуПроверки(ТекстОшибки); + Иначе + Возврат ЮТУтверждения; + КонецЕсли; + +КонецФункции + +// НеВыбрасываетИсключение +// Проверяет установленный для проверки метод Контекста на то, что метод не упадет по исключению +// или упадет по исключению текст которого не содержит ожидаемый +// +// Параметры: +// ОжидаемоеЗначение - Строка - Ожидается, что сообщение об ошибке НЕ будет содержать данный текст +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеВыбрасываетИсключение(Знач ОжидаемоеЗначение = Неопределено, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + Попытка + Контекст = Контекст(); + Модуль = ПроверяемоеЗначение(); + Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода) + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Результат.ИсключениеВозникло Тогда + ЮТРегистрацияОшибок.УстановитьДанныеОшибкиСравнения(Результат.ТекстИсключения, ОжидаемоеЗначение); + + Если НЕ ЗначениеЗаполнено(ОжидаемоеЗначение) Тогда + ТекстОшибки = СтрШаблон("ожидали, что метод `%1` не вызовет исключение, но это не так.", Контекст.ИмяМетода); + ЮТРегистрацияОшибок.ВызватьОшибкуПроверки(ТекстОшибки); + ИначеЕсли СтрНайти(Результат.ТекстИсключения, ОжидаемоеЗначение) <> 0 Тогда + ТекстОшибки = СтрШаблон("ожидали, что метод `%1` не вызовет исключение `%2`, но это не так.", Контекст.ИмяМетода, ОжидаемоеЗначение); + ЮТРегистрацияОшибок.ВызватьОшибкуПроверки(ТекстОшибки); + КонецЕсли; + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет установленное значение Контекста (или его свойство), ожидается что оно начинается на указанное значение +// При этом проверяемое значение должно быть строкой +// +// Параметры: +// СтрокаПоиска - Строка - Строка поиска +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НачинаетсяС(СтрокаПоиска, ОписаниеПроверки = Неопределено) Экспорт + + ПроверяемоеЗначение = ПроверяемоеЗначение(); + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипЗначения(ПроверяемоеЗначение, "Строка", "проверяемого значения"); + ПроверитьТипЗначения(СтрокаПоиска, "Строка", "ожидаемого значения"); + ПроверитьЗаполненностьЗначения(СтрокаПоиска, "ожидаемое значение"); + + Результат = СтрНачинаетсяС(ПроверяемоеЗначение, СтрокаПоиска); + + Если НЕ Результат Тогда + Сообщение = СтрШаблон("начинается с `%1`", СтрокаПоиска); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, СтрокаПоиска); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет установленное значение Контекста (или его свойство), ожидается что оно заканчивается на указанное значение +// При этом проверяемое значение должно быть строкой +// +// Параметры: +// СтрокаПоиска - Строка - Строка поиска +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЗаканчиваетсяНа(СтрокаПоиска, ОписаниеПроверки = Неопределено) Экспорт + + ПроверяемоеЗначение = ПроверяемоеЗначение(); + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипЗначения(ПроверяемоеЗначение, "Строка", "проверяемого значения"); + ПроверитьТипЗначения(СтрокаПоиска, "Строка", "ожидаемого значения"); + ПроверитьЗаполненностьЗначения(СтрокаПоиска, "ожидаемое значение"); + + Результат = СтрЗаканчиваетсяНа(ПроверяемоеЗначение, СтрокаПоиска); + + Если НЕ Результат Тогда + Сообщение = СтрШаблон("заканчивается на `%1`", СтрокаПоиска); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, СтрокаПоиска); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет вхождение установленного значение (или его свойства) в заданный интервал +// Проверяемое значение может находится на границе интервала +// Параметры: +// НачалоИнтервала - Произвольный - Левая граница интервала. Может иметь любой тип, позволяющий сравнивать значения +// ОкончаниеИнтервала - Произвольный - Правая граница. Может иметь любой тип, позволяющий сравнивать значения +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция МеждуВключаяГраницы(НачалоИнтервала, ОкончаниеИнтервала, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьМежду(НачалоИнтервала, ОкончаниеИнтервала, Истина, Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет вхождение установленного значение (или его свойства) в заданный интервал +// Проверяемое значение не может находится на границе интервала +// +// Параметры: +// НачалоИнтервала - Произвольный - Левая граница интервала. Может иметь любой тип, позволяющий сравнивать значения +// ОкончаниеИнтервала - Произвольный - Правая граница. Может иметь любой тип, позволяющий сравнивать значения +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция МеждуИсключаяГраницы(НачалоИнтервала, ОкончаниеИнтервала, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьМежду(НачалоИнтервала, ОкончаниеИнтервала, Ложь, Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет вхождение установленного значение (или его свойства) в заданный интервал +// Проверяемое значение может находится на начальной границе интервала +// +// Параметры: +// НачалоИнтервала - Произвольный - Левая граница интервала. Может иметь любой тип, позволяющий сравнивать значения +// ОкончаниеИнтервала - Произвольный - Правая граница. Может иметь любой тип, позволяющий сравнивать значения +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция МеждуВключаяНачалоГраницы(НачалоИнтервала, ОкончаниеИнтервала, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьМежду(НачалоИнтервала, ОкончаниеИнтервала, Истина, Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет вхождение установленного значение (или его свойства) в заданный интервал +// Проверяемое значение может находится на конечной границе интервала +// +// Параметры: +// НачалоИнтервала - Произвольный - Левая граница интервала. Может иметь любой тип, позволяющий сравнивать значения +// ОкончаниеИнтервала - Произвольный - Правая граница. Может иметь любой тип, позволяющий сравнивать значения +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция МеждуВключаяОкончаниеГраницы(НачалоИнтервала, ОкончаниеИнтервала, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьМежду(НачалоИнтервала, ОкончаниеИнтервала, Ложь, Истина); + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет каждый элемент установленного значения (или его свойства), все элементы должны иметь указанное свойство +// +// Параметры: +// ИмяСвойства - Строка +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция КаждыйЭлементСодержитСвойство(ИмяСвойства, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ОбъектПроверки = "каждый элемент проверяемого значения"; + + Для Каждого Элемент Из ПроверяемоеЗначение Цикл + + Если НЕ ЗначениеСодержитСвойство(Элемент, ИмяСвойства) Тогда + Сообщение = СтрШаблон("содержит свойство `%1`", ИмяСвойства); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ИмяСвойства, ОбъектПроверки); + КонецЕсли; + + КонецЦикла; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет каждый элемент установленного значения (или его свойства), +// все элементы должны иметь указанное свойство, которое равно ожидаемому значению +// +// Параметры: +// ИмяСвойства - Строка +// ОжидаемоеЗначение - Произвольный - Ожидаемое значение свойства +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция КаждыйЭлементСодержитСвойствоСоЗначением(ИмяСвойства, ОжидаемоеЗначение, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ОбъектПроверки = "каждый элемент проверяемого значения"; + ОписаниеОжидания = Новый Структура(ИмяСвойства, ОжидаемоеЗначение); + + Для Каждого Элемент Из ПроверяемоеЗначение Цикл + + Путь = НормализованныйПутьКСвойству(Элемент, ИмяСвойства, Ложь); + Если Путь = Неопределено Тогда + Сообщение = СтрШаблон("содержит свойство `%1`", ИмяСвойства); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОписаниеОжидания, ОбъектПроверки); + КонецЕсли; + + ЗначениеСвойства = ЗначениеСвойства(Элемент, Путь); + + Если НЕ ЗначенияРавны(ЗначениеСвойства, ОжидаемоеЗначение) Тогда + Сообщение = СтрШаблон("содержит свойство `%1`, которое равно `%2`", ИмяСвойства, ОжидаемоеЗначение); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОписаниеОжидания, ОбъектПроверки); + КонецЕсли; + + КонецЦикла; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет элементы установленного значения (или его свойства), хотя бы один из них должен иметь указанное свойство +// +// Параметры: +// ИмяСвойства - Строка +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЛюбойЭлементСодержитСвойство(ИмяСвойства, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ОбъектПроверки = "хоть один элемент проверяемого значения"; + + Найден = Ложь; + Для Каждого Элемент Из ПроверяемоеЗначение Цикл + + Если ЗначениеСодержитСвойство(Элемент, ИмяСвойства) Тогда + Найден = Истина; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если НЕ Найден Тогда + Сообщение = СтрШаблон("содержит свойство `%1`", ИмяСвойства); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ИмяСвойства, ОбъектПроверки); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет элементы установленного значения (или его свойства), +// хотя бы один из них должен иметь указанное свойство, которое равно ожидаемому значению +// +// Параметры: +// ИмяСвойства - Строка +// ОжидаемоеЗначение - Произвольный - Ожидаемое значение свойства +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ЛюбойЭлементСодержитСвойствоСоЗначением(ИмяСвойства, ОжидаемоеЗначение, ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ОбъектПроверки = "хоть один элемент проверяемого значения"; + + НайденоСвойство = Ложь; + НайденоЗначение = Ложь; + Для Каждого Элемент Из ПроверяемоеЗначение Цикл + + Путь = НормализованныйПутьКСвойству(Элемент, ИмяСвойства, Ложь); + Если Путь = Неопределено Тогда + Продолжить; + КонецЕсли; + + НайденоСвойство = Истина; + ЗначениеСвойства = ЗначениеСвойства(Элемент, Путь); + + Если ЗначенияРавны(ЗначениеСвойства, ОжидаемоеЗначение) Тогда + НайденоЗначение = Истина; + Прервать; + КонецЕсли; + + КонецЦикла; + + ОписаниеОжидания = Новый Структура(ИмяСвойства, ОжидаемоеЗначение); + Если НЕ НайденоСвойство Тогда + Сообщение = СтрШаблон("содержит свойство `%1`", ИмяСвойства); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОписаниеОжидания, ОбъектПроверки); + ИначеЕсли НЕ НайденоЗначение Тогда + Сообщение = СтрШаблон("содержит свойство `%1`, которое равно `%2`", ИмяСвойства, ОжидаемоеЗначение); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОписаниеОжидания, ОбъектПроверки); + КонецЕсли; + + Возврат ЮТУтверждения; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Сбросить контекст. +// Используется для принудительного сброса контекста утверждения +Процедура СброситьКонтекст() Экспорт + + ИнициализироватьКонтекстУтверждения(); + +КонецПроцедуры + +// Инициализирует контекст утверждений +// +// Возвращаемое значение: +// Структура - контекст утверждений: +// * ПроверяемоеЗначение - Произвольный +// * ПредставлениеПроверяемогоЗначения - Строка +// * ПрефиксОшибки - Строка +// * ИмяМетода - Строка +// * ИмяСвойства - Строка +// * НормализованныйПутьКСвойству - Неопределено - Не указано свойство +// - Массив из Строка, Число +// * ПараметрыМетода - Неопределено - Не установлены +// - Массив из Произвольный +// * ОписаниеПроверки - Строка +Функция НовыйКонтекстУтверждения() Экспорт + + Контекст = Новый Структура; + + Контекст.Вставить("ПроверяемоеЗначение", Неопределено); + Контекст.Вставить("ПредставлениеПроверяемогоЗначения", Неопределено); + Контекст.Вставить("ПрефиксОшибки", ""); + Контекст.Вставить("ИмяМетода", ""); + Контекст.Вставить("ИмяСвойства", Неопределено); + Контекст.Вставить("НормализованныйПутьКСвойству", Неопределено); + Контекст.Вставить("ПараметрыМетода", Неопределено); + Контекст.Вставить("ОписаниеПроверки", Неопределено); + + Возврат Контекст; + +КонецФункции + +// Обработчик события "ПередКаждымТестом" +// +// Параметры: +// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов +Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт + + ЮТУтверждения.СброситьКонтекст(); + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +#Область Контекст + +Функция ИнициализироватьКонтекстУтверждения() + + Контекст = НовыйКонтекстУтверждения(); + + ЮТКонтекст.УстановитьКонтекстУтверждений(Контекст); + ЮТКонтекст.УстановитьКонтекстОшибки(); + + Возврат Контекст; + +КонецФункции + +Функция Контекст() Экспорт + + КонтекстУтверждения = ЮТКонтекст.КонтекстПроверки(); + + Если КонтекстУтверждения = Неопределено Тогда + КонтекстУтверждения = ИнициализироватьКонтекстУтверждения(); + КонецЕсли; + + Возврат КонтекстУтверждения; + +КонецФункции + +#КонецОбласти + +Функция ПроверяемоеЗначение() + + Контекст = Контекст(); + + Если Контекст.ИмяСвойства <> Неопределено Тогда + Значение = ЗначениеСвойства(Контекст.ПроверяемоеЗначение, Контекст.НормализованныйПутьКСвойству); + Иначе + Значение = Контекст.ПроверяемоеЗначение; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция ЗначениеСвойства(Объект, НормализованныйПутьКСвойству) + + Значение = Объект; + Для Каждого Часть Из НормализованныйПутьКСвойству Цикл + + Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда + Значение = Значение.Получить(); + КонецЕсли; + + Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда + Часть = Значение.Количество() + Часть; + КонецЕсли; + + Значение = Значение[Часть]; + + КонецЦикла; + + Возврат Значение; + +КонецФункции + +Функция ЗначенияРавны(Значение1, Значение2) + + Возврат ТипЗнч(Значение1) = ТипЗнч(Значение2) И + (Значение1 = Значение2 ИЛИ СравнитьПоЗначению(Значение1, Значение2)); + +КонецФункции + +Функция НормализованныйПутьКСвойству(Знач Значение, Цепочка, ФиксироватьОшибку = Истина) + + ПутьКСвойству = Новый Массив(); + + ТипПути = ТипЗнч(Цепочка); + + Если ТипПути = Тип("Строка") Тогда + + Части = СтрРазделить(Цепочка, "."); + + ПройденныйПуть = Новый Массив(); + + Для Каждого Часть Из Части Цикл + + ПройденныйПуть.Добавить(Часть); + + ПозицияИндекса = СтрНайти(Часть, "["); + + Если ПозицияИндекса > 0 И ПозицияИндекса > 0 И СтрЗаканчиваетсяНа(Часть, "]") Тогда + + Если ПозицияИндекса > 1 Тогда + ПутьКСвойству.Добавить(Лев(Часть, ПозицияИндекса - 1)); + КонецЕсли; + + Пока ПозицияИндекса > 0 Цикл + + ЗакрывающаяПозиция = СтрНайти(Часть, "]", , ПозицияИндекса); + ИндексСтрокой = Сред(Часть, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1); + Индекс = Число(ИндексСтрокой); + ПутьКСвойству.Добавить(Индекс); + + ПозицияИндекса = СтрНайти(Часть, "[", , ЗакрывающаяПозиция); + + КонецЦикла; + + Иначе + + ПутьКСвойству.Добавить(Часть); + + КонецЕсли; + + КонецЦикла; + + ИначеЕсли ТипПути = Тип("Соответствие") Тогда + + ПутьКСвойству.Добавить(Цепочка); + + ИначеЕсли ТипПути = Тип("Число") Тогда + + ПутьКСвойству.Добавить(Цепочка); + + КонецЕсли; + + ПройденныйПуть = Новый Массив(); + + Для Каждого Часть Из ПутьКСвойству Цикл + + ПройденныйПуть.Добавить(Часть); + + Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда + Значение = Значение.Получить(); + КонецЕсли; + + Попытка + ЕстьСвойство = ЗначениеИмеетСвойство(Значение, Часть); + Исключение + ЕстьСвойство = Ложь; + КонецПопытки; + + Если ЕстьСвойство Тогда + Значение = Значение[Часть]; + ИначеЕсли ФиксироватьОшибку Тогда + ПутьСвойства = СтрСоединить(ПройденныйПуть, "."); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(СтрШаблон("содержит свойство `%1`", ПутьСвойства), Значение, Цепочка); + Иначе + Возврат Неопределено; + КонецЕсли; + + КонецЦикла; + + Возврат ПутьКСвойству; + +КонецФункции + +Функция ЗначениеСодержитСвойство(Знач Значение, Знач ИмяСвойства) + + Возврат НормализованныйПутьКСвойству(Значение, ИмяСвойства, Ложь) <> Неопределено; + +КонецФункции + +Функция ЗначениеИмеетСвойство(Значение, Свойство) + + Результат = Ложь; + ТипЗначения = ТипЗнч(Значение); + + Если ТипЗначения = Тип("Структура") Или ТипЗначения = Тип("ФиксированнаяСтруктура") Тогда + + Результат = Значение.Свойство(Свойство); + + ИначеЕсли ТипЗначения = Тип("Соответствие") Или ТипЗначения = Тип("ФиксированноеСоответствие") Тогда + + Для Каждого КлючЗначение Из Значение Цикл + + Если КлючЗначение.Ключ = Свойство И ТипЗнч(КлючЗначение.Ключ) = ТипЗнч(Свойство) Тогда + Результат = Истина; + Прервать; + КонецЕсли; + + КонецЦикла; + + ИначеЕсли ТипЗнч(Свойство) = Тип("Число") Тогда + + Если Свойство < 0 Тогда + Свойство = Значение.Количество() + Свойство; + КонецЕсли; + Результат = Свойство >= 0 И Значение.Количество() > Свойство; + + Иначе + + Результат = ЮТОбщий.ПеременнаяСодержитСвойство(Значение, Свойство); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение) + + ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение); + ИскомоеЗначениеНайдено = Неопределено; + + Если ТипПроверяемогоЗначения = Тип("Строка") Тогда + + ИскомоеЗначениеНайдено = СтрНайти(ПроверяемоеЗначение, ОжидаемоеЗначение) > 0; + + ИначеЕсли ЭтоТипМассива(ТипПроверяемогоЗначения) Тогда + + Индекс = ПроверяемоеЗначение.Найти(ОжидаемоеЗначение); + ИскомоеЗначениеНайдено = Индекс <> Неопределено; + + ИначеЕсли ЭтоТипКлючЗначение(ТипПроверяемогоЗначения) Тогда + + ИскомоеЗначениеНайдено = Ложь; + ТипОжидаемогоЗначения = ТипЗнч(ОжидаемоеЗначение); + + Для Каждого КлючЗначение Из ПроверяемоеЗначение Цикл + Если КлючЗначение.Значение = ОжидаемоеЗначение И ТипЗнч(КлючЗначение.Значение) = ТипОжидаемогоЗначения Тогда + ИскомоеЗначениеНайдено = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипПроверяемогоЗначения = Тип("СписокЗначений") Тогда + + ИскомоеЗначениеНайдено = ПроверяемоеЗначение.НайтиПоЗначению(ОжидаемоеЗначение) <> Неопределено; + + КонецЕсли; + + Возврат ИскомоеЗначениеНайдено; + +КонецФункции + +Функция ДлинаЗначения(ПроверяемоеЗначение) + + ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение); + + Если ТипПроверяемогоЗначения = Тип("Строка") Тогда + + ФактическаяДлина = СтрДлина(ПроверяемоеЗначение); + + Иначе + + Попытка + ФактическаяДлина = ПроверяемоеЗначение.Количество(); + Исключение + ФактическаяДлина = Неопределено; + КонецПопытки; + + КонецЕсли; + + Возврат ФактическаяДлина; + +КонецФункции + +Функция ВызватьМетод(Модуль, ИмяМетода, ПараметрыМетода) + + Если Не ЗначениеЗаполнено(ИмяМетода) Тогда + ВызватьИсключение "ИмяМетода не заполнено в контексте. Воспользуйтесь предварительно методом интерфейса `Метод(ИмяМетода)`"; + КонецЕсли; + + СтрокаПараметры = ""; + + Если ЭтоТипМассива(ТипЗнч(ПараметрыМетода)) Тогда + Для Сч = 0 По ПараметрыМетода.ВГраница() Цикл + СтрокаПараметры = ЮТОбщий.ДобавитьСтроку(СтрокаПараметры, СтрШаблон("ПараметрыМетода[%1]", Сч), ", "); + КонецЦикла; + ИначеЕсли ЗначениеЗаполнено(ПараметрыМетода) Тогда + ВызватьИсключение СтрШаблон("Не верный тип параметров `%1`, должен быть массив", ТипЗнч(ПараметрыМетода)); + КонецЕсли; + + Если Модуль <> Неопределено Тогда + СтрокаДляВыполнения = СтрШаблон("Модуль.%1(%2)", ИмяМетода, СтрокаПараметры); + Иначе + СтрокаДляВыполнения = СтрШаблон("%1(%2)", ИмяМетода, СтрокаПараметры); + КонецЕсли; + + Результат = Новый Структура("ИсключениеВозникло, ТекстИсключения", Ложь); + + Попытка + Выполнить(СтрокаДляВыполнения); + Исключение + Результат.ИсключениеВозникло = Истина; + Результат.ТекстИсключения = ОписаниеОшибки(); + КонецПопытки; + + Возврат Результат; + +КонецФункции + +#Область ПроверкаТипов + +Процедура ПроверитьТипПараметра(Знач ОжидаемоеЗначение, Реверс = Ложь) + + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ПроверитьТипЗначения(ОжидаемоеЗначение, Новый ОписаниеТипов("ОписаниеТипов, Тип, Строка")); + Результат = ТипЗначенияСоответствует(ПроверяемоеЗначение, ОжидаемоеЗначение); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Сообщение = СтрШаблон("имеет тип `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ТипЗнч(ПроверяемоеЗначение), ОжидаемоеЗначение); + +КонецПроцедуры + +Процедура ПроверитьТипЗначения(Значение, + Знач ОжидаемыйТип, + Описание = "ожидаемого значения", + ЕслиУстановлен = Ложь, + Суффикс = Неопределено) + + Если ЕслиУстановлен И Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Соответствует = ТипЗначенияСоответствует(Значение, ОжидаемыйТип); + + Если НЕ Соответствует Тогда + ТекстОшибки = СтрШаблон("Не верный тип %1 (`%2`), должен быть `%3`%4", + Описание, + ТипЗнч(Значение), + ОжидаемыйТип, + Суффикс); + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки); + КонецЕсли; + +КонецПроцедуры + +Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип) + + ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип); + + Если ТипОжидаемогоТипа = Тип("Строка") Тогда + Если СтрНайти(ОжидаемыйТип, ",") Тогда + ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип); + ТипОжидаемогоТипа = Тип("ОписаниеТипов"); + Иначе + ОжидаемыйТип = Тип(ОжидаемыйТип); + ТипОжидаемогоТипа = Тип("Тип"); + КонецЕсли; + КонецЕсли; + + ТипЗначения = ТипЗнч(Значение); + + Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда + // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено") + Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено; + Иначе + Соответствует = ТипЗначения = ОжидаемыйТип; + КонецЕсли; + + Возврат Соответствует; + +КонецФункции + +Функция ЭтоТипМассива(Тип) + + Возврат Тип = Тип("Массив") Или Тип = Тип("ФиксированныйМассив"); + +КонецФункции + +Функция ЭтоТипКлючЗначение(Тип) + + Возврат Тип = Тип("Структура") Или Тип = Тип("ФиксированнаяСтруктура") + Или Тип = Тип("Соответствие") Или Тип = Тип("ФиксированноеСоответствие"); + +КонецФункции + +#КонецОбласти + +Функция СравнитьПоЗначению(Значение1, Значение2) + + Попытка + СтрокаСравнения1 = ЮТОбщий.СтрокаJSON(Значение1); + СтрокаСравнения2 = ЮТОбщий.СтрокаJSON(Значение2); + Возврат СтрокаСравнения1 = СтрокаСравнения2; + Исключение + Возврат Ложь; + КонецПопытки; + +КонецФункции + +Процедура УстановитьОписаниеПроверки(ОписаниеПроверки) + + Контекст().ОписаниеПроверки = ОписаниеПроверки; + +КонецПроцедуры + +Процедура СравнитьЗначения(ОжидаемоеЗначение, Реверс, Сообщение) + + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ЗначенияРавны(ПроверяемоеЗначение, ОжидаемоеЗначение); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение); + +КонецПроцедуры + +Процедура ПроверитьЗаполненность(Реверс) + + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ЗначениеЗаполнено(ПроверяемоеЗначение); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + ОбработатьРезультатСравнения(Результат, "является заполненным", Реверс, ПроверяемоеЗначение, Неопределено); + +КонецПроцедуры + +Процедура ПроверитьСуществование(Реверс) + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = ПроверяемоеЗначение <> Null И ПроверяемоеЗначение <> Неопределено; + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + ОбработатьРезультатСравнения(Результат, "существует", Реверс, ПроверяемоеЗначение, Неопределено); + +КонецПроцедуры + +Процедура ПроверитьСодержание(ОжидаемоеЗначение, Реверс) + + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + Результат = НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если Результат = Неопределено Тогда + ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение)); + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки); + КонецЕсли; + + Сообщение = СтрШаблон("содержит `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение); + +КонецПроцедуры + +Функция ДлинаПроверяемогоЗначения() + + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(); + ФактическаяДлина = ДлинаЗначения(ПроверяемоеЗначение); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); + КонецПопытки; + + Если ФактическаяДлина = Неопределено Тогда + ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение)); + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки); + КонецЕсли; + + Возврат ФактическаяДлина; + +КонецФункции + +Процедура ПроверитьДлину(ОжидаемоеЗначение, Реверс) + + ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); + + ФактическаяДлина = ДлинаПроверяемогоЗначения(); + Результат = ФактическаяДлина = ОжидаемоеЗначение; + + Сообщение = СтрШаблон("имеет длину (размер) `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ФактическаяДлина, ОжидаемоеЗначение); + +КонецПроцедуры + +Процедура ОбработатьРезультатСравнения(Знач Результат, Знач Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение) + + Если Реверс Тогда + Результат = НЕ Результат; + Сообщение = "не " + Сообщение; + КонецЕсли; + + Если Не Результат Тогда + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОжидаемоеЗначение); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьМежду(НачалоИнтервала, ОкончаниеИнтервала, ВключаяНачало, ВключаяОкончание) + + ПроверяемоеЗначение = ПроверяемоеЗначение(); + + ТипЗначения = ТипЗнч(ПроверяемоеЗначение); + + Суффикс = ". Он должен совпадать с типом проверяемого значения"; + ПроверитьТипЗначения(НачалоИнтервала, ТипЗначения, "левой границы интервала", , Суффикс); + ПроверитьТипЗначения(ОкончаниеИнтервала, ТипЗначения, "правой границы интервала", , Суффикс); + + Если НачалоИнтервала > ОкончаниеИнтервала Тогда + ТекстОшибки = СтрШаблон("Не корректно задан интервал, левая граница (%1) не должна быть больше правой (%2)", + НачалоИнтервала, + ОкончаниеИнтервала); + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки); + КонецЕсли; + Результат = Истина; + + Если ВключаяНачало Тогда + Результат = НачалоИнтервала <= ПроверяемоеЗначение; + Иначе + Результат = НачалоИнтервала < ПроверяемоеЗначение; + КонецЕсли; + + Если ВключаяОкончание Тогда + Результат = Результат И ПроверяемоеЗначение <= ОкончаниеИнтервала; + Иначе + Результат = Результат И ПроверяемоеЗначение < ОкончаниеИнтервала; + КонецЕсли; + + Если Не Результат Тогда + Интервал = СтрШаблон("%1%2; %3%4", + ?(ВключаяНачало, "[", "("), + НачалоИнтервала, + ОкончаниеИнтервала, + ?(ВключаяОкончание, "]", ")"),); + Сообщение = "находится в интервале " + Интервал; + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, Интервал); + КонецЕсли; + + +КонецПроцедуры + +Процедура ПроверитьЗаполненностьЗначения(Значение, Описание) + + Если НЕ ЗначениеЗаполнено(Значение) Тогда + ТекстОшибки = СтрШаблон("Ожидали, что %1 заполнено, но это не так", Описание); + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ОбъектыРавны(Объект, ОбъектЭталон) Экспорт + + Ключи = ЮТОбщий.ВыгрузитьЗначения(ОбъектЭталон, "Ключ"); + + ЭтоСоответствие = ТипЗнч(Объект) = Тип("Соответствие") ИЛИ ТипЗнч(Объект) = Тип("ФиксированноеСоответствие"); + ЭтоСтруктура = ТипЗнч(Объект) = Тип("Структура") ИЛИ ТипЗнч(Объект) = Тип("ФиксированнаяСтруктура"); + + ЗначениеОтсутствующегоРеквизита = Новый УникальныйИдентификатор(); + + Если НЕ ЭтоСтруктура И НЕ ЭтоСоответствие Тогда + СтруктураОбъекта = Новый Структура(СтрСоединить(Ключи, ",")); + Для Каждого Ключ Из Ключи Цикл + СтруктураОбъекта[Ключ] = ЗначениеОтсутствующегоРеквизита; + КонецЦикла; + ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект); + Иначе + СтруктураОбъекта = Объект; + КонецЕсли; + + Для Каждого Ключ Из Ключи Цикл + + Если Не ЭтоСоответствие И (Не СтруктураОбъекта.Свойство(Ключ) Или СтруктураОбъекта[Ключ] = ЗначениеОтсутствующегоРеквизита) Тогда + Сообщение = СтрШаблон("не содержат свойство '%1'", Ключ); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, СтруктураОбъекта, ОбъектЭталон); + КонецЕсли; + + Если НЕ ЗначенияРавны(Объект[Ключ], ОбъектЭталон[Ключ]) Тогда + Сообщение = СтрШаблон("имеет свойство '%1', которое равно `%2`", Ключ, ОбъектЭталон[Ключ]); + ЮТРегистрацияОшибок.СгенерироватьОшибкуСравнения(Сообщение, СтруктураОбъекта, ОбъектЭталон); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТУтверждения/ЮТУтверждения.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТУтверждения/ЮТУтверждения.mdo new file mode 100644 index 0000000..f7910c0 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТУтверждения/ЮТУтверждения.mdo @@ -0,0 +1,11 @@ + + + ЮТУтверждения + + ru + ЮТУтверждения + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl new file mode 100644 index 0000000..68151cf --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl @@ -0,0 +1,647 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// КонтекстыВызова +// Возвращает перечисление возможных контекстов вызова +// Возвращаемое значение: +// ФиксированнаяСтруктура - Контексты вызова +Функция КонтекстыВызова() Экспорт + + Контексты = Новый Структура(); + + Контексты.Вставить("КлиентОбычноеПриложение", "КлиентОбычноеПриложение"); + Контексты.Вставить("КлиентУправляемоеПриложение", "КлиентУправляемоеПриложение"); + Контексты.Вставить("Сервер", "Сервер"); + Контексты.Вставить("ВызовСервера", "ВызовСервера"); + + // TODO Подозреваю нужно добавить web клиент + + Возврат Новый ФиксированнаяСтруктура(Контексты); + +КонецФункции + +// Доступные параметры (настройки) исполнения тестов +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - Параметры исполнения теста: +// * ВТранзакции - Строка - Тест должен выполняться в транзакции +Функция ПараметрыИсполненияТеста() Экспорт + + Параметры = Новый Структура(); + Параметры.Вставить("ВТранзакции", "ВТранзакции"); + + Возврат Новый ФиксированнаяСтруктура(Параметры); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +#Область Перечисления + +// КонтекстыИсполнения +// Возвращает перечисление возможных контекстов исполнения тестов +// Возвращаемое значение: +// ФиксированнаяСтруктура - Контексты исполнения +Функция КонтекстыИсполнения() Экспорт + + Контексты = Новый Структура(); + + Контексты.Вставить("Клиент", "Клиент"); + Контексты.Вставить("Сервер", "Сервер"); + + Возврат Новый ФиксированнаяСтруктура(Контексты); + +КонецФункции + +// СтатусыИсполненияТеста +// Возвращает перечисление возможных статусов выполнения теста, жизненный цикл теста +// Возвращаемое значение: +// ФиксированнаяСтруктура - Статусы исполнения теста +Функция СтатусыИсполненияТеста() Экспорт + + Статусы = Новый Структура(); + + Статусы.Вставить("Ожидание", "Ожидание"); + Статусы.Вставить("Исполнение", "Исполнение"); + Статусы.Вставить("Успешно", "Успешно"); + Статусы.Вставить("Ошибка", "Ошибка"); + Статусы.Вставить("Сломан", "Сломан"); + Статусы.Вставить("Пропущен", "Пропущен"); + Статусы.Вставить("НеРеализован", "НеРеализован"); + + Возврат Новый ФиксированнаяСтруктура(Статусы); + +КонецФункции + +// Типы ошибок. +// +// Возвращаемое значение: +// ФиксированнаяСтруктура +// * ТестНеРеализован - Строка +// * ОшибкаСравнения - Строка +// * ОшибкаОбработкиСобытия - Строка +// * Утверждений - Строка +// * Исполнения - Строка +// * ЧтенияТестов - Строка +// * МалоПараметров - Строка +// * МногоПараметров - Строка +// * НекорректныйКонтекстИсполнения - Строка +// * Пропущен - Строка +Функция ТипыОшибок() Экспорт + + Типы = Новый Структура; + + Для Каждого ТипОшибки Из ПараметрыТиповОшибок() Цикл + Типы.Вставить(ТипОшибки.Ключ, ТипОшибки.Ключ); + КонецЦикла; + + Возврат Новый ФиксированнаяСтруктура(Типы); + +КонецФункции + +Функция ПараметрыТиповОшибок(Кешировать = Истина) Экспорт + + Если Кешировать Тогда + ЮТПовторногоИспользования.ПараметрыТиповОшибок(); + КонецЕсли; + + Возврат ЮТТестовыеДанные.СтруктураMarkDown("Ключ", + "| Ключ | Представление | Статус | + ||--------------------------------|----------------------------------|--------------| + || ТестНеРеализован | Не реализован | НеРеализован | + || ОшибкаСравнения | Ошибка сравнения | Ошибка | + || ОшибкаОбработкиСобытия | Ошибка обработки события | Сломан | + || Утверждений | Ошибка утверждений | Ошибка | + || Исполнения | Ошибка исполнения | Сломан | + || ЧтенияТестов | Загрузки тестов | Сломан | + || МалоПараметров | Мало фактических параметров | Сломан | + || МногоПараметров | Много фактических параметров | Сломан | + || НекорректныйКонтекстИсполнения | Некорректный контекст исполнения | Пропущен | + || Пропущен | Пропущен | Пропущен | + |"); + +КонецФункции + +Функция УровниИсполнения() Экспорт + + Уровни = Новый Структура; + Уровни.Вставить("Модуль", "Модуль"); + Уровни.Вставить("НаборТестов", "НаборТестов"); + Уровни.Вставить("Тест", "Тест"); + + Возврат Новый ФиксированнаяСтруктура(Уровни); + +КонецФункции + +#КонецОбласти + +#Область СтруктурыДанных + +// Описание тестового модуля. +// +// Параметры: +// МетаданныеМодуля - Структура из см. ЮТФабрика.ОписаниеМодуля +// НаборыТестов - Массив из см. ЮТФабрика.ОписаниеТестовогоНабора +// +// Возвращаемое значение: +// Структура - Описание тестового модуля: +// * МетаданныеМодуля - Структура из см. ЮТФабрика.ОписаниеМодуля +// * НаборыТестов - Массив из см. ЮТФабрика.ОписаниеТестовогоНабора +// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки +Функция ОписаниеТестовогоМодуля(МетаданныеМодуля, НаборыТестов) Экспорт + + Описание = Новый Структура; + Описание.Вставить("МетаданныеМодуля", МетаданныеМодуля); + Описание.Вставить("НаборыТестов", НаборыТестов); + Описание.Вставить("Ошибки", Новый Массив); + + Возврат Описание; + +КонецФункции + +// ОписаниеТестовогоНабора +// Возвращает описание регистрируемого тестового набора. +// Эта структура используется на этапе формирования описаний имеющихся тестов +// Параметры: +// Имя - Строка - Имя набора +// ТегиСтрокой - Строка - Теги набора +// +// Возвращаемое значение: +// Структура - Описание тестового набора: +// * Имя - Строка - Имя набора +// * Представление - Строка - Представление, краткое описание +// * Теги - Массив из Строка - Коллекция тегов набора +// * Тесты - Массив из см. ОписаниеТеста - Коллекция тестов набора, см. ОписаниеТеста +// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки - Описания ошибок регистрации тестов +// * НастройкиВыполнения- Структура - Настройки исполнения теста +Функция ОписаниеТестовогоНабора(Имя, ТегиСтрокой = "") Экспорт + + Описание = Новый Структура; + Описание.Вставить("Имя", Строка(Имя)); + Описание.Вставить("Представление", Строка(Имя)); + Описание.Вставить("Теги", СтрРазделить(ТегиСтрокой, ", ", Ложь)); + Описание.Вставить("Тесты", Новый Массив); + Описание.Вставить("Ошибки", Новый Массив); + Описание.Вставить("НастройкиВыполнения", Новый Структура()); + + Возврат Описание; + +КонецФункции + +// ОписаниеТеста +// Возвращает описание регистрируемого теста. +// Эта структура используется на этапе формирования описаний имеющихся тестов +// Параметры: +// Имя - Строка - Имя тестового метода +// Представление - Строка - Представление, краткое описание теста +// КонтекстыВызова - Массив из Строка - Контексты исполнения теста +// ТегиСтрокой - Строка - Теги теста +// +// Возвращаемое значение: +// Структура - Описание теста: +// * Имя - Строка - Имя теста (тестового метода) +// * Представление - Строка - Представление теста +// * Теги - Массив из Строка - Теги теста +// * КонтекстВызова - Массив из Строка - Контексты исполнения теста +// * НастройкиВыполнения- Структура - Настройки исполнения теста +// * Параметры - Неопределено, Массив из Произвольный - Параметры теста +Функция ОписаниеТеста(Имя, Представление, КонтекстыВызова, Знач ТегиСтрокой = "") Экспорт + + Если ТегиСтрокой = Неопределено Тогда + ТегиСтрокой = ""; + КонецЕсли; + + Описание = Новый Структура(); + Описание.Вставить("Имя", Строка(Имя)); + Описание.Вставить("Представление", Строка(Представление)); + Описание.Вставить("Теги", СтрРазделить(ТегиСтрокой, ", ", Ложь)); + Описание.Вставить("КонтекстВызова", КонтекстыВызова); + Описание.Вставить("НастройкиВыполнения", Новый Структура()); + Описание.Вставить("Параметры", Неопределено); + + Возврат Описание; + +КонецФункции + +// ОписаниеИсполняемогоНабораТестов +// Возвращает описание исполняемого тестового набора. +// Содержит данные необходимые для выполнения прогона тестов +// Параметры: +// НаборТестов - Массив из см. ОписаниеТеста - Коллекция зарегистрированных тестовых наборов, см. ОписаниеТестовогоНабора +// ТестовыйМодуль - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля +// +// Возвращаемое значение: +// Структура - Описание исполняемого набора тестов: +// * Имя - Строка - Имя набора +// * Представление - Строка - Представление набора +// * Теги - Массив из Строка - Тэги набора +// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки - Описания ошибок выполнения теста +// * Режим - Строка - Режим исполнения набора, см. КонтекстыВызова +// * МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля +// * Тесты - Массив из см. ОписаниеИсполняемогоТеста - Тесты набора, структуру тестов см. ОписаниеИсполняемогоТеста +// * Выполнять - Булево - Признак, что можно выполнить прогон набора (нет ошибок блокирующих запуск) +// * ДатаСтарта - Число - Дата запуска набора +// * Длительность - Число - Продолжительность выполнения набора +// * НастройкиВыполнения- Структура - Настройки исполнения теста +Функция ОписаниеИсполняемогоНабораТестов(НаборТестов, ТестовыйМодуль) Экспорт + + Описание = Новый Структура(); + + Описание.Вставить("Имя", НаборТестов.Имя); + Описание.Вставить("Представление", НаборТестов.Представление); + Описание.Вставить("Теги", НаборТестов.Теги); + Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(НаборТестов.Ошибки)); + Описание.Вставить("Режим", ""); + Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля); + Описание.Вставить("Тесты", Новый Массив); + Описание.Вставить("Выполнять", Описание.Ошибки.Количество() = 0); + Описание.Вставить("ДатаСтарта", 0); + Описание.Вставить("Длительность", 0); + Описание.Вставить("НастройкиВыполнения", НаборТестов.НастройкиВыполнения); + + Возврат Описание; + +КонецФункции + +// ОписаниеИсполняемогоТеста +// Возвращает описание исполняемого теста +// Содержит данные необходимые для выполнения прогона тестов +// +// Параметры: +// Тест - Структура из см. ОписаниеТеста - Описание зарегистрированного теста, см. ОписаниеТеста +// Режим - Строка - Режим исполнения, см. КонтекстыВызова +// ТестовыйМодуль - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля +// +// Возвращаемое значение: +// Структура - Описание исполняемого теста: +// * Имя - Строка - Имя/представление теста +// * Метод - Строка - Имя тестового метода +// * ПолноеИмяМетода - Строка - Полное имя тестового метода, ИмяМодуля.ИмяМетода +// * Теги - Массив из Строка - Теги теста +// * Режим - Строка - Режим исполнения теста, см. КонтекстыВызова +// * ДатаСтарта - Число - Дата запуска теста +// * Длительность - Число - Продолжительность выполнения теста +// * Статус - Строка - Статус выполнения теста, см. СтатусыИсполненияТеста +// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки - Описания ошибок выполнения теста, см. ЮТФабрика.ОписаниеВозникшейОшибки +// * НастройкиВыполнения- Структура - Настройки исполнения теста +Функция ОписаниеИсполняемогоТеста(Тест, Режим, ТестовыйМодуль) Экспорт + + ПолноеИмяМетода = СтрШаблон("%1.%2", ТестовыйМодуль.МетаданныеМодуля.Имя, Тест.Имя); + Представление = ПредставлениеТеста(Тест); + + ОписаниеТеста = Новый Структура; + ОписаниеТеста.Вставить("Имя", Представление); + ОписаниеТеста.Вставить("Метод", Тест.Имя); + ОписаниеТеста.Вставить("ПолноеИмяМетода", ПолноеИмяМетода); + ОписаниеТеста.Вставить("Теги", Тест.Теги); + ОписаниеТеста.Вставить("Режим", Режим); + ОписаниеТеста.Вставить("ДатаСтарта", 0); + ОписаниеТеста.Вставить("Длительность", 0); + ОписаниеТеста.Вставить("Статус", СтатусыИсполненияТеста().Ожидание); + ОписаниеТеста.Вставить("Ошибки", Новый Массив); + ОписаниеТеста.Вставить("НастройкиВыполнения", Тест.НастройкиВыполнения); + ОписаниеТеста.Вставить("Параметры", Тест.Параметры); + + Возврат ОписаниеТеста; + +КонецФункции + +// ПараметрыЗапуска +// Набор параметров подсистемы тестирования. +// Параметры на английском, чтобы не держать несколько реализаций чтения и обработки параметров +// +// Возвращаемое значение: +// Структура - Параметры: +// * ВыполнятьМодульноеТестирование - Булево - Признак необходимости выполнения тестов +// * reportPath - Строка - Файл или каталог сохранения отчета о тестировании +// * filter - Структура - Параметры отбора запускаемых тестов, см. ПараметрыФильтрации +// * settings - см. НастройкиВыполнения +// * closeAfterTests - Булево - Признак необходимости закрытия приложения по окончании прогона +// * reportFormat - Строка - Формат отчета о тестировании. +// Модули реализующие различные форматы отчетов собраны в подсистеме ЮТФормированиеОтчета +Функция ПараметрыЗапуска() Экспорт + + Параметры = Новый Структура; + + Параметры.Вставить("ВыполнятьМодульноеТестирование", Ложь); + + Параметры.Вставить("reportPath", ""); + Параметры.Вставить("closeAfterTests", Истина); + Параметры.Вставить("filter", ПараметрыФильтрации()); + Параметры.Вставить("settings", НастройкиВыполнения()); + Параметры.Вставить("reportFormat", "jUnit"); + Параметры.Вставить("showReport", Ложь); + + Возврат Параметры; + +КонецФункции + +// ОписаниеКонтекстаОшибки +// Возвращает описание деталей/расшифровки ошибки +// Возвращаемое значение: +// Структура - Детали ошибки: +// * ОшибкаУтверждения - Булево - Признак, это ошибка проверки утверждения +// * ПроверяемоеЗначение - Произвольный - Фактическое значение +// * ОжидаемоеЗначение - Произвольный - Ожидаемое значение +Функция ОписаниеКонтекстаОшибки() Экспорт + + Описание = Новый Структура("ПроверяемоеЗначение, ОжидаемоеЗначение"); + Описание.Вставить("ОшибкаУтверждения", Ложь); + + Возврат Описание; + +КонецФункции + +// ОписаниеМодуля +// Возвращает структуру описания модуля +// Возвращаемое значение: +// Структура - Описание модуля: +// * Имя - Строка - Имя модуля +// * ПолноеИмя - Строка - Полное имя модуля +// * Расширение - Строка - Имя расширения, владельца модуля +// * КлиентУправляемоеПриложение - Булево - Доступность контекста +// * КлиентОбычноеПриложение - Булево - Доступность контекста +// * Сервер - Булево - Доступность контекста +// * ВызовСервера - Булево - Доступность контекста +Функция ОписаниеМодуля() Экспорт + + Описание = Новый Структура; + Описание.Вставить("Имя", ""); + Описание.Вставить("ПолноеИмя", ""); + Описание.Вставить("Расширение", ""); + Описание.Вставить("КлиентУправляемоеПриложение", Ложь); + Описание.Вставить("КлиентОбычноеПриложение", Ложь); + Описание.Вставить("Сервер", Ложь); + Описание.Вставить("ВызовСервера", Ложь); + + Возврат Описание; + +КонецФункции + +// ОписаниеВозникшейОшибки +// Возвращает базовую структуру ошибки +// +// Параметры: +// Сообщение - Строка +// +// Возвращаемое значение: +// Структура - Описание возникшей ошибки: +// * Сообщение - Строка - Описание возникшей ошибки +// * Стек - Строка - Стек возникшей ошибки +// * ТипОшибки - Строка - Тип возникшей ошибки. Доступные значения см. ЮТФабрика.ТипыОшибок +Функция ОписаниеВозникшейОшибки(Сообщение) Экспорт + + Возврат Новый Структура("Сообщение, Стек, ТипОшибки", Сообщение); + +КонецФункции + +// Возвращает базовую структуру ошибки проверки факта и ожидания +// +// Параметры: +// Сообщение - Строка +// +// Возвращаемое значение: +// Структура - Описание возникшей ошибки: +// * Сообщение - Строка - Описание возникшей ошибки +// * Стек - Строка - Стек возникшей ошибки +// * ТипОшибки - Строка - Тип возникшей ошибки. Доступные значения см. ЮТФабрика.ТипыОшибок +// * ПроверяемоеЗначение - Произвольный - Проверяемое, фактическое значение +// * ОжидаемоеЗначение - Произвольный - Ожидаемое значение +Функция ОписаниеОшибкиСравнения(Сообщение) Экспорт + + Описание = ОписаниеВозникшейОшибки(Сообщение); + Описание.ТипОшибки = ТипыОшибок().Утверждений; + Описание.Вставить("ПроверяемоеЗначение"); + Описание.Вставить("ОжидаемоеЗначение"); + + Возврат Описание; + +КонецФункции + +// Возвращает базовую структуру ошибки пропуска теста +// +// Параметры: +// Сообщение - Строка +// +// Возвращаемое значение: +// Структура -- Описание возникшей ошибки:: +// * Сообщение - Строка - Описание возникшей ошибки +// * Стек - Строка - Стек возникшей ошибки +// * ТипОшибки - Строка - Тип возникшей ошибки. Доступные значения +// См. ЮТФабрика.ТипыОшибок +Функция ОписаниеОшибкиПропуска(Сообщение) Экспорт + + Описание = ОписаниеВозникшейОшибки(Сообщение); + Описание.ТипОшибки = ТипыОшибок().Пропущен; + + Возврат Описание; + +КонецФункции + +// Описание события исполнения тестов. +// +// Параметры: +// Модуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста +// +// Возвращаемое значение: +// Структура - Описание события исполнения тестов: +// * ИмяМодуля - Строка +// * Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// * Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста +Функция ОписаниеСобытияИсполненияТестов(Модуль, Набор = Неопределено, Тест = Неопределено) Экспорт + + Описание = Новый Структура(); + Описание.Вставить("Модуль", Модуль); + Описание.Вставить("Набор", Набор); + Описание.Вставить("Тест", Тест); + + Возврат Описание; + +КонецФункции + +#КонецОбласти + +// КонтекстыМодуля +// Возвращает коллекцию доступных контекстов выполнения модуля +// Параметры: +// Модуль Модуль +// +// Возвращаемое значение: +// Массив - Контексты модуля +Функция КонтекстыМодуля(Модуль) Экспорт + + Контексты = КонтекстыВызова(); + + КонтекстыМодуля = Новый Массив(); + + Если Модуль.Сервер Тогда + КонтекстыМодуля.Добавить(Контексты.Сервер); + КонецЕсли; + + Если Модуль.КлиентУправляемоеПриложение Тогда + КонтекстыМодуля.Добавить(Контексты.КлиентУправляемоеПриложение); + КонецЕсли; + + Если Модуль.КлиентОбычноеПриложение Тогда + КонтекстыМодуля.Добавить(Контексты.КлиентОбычноеПриложение); + КонецЕсли; + + Возврат КонтекстыМодуля; + +КонецФункции + +// КонтекстыПриложения +// Возвращает коллекцию доступных контекстов приложения +// Возвращаемое значение: +// Массив из см. КонтекстыВызова - Контексты приложения +Функция КонтекстыПриложения() Экспорт + +#Если Сервер Тогда + ВызватьИсключение "Метод получения контекстов приложения должен вызываться с клиента"; +#КонецЕсли + + Контексты = КонтекстыВызова(); + КонтекстыПриложения = Новый Массив(); + + КонтекстыПриложения.Добавить(Контексты.Сервер); + КонтекстыПриложения.Добавить(Контексты.ВызовСервера); + +#Если ТолстыйКлиентОбычноеПриложение Тогда + КонтекстыПриложения.Добавить(Контексты.КлиентОбычноеПриложение); +#ИначеЕсли ТолстыйКлиентУправляемоеПриложение Или ТонкийКлиент Тогда + КонтекстыПриложения.Добавить(Контексты.КлиентУправляемоеПриложение); +#КонецЕсли + + Возврат КонтекстыПриложения; + +КонецФункции + +// КонтекстИсполнения +// Возвращает контекст исполнения по контексту вызова +// Параметры: +// КонтекстВызова - Строка - Контекст вызова, см. ЮТФабрика.КонтекстыВызова +// +// Возвращаемое значение: +// Неопределено, Строка - Контекст исполнения +Функция КонтекстИсполнения(КонтекстВызова) Экспорт + + КонтекстыВызова = КонтекстыВызова(); + + Если КонтекстВызова = КонтекстыВызова.Сервер Тогда + + Возврат КонтекстыИсполнения().Сервер; + + ИначеЕсли КонтекстВызова = КонтекстыВызова.КлиентУправляемоеПриложение + ИЛИ КонтекстВызова = КонтекстыВызова.КлиентОбычноеПриложение + ИЛИ КонтекстВызова = КонтекстыВызова.ВызовСервера Тогда + + Возврат КонтекстыИсполнения().Клиент; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + +КонецФункции + +// Формирует представление теста +// +// Параметры: +// Тест - см. ОписаниеТеста +// +// Возвращаемое значение: +// Строка - Представление теста +Функция ПредставлениеТеста(Тест) Экспорт + + Если ЗначениеЗаполнено(Тест.Представление) Тогда + Представление = Тест.Представление; + ИначеЕсли ЗначениеЗаполнено(Тест.Параметры) Тогда + ПредставлениеПараметров = СтрСоединить(Тест.Параметры, ", "); + Представление = СтрШаблон("%1(%2)", Тест.Имя, ПредставлениеПараметров); + Иначе + Представление = Тест.Имя; + КонецЕсли; + + Возврат Представление; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +// ПараметрыФильтрации +// Возвращает структуру отборов для поиска тестов +// Возвращаемое значение: +// Структура - Параметры фильтрации: +// * extensions - Неопределено, Массив из Строка - Список тестовых расширений +// * modules - Неопределено, Массив из Строка - Список тестовых модулей +// * suites - Неопределено, Массив из Строка - Список тестовых наборов +// * paths - Неопределено, Массив из Строка - Список путей до тестовых методов, путь может быть не полным. +// Например: +// + tests - Ищем тесты в расширении tests +// + tests.ОМ_ОбщегоНазначения - Ищем тесты в модуле ОМ_ОбщегоНазначения расширения tests +// + tests.ОМ_ОбщегоНазначения.ПолучитьЗначениеРеквизита - указание конкретного теста +// * tags - Неопределено, Массив из Строка - Список тэгов +// * contexts - Неопределено, Массив из Строка - Список тестируемых контекстов +// * tests - Неопределено, Массив из Строка - Список полных имен тестовых методов. ИмяМодуля.ИмяМетода{.Контекст} +Функция ПараметрыФильтрации() + + Параметры = Новый Структура; + Параметры.Вставить("extensions"); + Параметры.Вставить("modules"); + Параметры.Вставить("suites"); + Параметры.Вставить("tags"); + Параметры.Вставить("contexts"); + Параметры.Вставить("paths"); + Параметры.Вставить("tests"); + + Возврат Параметры; + +КонецФункции + +Функция НастройкиВыполнения() + + ПараметрыИсполнения = ПараметрыИсполненияТеста(); + + Настройки = Новый Структура(); + + Настройки.Вставить(ПараметрыИсполнения.ВТранзакции, Ложь); + + Возврат Настройки; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТФабрика/ЮТФабрика.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТФабрика/ЮТФабрика.mdo new file mode 100644 index 0000000..de810c0 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТФабрика/ЮТФабрика.mdo @@ -0,0 +1,11 @@ + + + ЮТФабрика + + ru + Клиент сервер + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТФильтрация/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТФильтрация/Module.bsl new file mode 100644 index 0000000..2ce178c --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТФильтрация/Module.bsl @@ -0,0 +1,297 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ЭтоПодходящееРасширение(ИмяРасширения) Экспорт + + Контекст = ЮТКонтекст.КонтекстЧитателя(); + + Возврат НЕ Контекст.Фильтр.ЕстьФильтрРасширений ИЛИ Контекст.Фильтр.Расширения.Свойство(ИмяРасширения); + +КонецФункции + +Функция ЭтоПодходящийМодуль(ОписаниеМодуля) Экспорт + + Контекст = ЮТКонтекст.КонтекстЧитателя(); + + Возврат ЗначениеЗаполнено(ОписаниеМодуля.Расширение) + И (НЕ Контекст.Фильтр.ЕстьФильтрМодулей ИЛИ Контекст.Фильтр.Модули.Свойство(ОписаниеМодуля.Имя)) + И ЭтоПодходящееРасширение(ОписаниеМодуля.Расширение); + +КонецФункции + +// Отфильтровать тестовые наборы. +// +// Параметры: +// ТестовыеНаборы - Массив из см. ЮТФабрика.ОписаниеТестовогоНабора - Тестовые наборы +// ОписаниеМодуля - Структура - Описание модуля, которому принадлежат наборы, см. ЮТФабрика.ОписаниеМодуля +// +// Возвращаемое значение: +// Массив из см. ЮТФабрика.ОписаниеТестовогоНабора - Отфильтрованные наборы +Функция ОтфильтроватьТестовыеНаборы(ТестовыеНаборы, ОписаниеМодуля) Экспорт + + Контекст = ЮТКонтекст.КонтекстЧитателя(); + + Если НЕ Контекст.Фильтр.ЕстьФильтрТестов И НЕ Контекст.Фильтр.ЕстьФильтрКонтекстов Тогда + Возврат ТестовыеНаборы; + КонецЕсли; + + Результат = Новый Массив(); + + Если Контекст.Фильтр.ЕстьФильтрТестов Тогда + ДоступныеТестовыеМетоды = Новый Соответствие(); + + Для Каждого ОписаниеИмениТеста Из Контекст.Фильтр.Тесты Цикл + + Если СтрСравнить(ОписаниеИмениТеста.ИмяМодуля, ОписаниеМодуля.Имя) = 0 Тогда + ОписаниеИмениТеста.ИмяМетода = ВРег(ОписаниеИмениТеста.ИмяМетода); + + СохраненноеОписаниеИмени = ДоступныеТестовыеМетоды[ОписаниеИмениТеста.ИмяМетода]; + + Если СохраненноеОписаниеИмени = Неопределено И ОписаниеИмениТеста.Контекст = Неопределено Тогда + ДоступныеТестовыеМетоды.Вставить(ВРег(ОписаниеИмениТеста.ИмяМетода), ОписаниеИмениТеста); + ИначеЕсли СохраненноеОписаниеИмени = Неопределено Тогда + ОписаниеИмениТеста.Контекст = ЮТОбщий.ЗначениеВМассиве(ОписаниеИмениТеста.Контекст); + ДоступныеТестовыеМетоды.Вставить(ВРег(ОписаниеИмениТеста.ИмяМетода), ОписаниеИмениТеста); + ИначеЕсли ОписаниеИмениТеста.Контекст = Неопределено Тогда + СохраненноеОписаниеИмени.Контекст = Неопределено; // Без фильтрации контекста теста, возьмом из самого теста контексты + ИначеЕсли СохраненноеОписаниеИмени.Контекст <> Неопределено Тогда + СохраненноеОписаниеИмени.Контекст.Добавить(ОписаниеИмениТеста.Контекст); + Иначе + // Если было имя теста без контекста, то будет вызов во всех контекстах + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Для Каждого Набор Из ТестовыеНаборы Цикл + + ОтфильтрованныйНабор = ЮТФабрика.ОписаниеТестовогоНабора(Набор.Имя); + ЗаполнитьЗначенияСвойств(ОтфильтрованныйНабор, Набор, , "Тесты"); + + Для Каждого Тест Из Набор.Тесты Цикл + + КонтекстыТеста = Неопределено; + + Если ДоступныеТестовыеМетоды <> Неопределено Тогда + ОписаниеИмениТеста = ДоступныеТестовыеМетоды[ВРег(Тест.Имя)]; + + Если ОписаниеИмениТеста = Неопределено Тогда + Продолжить; + КонецЕсли; + + КонтекстыТеста = ОписаниеИмениТеста.Контекст; + + КонецЕсли; + + Если КонтекстыТеста = Неопределено Тогда + КонтекстыТеста = Тест.КонтекстВызова; + КонецЕсли; + + Если Контекст.Фильтр.ЕстьФильтрКонтекстов Тогда + КонтекстыТеста = ЮТОбщий.ПересечениеМассивов(КонтекстыТеста, Контекст.Фильтр.Контексты); + КонецЕсли; + + Если КонтекстыТеста.Количество() = 0 Тогда + // Возможно стоит такие выводить в лог с ошибкой "по переданным параметрам контекст теста не определен" + Продолжить; + КонецЕсли; + + ОтфильтрованныйТест = ЮТФабрика.ОписаниеТеста(Тест.Имя, "", ""); + ЗаполнитьЗначенияСвойств(ОтфильтрованныйТест, Тест, , "КонтекстВызова"); + ОтфильтрованныйТест.КонтекстВызова = КонтекстыТеста; + + ОтфильтрованныйНабор.Тесты.Добавить(ОтфильтрованныйТест); + + КонецЦикла; + + Если ОтфильтрованныйНабор.Тесты.Количество() Тогда + Результат.Добавить(ОтфильтрованныйНабор); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Фильтр +// Конструктур фильтра поиска тестовых методов +// +// Возвращаемое значение: +// Структура - Фильтр: +// * Расширения - Структура - Имена расширений +// * Модули - Структура - Имена модулей +// * Наборы - Массив из Строка - Имена тестовых наборов +// * Теги - Массив из Строка +// * Контексты - Массив из Строка - Контексты вызова тестовых методов +// * Тесты - Массив из см. ОписаниеИмениТеста - Список путей к тестовым методам +Функция Фильтр() Экспорт + + Фильтр = Новый Структура("Расширения, Модули, Наборы, Теги, Контексты, Пути, Тесты"); + + Фильтр.Расширения = Новый Структура(); + Фильтр.Модули = Новый Структура(); + Фильтр.Теги = Новый Массив(); + Фильтр.Контексты = Новый Массив(); + Фильтр.Наборы = Новый Массив(); + Фильтр.Пути = Новый Массив(); + Фильтр.Тесты = Новый Массив(); + + Возврат Фильтр; + +КонецФункции + +Процедура УстановитьКонтекст(ПараметрыЗапускаТестов) Экспорт + + Расширения = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "extensions", Новый Массив); + Модули = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "modules", Новый Массив); + Контексты = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "contexts"); + Тесты = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "tests", Новый Массив); + + Теги = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "tags", Новый Массив); + // TODO: Подумать в каком формате задать наборы - ИмяМодуля.Набор, Набор или другой вариант + Наборы = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "suites", Новый Массив); + // TODO: Обработка путей в формате: Модуль.ИмяТеста, ИмяТеста - метод, параметры, контекст + // ОМ_ЮТУтверждения.Что[0: 1].Сервер, ОМ_ЮТУтверждения.Что[1: Структура].Сервер + Пути = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапускаТестов.filter, "paths", Новый Массив); + + Фильтр = Фильтр(); + + Фильтр.Расширения = МассивВСтруктуру(Расширения); + Фильтр.Модули = МассивВСтруктуру(Модули); + + Если Контексты = Неопределено Тогда + Фильтр.Контексты = ЮТФабрика.КонтекстыПриложения(); + Иначе + Фильтр.Контексты = Контексты; + КонецЕсли; + + Если ЗначениеЗаполнено(Теги) Тогда + Фильтр.Теги = Теги; + КонецЕсли; + + Если ЗначениеЗаполнено(Наборы) Тогда + Фильтр.Наборы = Наборы; + КонецЕсли; + + Если ЗначениеЗаполнено(Пути) Тогда + Фильтр.Пути = Пути; + КонецЕсли; + + МодулиТестов = Новый Структура(); + + Если ЗначениеЗаполнено(Тесты) Тогда + Для Каждого ПолноеИмяТеста Из Тесты Цикл + Описание = ОписаниеИмениТеста(ПолноеИмяТеста); + Фильтр.Тесты.Добавить(Описание); + МодулиТестов.Вставить(Описание.ИмяМодуля, Истина); + КонецЦикла; + КонецЕсли; + + Если МодулиТестов.Количество() И Фильтр.Модули.Количество() = 0 Тогда + + Фильтр.Модули = МодулиТестов; + + ИначеЕсли МодулиТестов.Количество() Тогда + + Модули = Новый Структура(); + + Для Каждого Элемент Из Фильтр.Модули Цикл + Если МодулиТестов.Свойство(Элемент.Ключ) Тогда + Модули.Вставить(Элемент.Ключ, Истина); + КонецЕсли; + КонецЦикла; + + Фильтр.Модули = Модули; + + КонецЕсли; + + Фильтр.Вставить("ЕстьФильтрРасширений", Фильтр.Расширения.Количество() > 0); + Фильтр.Вставить("ЕстьФильтрМодулей", МодулиТестов.Количество() ИЛИ Фильтр.Модули.Количество()); + Фильтр.Вставить("ЕстьФильтрТестов", Фильтр.Тесты.Количество()); + Фильтр.Вставить("ЕстьФильтрКонтекстов", ЗначениеЗаполнено(Фильтр.Контексты)); + + ЮТКонтекст.УстановитьКонтекстЧитателя(Новый Структура("Фильтр", Фильтр)); + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция МассивВСтруктуру(Значения) + + Результат = Новый Структура(); + + Если НЕ ЗначениеЗаполнено(Значения) Тогда + Возврат Результат; + КонецЕсли; + + Для Каждого Значение Из Значения Цикл + Результат.Вставить(Значение); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ОписаниеИмениТеста(Путь) + + Части = СтрРазделить(Путь, "."); + + Если Части.Количество() <= 1 ИЛИ Части.Количество() > 3 Тогда + ВызватьИсключение СтрШаблон("Не корректный формат пути к тесту `%1`, должен быть в формате `ИмяМодуля.ИмяМетода{.Контекст}`", Путь); + КонецЕсли; + + Описание = Новый Структура("ИмяМодуля, ИмяМетода, Контекст"); + + Для Инд = 0 По Части.ВГраница() Цикл + Части[Инд] = СокрЛП(Части[Инд]); + КонецЦикла; + + Описание.ИмяМодуля = Части[0]; + Описание.ИмяМетода = Части[1]; + Если Части.Количество() > 2 Тогда + Описание.Контекст = Части[2]; + КонецЕсли; + + Возврат Описание; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТФильтрация/ЮТФильтрация.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТФильтрация/ЮТФильтрация.mdo new file mode 100644 index 0000000..b3bff67 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТФильтрация/ЮТФильтрация.mdo @@ -0,0 +1,11 @@ + + + ЮТФильтрация + + ru + Фильтрация + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl new file mode 100644 index 0000000..59dbb4f --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl @@ -0,0 +1,237 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// ЗагрузитьТесты +// Читает наборы тестов (тестовые модули) из расширений +// Параметры: +// ПараметрыЗапускаТестов - см. ЮТФабрика.ПараметрыЗапуска +// +// Возвращаемое значение: +// Массив из см. ЮТФабрика.ОписаниеТестовогоМодуля - Набор описаний тестовых модулей, которые содержат информацию о запускаемых тестах +Функция ЗагрузитьТесты(ПараметрыЗапускаТестов) Экспорт + + Результат = Новый Массив; + + ЮТФильтрация.УстановитьКонтекст(ПараметрыЗапускаТестов); + + Для Каждого ОписаниеМодуля Из ТестовыеМодули() Цикл + + НаборыТестов = ТестовыеНаборыМодуля(ОписаниеМодуля, ПараметрыЗапускаТестов); + + Если НаборыТестов = Неопределено Тогда + Продолжить; + КонецЕсли; + + ТестовыйМодуль = ЮТФабрика.ОписаниеТестовогоМодуля(ОписаниеМодуля, НаборыТестов); + Результат.Добавить(ТестовыйМодуль); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// ПрочитатьНаборТестов +// Читает набор тестов из модуля +// Параметры: +// ОписаниеМодуля - см. ЮТФабрика.ОписаниеМодуля +// +// Возвращаемое значение: +// Неопределено, Массив из см. ЮТФабрика.ОписаниеТестовогоНабора- Если прочитано, то будет возвращено описание наборов +Функция ИсполняемыеСценарииМодуля(ОписаниеМодуля) Экспорт + + ЭтоТестовыйМодуль = Истина; + + ЮТТесты.ПередЧтениемСценариевМодуля(ОписаниеМодуля); + + ПолноеИмяМетода = ОписаниеМодуля.Имя + ".ИсполняемыеСценарии"; + Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ЮТОбщий.ЗначениеВМассиве(Неопределено)); + + Если Ошибка <> Неопределено Тогда + + ТипыОшибок = ЮТФабрика.ТипыОшибок(); + ТипОшибки = ЮТРегистрацияОшибок.ТипОшибки(Ошибка, ПолноеИмяМетода); + + Если ТипОшибки = ТипыОшибок.ТестНеРеализован Тогда + ЭтоТестовыйМодуль = Ложь; + Ошибка = Неопределено; + ИначеЕсли ТипОшибки = ТипыОшибок.МногоПараметров Тогда + Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода); + КонецЕсли; + + КонецЕсли; + + Если Ошибка <> Неопределено Тогда + + Данные = Новый Массив(); // Фиксируем, чтобы отобразить в отчете + Описание = ЮТФабрика.ОписаниеТестовогоНабора(ОписаниеМодуля.Имя); + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуЧтенияТестов(Описание, "Ошибка формирования списка тестовых методов", Ошибка); + + Данные.Добавить(Описание); + + ИначеЕсли ЭтоТестовыйМодуль Тогда + + ЮТТесты.ПослеЧтенияСценариевМодуля(); + Сценарии = ЮТТесты.СценарииМодуля(); + + Данные = ЮТФильтрация.ОтфильтроватьТестовыеНаборы(Сценарии.ТестовыеНаборы, ОписаниеМодуля); + + Иначе + + Данные = Неопределено; + + КонецЕсли; + + Возврат Данные; + +КонецФункции + +// ЭтоТестовыйМодуль +// Проверяет, является ли модуль модулем с тестами +// Параметры: +// МетаданныеМодуля - Структура - Описание метаданных модуля, см. ЮТФабрика.ОписаниеМодуля +// +// Возвращаемое значение: +// Булево - Этот модуль содержит тесты +Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт + +#Если Сервер Тогда + Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев()); +#КонецЕсли + +#Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТонкийКлиент Тогда + Если МетаданныеМодуля.КлиентУправляемоеПриложение Тогда + Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев()); + КонецЕсли; +#КонецЕсли + +#Если ТолстыйКлиентОбычноеПриложение Тогда + Если МетаданныеМодуля.КлиентОбычноеПриложение Тогда + Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев()); + КонецЕсли; +#КонецЕсли + + Если МетаданныеМодуля.Сервер Тогда + Возврат ЮТЧитательСервер.ЭтоТестовыйМодуль(МетаданныеМодуля); + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ИмяМетодаСценариев() + + Возврат "ИсполняемыеСценарии"; + +КонецФункции + +// ТестовыеМодули +// Возвращает описания модулей, содержащих тесты +// Возвращаемое значение: +// Массив из см. ЮТМетаданныеСервер.МетаданныеМодуля - Тестовые модули +Функция ТестовыеМодули() + + ТестовыеМодули = Новый Массив; + + МодулиРасширения = ЮТМетаданныеСервер.МодулиРасширений(); + + Для Каждого ОписаниеМодуля Из МодулиРасширения Цикл + + Если ЮТФильтрация.ЭтоПодходящийМодуль(ОписаниеМодуля) И ЭтоТестовыйМодуль(ОписаниеМодуля) Тогда + + ТестовыеМодули.Добавить(ОписаниеМодуля); + + КонецЕсли; + + КонецЦикла; + + Возврат ТестовыеМодули; + +КонецФункции + +Функция ТестовыеНаборыМодуля(Модуль, ПараметрыЗапуска) + + // TODO Фильтрация по путям + НаборыТестов = Неопределено; + +#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + Если Модуль.КлиентОбычноеПриложение ИЛИ Модуль.КлиентУправляемоеПриложение Тогда + НаборыТестов = ИсполняемыеСценарииМодуля(Модуль); + ИначеЕсли Модуль.Сервер Тогда + НаборыТестов = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(Модуль); + КонецЕсли; +#ИначеЕсли Сервер Тогда + Если Модуль.Сервер Тогда + НаборыТестов = ИсполняемыеСценарииМодуля(Модуль); + Иначе + ВызватьИсключение "Чтение списка тестов модуля в недоступном контексте"; + КонецЕсли; +#ИначеЕсли Клиент Тогда + Если Модуль.КлиентУправляемоеПриложение Тогда + НаборыТестов = ИсполняемыеСценарииМодуля(Модуль); + ИначеЕсли Модуль.Сервер Тогда + НаборыТестов = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(Модуль); + КонецЕсли; +#КонецЕсли + + Возврат НаборыТестов; + +КонецФункции + +Функция Фильтр(ПараметрыЗапуска) + + Фильтр = Новый Структура("Расширения, Модули, Наборы, Теги, Контексты, Пути"); + + Фильтр.Расширения = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "extensions"); + Фильтр.Модули = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "modules"); + Фильтр.Теги = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "tags"); + Фильтр.Контексты = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "contexts"); + // TODO: Подумать в каком формате задать наборы - ИмяМодуля.Набор, Набор или другой вариант + Фильтр.Наборы = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "suites"); + + // TODO: Обработка путей в формате: Модуль.ИмяТеста, ИмяТеста - метод, параметры, контекст + // ОМ_ЮТУтверждения.Что[0: 1].Сервер, ОМ_ЮТУтверждения.Что[1: Структура].Сервер + Фильтр.Пути = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "paths"); + + Возврат Фильтр; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТЧитатель/ЮТЧитатель.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТЧитатель/ЮТЧитатель.mdo new file mode 100644 index 0000000..2d0ebb6 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТЧитатель/ЮТЧитатель.mdo @@ -0,0 +1,11 @@ + + + ЮТЧитатель + + ru + ЮТЧитатель + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТЧитательСервер/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТЧитательСервер/Module.bsl new file mode 100644 index 0000000..27422e4 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТЧитательСервер/Module.bsl @@ -0,0 +1,55 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// ПрочитатьНаборТестов +// См. ЮТЧитатель.ПрочитатьНаборТестов +// +Функция ИсполняемыеСценарииМодуля(Знач МетаданныеМодуля) Экспорт + + Возврат ЮТЧитатель.ИсполняемыеСценарииМодуля(МетаданныеМодуля); + +КонецФункции + +Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт + + Возврат ЮТЧитатель.ЭтоТестовыйМодуль(МетаданныеМодуля); + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТЧитательСервер/ЮТЧитательСервер.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТЧитательСервер/ЮТЧитательСервер.mdo new file mode 100644 index 0000000..f3808f2 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТЧитательСервер/ЮТЧитательСервер.mdo @@ -0,0 +1,10 @@ + + + ЮТЧитательСервер + + ru + ЮТЧитатель сервер + + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТест/Module.bsl b/src/cfe/yaxunit/src/CommonModules/ЮТест/Module.bsl new file mode 100644 index 0000000..77a5114 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТест/Module.bsl @@ -0,0 +1,122 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Основной модуль для запуска тестирования +///////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Возвращает API формирования утверждения для проверки теста +// +// Параметры: +// ПроверяемоеЗначение - Произвольный - Проверяемое фактическое значение +// Сообщение - Строка - Описание проверки, которое будет выведено при возникновении ошибки +// +// Возвращаемое значение: +// ОбщийМодуль - Утверждения +Функция ОжидаетЧто(ПроверяемоеЗначение, Сообщение = "") Экспорт + + Возврат ЮТУтверждения.Что(ПроверяемоеЗначение, Сообщение); + +КонецФункции + +// Пропустить выполнение теста +// Используется если тест выполняется в неподходящих условиях и не нужно его выполнять, но отразить в отчете требуется +// Параметры: +// Сообщение - Неопределено - Сообщение +Процедура Пропустить(Сообщение = Неопределено) Экспорт + + ЮТРегистрацияОшибок.Пропустить(Сообщение); + +КонецПроцедуры + +// Возвращает API для работы с тестовыми данными +// +// Возвращаемое значение: +// ОбщийМодуль - Данные +Функция Данные() Экспорт + + Возврат ЮТТестовыеДанные; + +КонецФункции + +// Конструктор вариантов прогона теста +// Используется для формирования набора различных параметров выполнения +// Параметры: +// Реквизиты - Строка - Список реквизитов варианта разделенных запятой +// +// Возвращаемое значение: +// ОбщийМодуль - Варианты +Функция Варианты(Реквизиты) Экспорт + + Возврат ЮТКонструкторВариантов.Варианты(Реквизиты); + +КонецФункции + +Функция Контекст() Экспорт + + Возврат ЮТКонтекстТеста; + +КонецФункции + +// КонтекстТеста +// Возвращает структуру, в которой можно хранить данные используемые в тесте +// Данные живут в рамках одного теста, но доступны в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста` +// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста` +// Возвращаемое значение: +// Структура - Контекст теста +// Неопределено - Если метод вызывается за рамками теста +Функция КонтекстТеста() Экспорт + + Возврат ЮТКонтекст.КонтекстТеста(); + +КонецФункции + +// КонтекстНабора +// Возвращает структуру, в которой можно хранить данные используемые в тестах набора +// Данные живут в рамках одного набора тестов (данные между клиентом и сервером не синхронизируются) +// Доступны в каждом тесте набора и в обработчиках событий +// + `ПередТестовымНабором` +// + `ПослеТестовогоНабора` +// + `ПередКаждымТестом` +// + `ПослеКаждогоТеста` +// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста` +// Возвращаемое значение: +// Структура - Контекст набора тестов +// Неопределено - Если метод вызывается за рамками тестового набора +Функция КонтекстТестовогоНабора() Экспорт + + Возврат ЮТКонтекст.КонтекстНабора(); + +КонецФункции + +// КонтекстМодуля +// Возвращает структуру, в которой можно хранить данные используемые в тестах модуля +// Данные живут в рамках одного тестового модуля (данные между клиентом и сервером не синхронизируются) +// Доступны в каждом тесте модуля и в обработчиках событий +// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеВсехТестов` +// Возвращаемое значение: +// Структура - Контекст тестового модуля +// Неопределено - Если метод вызывается за рамками тестового модуля +Функция КонтекстМодуля() Экспорт + + Возврат ЮТКонтекст.КонтекстМодуля(); + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/ЮТест/ЮТест.mdo b/src/cfe/yaxunit/src/CommonModules/ЮТест/ЮТест.mdo new file mode 100644 index 0000000..0d096b7 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/ЮТест/ЮТест.mdo @@ -0,0 +1,11 @@ + + + ЮТест + + ru + Тест + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/Module.bsl b/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/Module.bsl new file mode 100644 index 0000000..cb66b12 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/Module.bsl @@ -0,0 +1,54 @@ +// @strict-types + + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИсполняемыеСценарии() Экспорт + + ЮТТесты + .ДобавитьТест("тест_POST"); + +КонецПроцедуры + +#Область События + +Процедура ПередВсемиТестами() Экспорт + +КонецПроцедуры + +Процедура ПередКаждымТестом() Экспорт + +КонецПроцедуры + +Процедура ПослеКаждогоТеста() Экспорт + +КонецПроцедуры + +Процедура ПослеВсехТестов() Экспорт + +КонецПроцедуры + +#КонецОбласти + +Процедура тест_POST() Экспорт + + Параметры = бф_КоннекторХТТП.НовыеПараметры(); + Параметры.Json = Новый Структура("testField1,testField2", "field1", 5); + Результат = бф_КоннекторХТТП.Post("http://httpbin.org/post", , Параметры); + + ЮТест.ОжидаетЧто(Результат) + .Свойство("КодСостояния").Меньше(300); + ЮТест.ОжидаетЧто(бф_КоннекторХТТП.КакJson(Результат)) + .Свойство("json.testField1").Равно("field1").Объект() + .Свойство("json.testField2").Равно(5); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/тест_КоннекторХТТП.mdo b/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/тест_КоннекторХТТП.mdo new file mode 100644 index 0000000..825f3c4 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/тест_КоннекторХТТП.mdo @@ -0,0 +1,11 @@ + + + тест_КоннекторХТТП + + ru + Тест коннектор ХТТП + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/тест_КоннекторХТТП.suppress b/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/тест_КоннекторХТТП.suppress new file mode 100644 index 0000000..b73e625 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/тест_КоннекторХТТП/тест_КоннекторХТТП.suppress @@ -0,0 +1,4 @@ + + + + diff --git a/src/cfe/yaxunit/src/CommonModules/тест_ПроцессорКоллекций/Module.bsl b/src/cfe/yaxunit/src/CommonModules/тест_ПроцессорКоллекций/Module.bsl new file mode 100644 index 0000000..4341bf5 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/тест_ПроцессорКоллекций/Module.bsl @@ -0,0 +1,99 @@ +// @strict-types + + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИсполняемыеСценарии() Экспорт + + ЮТТесты + .ДобавитьТест("тест_ИнциализацияИзКоллекции", "Иницилизация из коллекции") + .ДобавитьТест("тест_ИнциализацияИзНабора", "Инициализация из набора") + .ДобавитьТест("тест_СтандартнаяСортировка", "Сортировка коллекции") + ; + +КонецПроцедуры + +#Область События + +Процедура ПередВсемиТестами() Экспорт + +КонецПроцедуры + +Процедура ПередКаждымТестом() Экспорт + +КонецПроцедуры + +Процедура ПослеКаждогоТеста() Экспорт + +КонецПроцедуры + +Процедура ПослеВсехТестов() Экспорт + +КонецПроцедуры + +#КонецОбласти + +Процедура тест_ИнциализацияИзКоллекции() Экспорт + + Числа = НовыеЧисла(); + Коллекция = бф_ПроцессорыКоллекций.ИзКоллекции(Числа); + ЮТест.ОжидаетЧто(Коллекция.ВМассив()).Равно(Числа); + + +КонецПроцедуры + +Процедура тест_ИнциализацияИзНабора() Экспорт + + Числа = НовыеЧисла(); + + Коллекция = бф_ПроцессорыКоллекций.ИзНабора( + Числа.Получить(0), + Числа.Получить(1), + Числа.Получить(2), + Числа.Получить(3), + Числа.Получить(4), + Числа.Получить(5), + ); + ЮТест.ОжидаетЧто(Коллекция.ВМассив()).Равно(Числа); + + +КонецПроцедуры + +Процедура тест_СтандартнаяСортировка() Экспорт + + Числа = НовыеЧисла(); + + Коллекция = бф_ПроцессорыКоллекций.ИзКоллекции(Числа).Сортировать(); + + ПредыдущееЗначение = 0; + + Для Каждого Элемент Из Коллекция.ВМассив() Цикл + ЮТест.ОжидаетЧто(ПредыдущееЗначение).МеньшеИлиРавно(Элемент); + //@skip-check statement-type-change + ПредыдущееЗначение = Элемент; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НовыеЧисла() + Массив = Новый Массив; // Массив из Число + Массив.Добавить(1); + Массив.Добавить(5); + Массив.Добавить(2); + Массив.Добавить(92); + Массив.Добавить(7); + Массив.Добавить(2); + + Возврат Массив; + +КонецФункции + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/CommonModules/тест_ПроцессорКоллекций/тест_ПроцессорКоллекций.mdo b/src/cfe/yaxunit/src/CommonModules/тест_ПроцессорКоллекций/тест_ПроцессорКоллекций.mdo new file mode 100644 index 0000000..ebf3300 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonModules/тест_ПроцессорКоллекций/тест_ПроцессорКоллекций.mdo @@ -0,0 +1,11 @@ + + + тест_ПроцессорКоллекций + + ru + Тест процессор коллекций + + true + true + true + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТНеизвестный/Picture.svg b/src/cfe/yaxunit/src/CommonPictures/ЮТНеизвестный/Picture.svg new file mode 100644 index 0000000..d125edd --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТНеизвестный/Picture.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТНеизвестный/ЮТНеизвестный.mdo b/src/cfe/yaxunit/src/CommonPictures/ЮТНеизвестный/ЮТНеизвестный.mdo new file mode 100644 index 0000000..79875c3 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТНеизвестный/ЮТНеизвестный.mdo @@ -0,0 +1,8 @@ + + + ЮТНеизвестный + + ru + Неизвестный + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТОшибка/Picture.svg b/src/cfe/yaxunit/src/CommonPictures/ЮТОшибка/Picture.svg new file mode 100644 index 0000000..e37abd8 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТОшибка/Picture.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТОшибка/ЮТОшибка.mdo b/src/cfe/yaxunit/src/CommonPictures/ЮТОшибка/ЮТОшибка.mdo new file mode 100644 index 0000000..997c60f --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТОшибка/ЮТОшибка.mdo @@ -0,0 +1,8 @@ + + + ЮТОшибка + + ru + Ошибка + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТПропущен/Picture.svg b/src/cfe/yaxunit/src/CommonPictures/ЮТПропущен/Picture.svg new file mode 100644 index 0000000..552f0b9 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТПропущен/Picture.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТПропущен/ЮТПропущен.mdo b/src/cfe/yaxunit/src/CommonPictures/ЮТПропущен/ЮТПропущен.mdo new file mode 100644 index 0000000..744af99 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТПропущен/ЮТПропущен.mdo @@ -0,0 +1,8 @@ + + + ЮТПропущен + + ru + Пропущен + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТУпал/Picture.svg b/src/cfe/yaxunit/src/CommonPictures/ЮТУпал/Picture.svg new file mode 100644 index 0000000..71a9fa1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТУпал/Picture.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТУпал/ЮТУпал.mdo b/src/cfe/yaxunit/src/CommonPictures/ЮТУпал/ЮТУпал.mdo new file mode 100644 index 0000000..e2c44ed --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТУпал/ЮТУпал.mdo @@ -0,0 +1,8 @@ + + + ЮТУпал + + ru + Упал + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТУспешно/Picture.svg b/src/cfe/yaxunit/src/CommonPictures/ЮТУспешно/Picture.svg new file mode 100644 index 0000000..a189ec1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТУспешно/Picture.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТУспешно/ЮТУспешно.mdo b/src/cfe/yaxunit/src/CommonPictures/ЮТУспешно/ЮТУспешно.mdo new file mode 100644 index 0000000..09a3169 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТУспешно/ЮТУспешно.mdo @@ -0,0 +1,8 @@ + + + ЮТУспешно + + ru + Успешно + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТЭлементыТестов/Picture.svg b/src/cfe/yaxunit/src/CommonPictures/ЮТЭлементыТестов/Picture.svg new file mode 100644 index 0000000..ac31420 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТЭлементыТестов/Picture.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/cfe/yaxunit/src/CommonPictures/ЮТЭлементыТестов/ЮТЭлементыТестов.mdo b/src/cfe/yaxunit/src/CommonPictures/ЮТЭлементыТестов/ЮТЭлементыТестов.mdo new file mode 100644 index 0000000..0b290b1 --- /dev/null +++ b/src/cfe/yaxunit/src/CommonPictures/ЮТЭлементыТестов/ЮТЭлементыТестов.mdo @@ -0,0 +1,8 @@ + + + ЮТЭлементыТестов + + ru + Элементы тестов + + diff --git a/src/cfe/yaxunit/src/Configuration/CommandInterface.cmi b/src/cfe/yaxunit/src/Configuration/CommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Configuration/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Configuration/Configuration.mdo b/src/cfe/yaxunit/src/Configuration/Configuration.mdo new file mode 100644 index 0000000..86492fb --- /dev/null +++ b/src/cfe/yaxunit/src/Configuration/Configuration.mdo @@ -0,0 +1,72 @@ + + + YAXUNIT + Adopted + + Extended + + + + + + + + true + ЮТ + 8.3.10 + AddOn + Russian + 22.11.0 + + Русский + Adopted + + Checked + + ru + + Subsystem.тесты + Subsystem.ЮТДвижок + Subsystem.ЮТФункциональность + CommonPicture.ЮТНеизвестный + CommonPicture.ЮТОшибка + CommonPicture.ЮТПропущен + CommonPicture.ЮТУпал + CommonPicture.ЮТУспешно + CommonPicture.ЮТЭлементыТестов + CommonModule.Мокито + CommonModule.МокитоОбучение + CommonModule.МокитоПроверки + CommonModule.МокитоСлужебный + CommonModule.СтроковыеФункцииКлиентСервер + CommonModule.тест_КоннекторХТТП + CommonModule.тест_ПроцессорКоллекций + CommonModule.ЮТест + CommonModule.ЮТИсполнитель + CommonModule.ЮТИсполнительСервер + CommonModule.ЮТКонструкторВариантов + CommonModule.ЮТКонтекст + CommonModule.ЮТКонтекстКлиент + CommonModule.ЮТКонтекстСервер + CommonModule.ЮТКонтекстТеста + CommonModule.ЮТМетаданныеСервер + CommonModule.ЮТОбщий + CommonModule.ЮТОбщийВызовСервера + CommonModule.ЮТОтчет + CommonModule.ЮТОтчетJSON + CommonModule.ЮТОтчетJUnit + CommonModule.ЮТПараметры + CommonModule.ЮТПовторногоИспользования + CommonModule.ЮТРасширения + CommonModule.ЮТРегистрацияОшибок + CommonModule.ЮТСобытия + CommonModule.ЮТТестовыеДанные + CommonModule.ЮТТестовыеДанныеВызовСервера + CommonModule.ЮТТесты + CommonModule.ЮТУтверждения + CommonModule.ЮТФабрика + CommonModule.ЮТФильтрация + CommonModule.ЮТЧитатель + CommonModule.ЮТЧитательСервер + DataProcessor.ЮТЮнитТесты + diff --git a/src/cfe/yaxunit/src/Configuration/MainSectionCommandInterface.cmi b/src/cfe/yaxunit/src/Configuration/MainSectionCommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Configuration/MainSectionCommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Configuration/ManagedApplicationModule.bsl b/src/cfe/yaxunit/src/Configuration/ManagedApplicationModule.bsl new file mode 100644 index 0000000..625cab1 --- /dev/null +++ b/src/cfe/yaxunit/src/Configuration/ManagedApplicationModule.bsl @@ -0,0 +1,42 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область ОписаниеПеременных + +Перем ЮТДанныеКонтекста Экспорт; + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Обработчики событий модуля +///////////////////////////////////////////////////////////////////////////////// +#Область ОбработчикиСобытий + +///////////////////////////////////////////////////////////////////////////////// +// ОТКРЫТИЕ ПРИЛОЖЕНИЯ +///////////////////////////////////////////////////////////////////////////////// + +// Используется для перехвата управления расширением после отработки запуска приложения +&После("ПриНачалеРаботыСистемы") +Процедура ЮТПриНачалеРаботыСистемы() + + ЮТИсполнитель.ВыполнитьМодульноеТестирование(); + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/ConditionalAppearance.dcssca b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/ConditionalAppearance.dcssca new file mode 100644 index 0000000..2f5f3c5 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/ConditionalAppearance.dcssca @@ -0,0 +1,160 @@ + + + + + + ДеревоТестовПрогресс + + + + + ДеревоТестов.Набор + Equal + false + + + + + Видимость + false + + + + + ru + Скрытие колонок. Тест + + + + + + + ДеревоТестовИконка + + + ДеревоТестовСостояние + + + + + ДеревоТестов.Набор + Equal + true + + + + + Видимость + false + + + + + ru + Скрытие колонок. Набор + + + + + + + ДеревоТестовКонтекст + + + + + ДеревоТестов.Контекст + Equal + Сервер + + + + + ЦветТекста + #B46C00 + + + + + ru + Контекст. Сервер + + + + + + + ДеревоТестовКонтекст + + + + + ДеревоТестов.Контекст + Equal + Клиент + + + + + ЦветТекста + #058BC0 + + + + + ru + Контекст. Клиент + + + + + + + ДеревоТестовВремяВыполнения + + + + + OrGroup + + AndGroup + + ДеревоТестов.Набор + Equal + false + + + ДеревоТестов.ВремяВыполнения + Greater + 1 + + + + AndGroup + + ДеревоТестов.Набор + Equal + true + + + ДеревоТестов.ВремяВыполнения + Greater + 10 + + + + + + + ЦветТекста + #D2000F + + + + + ru + Время выполнения > 1 сек + + + + diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/Form.form b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/Form.form new file mode 100644 index 0000000..471d5e8 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/Form.form @@ -0,0 +1,1486 @@ + + + + ОсновнаяКоманднаяПанель + 122 + + ФормаСформироватьНастройки + 125 + true + true + + true + + + ФормаСформироватьНастройкиРасширеннаяПодсказка + 115 + true + true + + true + + Label + true + true + + Left + + + Form.Command.СформироватьНастройки + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 123 + true + true + + true + + Label + true + true + + Left + + + CommandBar + + Left + Item.ДеревоТестов + + + + ГруппаОсновное + 85 + + ДеревоТестов + 29 + true + true + + true + + + ДеревоТестов + + None + + ДеревоТестовПредставление + 42 + true + true + + true + + + ДеревоТестов.Представление + + + ДеревоТестовПредставлениеРасширеннаяПодсказка + 44 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовПредставлениеКонтекстноеМеню + 43 + true + true + + true + + true + + InputField + Enter + true + Left + true + + 10 + true + true + true + true + true + true + + 8.0 + true + + + + + ДеревоТестовКонтекст + 107 + true + true + + true + + + ДеревоТестов.Контекст + + + ДеревоТестовКонтекстРасширеннаяПодсказка + 109 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовКонтекстКонтекстноеМеню + 108 + true + true + + true + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + + ДеревоТестовГруппаПрогресс + 102 + + ДеревоТестовГруппаСостояние + 87 + + ДеревоТестовИконка + 54 + true + true + + true + + + ДеревоТестов.Иконка + + None + + ДеревоТестовИконкаРасширеннаяПодсказка + 56 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовИконкаКонтекстноеМеню + 55 + true + true + + true + + true + + PictureField + Enter + true + Left + true + + 5 + true + true + true + + + + ДеревоТестовСостояние + 48 + true + true + + true + + + ДеревоТестов.Состояние + + + ДеревоТестовСостояниеРасширеннаяПодсказка + 50 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовСостояниеКонтекстноеМеню + 49 + true + true + + true + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Дерево тестов группа состояние</value> + + + ДеревоТестовГруппаСостояниеРасширеннаяПодсказка + 88 + true + true + + true + + Label + true + true + + Left + + + ColumnGroup + + InCell + true + + + + ДеревоТестовПрогресс + 99 + true + true + + true + + + ДеревоТестов.Прогресс + + + ДеревоТестовПрогрессРасширеннаяПодсказка + 101 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовПрогрессКонтекстноеМеню + 100 + true + true + + true + + true + + PictureField + Enter + true + Left + true + + true + 2 + true + true + Stretch + + + true + true + + true + + + <key>ru</key> + <value>Дерево тестов группа1</value> + + 30 + + ДеревоТестовГруппаПрогрессРасширеннаяПодсказка + 103 + true + true + + true + + Label + true + true + + Left + + + ColumnGroup + + Vertical + true + + + + ДеревоТестовВремяВыполнения + 51 + true + true + + true + + + ДеревоТестов.ПредставлениеВремяВыполнения + + + ДеревоТестовВремяВыполненияРасширеннаяПодсказка + 53 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовВремяВыполненияКонтекстноеМеню + 52 + true + true + + true + + true + + InputField + Enter + true + Left + true + + 2 + true + true + true + true + true + true + + + None + + ДеревоТестовКоманднаяПанель + 30 + true + true + + true + + Left + true + + + OnActivateRow + ДеревоТестовПриАктивизацииСтроки + + + true + true + + true + + ДеревоТестовСтрокаПоиска + 33 + + ДеревоТестовСтрокаПоискаРасширеннаяПодсказка + 35 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовСтрокаПоискаКонтекстноеМеню + 34 + true + true + + true + + true + + + true + + + + true + true + + true + + ДеревоТестовСостояниеПросмотра + 39 + + ДеревоТестовСостояниеПросмотраРасширеннаяПодсказка + 41 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовСостояниеПросмотраКонтекстноеМеню + 40 + true + true + + true + + true + + ViewStatusAddition + + true + + + + true + true + + true + + ДеревоТестовУправлениеПоиском + 36 + + ДеревоТестовУправлениеПоискомРасширеннаяПодсказка + 38 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовУправлениеПоискомКонтекстноеМеню + 37 + true + true + + true + + true + + SearchControlAddition + + true + + + + ДеревоТестовРасширеннаяПодсказка + 32 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовКонтекстноеМеню + 31 + true + true + + true + + true + + Tree + true + 3 + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + ДеревоТестов.ТипОбъекта + + + CommonPicture.ЮТЭлементыТестов + +
+ + ГруппаДанныеОшибок + 83 + + ДеревоТестовОшибки + 59 + true + true + + true + + + Items.ДеревоТестов.CurrentData.Ошибки + + None + + ДеревоТестовОшибкиСообщение + 72 + + <key>ru</key> + <value>Сообщения</value> + + true + true + + true + + + Элементы.ДеревоТестов.ТекущиеДанные.Ошибки.Сообщение + + + ДеревоТестовОшибкиСообщениеРасширеннаяПодсказка + 74 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОшибкиСообщениеКонтекстноеМеню + 73 + true + true + + true + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + None + + ДеревоТестовОшибкиКоманднаяПанель + 60 + true + true + + true + + Left + true + + + OnActivateRow + ДеревоТестовОшибкиПриАктивизацииСтроки + + + true + true + + true + + ДеревоТестовОшибкиСтрокаПоиска + 63 + + ДеревоТестовОшибкиСтрокаПоискаРасширеннаяПодсказка + 65 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОшибкиСтрокаПоискаКонтекстноеМеню + 64 + true + true + + true + + true + + + true + + + + true + true + + true + + ДеревоТестовОшибкиСостояниеПросмотра + 69 + + ДеревоТестовОшибкиСостояниеПросмотраРасширеннаяПодсказка + 71 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОшибкиСостояниеПросмотраКонтекстноеМеню + 70 + true + true + + true + + true + + ViewStatusAddition + + true + + + + true + true + + true + + ДеревоТестовОшибкиУправлениеПоиском + 66 + + ДеревоТестовОшибкиУправлениеПоискомРасширеннаяПодсказка + 68 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОшибкиУправлениеПоискомКонтекстноеМеню + 67 + true + true + + true + + true + + SearchControlAddition + + true + + + + ДеревоТестовОшибкиРасширеннаяПодсказка + 62 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОшибкиКонтекстноеМеню + 61 + true + true + + true + + true + + 2 + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + Auto + Auto + true + true + + Style.FormBackColor + + None + None +
+ + ДеревоТестовОшибкиСтек + 75 + true + true + + true + + + Items.ДеревоТестовОшибки.CurrentData.Стек + + None + + ДеревоТестовОшибкиСтекРасширеннаяПодсказка + 77 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОшибкиСтекКонтекстноеМеню + 76 + true + true + + true + + true + + TextDocumentField + Enter + true + true + Left + true + + 50 + 10 + true + true + + Style.FormBackColor + + + + + РаботаСОшибкой + 110 + + Сравнить + 112 + true + true + + true + + + СравнитьРасширеннаяПодсказка + 113 + true + true + + true + + Label + true + true + + Left + + + Form.Command.Сравнить + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + true + + РаботаСОшибкойРасширеннаяПодсказка + 111 + true + true + + true + + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаДанныеОшибокРасширеннаяПодсказка + 84 + true + true + + true + + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + DontUse + +
+ true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаОсновноеРасширеннаяПодсказка + 86 + true + true + + true + + Label + true + true + + Left + + + UsualGroup + + true + true + Auto + DontUse + +
+ + СтатистикаВыполнения + 80 + true + true + + true + + + СтатистикаВыполненияРасширеннаяПодсказка + 82 + true + true + + true + + Label + true + true + + Left + + + + СтатистикаВыполненияКонтекстноеМеню + 81 + true + true + + true + + true + + Label + true + false + + 16.0 + + + Left + + + None + + ФормаКоманднаяПанель + -1 + true + true + + true + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + true + true + Vertical + true + true + true + true + true + + Объект + 114 + + DataProcessorObject.ЮТЮнитТесты + + + true + + + true + +
true
+
+ + ДеревоТестов + + <key>ru</key> + <value>Дерево тестов</value> + + 124 + + ValueTree + + + true + + + true + + + Представление + + <key>ru</key> + <value>Представление</value> + + 4 + + String + + + + true + + + true + + + + Состояние + + <key>ru</key> + <value>Состояние</value> + + 6 + + String + + + + true + + + true + + + + ПредставлениеВремяВыполнения + + <key>ru</key> + <value>Время выполнения</value> + + 7 + + String + + + + true + + + true + + + + Иконка + + <key>ru</key> + <value>Иконка</value> + + 8 + + Picture + + + true + + + true + + + + Ошибки + + <key>ru</key> + <value>Ошибки</value> + + 9 + + ValueTable + + + true + + + true + + + + Прогресс + + <key>ru</key> + <value>Прогресс</value> + + 13 + + Picture + + + true + + + true + + + + Набор + + <key>ru</key> + <value>Набор</value> + + 14 + + Boolean + + + true + + + true + + + + Контекст + + <key>ru</key> + <value>Контекст</value> + + 15 + + String + + + + true + + + true + + + + ТипОбъекта + + <key>ru</key> + <value>Тип объекта</value> + + 116 + + Number + + 1 + + + + true + + + true + + + + ВремяВыполнения + + <key>ru</key> + <value>Время выполнения</value> + + 117 + + Number + + 10 + + + + true + + + true + + + + + ДеревоТестов.Ошибки + + + Сообщение + + <key>ru</key> + <value>Сообщение</value> + + 10 + + String + + + + true + + + true + + + + Стек + + <key>ru</key> + <value>Стек</value> + + 11 + + String + + + + true + + + true + + + + ОжидаемоеЗначение + + <key>ru</key> + <value>Ожидаемое значение</value> + + 18 + + String + + + + true + + + true + + + + ФактическоеЗначение + + <key>ru</key> + <value>Фактическое значение</value> + + 19 + + String + + + + true + + + true + + + + + + АдресДанных + + <key>ru</key> + <value>Адрес данных</value> + + 16 + + String + + + + true + + + true + + + + СтатистикаВыполненияВеса + + <key>ru</key> + <value>Статистика выполнения веса</value> + + 118 + + String + + 10 + + + + true + + + true + + + + Сравнить + + <key>ru</key> + <value>Сравнить</value> + + 1 + + true + + + StdPicture.QueryWizardReplaceTable + + + + Сравнить + + + TextPicture + 59 + + + СформироватьНастройки + + <key>ru</key> + <value>Сформировать настройки</value> + + 2 + + true + + + + СформироватьНастройки + + + DontUse + + + + + + +
diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/Module.bsl b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/Module.bsl new file mode 100644 index 0000000..518074f --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Основная/Module.bsl @@ -0,0 +1,359 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АдресХранилища") И ЭтоАдресВременногоХранилища(Параметры.АдресХранилища) Тогда + + ОтобразитьРезультатыТестирования(Параметры.АдресХранилища); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоТестов + +&НаКлиенте +Процедура ДеревоТестовПриАктивизацииСтроки(Элемент) + + Данные = Элементы.ДеревоТестов.ТекущиеДанные; + + Если Данные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Данные.Ошибки.Количество() Тогда + Элементы.ДеревоТестовОшибки.ТекущаяСтрока = Данные.Ошибки[0].ПолучитьИдентификатор(); + КонецЕсли; + + ОбновитьДоступностьСравнения(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоТестовОшибки + +&НаКлиенте +Процедура ДеревоТестовОшибкиПриАктивизацииСтроки(Элемент) + + ОбновитьДоступностьСравнения(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Сравнить(Команда) + + Данные = Элементы.ДеревоТестовОшибки.ТекущиеДанные; + + Если Данные = Неопределено Или ПустаяСтрока(Данные.ОжидаемоеЗначение) И ПустаяСтрока(Данные.ФактическоеЗначение) Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура("ОжидаемоеЗначение, ФактическоеЗначение", Данные.ОжидаемоеЗначение, Данные.ФактическоеЗначение); + ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Сравнение", ПараметрыФормы, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьНастройки(Команда) + + ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.СозданиеНастройки", , ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ОтобразитьРезультатыТестирования(АдресХранилища) + + Данные = ПолучитьИзВременногоХранилища(АдресХранилища); + УдалитьИзВременногоХранилища(АдресХранилища); + + РезультатТестирования = Данные.РезультатыТестирования; + Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + + ОбщаяСтатистика = Статистика(); + + Для Каждого Набор Из РезультатТестирования Цикл + + СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить(); + СтрокаНабора.Набор = Истина; + СтрокаНабора.Представление = Набор.Представление; + СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим); + СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность); + СтрокаНабора.ВремяВыполнения = Набор.Длительность / 1000; + СтрокаНабора.ТипОбъекта = 2; + + ЗаполнитьОшибки(СтрокаНабора, Набор); + + СтатистикаНабора = Статистика(); + + Для Каждого Тест Из Набор.Тесты Цикл + + СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить(); + СтрокаТеста.Представление = Тест.Имя; + СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим); + СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность); + СтрокаТеста.ВремяВыполнения = Тест.Длительность / 1000; + СтрокаТеста.Состояние = Тест.Статус; + СтрокаТеста.ТипОбъекта = 3; + + СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус); + ЗаполнитьОшибки(СтрокаТеста, Тест); + ИнкрементСтатистики(СтатистикаНабора, Тест.Статус, Статусы); + + КонецЦикла; + + Если СтатистикаНабора.Сломано Тогда + СтрокаНабора.Состояние = Статусы.Сломан; + ИначеЕсли СтатистикаНабора.Упало Тогда + СтрокаНабора.Состояние = Статусы.Ошибка; + ИначеЕсли СтатистикаНабора.Пропущено Тогда + СтрокаНабора.Состояние = Статусы.Пропущен; + ИначеЕсли СтатистикаНабора.Неизвестно Тогда + СтрокаНабора.Состояние = Статусы.Ошибка; + Иначе + СтрокаНабора.Состояние = Статусы.Успешно; + КонецЕсли; + + СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора); + + СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние); + + Для Каждого Элемент Из СтатистикаНабора Цикл + ЮТОбщий.Инкремент(ОбщаяСтатистика[Элемент.Ключ], Элемент.Значение); + КонецЦикла; + + КонецЦикла; + + Элементы.СтатистикаВыполнения.Заголовок = ПредставлениеСтатистики(ОбщаяСтатистика); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ЗаполнитьОшибки(СтрокаДерева, ОписаниеОбъекта) + + Для Каждого Ошибка Из ОписаниеОбъекта.Ошибки Цикл + + СтрокаОшибки = СтрокаДерева.Ошибки.Добавить(); + СтрокаОшибки.Сообщение = Ошибка.Сообщение; + СтрокаОшибки.Стек = Ошибка.Стек; + СтрокаОшибки.ОжидаемоеЗначение = ЮТОбщий.ЗначениеСтруктуры(Ошибка, "ОжидаемоеЗначение"); + СтрокаОшибки.ФактическоеЗначение = ЮТОбщий.ЗначениеСтруктуры(Ошибка, "ПроверяемоеЗначение"); + + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция Статистика() + + Статистика = Новый Структура(); + Статистика.Вставить("Всего", 0); + Статистика.Вставить("Успешно", 0); + Статистика.Вставить("Упало", 0); + Статистика.Вставить("Сломано", 0); + Статистика.Вставить("Пропущено", 0); + Статистика.Вставить("Неизвестно", 0); + + Возврат Статистика; + +КонецФункции + +&НаСервереБезКонтекста +Функция НормализоватьКонтекст(Контекст) + + Если СтрНачинаетсяС(Контекст, "Клиент") Тогда + Возврат "Клиент"; + Иначе + Возврат Контекст; + КонецЕсли; + +КонецФункции + +&НаСервереБезКонтекста +Процедура ИнкрементСтатистики(Статистика, Статус, Знач Статусы = Неопределено) + + Если Статусы = Неопределено Тогда + Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + КонецЕсли; + + ЮТОбщий.Инкремент(Статистика.Всего); + + Если Статус = Статусы.Успешно Тогда + + ЮТОбщий.Инкремент(Статистика.Успешно); + + ИначеЕсли Статус = Статусы.Сломан ИЛИ Статус = Статусы.НеРеализован Тогда + + ЮТОбщий.Инкремент(Статистика.Сломано); + + ИначеЕсли Статус = Статусы.Ошибка Тогда + + ЮТОбщий.Инкремент(Статистика.Упало); + + ИначеЕсли Статус = Статусы.Пропущен Тогда + + ЮТОбщий.Инкремент(Статистика.Пропущено); + + Иначе + + ЮТОбщий.Инкремент(Статистика.Неизвестно); + + КонецЕсли; + +КонецПроцедуры + +#Область Интерфейсное + +&НаСервереБезКонтекста +Функция КартинкаСтатуса(Статус) + + Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + + Если Статус = Статусы.Успешно Тогда + + Возврат БиблиотекаКартинок.ЮТУспешно; + + ИначеЕсли Статус = Статусы.Сломан ИЛИ Статус = Статусы.НеРеализован Тогда + + Возврат БиблиотекаКартинок.ЮТОшибка; + + ИначеЕсли Статус = Статусы.Ошибка Тогда + + Возврат БиблиотекаКартинок.ЮТУпал; + + ИначеЕсли Статус = Статусы.Пропущен Тогда + + Возврат БиблиотекаКартинок.ЮТПропущен; + + Иначе + + Возврат БиблиотекаКартинок.ЮТНеизвестный; + + КонецЕсли; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПредставлениеСтатистики(Статистика) + + БлокиСтатистики = Новый Массив(); + Разделитель = "; "; + + БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего, Статистика.Всего - Статистика.Пропущено)); + + Если Статистика.Пропущено Тогда + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТПропущен); + БлокиСтатистики.Добавить(" Пропущено: " + Статистика.Пропущено); + КонецЕсли; + + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТУспешно); + БлокиСтатистики.Добавить(" Успешно: " + Статистика.Успешно); + + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТОшибка); + БлокиСтатистики.Добавить(" Сломано: " + Статистика.Сломано); + + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТУпал); + БлокиСтатистики.Добавить(" Упало: " + Статистика.Упало); + + Если Статистика.Неизвестно Тогда + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТНеизвестный); + БлокиСтатистики.Добавить(" Неизвестно: " + Статистика.Неизвестно); + КонецЕсли; + + Возврат Новый ФорматированнаяСтрока(БлокиСтатистики); + +КонецФункции + +&НаСервереБезКонтекста +Функция ГрафическоеПредставлениеСтатистики(Статистика) + + Текст = БлокиСтатистики(Статистика); + + Возврат Новый Картинка(ПолучитьДвоичныеДанныеИзСтроки(Текст)); + +КонецФункции + +&НаСервереБезКонтекста +Функция БлокиСтатистики(Статистика) + + Блоки = Новый Массив(); + Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Успешно, "25AE88")); + Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Пропущено, "999999")); + Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Упало, "EFCE4A")); + Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Сломано, "D75A4A")); + Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Неизвестно, "9400d3")); + + Сдвиг = 0; + Высота = 20; + + Текст = ""; + + Для Инд = 0 По Блоки.ВГраница() Цикл + + Если Блоки[Инд].Количество = 0 Тогда + Продолжить; + КонецЕсли; + + Текст = Текст + СтрШаблон(" + | %7 + |", Сдвиг + 2, Высота * 2 - 4, Высота - 4, Блоки[Инд].Цвет, Сдвиг + Высота, Высота - 4, Блоки[Инд].Количество); + ЮТОбщий.Инкремент(Сдвиг, Высота * 2 + 2); + + КонецЦикла; + + Возврат СтрШаблон(" + | %3 + |", Сдвиг, Высота + 2, Текст); + +КонецФункции + +#КонецОбласти + +&НаКлиенте +Процедура ОбновитьДоступностьСравнения() + + Данные = Элементы.ДеревоТестовОшибки.ТекущиеДанные; + Элементы.Сравнить.Доступность = Данные <> Неопределено И (НЕ ПустаяСтрока(Данные.ОжидаемоеЗначение) Или НЕ ПустаяСтрока(Данные.ФактическоеЗначение)); + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/СозданиеНастройки/Form.form b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/СозданиеНастройки/Form.form new file mode 100644 index 0000000..3cd19a5 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/СозданиеНастройки/Form.form @@ -0,0 +1,888 @@ + + + + <key>ru</key> + <value>Конфигурация запуска тестов</value> + + + ДеревоТестов + 61 + true + true + + true + + + ДеревоТестов + + None + + ДеревоТестовГруппаПредставление + 34 + + ДеревоТестовОтметка + 31 + true + true + + true + + + ДеревоТестов.Отметка + + None + + OnChange + ДеревоТестовОтметкаПриИзменении + + + ДеревоТестовОтметкаРасширеннаяПодсказка + 33 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовОтметкаКонтекстноеМеню + 32 + true + true + + true + + true + + CheckBoxField + Enter + true + Left + true + + true + + + + ДеревоТестовПредставление + 22 + true + true + + true + + + ДеревоТестов.Представление + + + ДеревоТестовПредставлениеРасширеннаяПодсказка + 24 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовПредставлениеКонтекстноеМеню + 23 + true + true + + true + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Дерево тестов группа1</value> + + + ДеревоТестовГруппаПредставлениеРасширеннаяПодсказка + 35 + true + true + + true + + Label + true + true + + Left + + + ColumnGroup + + InCell + true + + + + ДеревоТестовКоманднаяПанель + 62 + + ДеревоТестовУстановитьФлажки + 36 + true + true + + true + + + ДеревоТестовУстановитьФлажкиРасширеннаяПодсказка + 37 + true + true + + true + + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Auto + true + true + UserCmds + Auto + + + ДеревоТестовСнятьФлажки + 38 + true + true + + true + + + ДеревоТестовСнятьФлажкиРасширеннаяПодсказка + 39 + true + true + + true + + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Auto + true + true + UserCmds + Auto + + + ДеревоТестовСохранитьПараметры + 58 + true + true + + true + + + ДеревоТестовСохранитьПараметрыРасширеннаяПодсказка + 59 + true + true + + true + + Label + true + true + + Left + + + Form.Command.СохранитьПараметры + Auto + true + true + Right + UserCmds + Auto + + true + true + + true + + Left + true + + + true + true + + true + + ДеревоТестовСтрокаПоиска + 13 + + ДеревоТестовСтрокаПоискаРасширеннаяПодсказка + 15 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовСтрокаПоискаКонтекстноеМеню + 14 + true + true + + true + + true + + + true + + + + true + true + + true + + ДеревоТестовСостояниеПросмотра + 19 + + ДеревоТестовСостояниеПросмотраРасширеннаяПодсказка + 21 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовСостояниеПросмотраКонтекстноеМеню + 20 + true + true + + true + + true + + ViewStatusAddition + + true + + + + true + true + + true + + ДеревоТестовУправлениеПоиском + 16 + + ДеревоТестовУправлениеПоискомРасширеннаяПодсказка + 18 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовУправлениеПоискомКонтекстноеМеню + 17 + true + true + + true + + true + + SearchControlAddition + + true + + + + ДеревоТестовРасширеннаяПодсказка + 12 + true + true + + true + + Label + true + true + + Left + + + + ДеревоТестовКонтекстноеМеню + 63 + true + true + + true + + true + + Tree + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + ДеревоТестов.ТипОбъекта + + + CommonPicture.ЮТЭлементыТестов + + + + ГруппаПараметрыЗапуска + 43 + + ФайлКонфигурации + 55 + true + true + + true + + + ФайлКонфигурации + + + OnChange + ФайлКонфигурацииПриИзменении + + + ФайлКонфигурацииРасширеннаяПодсказка + 57 + true + true + + true + + Label + true + true + + Left + + + + ФайлКонфигурацииКонтекстноеМеню + 56 + true + true + + true + + true + + InputField + Enter + true + Left + true + + + StartChoice + ФайлКонфигурацииНачалоВыбора + + true + true + true + true + true + true + true + true + + + + ГруппаНастройкиЗапуска + 53 + + ЗапускИзКонфигуратор + 50 + true + true + + true + + + ЗапускИзКонфигуратор + + None + + OnChange + ЗапускИзПредприятияПриИзменении + + + ЗапускИзКонфигураторРасширеннаяПодсказка + 52 + true + true + + true + + Label + true + true + + Left + + + + ЗапускИзКонфигураторКонтекстноеМеню + 51 + true + true + + true + + true + + CheckBoxField + Enter + true + Left + true + + Tumbler + + ru + БЛ='Строка запуска предприятия'; БИ='Запуск из конфигуратора' + + + + + ПараметрыЗапуска + 40 + true + true + + true + + + ПараметрыЗапуска + + None + + ПараметрыЗапускаРасширеннаяПодсказка + 42 + true + true + + true + + Label + true + true + + Left + + + + ПараметрыЗапускаКонтекстноеМеню + 41 + true + true + + true + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + + true + true + + true + + + ГруппаНастройкиЗапускаРасширеннаяПодсказка + 54 + true + true + + true + + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + DontUse + + + true + true + + true + + + <key>ru</key> + <value>Параметры запуска</value> + + + ГруппаПараметрыЗапускаРасширеннаяПодсказка + 44 + true + true + + true + + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + true + Auto + DontUse + + + None + + ФормаКоманднаяПанель + -1 + true + true + + true + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnOpen + ПриОткрытии + + Use + true + Vertical + true + true + true + true + + ДеревоТестов + + <key>ru</key> + <value>Дерево тестов</value> + + 3 + + ValueTree + + + true + + + true + + + Представление + + <key>ru</key> + <value>Представление</value> + + 4 + + String + + + + true + + + true + + + + Идентификатор + + <key>ru</key> + <value>Идентификатор</value> + + 60 + + String + + + + true + + + true + + + + ТипОбъекта + + <key>ru</key> + <value>Тип объекта</value> + + 6 + + Number + + 1 + + + + true + + + true + + + + Отметка + + <key>ru</key> + <value>Отметка</value> + + 8 + + Number + + 1 + + + + true + + + true + + + + + ФайлКонфигурации + + <key>ru</key> + <value>Файл конфигурации</value> + + 9 + + String + + + + true + + + true + + + ФайлКонфигурации + + + + ПараметрыЗапуска + + <key>ru</key> + <value>Параметры запуска</value> + + 10 + + String + + + + true + + + true + + + + ЗапускИзКонфигуратор + + <key>ru</key> + <value>Запуск из конифгуратор</value> + + 11 + + Boolean + + + true + + + true + + + ЗапускИзКонфигуратор + + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 1 + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + DontUse + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 2 + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + DontUse + + + СохранитьПараметры + + <key>ru</key> + <value>Сохранить параметры</value> + + 5 + + true + + + + СохранитьПараметры + + + DontUse + + + + + + diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/СозданиеНастройки/Module.bsl b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/СозданиеНастройки/Module.bsl new file mode 100644 index 0000000..cb345d2 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/СозданиеНастройки/Module.bsl @@ -0,0 +1,475 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ЗаполнитьДеревоТестов(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ФайлКонфигурацииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ВыбратьФайл("*.json|*.json", ФайлКонфигурации, Новый ОписаниеОповещения("УстановитьФайлКонфигурации", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапускИзПредприятияПриИзменении(Элемент) + + ОбновитьСтрокуЗапуска(); + +КонецПроцедуры + +&НаКлиенте +Процедура ФайлКонфигурацииПриИзменении(Элемент) + + ОбновитьСтрокуЗапуска(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоТестов + +&НаКлиенте +Процедура ДеревоТестовОтметкаПриИзменении(Элемент) + + Данные = Элементы.ДеревоТестов.ТекущиеДанные; + + Если Данные.Отметка = 2 Тогда + Данные.Отметка = 0; + КонецЕсли; + + УстановитьРекурсивноЗначение(Данные.ПолучитьЭлементы(), Данные.Отметка); + ОбновитьОтметкиРодителей(Данные); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + УстановитьРекурсивноЗначение(ДеревоТестов.ПолучитьЭлементы(), 0); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + + УстановитьРекурсивноЗначение(ДеревоТестов.ПолучитьЭлементы(), 1); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьПараметры(Команда) + + Если НЕ ЕстьОтмеченныеТесты() Тогда + ПоказатьПредупреждение(, "Отметьте тесты, которые должны выполниться"); + Возврат; + КонецЕсли; + + Если ПустаяСтрока(ФайлКонфигурации) Тогда + Обработчик = Новый ОписаниеОповещения("СохранитьПараметрыПослеВыбораФайла", ЭтотОбъект); + ВыбратьФайл("*.json|*.json", ФайлКонфигурации, Обработчик); + Иначе + СохранитьПараметрыПослеВыбораФайла(ФайлКонфигурации); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗаполнитьДеревоТестов() + + ЮТКонтекст.ИнициализироватьКонтекст(); + ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Новый Структура("filter", Новый Структура)); + ЮТКонтекст.УдалитьКонтекст(); + + СтрокиРасширений = Новый Соответствие(); + + Для Каждого ОписаниеМодуля Из ТестовыеМодули Цикл + + ИмяРасширения = ОписаниеМодуля.МетаданныеМодуля.Расширение; + + СтрокаРасширения = СтрокиРасширений[ИмяРасширения]; + Если СтрокаРасширения = Неопределено Тогда + СтрокаРасширения = ДобавитьСтрокуРасширения(ДеревоТестов, ИмяРасширения); + СтрокиРасширений.Вставить(ИмяРасширения, СтрокаРасширения); + КонецЕсли; + + СтрокаМодуля = ДобавитьСтрокуМодуля(СтрокаРасширения, ОписаниеМодуля.МетаданныеМодуля); + + Если ОписаниеМодуля.НаборыТестов.Количество() = 1 Тогда + + Для Каждого Тест Из ОписаниеМодуля.НаборыТестов[0].Тесты Цикл + + ДобавитьСтрокуТеста(СтрокаМодуля, Тест); + + КонецЦикла; + + Иначе + + Для Каждого Набор Из ОписаниеМодуля.НаборыТестов Цикл + + СтрокаНабора = ДобавитьСтрокуНабора(СтрокаМодуля, Набор); + + Для Каждого Тест Из Набор.Тесты Цикл + + ДобавитьСтрокуТеста(СтрокаНабора, Тест); + + КонецЦикла; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ДобавитьСтрокуРасширения(Владелец, ИмяРасширения) + + Строка = Владелец.ПолучитьЭлементы().Добавить(); + Строка.Идентификатор = ИмяРасширения; + Строка.Представление = ИмяРасширения; + Строка.ТипОбъекта = 0; + + Возврат Строка; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ДобавитьСтрокуМодуля(Владелец, МетаданныеМодуля) + + Строка = Владелец.ПолучитьЭлементы().Добавить(); + Строка.Идентификатор = МетаданныеМодуля.Имя; + Строка.Представление = МетаданныеМодуля.Имя; + Строка.ТипОбъекта = 1; + + Возврат Строка; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ДобавитьСтрокуНабора(Владелец, Набор) + + Строка = Владелец.ПолучитьЭлементы().Добавить(); + Строка.Идентификатор = Набор.Имя; + Строка.Представление = Набор.Представление; + Строка.ТипОбъекта = 2; + + Возврат Строка; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ДобавитьСтрокуТеста(Владелец, Тест) + + Представление = ЮТФабрика.ПредставлениеТеста(Тест); + + Если Владелец.ТипОбъекта = 1 Тогда + СтрокаМодуля = Владелец; + Иначе + СтрокаМодуля = Владелец.ПолучитьРодителя(); + КонецЕсли; + + Строка = Владелец.ПолучитьЭлементы().Добавить(); + Строка.Идентификатор = СтрШаблон("%1.%2", СтрокаМодуля.Идентификатор, Тест.Имя); + Строка.Представление = СтрШаблон("%1, %2", Представление, СтрСоединить(Тест.КонтекстВызова, ", ")); + Строка.ТипОбъекта = 3; + + Возврат Строка; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьРекурсивноЗначение(Элементы, Значение, Колонка = "Отметка") + + Для Каждого Элемент Из Элементы Цикл + + Элемент[Колонка] = Значение; + + Если ЗначениеЗаполнено(Элемент.ПолучитьЭлементы()) Тогда + УстановитьРекурсивноЗначение(Элемент.ПолучитьЭлементы(), Значение, Колонка); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьОтметкиРодителей(Элемент) + + Родитель = Элемент.ПолучитьРодителя(); + + Если Родитель = Неопределено Тогда + Возврат; + КонецЕсли; + + ЕстьСОтметкой = Ложь; + ЕстьБезОтметки = Ложь; + + Для Каждого Элемент Из Родитель.ПолучитьЭлементы() Цикл + + Если Элемент.Отметка = 0 Тогда + ЕстьБезОтметки = Истина; + ИначеЕсли Элемент.Отметка = 1 Тогда + ЕстьСОтметкой = Истина; + ИначеЕсли Элемент.Отметка = 2 Тогда + ЕстьБезОтметки = Истина; + ЕстьСОтметкой = Истина; + КонецЕсли; + + Если ЕстьБезОтметки И ЕстьСОтметкой Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ЕстьСОтметкой И ЕстьБезОтметки Тогда + НоваяОтметка = 2; + ИначеЕсли ЕстьСОтметкой Тогда + НоваяОтметка = 1; + Иначе + НоваяОтметка = 0; + КонецЕсли; + + Если Родитель.Отметка = НоваяОтметка Тогда + Возврат; + КонецЕсли; + + Родитель.Отметка = НоваяОтметка; + ОбновитьОтметкиРодителей(Родитель); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСтрокуЗапуска() + + ПараметрыЗапускаЮнитТестов = СтрШаблон("%1=%2", ЮТПараметры.КлючЗапуска(), ФайлКонфигурации); + + Если ЗапускИзКонфигуратор Тогда + + ПараметрыЗапуска = ПараметрыЗапускаЮнитТестов; + + Иначе + +#Если ВебКлиент Тогда + ВызватьИсключение "Формирование строки запуска для веб-клиенте не поддерживается"; +#Иначе + СистемнаяИнформация = Новый СистемнаяИнформация; +#Если ТонкийКлиент Тогда + Файл = "1cv8c"; +#Иначе + Файл = "1cv8"; +#КонецЕсли + ПутьЗапускаемогоКлиента = КаталогПрограммы() + ПолучитьРазделительПути() + Файл; + + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы + = ТипПлатформы.Windows_x86_64 Тогда + ПутьЗапускаемогоКлиента = ПутьЗапускаемогоКлиента + ".exe"; + КонецЕсли; + + ПараметрыЗапуска = СтрШаблон("""%1"" /N""%2"" /IBConnectionString ""%3"" /C""%4""", + ПутьЗапускаемогоКлиента, + ИмяПользователя(), + СтрЗаменить(СтрокаСоединенияИнформационнойБазы(), """", """"""), + ПараметрыЗапускаЮнитТестов); +#КонецЕсли + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьПараметрыПослеВыбораФайла(ВыбранныйФайл, ДополнительныеПараметры = Неопределено) Экспорт + + ФайлКонфигурации = ВыбранныйФайл; + ОбновитьСтрокуЗапуска(); + СохранитьКонфигурациюЗапуска(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФайлКонфигурации(ВыбранныйФайл, ДополнительныеПараметры) Экспорт + + ФайлКонфигурации = ВыбранныйФайл; + ОбновитьСтрокуЗапуска(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьФайл(Фильтр, ИмяФайла, Оповещение) + + ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ДиалогВыбораФайла.Фильтр = Фильтр; + ДиалогВыбораФайла.МножественныйВыбор = Ложь; + ДиалогВыбораФайла.ПолноеИмяФайла = ИмяФайла; + + ПараметрыОбработчика = Новый Структура("Оповещение", Оповещение); + Обработчик = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект, ПараметрыОбработчика); + ДиалогВыбораФайла.Показать(Обработчик); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт + + Если ВыбранныеФайлы <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, ВыбранныеФайлы[0]); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКонфигурациюЗапуска() + +#Если ВебКлиент Тогда + ВызватьИсключение "Сохранение конфигурации из веб-клиента не поддерживается"; +#Иначе + Конфигурация = ЮТФабрика.ПараметрыЗапуска(); + Конфигурация.showReport = Истина; + Конфигурация.closeAfterTests = Истина; + Конфигурация.reportPath = ЮТОбщий.Каталог(ФайлКонфигурации); + Конфигурация.Удалить("ВыполнятьМодульноеТестирование"); + + Если НЕ (УстановленФильтрПоРасширению(Конфигурация) ИЛИ УстановленФильтрПоМодулям(Конфигурация)) Тогда + УстановитьФильтрПоТестам(Конфигурация); + КонецЕсли; + + Запись = Новый ЗаписьJSON(); + Запись.ОткрытьФайл(ФайлКонфигурации); + ЗаписатьJSON(Запись, Конфигурация); + Запись.Закрыть(); +#КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Функция ЕстьОтмеченныеТесты() + + Для Каждого СтрокаРасширения Из ДеревоТестов.ПолучитьЭлементы() Цикл + Если СтрокаРасширения.Отметка > 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +&НаКлиенте +Функция УстановленФильтрПоРасширению(Конфигурация) + + Расширения = Новый Массив(); + Для Каждого СтрокаРасширения Из ДеревоТестов.ПолучитьЭлементы() Цикл + + Если СтрокаРасширения.Отметка = 2 Тогда + Возврат Ложь; + ИначеЕсли СтрокаРасширения.Отметка = 1 Тогда + Расширения.Добавить(СтрокаРасширения.Идентификатор); + КонецЕсли; + + КонецЦикла; + + Если Расширения.Количество() Тогда + Конфигурация.filter.extensions = Расширения; + КонецЕсли; + + Возврат Расширения.Количество() > 0; + +КонецФункции + +&НаКлиенте +Функция УстановленФильтрПоМодулям(Конфигурация) + + Модули = Новый Массив(); + + Для Каждого СтрокаРасширения Из ДеревоТестов.ПолучитьЭлементы() Цикл + + Если СтрокаРасширения.Отметка = 0 Тогда + Продолжить; + КонецЕсли; + + Для Каждого СтрокаМодуля Из СтрокаРасширения.ПолучитьЭлементы() Цикл + + Если СтрокаМодуля.Отметка = 2 Тогда + Возврат Ложь; + ИначеЕсли СтрокаМодуля.Отметка = 1 Тогда + Модули.Добавить(СтрокаМодуля.Идентификатор); + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Если Модули.Количество() Тогда + Конфигурация.filter.modules = Модули; + КонецЕсли; + + Возврат Модули.Количество() > 0; + +КонецФункции + +&НаКлиенте +Процедура УстановитьФильтрПоТестам(Конфигурация) + + Тесты = Новый Массив(); + ДобавитьОтмеченныеТесты(ДеревоТестов.ПолучитьЭлементы(), Тесты); + + Конфигурация.filter.tests = Тесты; + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьОтмеченныеТесты(Строки, Тесты) + + Для Каждого Строка Из Строки Цикл + Если Строка.Отметка = 0 Тогда + Продолжить; + КонецЕсли; + + Если Строка.ТипОбъекта = 3 Тогда + Тесты.Добавить(Строка.Идентификатор); + Иначе + ДобавитьОтмеченныеТесты(Строка.ПолучитьЭлементы(), Тесты); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Сравнение/Form.form b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Сравнение/Form.form new file mode 100644 index 0000000..f83a09d --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Сравнение/Form.form @@ -0,0 +1,101 @@ + + + + Скрипт + 4 + true + true + + true + + + Скрипт + + true + None + + СкриптРасширеннаяПодсказка + 3 + true + true + + true + + Label + true + true + + Left + + + + СкриптКонтекстноеМеню + 2 + true + true + + true + + true + + HTMLDocumentField + Enter + true + Left + true + + 50 + 10 + true + true + + Style.FormBackColor + + + + None + + ФормаКоманднаяПанель + -1 + true + true + + true + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + true + true + Vertical + true + true + true + true + + Скрипт + + <key>ru</key> + <value>Скрипт</value> + + 1 + + String + + + + true + + + true + + + + + + + diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Сравнение/Module.bsl b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Сравнение/Module.bsl new file mode 100644 index 0000000..2177f57 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Forms/Сравнение/Module.bsl @@ -0,0 +1,34 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 BIA-Technologies Limited Liability Company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТекстСтраницы = Обработки.ЮТЮнитТесты.ПолучитьМакет("СравнениеOld").ПолучитьТекст(); + + ТекстСтраницы = СтрЗаменить(ТекстСтраницы, "ИсходныйТекст", Параметры.ОжидаемоеЗначение); + ТекстСтраницы = СтрЗаменить(ТекстСтраницы, "СравниваемыйТекст", Параметры.ФактическоеЗначение); + + АдресСтраницы = ПоместитьВоВременноеХранилище(ПолучитьДвоичныеДанныеИзСтроки(ТекстСтраницы), УникальныйИдентификатор); + Скрипт = СтрШаблон("%1/%2", ПолучитьНавигационнуюСсылкуИнформационнойБазы(), АдресСтраницы); + +КонецПроцедуры + +#КонецОбласти diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Templates/Сравнение/Template.txt b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Templates/Сравнение/Template.txt new file mode 100644 index 0000000..8b7f0f6 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Templates/Сравнение/Template.txt @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Templates/СравнениеOld/Template.txt b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Templates/СравнениеOld/Template.txt new file mode 100644 index 0000000..c52a9d3 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/Templates/СравнениеOld/Template.txt @@ -0,0 +1,936 @@ + + + + + + + + Diff test + + + + + + + +
+
+

Edit

+
+
+
+
+

Ожидаемое значение

+
+
+

+    
+
+
+

Фактическое значение

+
+
+

+    
+ + + + \ No newline at end of file diff --git a/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/ЮТЮнитТесты.mdo b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/ЮТЮнитТесты.mdo new file mode 100644 index 0000000..d1cb4e1 --- /dev/null +++ b/src/cfe/yaxunit/src/DataProcessors/ЮТЮнитТесты/ЮТЮнитТесты.mdo @@ -0,0 +1,57 @@ + + + + + + + ЮТЮнитТесты + + ru + Юнит тесты + + true + DataProcessor.ЮТЮнитТесты.Form.Основная + + Основная + + ru + Основная + + PersonalComputer + MobileDevice + + + СозданиеНастройки + + ru + Создание настройки + + PersonalComputer + MobileDevice + + + Сравнение + + ru + Сравнение + + PersonalComputer + MobileDevice + + + Сравнение + + ru + Сравнение + + TextDocument + + + СравнениеOld + + ru + Сравнение old + + TextDocument + + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТДвижок/CommandInterface.cmi b/src/cfe/yaxunit/src/Subsystems/ЮТДвижок/CommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТДвижок/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТДвижок/ЮТДвижок.mdo b/src/cfe/yaxunit/src/Subsystems/ЮТДвижок/ЮТДвижок.mdo new file mode 100644 index 0000000..8c72d75 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТДвижок/ЮТДвижок.mdo @@ -0,0 +1,47 @@ + + + ЮТДвижок + + ru + Юнит тесты + + true + CommonModule.Мокито + CommonModule.МокитоОбучение + CommonModule.МокитоПроверки + CommonModule.МокитоСлужебный + CommonModule.ЮТИсполнитель + CommonModule.ЮТИсполнительСервер + CommonModule.ЮТКонтекст + CommonModule.ЮТКонтекстКлиент + CommonModule.ЮТКонтекстСервер + CommonModule.ЮТМетаданныеСервер + CommonModule.ЮТОбщий + CommonModule.ЮТОтчет + CommonModule.ЮТОтчетJSON + CommonModule.ЮТОтчетJUnit + CommonModule.ЮТПараметры + CommonModule.ЮТПовторногоИспользования + CommonModule.ЮТРасширения + CommonModule.ЮТРегистрацияОшибок + CommonModule.ЮТСобытия + CommonModule.ЮТТестовыеДанные + CommonModule.ЮТТесты + CommonModule.ЮТУтверждения + CommonModule.ЮТФабрика + CommonModule.ЮТФильтрация + CommonModule.ЮТЧитатель + CommonModule.ЮТЧитательСервер + CommonModule.ЮТКонструкторВариантов + CommonModule.ЮТОбщийВызовСервера + CommonModule.ЮТТестовыеДанныеВызовСервера + CommonModule.ЮТест + CommonModule.ЮТКонтекстТеста + CommonPicture.ЮТНеизвестный + CommonPicture.ЮТОшибка + CommonPicture.ЮТПропущен + CommonPicture.ЮТУпал + CommonPicture.ЮТУспешно + CommonPicture.ЮТЭлементыТестов + DataProcessor.ЮТЮнитТесты + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/CommandInterface.cmi b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/CommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/CommandInterface.cmi b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/CommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo new file mode 100644 index 0000000..f83fad1 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo @@ -0,0 +1,14 @@ + + + ЮТОбработчикиСобытий + + ru + ЮТОбработчики событий + + true + true + CommonModule.МокитоСлужебный + CommonModule.ЮТТестовыеДанные + CommonModule.ЮТУтверждения + Subsystem.ЮТФункциональность + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТФормированиеОтчета/CommandInterface.cmi b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТФормированиеОтчета/CommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТФормированиеОтчета/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТФормированиеОтчета/ЮТФормированиеОтчета.mdo b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТФормированиеОтчета/ЮТФормированиеОтчета.mdo new file mode 100644 index 0000000..a3a3549 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТФормированиеОтчета/ЮТФормированиеОтчета.mdo @@ -0,0 +1,13 @@ + + + ЮТФормированиеОтчета + + ru + Формирование отчета + + true + true + CommonModule.ЮТОтчетJSON + CommonModule.ЮТОтчетJUnit + Subsystem.ЮТФункциональность + diff --git a/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/ЮТФункциональность.mdo b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/ЮТФункциональность.mdo new file mode 100644 index 0000000..fc22900 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/ЮТФункциональность/ЮТФункциональность.mdo @@ -0,0 +1,11 @@ + + + ЮТФункциональность + + ru + Функциональность + + true + ЮТОбработчикиСобытий + ЮТФормированиеОтчета + diff --git a/src/cfe/yaxunit/src/Subsystems/тесты/CommandInterface.cmi b/src/cfe/yaxunit/src/Subsystems/тесты/CommandInterface.cmi new file mode 100644 index 0000000..0cf6de8 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/тесты/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/src/cfe/yaxunit/src/Subsystems/тесты/тесты.mdo b/src/cfe/yaxunit/src/Subsystems/тесты/тесты.mdo new file mode 100644 index 0000000..5ba12b3 --- /dev/null +++ b/src/cfe/yaxunit/src/Subsystems/тесты/тесты.mdo @@ -0,0 +1,12 @@ + + + тесты + + ru + Тесты + + true + true + CommonModule.тест_КоннекторХТТП + CommonModule.тест_ПроцессорКоллекций + diff --git a/v8config.json b/v8config.json new file mode 100644 index 0000000..97bcfee --- /dev/null +++ b/v8config.json @@ -0,0 +1,55 @@ +{ + "GLOBAL": { + "ВерсияПлатформы": "8.3.10.2309", + "version": "2.1", + "ФорматEDT": true + }, + "АвтоТестирование": { + "Выполнять": true, + "ВыполнятьБазовые": true, + "ВыполнятьxUnit": true, + "ТестыxUnitВРасширении": true, + "ИсполнительxUnitВРасширении": true, + "ВыполнятьVanessa": false, + "ПредварительнаяПодготовкаБазы": false, + "ПередаватьПокрытиеТестамиВСонар": false + }, + "АвтоДокументирование": { + "Выполнять": false, + "КодПространстваConfluence": "yaxunit", + "ПоследнийОбработанныйКоммит": "", + "Шаблоны": "" + }, + "АнализИсходников": { + "Выполнять": true, + "ДочерниеПроекты": [] + }, + "АвтоСборка": { + "ВключитьНомерСборки": true, + "ОбновлятьВерсиюКонфигурации": false, + "КаталогРасположенияСборок": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\yaxunit", + "КаталогРасположенияСборокRelease": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\yaxunit\\releases", + "КаталогРасположенияОбразов": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП\\spec", + "ВыполнятьНаСервернойБазе": false + }, + "Уведомления": { + "Выполнять": true, + "Ответственные": [{ + "Адресат": "arch-bots", + "Транспорт": "rocketchat" + }] + }, + "Сонар": { + "Сервер": "c7-sonar-server.tlc.lan", + "Порт": "9000", + "Токен": "6c0a7cc2bf2e8f054562da6fabf3f2bf41e7a308", + "Профили": "bsl bia; Sonar way (outdated copy)" + }, + "СвязанныеПроекты": { + "bsp": { + "Репозиторий": "git@gitlab.dellin.ru:orais/bsp/bsp.git", + "Ветка": "master", + "Назначение": "Основная конфигурация" + } + } +} \ No newline at end of file