diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml new file mode 100644 index 000000000..de527584a --- /dev/null +++ b/.github/workflows/build-on-windows.yml @@ -0,0 +1,76 @@ +name: Build +on: + workflow_call: + inputs: + v8_version: + type: string + required: true + + src_artifact_name: + type: string + required: true + + artifact_name: + type: string + required: true +jobs: + build: + runs-on: windows-latest + defaults: + run: + shell: pwsh + steps: + + - name: install Onec Platform + uses: alkoleft/onec-setup-build-env-action@develop + with: + type: onec + onec_version: ${{ inputs.v8_version }} + cache: true + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 10 + + - name: download artifact + uses: actions/download-artifact@v3 + with: + name: ${{ inputs.src_artifact_name }} + + - run: | + mkdir export + mkdir binary + cd export + 7z x ../export.7z -y + + - name: create IB + run: ibcmd infobase create --db-path=file-db --import=export\configuration --apply --force + timeout-minutes: 5 + + - name: import yaxunit + run: ibcmd infobase config import --db-path=file-db --extension=YAXUNIT export\yaxunit + timeout-minutes: 5 + + - name: import tests + run: ibcmd infobase config import --db-path=file-db --extension=tests export\tests + timeout-minutes: 5 + + - name: save yaxunit + run: ibcmd infobase config save --db-path=file-db --extension=YAXUNIT binary\yaxunit.cfe + timeout-minutes: 5 + + - name: save tests + run: ibcmd infobase config save --db-path=file-db --extension=tests binary\tests.cfe + timeout-minutes: 5 + + - name: save configuration + run: ibcmd infobase config save --db-path=file-db binary\configuration.cf + timeout-minutes: 5 + + - name: upload-artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ inputs.artifact_name }} + path: binary\*.* + if-no-files-found: error + retention-days: 1 diff --git a/.github/workflows/deploy-documentation.yml b/.github/workflows/deploy-documentation.yml index 42fa836f6..8c07ce64f 100644 --- a/.github/workflows/deploy-documentation.yml +++ b/.github/workflows/deploy-documentation.yml @@ -1,4 +1,4 @@ -name: Deploy to GitHub Pages +name: Documentation on: push: diff --git a/.github/workflows/export-xml.yml b/.github/workflows/export-xml.yml new file mode 100644 index 000000000..7b59112e5 --- /dev/null +++ b/.github/workflows/export-xml.yml @@ -0,0 +1,66 @@ +name: Export to designer xml +on: + workflow_call: + inputs: + edt_version: + type: string + required: true + + artifact_name: + type: string + required: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: install EDT + uses: IT-Medved/onec-setup-build-env-action@develop + with: + type: edt + edt_version: ${{ inputs.edt_version }} + cache: true + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 10 + + - name: convert configuration src + uses: alkoleft/onec-edtcli-command-action@main + with: + export: true + from: fixtures/demo-configuration + to: export/configuration + timeout: 5 + timeout-minutes: 10 + + - name: convert yaxunit src + uses: alkoleft/onec-edtcli-command-action@main + with: + export: true + from: exts/yaxunit + to: export/yaxunit + timeout: 5 + timeout-minutes: 10 + + - name: convert tests src + uses: alkoleft/onec-edtcli-command-action@main + with: + export: true + from: tests + to: export/tests + timeout: 5 + timeout-minutes: 10 + + - run: | + cd export + 7za a -t7z ../export.7z ./ + + - name: upload-artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ inputs.artifact_name }} + path: export.7z + if-no-files-found: error + retention-days: 1 diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml new file mode 100644 index 000000000..49fd1b6c5 --- /dev/null +++ b/.github/workflows/main-build.yml @@ -0,0 +1,64 @@ +name: Build and test +on: + push: + branches: [ feature/**, develop ] + pull_request_target: + branches: [ develop ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + checks: write + id-token: write + +jobs: + export_to_designer: + name: Export to designer xml + uses: ./.github/workflows/export-xml.yml + with: + edt_version: 2023.1.2 + artifact_name: designer-src + secrets: inherit + + build_artifacts: + name: Build artifacts + uses: ./.github/workflows/build-on-windows.yml + needs: export_to_designer + with: + v8_version: 8.3.21.1895 + src_artifact_name: designer-src + artifact_name: build-artifacts + secrets: inherit + + tests_linux_ru: + name: Tests Linux 8.3.21.1895 ru_RU + uses: ./.github/workflows/run-tests-linux.yml + needs: build_artifacts + with: + v8_version: 8.3.21.1895 + artifact_name: build-artifacts + secrets: inherit + + tests_linux_en: + name: Tests Linux 8.3.21.1895 en_US + uses: ./.github/workflows/run-tests-linux.yml + if: false + needs: build_artifacts + with: + v8_version: 8.3.21.1895 + artifact_name: build-artifacts + locale: en_US + fail_on_failure: false + secrets: inherit + + tests_windows_ru: + name: Tests Windows 8.3.21.1895 ru_RU + uses: ./.github/workflows/run-tests-windows.yml + needs: build_artifacts + with: + v8_version: 8.3.21.1895 + artifact_name: build-artifacts + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/run-tests-linux.yml b/.github/workflows/run-tests-linux.yml new file mode 100644 index 000000000..eba2e54c4 --- /dev/null +++ b/.github/workflows/run-tests-linux.yml @@ -0,0 +1,167 @@ +name: Run tests on Linux + +on: + workflow_call: + inputs: + v8_version: + description: 'Platform version' + type: string + required: true + + locale: + type: string + required: false + default: ru_RU + + artifact_name: + type: string + required: true + + fail_on_failure: + type: boolean + required: false + default: true + +permissions: + contents: read + checks: write + id-token: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-Linux + cancel-in-progress: true + +jobs: + execute-tests: + runs-on: ubuntu-latest + steps: + + - name: download artifact + uses: actions/download-artifact@v3 + with: + name: ${{ inputs.artifact_name }} + path: binary + + - name: prepare + run: | + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y locales + sudo ln -s /usr/lib/x86_64-linux-gnu/libenchant-2.so.2 /usr/lib/libenchant.so.1 + sudo localedef -i ${{ inputs.locale }} -c -f UTF-8 -A /usr/share/locale/locale.alias ${{ inputs.locale }}.UTF-8 + mkdir reports -p + + - name: install platform + uses: IT-Medved/onec-setup-build-env-action@develop + with: + type: onec + onec_version: ${{ inputs.v8_version }} + cache: false + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 10 + + - name: install x11 + run: sudo apt-get install -y x11-xserver-utils + continue-on-error: true + timeout-minutes: 5 + + - name: install xserver-dummy + run: sudo apt-get install -y xserver-xorg-video-dummy + timeout-minutes: 5 + + - name: create dummy-config + uses: DamianReeves/write-file-action@master + with: + path: dummy-1920x1080.conf + contents: | + Section "Monitor" + Identifier "Monitor0" + HorizSync 28.0-80.0 + VertRefresh 48.0-75.0 + # https://arachnoid.com/modelines/ + # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz + Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync + EndSection + Section "Device" + Identifier "Card0" + Driver "dummy" + VideoRam 256000 + EndSection + Section "Screen" + DefaultDepth 24 + Identifier "Screen0" + Device "Card0" + Monitor "Monitor0" + SubSection "Display" + Depth 24 + Modes "1920x1080_60.00" + EndSubSection + EndSection + + - name: start xserver + run: sudo X :99 -config dummy-1920x1080.conf & + timeout-minutes: 5 + + - name: create IB + run: ibcmd infobase create --db-path=file-db --load=binary/configuration.cf --apply --force + timeout-minutes: 5 + + - name: load yaxunit + run: | + ibcmd infobase config load --db-path=file-db --extension=YAXUNIT --force binary/yaxunit.cfe + ibcmd infobase config apply --db-path=file-db --extension=YAXUNIT --force + ibcmd infobase config extension update --db-path=file-db --name=YAXUNIT --safe-mode=no --unsafe-action-protection=no + timeout-minutes: 5 + + - name: load tests + run: | + ibcmd infobase config load --db-path=file-db --extension=tests --force binary/tests.cfe + ibcmd infobase config apply --db-path=file-db --extension=tests --force + ibcmd infobase config extension update --db-path=file-db --name=tests --safe-mode=no --unsafe-action-protection=no + timeout-minutes: 5 + + - name: run server + run: ibsrv --db-path=file-db --daemon + + - name: create test-config + uses: DamianReeves/write-file-action@master + with: + path: unit.json + contents: | + { + "reportFormat": "jUnit", + "reportPath": "reports/report.xml", + "closeAfterTests": true, + "exitCode": "exit-code.txt", + "logging": { + "console": true + } + } + + - name: run tests + run: 1cv8c /WS "http://localhost:8314" /C"RunUnitTests=${{github.workspace}}/unit.json" /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out ${{github.workspace}}/output.log + timeout-minutes: 5 + env: + DISPLAY: :99 + LANG: "${{ inputs.locale }}.UTF-8" + + - name: view output + if: always() + run: cat ./output.log + + - name: upload-artifact + uses: actions/upload-artifact@v3 + if: always() + with: + name: Tests report. Linux ${{ inputs.v8_version }} ${{ inputs.locale }} + path: reports/*.* + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() + with: + job_name: Tests Linux ${{ inputs.v8_version }} ${{ inputs.locale }} + check_name: Tests report. Linux ${{ inputs.v8_version }} ${{ inputs.locale }} + report_paths: reports/report.xml + fail_on_failure: ${{ inputs.fail_on_failure }} + require_passed_tests: true \ No newline at end of file diff --git a/.github/workflows/run-tests-windows.yml b/.github/workflows/run-tests-windows.yml new file mode 100644 index 000000000..d5d2b62ba --- /dev/null +++ b/.github/workflows/run-tests-windows.yml @@ -0,0 +1,117 @@ +name: Run tests on Windows + +on: + workflow_call: + inputs: + v8_version: + description: 'Platform version' + type: string + required: true + + locale: + type: string + required: false + default: ru_RU + + artifact_name: + type: string + required: true + + fail_on_failure: + type: boolean + required: false + default: true + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-Windows + cancel-in-progress: true + +jobs: + execute-tests: + runs-on: windows-latest + defaults: + run: + shell: pwsh + + steps: + + - name: download artifact + uses: actions/download-artifact@v3 + with: + name: ${{ inputs.artifact_name }} + path: binary + + - name: install platform + uses: alkoleft/onec-setup-build-env-action@develop + with: + type: onec + onec_version: ${{ inputs.v8_version }} + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 10 + + - name: create IB + run: | + mkdir data\data + ibcmd.exe infobase create --data=data --load=binary\configuration.cf --apply --force + timeout-minutes: 5 + + - name: load yaxunit + run: | + ibcmd.exe infobase config load --data=data --extension=YAXUNIT --force binary\yaxunit.cfe + ibcmd.exe infobase config apply --data=data --extension=YAXUNIT --force + ibcmd.exe infobase config extension update --data=data --name=YAXUNIT --safe-mode=no --unsafe-action-protection=no + timeout-minutes: 5 + + - name: load tests + run: | + ibcmd.exe infobase config load --data=data --extension=tests --force binary\tests.cfe + ibcmd.exe infobase config apply --data=data --extension=tests --force + ibcmd.exe infobase config extension update --data=data --name=tests --safe-mode=no --unsafe-action-protection=no + timeout-minutes: 5 + + - name: create test-config + uses: DamianReeves/write-file-action@master + with: + path: unit.json + contents: | + { + "reportFormat": "jUnit", + "reportPath": "reports\\report.xml", + "closeAfterTests": true, + "exitCode": "exit-code.txt", + "logging": { + "console": true, + "file": "execute.log" + } + } + + - name: Test + run: | + Start-Process ibsrv.exe -ArgumentList "--data=data" + Start-Process -NoNewWindow -PassThru -Wait 1cv8c.exe -ArgumentList '/WS "http://localhost:8314" /C"RunUnitTests=unit.json" /L ru /VL ${{ inputs.locale }} /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out 1cv8c-output.log' + timeout-minutes: 10 + + - name: view output + if: always() + run: type execute.log + + - name: view output + if: always() + run: type 1cv8c-output.log + + - name: upload-artifact + uses: actions/upload-artifact@v3 + with: + name: Tests report. Windows ${{ inputs.v8_version }} ${{ inputs.locale }} + path: reports/ + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + with: + job_name: Tests Windows ${{ inputs.v8_version }} ${{ inputs.locale }} + check_name: Tests report. Windows ${{ inputs.v8_version }} ${{ inputs.locale }} + report_paths: reports/report.xml + fail_on_failure: ${{ inputs.fail_on_failure }} + require_passed_tests: true diff --git a/.github/workflows/sq.yml b/.github/workflows/sq.yml index ec3173c6d..4fe09291b 100644 --- a/.github/workflows/sq.yml +++ b/.github/workflows/sq.yml @@ -43,7 +43,8 @@ jobs: -Dsonar.host.url=https://sonar.openbsl.ru -Dsonar.branch.name=${{ env.BRANCH_NAME }} -Dsonar.projectVersion=${{ steps.extract_version.outputs.version }} - + -Dsonar.qualitygate.wait=true + -Dsonar.qualitygate.timeout=300 # Анализ проекта в SonarQube (PR) # https://docs.sonarqube.org/latest/analysis/pull-request/ - name: Анализ в SonarQube (pull-request) @@ -57,3 +58,5 @@ jobs: -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} + -Dsonar.qualitygate.wait=true + -Dsonar.qualitygate.timeout=300 diff --git a/README.md b/README.md index b4fb4ed77..7c0797b62 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ [![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=yaxunit) [![Maintainability](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=sqale_rating)](https://sonar.openbsl.ru/dashboard?id=yaxunit) +[![Build and test](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml) +[![Build ocumentation](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml) + Обсудить в [Telegram чате](https://t.me/BIAOpenTools/12) ---- diff --git a/documentation/blog/2023/09/05-engine-release.md b/documentation/blog/2023/09/05-engine-release.md new file mode 100644 index 000000000..82821100f --- /dev/null +++ b/documentation/blog/2023/09/05-engine-release.md @@ -0,0 +1,38 @@ +--- +title: YaxUnit. Версия 23.08 +authors: alkoleft +tags: [releases, yaxunit] +--- + +[Release 23.08](https://github.com/bia-technologies/edt-test-runner/releases/tag/23.08) + +## Новое в версии + +### Тестовые данные + +* Загрузка данных из табличного документа или таблицы markdown [#133](https://github.com/bia-technologies/yaxunit/issues/133), [документация](https://bia-technologies.github.io/yaxunit/docs/user-api/test-data/#%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B8%D0%B7-%D0%BC%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2). Спасибо [@dlyubanevich](https://github.com/dlyubanevich) +* Добавить возможность указывать тип фикции [#121](https://github.com/bia-technologies/yaxunit/issues/121) +* Добавить возможность получать случайное значение перечисления [#132](https://github.com/bia-technologies/yaxunit/issues/132) +* Тестовые данные, добавить метод СлучайныйИдентификатор [#102](https://github.com/bia-technologies/yaxunit/issues/102) + +### Утверждения + +* Добавить в ассерты и предикаты поддержку проверки по регулярному выражению [#138](https://github.com/bia-technologies/yaxunit/issues/138). Спасибо [@Daabramov](https://github.com/Daabramov) + +### Прочее + +* Запуск и перезапуск тестов из предприятия [#49](https://github.com/bia-technologies/yaxunit/issues/49), [документация](https://bia-technologies.github.io/yaxunit/docs/yaxunit-ui) +* Пауза [#136](https://github.com/bia-technologies/yaxunit/issues/136) +* Унифицированный механизм подключения внешних компонент - тихая установка, работа с отключенными синхронными вызовами. + +### CI + +* Github CI, реализовано автотестирование движка под windows и linux [#142](https://github.com/bia-technologies/yaxunit/pull/142) +* Вывод лога выполнения тестирования в консоль [#144](https://github.com/bia-technologies/yaxunit/issues/144) + +## Исправленные ошибки + +### Прочее + +* Подтягиваются глобальные общие модули [#148](https://github.com/bia-technologies/yaxunit/pull/148). Спасибо [@SeiOkami](https://github.com/SeiOkami) +* Исправлены выявленные ошибки [#130](https://github.com/bia-technologies/yaxunit/pull/130). Спасибо [@potoyalo](https://github.com/potoyalo) diff --git a/documentation/docs/images/config-ui.png b/documentation/docs/images/config-ui.png index 07bc130eb..65b527746 100644 Binary files a/documentation/docs/images/config-ui.png and b/documentation/docs/images/config-ui.png differ diff --git a/documentation/docs/images/ui-run-menu.png b/documentation/docs/images/ui-run-menu.png new file mode 100644 index 000000000..1f1bd4a5c Binary files /dev/null and b/documentation/docs/images/ui-run-menu.png differ diff --git a/documentation/docs/images/ui-run-tests.png b/documentation/docs/images/ui-run-tests.png new file mode 100644 index 000000000..811e7fb74 Binary files /dev/null and b/documentation/docs/images/ui-run-tests.png differ diff --git a/documentation/docs/run/configuration.md b/documentation/docs/run/configuration.md index 5bdfe4be4..1c60a92a9 100644 --- a/documentation/docs/run/configuration.md +++ b/documentation/docs/run/configuration.md @@ -31,7 +31,8 @@ | Имя параметра | Тип | Значение по умолчанию | Описание | |---------------|-----------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------| | `file` | `String` | `""` | Путь к файлу лога | -| `enable` | `Boolean` | `Null` | Признак использования логирования. Если не указан, зависит от параметра `file`, если он указан - вкл, если не указан - выкл | +| `enable` | `Boolean` | `Null` | Использование логирвания.
Если не указан, зависит от параметра `file` и `console`, если установлены - вкл, если нет - выкл | +| `console` | `Boolean` | `false` | Вывод лога в stdout (консоль) | | `level` | `String` | `"debug"` | Уровень детализации лога. Возможные значения: `"debug"`, `"info"`, `"error"` | Примеры: diff --git a/documentation/docs/run/run.md b/documentation/docs/run/run.md index 130632a7c..11e44b1b5 100644 --- a/documentation/docs/run/run.md +++ b/documentation/docs/run/run.md @@ -20,10 +20,18 @@ ![Конфигуратор](images/from-configurator.png) * Воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации) +## Запуск из предприятия + +Для запуска тестов из предприятия необходимо воспользоваться командой [Запуск тестирования](../yaxunit-ui.md#запуск-тестов) + +![Запуск тестов](../images/ui-run-tests.png) + ## Строка запуска предприятия `[путь к клиенту 1С] ENTERPRISE [Параметры подключения к ИБ] [Параметры авторизации] /C RunUnitTests=/путь/к/конфигурационному/файлу` +Для формирования строки запуска можно воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации) + Пример: `"C:\Program Files\1cv8\8.3.18.1698\bin\1cv8c.exe" ENTERPRISE /IBName MyInfoBase /N Admin /C RunUnitTests=C:\tmp\test-config.json` diff --git a/documentation/docs/user-api/assertions/assertions-base.md b/documentation/docs/user-api/assertions/assertions-base.md index 84d7c4dfd..6501b876c 100644 --- a/documentation/docs/user-api/assertions/assertions-base.md +++ b/documentation/docs/user-api/assertions/assertions-base.md @@ -8,7 +8,7 @@ tags: [Начало, Утверждения] Доступ к утверждениям обеспечивает метод `ЮТест.ОжидаетЧто`, который возвращает инициализированный модуль `ЮТУтверждения`, реализующий работу с утверждениями. -:::tip +:::tip Не рекомендуется обращаться к модулю `ЮТУтверждения` напрямую, используйте `ЮТест.ОжидаетЧто` ::: @@ -29,63 +29,89 @@ tags: [Начало, Утверждения] ## Доступные методы -* Сравнить значение используя - * `Равно` - проверка на равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению - * `НеРавно` - проверка на не равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению - * `Больше` - проверяемое значение должно быть больше указанного - * `БольшеИлиРавно` - проверяемое значение должно быть больше или равно указанному - * `Меньше` - проверяемое значение должно быть меньше указанного - * `МеньшеИлиРавно` - проверяемое значение должно быть меньше или равно указанному - * `ЭтоНеопределено` - проверяемое значение должно быть равно `Неопределено` - * `ЭтоНеНеопределено` - проверяемое значение должно быть не равно `Неопределено` - * `ЭтоNull` - проверяемое значение должно быть равно `Null` - * `ЭтоНеNull` - проверяемое значение должно быть не равно `Null` - * `ЭтоИстина` - проверяемое значение должно быть истиной - * `ЭтоНеИстина` - проверяемое значение не должно быть истиной - * `ЭтоЛожь` - проверяемое значение должно быть ложью - * `ЭтоНеЛожь` - проверяемое значение не должно быть ложью -* Проверить заполненность - * `Заполнено` - проверяет заполненность значения - * `НеЗаполнено` - проверяет незаполненность значения - * `Существует` - проверяет существование (не равно `Null` и `Неопределено`) значения - * `НеСуществует` - проверяет не существование (не равно `Null` и `Неопределено`) значения -* Проверить длину строки (размер коллекции) - * `ИмеетДлину` - проверяет, что значение имеет указанную длину (размер) - * `ИмеетДлинуБольше` - проверяет, что значение имеет длину (размер), которая больше указанной - * `ИмеетДлинуМеньше` - проверяет, что значение имеет длину (размер), которая меньше указанной - * `НеИмеетДлину` - проверяет, что длина (размер) значения не равна указанной -* Проверить вхождения подстроки - * `Содержит` - проверяемая строка содержит указанную подстроку - * `НеСодержит` - проверяемая строка не содержит указанную подстроку - * `НачинаетсяС` - проверяемая строка начинается с указанной строки - * `ЗаканчиваетсяНа` - проверяемая строка заканчивается на указанную строку -* Проверить вхождения значения в интервал - * `МеждуВключаяГраницы` - проверяемое значение находиться в указанному интервале (включая границы) - * `МеждуИсключаяГраницы` - проверяемое значение находиться в указанному интервале (исключая границы) - * `МеждуВключаяНачалоГраницы` - проверяемое значение находиться в указанному интервале (включая левую границу и исключая правую) - * `МеждуВключаяОкончаниеГраницы` - проверяемое значение находиться в указанному интервале (исключая левую границу и включая правую) -* Проверить тип значения - * `ИмеетТип` - проверяемое значение должно иметь указанный тип - * `НеИмеетТип` - тип проверяемого значения должен отличаться от указанного -* Проверить выполнение метода - * `ВыбрасываетИсключение` - проверят, что указанный метод объекта выбрасывает исключение - * `НеВыбрасываетИсключение` - проверят, что указанный метод объекта не выбрасывает исключение -* Проверить наличие свойств/реквизитов - * `ИмеетСвойство` - проверяемый объект должен содержать указанное свойство - * `НеИмеетСвойства` - проверяемый объект не содержит указанное свойство - * `ИмеетСвойстваРавные` - проверяемый объект должен содержать указанный набор свойств/реквизитов и значений -* Проверить элементы коллекции - * `Содержит` - проверяемая коллекция должна содержать указанный элемент - * `НеСодержит` - проверяемая коллекция не должна содержать указанный элемент - * `КаждыйЭлементСодержитСвойство` - проверяет, что каждый элемент коллекции имеет указанное свойство - * `КаждыйЭлементСодержитСвойствоСоЗначением` - проверяет, что каждый элемент коллекции имеет указанное свойство, которое равно ожидаемому значению - * `ЛюбойЭлементСодержитСвойство` - проверяет, что в коллекции есть элемент содержащий указанное свойство - * `ЛюбойЭлементСодержитСвойствоСоЗначением` - проверяет, что в коллекции есть элемент содержащий указанное свойство, которое равно ожидаемому значению - :::tip Полный и актуальный набор методов смотрите в описании API ::: +### Сравнение значений + +* `Равно` - проверка на равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению +* `НеРавно` - проверка на не равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению +* `Больше` - проверяемое значение должно быть больше указанного +* `БольшеИлиРавно` - проверяемое значение должно быть больше или равно указанному +* `Меньше` - проверяемое значение должно быть меньше указанного +* `МеньшеИлиРавно` - проверяемое значение должно быть меньше или равно указанному +* `ЭтоНеопределено` - проверяемое значение должно быть равно `Неопределено` +* `ЭтоНеНеопределено` - проверяемое значение должно быть не равно `Неопределено` +* `ЭтоNull` - проверяемое значение должно быть равно `Null` +* `ЭтоНеNull` - проверяемое значение должно быть не равно `Null` +* `ЭтоИстина` - проверяемое значение должно быть истиной +* `ЭтоНеИстина` - проверяемое значение не должно быть истиной +* `ЭтоЛожь` - проверяемое значение должно быть ложью +* `ЭтоНеЛожь` - проверяемое значение не должно быть ложью + +### Проверка заполненности + +* `Заполнено` - проверяет заполненность значения +* `НеЗаполнено` - проверяет незаполненность значения +* `Существует` - проверяет существование (не равно `Null` и `Неопределено`) значения +* `НеСуществует` - проверяет не существование (не равно `Null` и `Неопределено`) значения + +### Проверка строк + +* `ИмеетДлину` - проверяет, что строка имеет указанную длину +* `ИмеетДлинуБольше` - проверяет, что длин строки больше указанной +* `ИмеетДлинуМеньше` - проверяет, что длина строки меньше указанной +* `НеИмеетДлину` - проверяет, что длина строки отличается от указанной +* `Содержит` - проверяемая строка содержит указанную подстроку +* `НеСодержит` - проверяемая строка не содержит указанную подстроку +* `НачинаетсяС` - проверяемая строка начинается с указанной строки +* `ЗаканчиваетсяНа` - проверяемая строка заканчивается на указанную строку +* `СодержитСтрокуПоШаблону` - проверяемая строка содержит подстроку, соответствующую регулярному выражению +* `НеСодержитСтрокуПоШаблону` - проверяемая строка не содержит подстроку, соответствующую регулярному выражению + +### Проверка вхождения значения в интервал + +* `МеждуВключаяГраницы` - проверяемое значение находиться в указанному интервале (включая границы) +* `МеждуИсключаяГраницы` - проверяемое значение находиться в указанному интервале (исключая границы) +* `МеждуВключаяНачалоГраницы` - проверяемое значение находиться в указанному интервале (включая левую границу и исключая правую) +* `МеждуВключаяОкончаниеГраницы` - проверяемое значение находиться в указанному интервале (исключая левую границу и включая правую) + +### Проверка типа значения + +* `ИмеетТип` - проверяемое значение должно иметь указанный тип +* `НеИмеетТип` - тип проверяемого значения должен отличаться от указанного + +### Проверка выполнения метода + +* `ВыбрасываетИсключение` - проверят, что указанный метод объекта выбрасывает исключение +* `НеВыбрасываетИсключение` - проверят, что указанный метод объекта не выбрасывает исключение + +### Проверка наличия свойств/реквизитов + +* `ИмеетСвойство` - проверяемый объект должен содержать указанное свойство +* `НеИмеетСвойства` - проверяемый объект не содержит указанное свойство +* `ИмеетСвойстваРавные` - проверяемый объект должен содержать указанный набор свойств/реквизитов и значений + +### Проверка коллекции + +* `ИмеетДлину` - проверяет, что коллекция имеет указанный размер +* `ИмеетДлинуБольше` - проверяет, что коллекция имеет размер, который больше указанного +* `ИмеетДлинуМеньше` - проверяет, что коллекция имеет размер, который меньше указанного +* `НеИмеетДлину` - проверяет, что размер коллекции отличается от указанного +* `Содержит` - проверяемая коллекция должна содержать указанный элемент +* `НеСодержит` - проверяемая коллекция не должна содержать указанный элемент +* `КаждыйЭлементСодержитСвойство` - проверяет, что каждый элемент коллекции имеет указанное свойство +* `КаждыйЭлементСодержитСвойствоСоЗначением` - проверяет, что каждый элемент коллекции имеет указанное свойство, которое равно ожидаемому значению +* `ЛюбойЭлементСодержитСвойство` - проверяет, что в коллекции есть элемент содержащий указанное свойство +* `ЛюбойЭлементСодержитСвойствоСоЗначением` - проверяет, что в коллекции есть элемент содержащий указанное свойство, которое равно ожидаемому значению +* `КаждыйЭлементСоответствуетПредикату` - проверяет, что элементы коллекции соответствуют переданным условиям +* `ЛюбойЭлементСоответствуетПредикату` - проверяет, что коллекция содержит элемент, который соответствует переданным условиям + +### Проверка на соответствие набору условий, предикату + +* `СоответствуетПредикату` - проверяет, что объект или его свойство соответствует набору условий + ### Проверка методов объекта Для проверки работы методов объекта есть набор утверждений среди описанных выше (`ВыбрасываетИсключение` и `НеВыбрасываетИсключение`), но для их работы необходимо выполнить предварительные настройки. @@ -106,53 +132,98 @@ tags: [Начало, Утверждения] ## Примеры -1. Базовые проверки - - ```bsl - ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение - .ИмеетТип("Число") // Проверим тип - .Заполнено() // Заполненность проверяемого значения - .Больше(0) // Сравним с нулем - .Равно(5); // Проверим ожидаемый результат - ``` - -2. Проверка сложного объекта - - ```bsl - Объект = ЮТОбщий.ЗначениеВМассиве("1", "2", "3"); - ЮТУтверждения.Что(Объект, "Проверка элементов массива") - .Содержит("1") - .НеСодержит(1) - .Элемент(0).Равно("1") - .Элемент(1).Равно("2") - .Элемент(-1).Равно("3") - .Свойство("[00]").Равно("1") - .Свойство("[1]").Равно("2") - .Свойство("[-1]").Равно("3") - .НетСвойства(3) - .НеИмеетСвойства("[3]"); - - Объект.Добавить(Новый Структура("Первый, Второй", 1, ЮТОбщий.ЗначениеВМассиве(2))); - ЮТУтверждения.Что(Объект, "Проверка свойства элемента массива") - .Свойство("[3].Первый").Равно(1) - .Свойство("[3].Второй[-1]").Равно(2) - .Свойство("[3].Второй[0]").Равно(2) - ``` - -3. Проверка вызова метода - - ```bsl - ЮТУтверждения.Что(ОМ_ЮТУтверждения) - .Метод("МетодБезИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение")) - .НеВыбрасываетИсключение() - .НеВыбрасываетИсключение("Ожидаемое исключение"); - ЮТУтверждения.Что(ОМ_ЮТУтверждения) - .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение", 2)) - .ВыбрасываетИсключение("Слишком много фактических параметров"); - ЮТУтверждения.Что(ОМ_ЮТУтверждения) - .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение")) - .ВыбрасываетИсключение("Исключение"); - ЮТУтверждения.Что(ОМ_ЮТУтверждения) - .Метод("МетодБезИсключение") - .ВыбрасываетИсключение("Недостаточно фактических параметров"); - ``` +### Базовые проверки + +```bsl +ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение + .ИмеетТип("Число") // Проверим тип + .Заполнено() // Заполненность проверяемого значения + .Больше(0) // Сравним с нулем + .Равно(5); // Проверим ожидаемый результат +``` + +### Проверка сложного объекта + +```bsl +Объект = ЮТОбщий.ЗначениеВМассиве("1", "2", "3"); +ЮТУтверждения.Что(Объект, "Проверка элементов массива") + .Содержит("1") + .НеСодержит(1) + .Элемент(0).Равно("1") + .Элемент(1).Равно("2") + .Элемент(-1).Равно("3") + .Свойство("[00]").Равно("1") + .Свойство("[1]").Равно("2") + .Свойство("[-1]").Равно("3") + .НетСвойства(3) + .НеИмеетСвойства("[3]"); + +Объект.Добавить(Новый Структура("Первый, Второй", 1, ЮТОбщий.ЗначениеВМассиве(2))); +ЮТУтверждения.Что(Объект, "Проверка свойства элемента массива") + .Свойство("[3].Первый").Равно(1) + .Свойство("[3].Второй[-1]").Равно(2) + .Свойство("[3].Второй[0]").Равно(2) +``` + +### Проверка вызова метода + +```bsl +ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("МетодБезИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение")) + .НеВыбрасываетИсключение() + .НеВыбрасываетИсключение("Ожидаемое исключение"); +ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение", 2)) + .ВыбрасываетИсключение("Слишком много фактических параметров"); +ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение")) + .ВыбрасываетИсключение("Исключение"); +ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("МетодБезИсключение") + .ВыбрасываетИсключение("Недостаточно фактических параметров"); +``` + +### Проверка соответствия предикату + +```bsl +Дата = ЮТест.Данные().СлучайнаяДата(); + +Объект = Новый Структура; +Объект.Вставить("Число", 1); +Объект.Вставить("Строка", "1"); +Объект.Вставить("Дата", Дата); +Объект.Вставить("Массив", ЮТОбщий.ЗначениеВМассиве(1, "1")); + +ПроверкаЧисла = ЮТест.Предикат().Реквизит("Число") + .ИмеетТип(Тип("Число")) + .БольшеИлиРавно(1) + .МеньшеИлиРавно(10) + .Получить(); +ПроверкаДаты = ЮТест.Предикат().Реквизит("Дата") + .ИмеетТип(Новый ОписаниеТипов("Дата")) + .Равно(Дата) + .Получить(); + +ЮТест.ОжидаетЧто(Объект) + .СоответствуетПредикату(ЮТест.Предикат() + .Заполнено() + .ИмеетТип("Структура")) + .СоответствуетПредикату(ПроверкаЧисла) + .СоответствуетПредикату(ПроверкаДаты) +; +``` + +### Проверка элементов коллекции на соответствие предикату + +```bsl +ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11", ОписанияТипов); +Ютест.ОжидаетЧто(ТаблицаРезультатов) + .ИмеетТип("Массив") + .ИмеетДлину(3) + .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат() + .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары") + .Реквизит("Период").Заполнено().ИмеетТип("Дата") + .Реквизит("Количество").Заполнено().ИмеетТип("Число") + .Реквизит("Цена").Заполнено().ИмеетТип("Число") + ) +``` diff --git a/documentation/docs/user-api/test-data/test-data.md b/documentation/docs/user-api/test-data/test-data.md index bcb33d2e5..fca9b6acc 100644 --- a/documentation/docs/user-api/test-data/test-data.md +++ b/documentation/docs/user-api/test-data/test-data.md @@ -24,7 +24,7 @@ tags: [Начало, Тестовые данные] В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные()`. -:::tip +:::tip Не рекомендуется обращаться к модулю `ЮТТестовыеДанные` напрямую, используйте `ЮТест.Данные()` ::: @@ -35,100 +35,101 @@ tags: [Начало, Тестовые данные] * Автоматически удалять созданные данные (для этого необходимо включить настройку теста `УдалениеТестовыхДанных()`) * Работать с файлами * Использовать таблицы markdown в качестве макетов данных +* Генерировать таблицы значений из табличных документов и таблиц markdown -Примеры +## Примеры -1. Генерация фейкового документа +### Генерация фейкового документа - ```bsl - #Если Сервер Тогда - Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара); - #Иначе - Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара"); - #КонецЕсли +```bsl +#Если Сервер Тогда + Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара); +#Иначе + Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара"); +#КонецЕсли - Конструктор - .Фикция("Поставщик") - .Фикция("Склад") - .Фикция("Валюта") - .Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина)) - .ТабличнаяЧасть("Товары"); - - Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл - Конструктор.ДобавитьСтроку() - .Фикция("Товар") - .Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2)) - .Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20)) - .Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество) - КонецЦикла; + Конструктор + .Фикция("Поставщик") + .Фикция("Склад") + .Фикция("Валюта") + .Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина)) + .ТабличнаяЧасть("Товары"); + + Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл + Конструктор.ДобавитьСтроку() + .Фикция("Товар") + .Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2)) + .Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20)) + .Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество) + КонецЦикла; - Ссылка = Конструктор.Провести(); - ``` + Ссылка = Конструктор.Провести(); +``` -2. Генерация произвольных фейковых данных +### Генерация произвольных фейковых данных - ```bsl - Функция ОписаниеСервера(Знач Идентификатор = Неопределено) Экспорт - - Описание = БазовоеОписаниеОбъекта(Идентификатор, "СРВ"); - - Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес()); - Описание.Вставить("ЧастотаЯдра", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(4, 3)); - Описание.Вставить("КоличествоЯдер", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(10)); - Описание.Вставить("КоличествоПотоков", Описание.КоличествоЯдер * 2); - Описание.Вставить("ПроизводительностьПроцессора", Описание.ЧастотаЯдра * Описание.КоличествоЯдер); - Описание.Вставить("ОбъемПамяти", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(1024, 3)); - Описание.Вставить("Диски", Новый Массив()); - Описание.Вставить("Кластер"); - - Для Инд = 1 По ЮТТестовыеДанные.СлучайноеЧисло(1, 3) Цикл - Описание.Диски.Добавить(ОписаниеДиска()); - КонецЦикла; - - Возврат Описание; - - КонецФункции +```bsl +Функция ОписаниеСервера(Знач Идентификатор = Неопределено) Экспорт + + Описание = БазовоеОписаниеОбъекта(Идентификатор, "СРВ"); + + Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес()); + Описание.Вставить("ЧастотаЯдра", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(4, 3)); + Описание.Вставить("КоличествоЯдер", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(10)); + Описание.Вставить("КоличествоПотоков", Описание.КоличествоЯдер * 2); + Описание.Вставить("ПроизводительностьПроцессора", Описание.ЧастотаЯдра * Описание.КоличествоЯдер); + Описание.Вставить("ОбъемПамяти", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(1024, 3)); + Описание.Вставить("Диски", Новый Массив()); + Описание.Вставить("Кластер"); + + Для Инд = 1 По ЮТТестовыеДанные.СлучайноеЧисло(1, 3) Цикл + Описание.Диски.Добавить(ОписаниеДиска()); + КонецЦикла; + + Возврат Описание; + +КонецФункции - Функция ОписаниеЗаявкиНаСозданиеВМ() Экспорт - - Описание = Новый Структура(); - - Описание.Вставить("Наименование", "req-" + ЮТТестовыеДанные.СлучайнаяСтрока()); - Описание.Вставить("ДатаДобавления", глПолучитьМосковскоеВремя()); - Описание.Вставить("ДатаОкончанияАренды", глДобавитьКДате(глПолучитьМосковскоеВремя(), "ДЕНЬ", 2)); - Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес()); - - Описание.Вставить("Проект", Проект()); - Описание.Вставить("Мейнтейнер", ПараметрыСеанса.Сотрудник); - - Описание.Вставить("КоличествоCPU", ЮТТестовыеДанные.СлучайноеЧисло(1, 4)); - Описание.Вставить("КоличествоПамяти", ЮТТестовыеДанные.СлучайноеЧисло(1, 16)); - Описание.Вставить("КоличествоДисков", ЮТТестовыеДанные.СлучайноеЧисло(1, 16)); - Описание.Вставить("ОперационнаяСистема", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОперационныеСистемы)); - - Описание.Вставить("СредаЭксплуатации", ""); - Описание.Вставить("Назначение", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.НазначенияВиртуальныхМашин)); - Описание.Вставить("ТипСреды", Справочники.ТипыИнформационныхСред.BETA); - Описание.Вставить("КодСервиса", ЮТТестовыеДанные.СлучайнаяСтрока(1)); - - Возврат Описание; - - КонецФункции +Функция ОписаниеЗаявкиНаСозданиеВМ() Экспорт + + Описание = Новый Структура(); + + Описание.Вставить("Наименование", "req-" + ЮТТестовыеДанные.СлучайнаяСтрока()); + Описание.Вставить("ДатаДобавления", глПолучитьМосковскоеВремя()); + Описание.Вставить("ДатаОкончанияАренды", глДобавитьКДате(глПолучитьМосковскоеВремя(), "ДЕНЬ", 2)); + Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес()); + + Описание.Вставить("Проект", Проект()); + Описание.Вставить("Мейнтейнер", ПараметрыСеанса.Сотрудник); + + Описание.Вставить("КоличествоCPU", ЮТТестовыеДанные.СлучайноеЧисло(1, 4)); + Описание.Вставить("КоличествоПамяти", ЮТТестовыеДанные.СлучайноеЧисло(1, 16)); + Описание.Вставить("КоличествоДисков", ЮТТестовыеДанные.СлучайноеЧисло(1, 16)); + Описание.Вставить("ОперационнаяСистема", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОперационныеСистемы)); + + Описание.Вставить("СредаЭксплуатации", ""); + Описание.Вставить("Назначение", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.НазначенияВиртуальныхМашин)); + Описание.Вставить("ТипСреды", Справочники.ТипыИнформационныхСред.BETA); + Описание.Вставить("КодСервиса", ЮТТестовыеДанные.СлучайнаяСтрока(1)); + + Возврат Описание; + +КонецФункции - Функция НовыйОбразDocker(Версия, ПоУмолчанию = Истина) Экспорт - - Данные = Новый Структура("Адрес, ВерсияПлатформы, ТипПлатформы, ИспользоватьПоУмолчанию"); - Данные.Адрес = "gitlab.ru/orais/ci_cd/1cws-apache24:" + Версия; - Данные.ВерсияПлатформы = Версия; - Данные.ТипПлатформы = Перечисления.ТипыСоединенияИсточникаДанных.Соединение1СПредприятие83Сервер; - Данные.ИспользоватьПоУмолчанию = ПоУмолчанию; - - Возврат ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОбразыDocker, Версия, Данные); - - КонецФункции - ``` +Функция НовыйОбразDocker(Версия, ПоУмолчанию = Истина) Экспорт + + Данные = Новый Структура("Адрес, ВерсияПлатформы, ТипПлатформы, ИспользоватьПоУмолчанию"); + Данные.Адрес = "gitlab.ru/orais/ci_cd/1cws-apache24:" + Версия; + Данные.ВерсияПлатформы = Версия; + Данные.ТипПлатформы = Перечисления.ТипыСоединенияИсточникаДанных.Соединение1СПредприятие83Сервер; + Данные.ИспользоватьПоУмолчанию = ПоУмолчанию; + + Возврат ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОбразыDocker, Версия, Данные); + +КонецФункции +``` -3. Чтение из таблицы Markdown +### Чтение из таблицы Markdown ```bsl Макет = @@ -172,3 +173,342 @@ tags: [Начало, Тестовые данные] Возврат ТипыМетаданных; ``` + +### Загрузка данных из макетов + +Для загрузки данных из макетов подойдет метод `ЮТест.Данные().ЗагрузитьИзМакета` + +Он позволяет: + +* Загружать данные из табличных макет (`ТабличныйДокумент` или `ТекстовыйДокумент` с таблицей markdown) +* Загружать данные на клиенте и на сервер +* Загружать не весь макет, а конкретную область (в одном макете может находится несколько таблиц данных) +* Приводить значения к указанным типам и создавать записи в базе данных + +Пример табличного документа: + +| Товар | Товар.Поставщик | Товар.Вид | Цена | Количество | Сумма | +|---------|-----------------|-----------|-------|------------|-------| +| Товар 1 | Поставщик 1 | Товар | 100 | 1 | 100 | +| Товар 1 | | | 100 | 2 | 200 | +| Товар 1 | Поставщик 2 | Товар | 100 | 3 | 300 | +| Товар 2 | Поставщик 1 | Товар | 2 000 | 1 | 2000 | +| Услуга | | Услуга | 300,5 | 1 | 300.5 | + +Особенности: + +* Создание данных + * Данные в базе всегда создаются, не выполняется поиск уже существующих ссылок. При необходимости вы можете найти данные сами и передать в параметрах `ЗаменяемыеЗначения` или `КэшЗначений` + :::tip + При преобразовании табличного документа в таблицу значений существующие объекты метаданных не изменяются, только создаются новые. Нужно проявлять внимательность в случаях, если в базе уже имеются данные с тем же кодом/наименованием (и по ним используется контроль уникальности), что и в табличном документе. + ::: + * Можно указывать значения вложенных реквизитов в других колонках, например для колонки `Товар` можно добавить колонки с поставщиком и видом товара `Товар.Поставщик` и `Товар.Вид`, в которых указать нужные значения + * Переиспользование созданных данных, используется `КэшЗначений`, в который помещаются все созданные данные, если кэш содержит данные подходящего типа с указанным идентификатором, то используется ранее созданное значение из кэша. Например, в примере выше, для первой строки будет создан товар с идентификатором `Товар 1`. В строках 2 и 3 будет использовано значение из кэша - `Товар 1`, в 4й и 5й строке - созданы новые товары. + + :::tip + Значение в колонке "Товар" является идентификатором ссылки. Для справочника значение этой колонки по умолчанию записывается в реквизит "Наименование" или "Код", в зависимости от того, какой из этих реквизитов является основным представлением. Для документа это значение никуда не записывается, оно лишь является идентификатором. Таким образом, если одному значению в колонке "Товар" соответствуют различные значения в других колонках, то в элемент справочника запишутся реквизиты из первой строки, а для других строк ссылка на этот элемент будет проставлена по соответствующему идентификатору + ::: + +#### Загрузка всего макета + +В качестве источника данных можно использовать весь табличный документ. В этом случае будет получена таблица значений, начиная с 1-ой строки и 1-ой колонки табличного документа до первой пустой строки. + +:::info +Этот код работает и на клиенте и на сервер. Для сервера результатом будет таблица значений, для клиента - массив структур +::: + +_Исходные данные_ + +| Товар | Товар.Поставщик | Товар.Вид | Цена | Количество | Сумма | +|---------|-----------------|-----------|-------|------------|-------| +| Товар 1 | Поставщик 1 | Товар | 100 | 1 | 100 | +| Товар 1 | | | 100 | 2 | 200 | +| Товар 1 | Поставщик 2 | Товар | 100 | 3 | 300 | +| Товар 2 | Поставщик 1 | Товар | 2 000 | 1 | 2000 | +| Услуга | | Услуга | 300,5 | 1 | 300.5 | + +```bsl +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); +ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); + +ТаблицаТоваров = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных", ОписанияТипов); + +Ютест.ОжидаетЧто(ТаблицаТоваров) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(5) + .Свойство("[0].Товар.Наименование").Равно("Товар 1") + .Свойство("[0].Товар.Поставщик.Наименование").Равно("Поставщик") + .Свойство("[0].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар) + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100) + .Свойство("[0].Сумма").Равно(100) + .Свойство("[1].Товар").Равно(ТаблицаТоваров[0].Товар) + .Свойство("[1].Количество").Равно(2) + .Свойство("[1].Цена").Равно(100) + .Свойство("[1].Сумма").Равно(200) + .Свойство("[2].Товар").Равно(ТаблицаТоваров[0].Товар) + .Свойство("[2].Количество").Равно(3) + .Свойство("[2].Цена").Равно(100) + .Свойство("[2].Сумма").Равно(300) + .Свойство("[3].Товар.Наименование").Равно("Товар 2") + .Свойство("[3].Товар.Поставщик.Наименование").Равно("Поставщик") + .Свойство("[3].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар) + .Свойство("[3].Количество").Равно(1) + .Свойство("[3].Цена").Равно(2000) + .Свойство("[3].Сумма").Равно(2000) + .Свойство("[4].Товар.Наименование").Равно("Услуга") + .Свойство("[4].Товар.Поставщик").НеЗаполнено() + .Свойство("[4].Товар.Вид").Равно(Перечисления.ВидыТоваров.Услуга) + .Свойство("[4].Количество").Равно(1) + .Свойство("[4].Цена").Равно(300.5) + .Свойство("[4].Сумма").Равно(300.5); +``` + +#### Загрузка области из макета + +Можно получить отдельную область из табличного документа и использовать ее в качестве источника данных для таблицы значений. Таким образом в одном табличном документе можно хранить несколько таблиц. + +Пример юнит-теста для проверки работы метода. На входе он получает таблицу значений, которую заполняет и/или возвращает. В одной области табличного документа - исходные данные, передаваемые в качестве входящего параметра, а в другой - таблица с ожидаемым значением. + +_Исходные данные_ + +| Товар | Товар.Поставщик | Товар.Вид | Количество | +|---------|-----------------|------------|------------| +| Товар 1 | Поставщик 1 | Товар | 1 | +| Товар 2 | Поставщик 1 | Товар | 1 | +| Услуга | | Услуга | 1 | +| Товар | Цена | Количество | Сумма | +| Товар 1 | 100 | 1 | 100 | +| Товар 2 | 2 000 | 1 | 2000 | +| Услуга | 300,5 | 1 | 300.5 | + +```bsl +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); +ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); + +// Для общего использования созданных значений используется переменная КешЗначений. +// В двух табличных документах одинаковый состав товаров. +// Чтобы в обеих таблицах этому товару соответствовало одно значение справочника - +// нужно передавать в параметре функции переменную, в которой будут храниться соответствия +// наименований к ссылкам на объекты. +КэшЗначений = Новый Соответствие; + +ТаблицаИсходныхДанных = ЮТест.Данные().ЗагрузитьИзМакета( + "ОбщийМакет.ЮТ_МакетТестовыхДанных.R1C1R4C4", + ОписанияТипов, + КэшЗначений +); + +ТаблицаИсходныхДанных = ЮТест.Данные().ЗагрузитьИзМакета( + "ОбщийМакет.ЮТ_МакетТестовыхДанных.R1C1R4C4", + ОписанияТипов, + КэшЗначений +); + +ТаблицаОжидаемыхЗначений = ЮТест.Данные().ЗагрузитьИзМакета( + "ОбщийМакет.ЮТ_МакетТестовыхДанных.R5C1R8C4", + ОписанияТипов, + КэшЗначений +); + +ТаблицаРезультата = ОбщийМодуль1.ТаблицаТоваровСЦенамиИзОстатков(ТаблицаИсходныхДанных); + +Ютест.ОжидаетЧто(ТаблицаРезультата) + .Равно(ТаблицаОжидаемыхЗначений); +``` + +#### Загрузка документа с табличной частью и проверка движений + +Интеграционный-тест для проверки формирования движений документа по некоторому регистру. В первой таблице - табличная часть документа. Во второй - реквизиты самого документа. В третьей - ожидаемые движения по регистру, который нужно протестировать. + +В макете мы создадим три именованные области с таблицами + +Область `Реквизиты_документа` + +| ПриходТовара | Дата | Поставщик | Валюта | Склад | Организация | +|--------------|------|-------------|--------|-------|-------------| +| Документ 1 | Дата | Поставщик 1 | Валюта | Склад | Организация | + +Область `Табличная_часть_документа` + +| Документ | Товар | Товар.Поставщик | Товар.Вид | Цена | Количество | Сумма | +|------------|---------|-----------------|-----------|-------|------------|-------| +| Документ 1 | Товар 1 | Поставщик 1 | Товар | 100 | 1 | 100 | +| Документ 1 | Товар 2 | Поставщик 1 | Товар | 2 000 | 1 | 2000 | +| Документ 1 | Услуга | | Услуга | 300,5 | 1 | 300.5 | + +Область `Ожидаемые_движения` + +| Период | Активность | ВидДвижения | Регистратор | Склад | Товар | Количество | +|--------|------------|-------------|-------------|-------|---------|------------| +| Дата | Истина | Приход | Документ 1 | Склад | Товар 1 | 1 | +| Дата | Истина | Приход | Документ 1 | Склад | Товар 2 | 1 | +| Дата | Истина | Приход | Документ 1 | Склад | Услуга | 1 | + +```bsl +КэшЗначений = Новый Соответствие; + +Организация = Ютест.КонтекстМодуля().Организация; +Поставщик = ЮТест.Данные().СоздатьЭлемент(Справочники.Контрагенты, "Поставщик"); +ДатаДокумента = НачалоДня(ТекущаяДатаСеанса()); + +// Если нужно не создавать новое значение, а использовать существующее, +// например, созданное ранее, то можно использовать соответствие - +// значение из табличного документа к нужному значению. +ЗаменяемыеЗначения = Новый Соответствие; +ЗаменяемыеЗначения.Вставить("Организация", Организация); +ЗаменяемыеЗначения.Вставить("Поставщик 1", Поставщик); +ЗаменяемыеЗначения.Вставить("Дата", ДатаДокумента); + +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("ПриходТовара", Новый ОписаниеТипов("ДокументСсылка.ПриходТовара")); +ОписанияТипов.Вставить("Дата", Новый ОписаниеТипов("Дата")); +ОписанияТипов.Вставить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации")); +ОписанияТипов.Вставить("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")); +ОписанияТипов.Вставить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады")); +ОписанияТипов.Вставить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты")); + +ТаблицаДокументов = ЮТест.Данные().ЗагрузитьИзМакета( + "ОбщийМакет.ЮТ_МакетТестовыхДанных.Реквизиты_документа" + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения +); + +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("Документ", Новый ОписаниеТипов("ДокументСсылка.ПриходТовара")); +ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); +ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); + +ТаблицаТоваров = ЮТест.Данные().ЗагрузитьИзМакета( + "ОбщийМакет.ЮТ_МакетТестовыхДанных.Табличная_часть_документа", + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения +); + +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата")); +ОписанияТипов.Вставить("Активность", Новый ОписаниеТипов("Булево")); +ОписанияТипов.Вставить("ВидДвижения", Новый ОписаниеТипов("ВидДвиженияНакопления")); +ОписанияТипов.Вставить("Регистратор", Новый ОписаниеТипов("ДокументСсылка.ПриходТовара")); +ОписанияТипов.Вставить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады")); +ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); +ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); + +ТаблицаДвижений = ЮТест.Данные().ЗагрузитьИзМакета( + "ОбщийМакет.ЮТ_МакетТестовыхДанных.Ожидаемые_движения", + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения +); + +Для Каждого ДанныеДокументов Из ТаблицаДокументов Цикл + + Отбор = Новый Структура("Документ", ДанныеДокументов.ПриходТовара); + ТоварыДокумента = ТаблицаТоваров.Скопировать(Отбор); + + ДокументОбъект = ДанныеДокументов.Документ.ПолучитьОбъект(); + ДокументОбъект.Товары.Загрузить(ТоварыДокумента); + ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); + + ТоварныеЗапасы = ДокументОбъект.Движения.ТоварныеЗапасы; + ТоварныеЗапасы.Прочитать(); + ТаблицаТоварныхЗапасов = ТоварныеЗапасы.Выгрузить(); + + Отбор = Новый Структура("Регистратор", ДанныеДокументов.ПриходТовара); + ОжидаемыеТоварныеЗапасы = ТаблицаДвижений.Скопировать(Отбор); + + Ютест.ОжидаетЧто(ТаблицаТоварныхЗапасов) + .Равно(ОжидаемыеТоварныеЗапасы); + +КонецЦикла; +``` + +#### Заменяемые значения + +Создание и заполнение объектов двойной вложенности и более (например, "Товар.Поставщик.ВидКонтрагента") не поддерживается. Если есть такая потребность, следует использовать переменную "ЗаменяемыеЗначения". Т.е. следует создать и заполнять нужный объект перед преобразованием табличного документа в таблицу значений, а затем передать его в функцию получения таблицы значений. + +```bsl +Поставщик = ЮТест.Данные().КонструкторОбъекта(Справочники.Контрагенты) + .Установить("ВидКонтрагента", ВидКонтрагента) + .Записать(); + +// В табличном документе должна быть колонка [Товар.Поставщик] со значением "Некий поставщик". +// В этом случае в таблицу значений проставится значение, полученное из соответствия +ЗаменяемыеЗначения = Новый Соответствие; +ЗаменяемыеЗначения.Вставить("Некий поставщик", Поставщик); + +ТаблицаЗначений = ЮТест.Данные().ЗагрузитьИзМакета( + ТабличныйДокумент, + ОписанияТипов, + Неопределено, + ЗаменяемыеЗначения +); + +ЮТест.ОжидаетЧто(ТаблицаЗначений) + .Свойство("[0].Товар.Поставщик.ВидКонтрагента").Равно(ВидКонтрагента); +``` + +#### Заменяемые значения и составные типы + +Можно использовать составные типы в колонках таблицы значений, но создание объектов метаданных для такой колонки не поддерживается. Можно воспользоваться соответствием "ЗаменяемыеЗначения", если потребуется в одну колонку записать значения разных типов. + +```bsl +ТипАналитики = Новый ОписаниеТипов("СправочникСсылка.Товары,СправочникСсылка.Контрагенты"); + +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("Аналитика", ТипАналитики); + +Поставщик = ЮТест.Данные().СоздатьЭлемент(Справочники.Контрагенты); +Товар = ЮТест.Данные().СоздатьЭлемент(Справочники.Товары); + +ЗаменяемыеЗначения = Новый Соответствие; +ЗаменяемыеЗначения.Вставить("Аналитика (Поставщик)", Поставщик); +ЗаменяемыеЗначения.Вставить("Аналитика (Товар)", Товар); + +ТаблицаЗначений = ЮТест.Данные().ЗагрузитьИзМакета( + ТабличныйДокумент, + ОписанияТипов, + Неопределено, + ЗаменяемыеЗначения +); + +ЮТест.ОжидаетЧто(ТаблицаЗначений) + .Свойство("[0].Аналитика").Равно(Поставщик) + .Свойство("[1].Аналитика").Равно(Товар) +; +``` + +#### Inline макеты, загрузка из Markdown + +При необходимости вы можете разместить таблицу с данными прямо в коде. + +:::tip +Если вы используете EDT, то удобнее редактировать многострочные строки в `Редакторе запроса` +::: + +```bsl +ТаблицаMarkDown = +"| Товар | Цена | Количество | Сумма | +||---------|-------|------------|-------| +|| Товар 1 | 100 | 1 | 100 | +|| Товар 2 | 2 000 | 1 | 2000 | +|| Услуга | 300,9 | 1 | 300,9 |"; + +ОписанияТипов = Новый Соответствие; +ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); +ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); +ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); + +Данные = ЮТест.Данные().ЗагрузитьИзМакета(ТаблицаMarkDown, ОписанияТипов); +``` diff --git a/documentation/docs/yaxunit-ui.md b/documentation/docs/yaxunit-ui.md index 7de903996..4e19a8022 100644 --- a/documentation/docs/yaxunit-ui.md +++ b/documentation/docs/yaxunit-ui.md @@ -1,27 +1,24 @@ # Графический интерфейс -## Интерфейс отчета +Расширение добавляет в командный интерфейс конфигурации новый раздел "Юнит тест". + +Из него вы можете интерактивно запускать тесты или сформировать файл конфигурации запуска. + +## Запуск тестов + +Для запуска и отладки тестов вы можете воспользоваться командой "Запуск тестов" + +Будут автоматически загружены все тесты и выведены в виде дерева сгруппированного по тестовым наборам (модулям). -Для просмотра результатов тестирования в режиме 1С:Предприятие, вам необходимо в параметрах запуска указать [настройку](run) `showReport` -Например, создав файла настроек - -```json -{ - "reportPath": "/tmp/settings/", - "filter": { - "extensions": [ - "tests" - ] - }, - "settings": { - "ВТранзакции": false - }, - "reportFormat": "jUnit", - "showReport": true -} -``` - -Мы получим примерно такой результат +![Запуск тестов](images/ui-run-tests.png) + +Из этой формы вы можете запустить нужные тесты. + +![Меню запуска](images/ui-run-menu.png) + +И сразу же увидеть результат прогона. + +## Интерфейс отчета ![Отчет](images/report-ui.png) diff --git a/documentation/src/pages/index.md b/documentation/src/pages/index.md index ec54d86a0..b908f6416 100644 --- a/documentation/src/pages/index.md +++ b/documentation/src/pages/index.md @@ -13,6 +13,9 @@ slug: / [![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=yaxunit) [![Maintainability](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=sqale_rating)](https://sonar.openbsl.ru/dashboard?id=yaxunit) +[![Build and test](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml) +[![Build ocumentation](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml) + Обсудить в [Telegram чате](https://t.me/BIAOpenTools/12) ---- diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" new file mode 100644 index 000000000..e50f685bc --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" @@ -0,0 +1,80 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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); + + Возврат Параметры; + +КонецФункции + +Функция НовыйПустойОбработчик1() Экспорт + + Возврат Новый ОписаниеОповещения("ПустойОбработчик1", ЭтотОбъект); + +КонецФункции + +Процедура ПустойОбработчик1(Параметр1) Экспорт + +КонецПроцедуры + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo" new file mode 100644 index 000000000..40696a31d --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo" @@ -0,0 +1,10 @@ + + + ЮТАсинхроннаяОбработкаСлужебныйКлиент + + ru + Асинхронная обработка служебный + + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" index 638979098..7bc722d23 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" @@ -116,7 +116,7 @@ Если ОдинРеквизит Тогда Возврат Неопределено; Иначе - Реквизиты = СтрСоединить(ПсеводнимыВыбираемыхПолей(ОписаниеЗапроса), ","); + Реквизиты = СтрСоединить(ПсевдонимыВыбираемыхПолей(ОписаниеЗапроса), ","); Возврат Новый Структура(Реквизиты); КонецЕсли; КонецЕсли; @@ -245,7 +245,7 @@ КонецФункции -Функция ПсеводнимыВыбираемыхПолей(ОписаниеЗапроса) +Функция ПсевдонимыВыбираемыхПолей(ОписаниеЗапроса) Псевдонимы = Новый Массив; diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" index f2a096b02..a7d1c724a 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" @@ -25,24 +25,94 @@ ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры"); ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска"); + ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПодключитьКомпоненты"); + ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация"); ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты"); ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование"); ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет"); ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата"); ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗавершить"); - ВызватьСледующийОбработчик(ПараметрыИсполнения); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения); КонецПроцедуры -Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт +Процедура ВыполнитьМодульноеТестированиеПоНастройке(ПараметрыЗапуска, ОбработчикЗавершения) Экспорт - Если Обработчик <> Неопределено Тогда - ВыполнитьОбработкуОповещения(Обработчик, Результат); - КонецЕсли; + ПараметрыИсполнения = ПараметрыИсполнения(); + ПараметрыИсполнения.ПараметрыЗапуска = ПараметрыЗапуска; + + ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация"); + ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты"); + ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование"); + ПараметрыИсполнения.Цепочка.Добавить(ОбработчикЗавершения); + + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения); КонецПроцедуры +Функция ПараметрыИсполнения() Экспорт + + Параметры = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки(); + Параметры.Вставить("АргументыЗапуска"); + Параметры.Вставить("ПараметрыЗапуска"); + Параметры.Вставить("ИсполняемыеТестовыеМодули"); + Параметры.Вставить("РезультатыТестирования"); + + Возврат Параметры; + +КонецФункции + +Функция ВыполнитьТестыМодуля(ТестовыйМодуль) Экспорт + + Результаты = Новый Массив(); + + КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения(); + + КлиентскиеНаборы = Новый Массив(); + СерверныеНаборы = Новый Массив(); + ПропущенныеНаборы = Новый Массив(); + + Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл + + Если НЕ Набор.Выполнять Тогда + ПропущенныеНаборы.Добавить(Набор); + Продолжить; + КонецЕсли; + + РежимИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим); + + Если РежимИсполнения = КонтекстыИсполнения.Клиент Тогда + КлиентскиеНаборы.Добавить(Набор); + ИначеЕсли РежимИсполнения = КонтекстыИсполнения.Сервер Тогда + СерверныеНаборы.Добавить(Набор); + Иначе + ПропущенныеНаборы.Добавить(Набор); + КонецЕсли; + + КонецЦикла; + + ТестовыйМодульОблегченный = ЮТОбщий.СкопироватьСтруктуру(ТестовыйМодуль); + ТестовыйМодульОблегченный.НаборыТестов = Новый Массив(); + + Если ЗначениеЗаполнено(КлиентскиеНаборы) Тогда + Результаты = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КлиентскиеНаборы, ТестовыйМодульОблегченный); + КонецЕсли; + + Если ЗначениеЗаполнено(СерверныеНаборы) Тогда + Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(СерверныеНаборы, ТестовыйМодульОблегченный); + ЮТЛогирование.ВывестиСерверныеСообщения(); + ЮТОбщий.ДополнитьМассив(Результаты, Результат); + КонецЕсли; + + ЮТОбщий.ДополнитьМассив(Результаты, ПропущенныеНаборы); + + ТестовыйМодульОблегченный.НаборыТестов = Результаты; + + Возврат ТестовыйМодульОблегченный; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -57,7 +127,7 @@ Процедура ОбработчикЗагрузитьПараметры(Результат, ДополнительныеПараметры) Экспорт - Обработчик = СледующийОбработчик(ДополнительныеПараметры); + Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры); ЮТПараметрыЗапуска.ПараметрыЗапуска(ДополнительныеПараметры.АргументыЗапуска, Обработчик); КонецПроцедуры @@ -70,70 +140,66 @@ Возврат; КонецЕсли; - ВызватьСледующийОбработчик(ДополнительныеПараметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры); КонецПроцедуры -Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт +Процедура ОбработчикИнициализация(Результат, ДополнительныеПараметры) Экспорт - Параметры = ДополнительныеПараметры.ПараметрыЗапуска; + ЮТСобытия.Инициализация(ДополнительныеПараметры.ПараметрыЗапуска); - ЮТКонтекст.ИнициализироватьКонтекст(); - ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings); - ЮТСобытия.Инициализация(Параметры); - // Повторно сохраним для передачи на сервер - ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения()); - ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения()); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры); + +КонецПроцедуры + +Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт ЮТСобытия.ПередЧтениеСценариев(); - ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Параметры); + + ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(ДополнительныеПараметры.ПараметрыЗапуска); ЮТСобытия.ПослеЧтенияСценариев(ТестовыеМодули); - КоллекцияКатегорийНаборов = Новый Массив(); + ИсполняемыеТестовыеМодули = Новый Массив(); Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл - КатегорииНаборов = КатегорииНаборовТестовМодуля(ТестовыйМодуль); - КоллекцияКатегорийНаборов.Добавить(КатегорииНаборов); + ИсполняемыйТестовыйМодуль = ИсполняемыйТестовыйМодуль(ТестовыйМодуль); + ИсполняемыеТестовыеМодули.Добавить(ИсполняемыйТестовыйМодуль); КонецЦикла; - ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов); - ДополнительныеПараметры.КоллекцияКатегорийНаборов = КоллекцияКатегорийНаборов; + ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули); + ДополнительныеПараметры.ИсполняемыеТестовыеМодули = ИсполняемыеТестовыеМодули; - ВызватьСледующийОбработчик(ДополнительныеПараметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры, ИсполняемыеТестовыеМодули); КонецПроцедуры Процедура ОбработчикВыполнитьТестирование(Результат, ДополнительныеПараметры) Экспорт + ЮТСобытия.ПередВыполнениемТестов(ДополнительныеПараметры.ИсполняемыеТестовыеМодули); + РезультатыТестирования = Новый Массив(); - КоллекцияКатегорийНаборов = ДополнительныеПараметры.КоллекцияКатегорийНаборов; - Для Каждого КатегорииНаборов Из КоллекцияКатегорийНаборов Цикл - - Результат = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль); - ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат); - - Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, КатегорииНаборов.ТестовыйМодуль); - ЮТЛогирование.ВывестиСерверныеСообщения(); - - ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат); + Для Каждого ТестовыйМодуль Из ДополнительныеПараметры.ИсполняемыеТестовыеМодули Цикл - ЮТОбщий.ДополнитьМассив(РезультатыТестирования, КатегорииНаборов.Пропущенные); + РезультатыПрогонаМодуля = ВыполнитьТестыМодуля(ТестовыйМодуль); + РезультатыТестирования.Добавить(РезультатыПрогонаМодуля); КонецЦикла; + ЮТСобытия.ПослеВыполненияТестов(РезультатыТестирования); + ДополнительныеПараметры.РезультатыТестирования = РезультатыТестирования; - ВызватьСледующийОбработчик(ДополнительныеПараметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры, РезультатыТестирования); КонецПроцедуры Процедура ОбработчикСохранитьОтчет(Результат, ДополнительныеПараметры) Экспорт Если ЗначениеЗаполнено(ДополнительныеПараметры.ПараметрыЗапуска.reportPath) Тогда - Обработчик = СледующийОбработчик(ДополнительныеПараметры); + Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры); ЮТОтчет.СформироватьОтчет(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска, Обработчик); Иначе - ВызватьСледующийОбработчик(ДополнительныеПараметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры); КонецЕсли; КонецПроцедуры @@ -141,7 +207,7 @@ Процедура ОбработчикСохранитьКодВозврата(Результат, ДополнительныеПараметры) Экспорт ЗаписатьКодВозврата(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска); - ВызватьСледующийОбработчик(ДополнительныеПараметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры); КонецПроцедуры @@ -158,25 +224,37 @@ КонецПроцедуры +Процедура ОбработчикПодключитьКомпоненты(Результат, ДополнительныеПараметры) Экспорт + + Если ДополнительныеПараметры.ПараметрыЗапуска.ПодключатьВнешниеКомпоненты Тогда + Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры); + ЮТКомпонентыКлиент.ТихаяУстановкаКомпонент(Обработчик); + Иначе + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти -Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено) +#Область ОбработчикиСобытий + +Процедура Инициализация(Параметры) Экспорт - Обработчик = СледующийОбработчик(ПараметрыИсполнения); - ЮТЛогирование.Отладка("Вызов обработчика исполнителя: " + Обработчик.ИмяПроцедуры); - ВыполнитьОбработкуОповещения(Обработчик, Результат); + ЮТКонтекст.ИнициализироватьКонтекст(); + ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings); + // Повторно сохраним для передачи на сервер + ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения()); КонецПроцедуры -Функция СледующийОбработчик(ПараметрыИсполнения) - - ПараметрыИсполнения.ИндексСледующегоОбработчика = ПараметрыИсполнения.ИндексСледующегоОбработчика + 1; - Обработчик = ПараметрыИсполнения.Цепочка[ПараметрыИсполнения.ИндексСледующегоОбработчика]; - ЮТЛогирование.Отладка("Следующий обработчик исполнителя: " + Обработчик.ИмяПроцедуры); +Процедура ПередВыполнениемТестов(ИсполняемыеМодули) Экспорт - Возврат Обработчик; + ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения()); -КонецФункции +КонецПроцедуры + +#КонецОбласти Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, ИмяМетода) @@ -185,25 +263,46 @@ КонецПроцедуры -Функция ПараметрыИсполнения() +Функция ИсполняемыйТестовыйМодуль(ТестовыйМодуль) - Параметры = Новый Структура(); - Параметры.Вставить("АргументыЗапуска"); - Параметры.Вставить("ПараметрыЗапуска"); - Параметры.Вставить("Цепочка", Новый Массив()); - Параметры.Вставить("ИндексСледующегоОбработчика", -1); - Параметры.Вставить("КоллекцияКатегорийНаборов"); - Параметры.Вставить("РезультатыТестирования"); + ИсполняемыйТестовыйМодуль = ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля(ТестовыйМодуль); - Возврат Параметры; + КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения(); + КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля); + КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения(); + + ИсполняемыйТестовыйМодуль.НаборыТестов = ИсполняемыеНаборыМодуля(ТестовыйМодуль); + + Для Каждого Набор Из ИсполняемыйТестовыйМодуль.НаборыТестов Цикл + + КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим); + + ОшибкаКонтекста = Неопределено; + Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда + ОшибкаКонтекста = "Неподдерживаемый режим запуска"; + ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда + ОшибкаКонтекста = "Модуль не доступен в этом контексте"; + ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда + ОшибкаКонтекста = "Неизвестный контекст/режим исполнения"; + КонецЕсли; + + Если ОшибкаКонтекста <> Неопределено Тогда + Набор.Выполнять = Ложь; + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста); + Для Каждого Тест Из Набор.Тесты Цикл + ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста); + КонецЦикла; + КонецЕсли; + + КонецЦикла; + + Возврат ИсполняемыйТестовыйМодуль; КонецФункции -Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль) - - КатегорииНаборов = ЮТФабрика.ОписаниеКатегорияНабораТестов(ТестовыйМодуль); +Функция ИсполняемыеНаборыМодуля(ТестовыйМодуль) - ИсполняемыеТестовыеНаборы = Новый Массив; + Результат = Новый Массив(); Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл @@ -233,68 +332,21 @@ Если НаборыКонтекстов.Количество() Тогда Для Каждого Элемент Из НаборыКонтекстов Цикл - ИсполняемыеТестовыеНаборы.Добавить(Элемент.Значение); + Результат.Добавить(Элемент.Значение); КонецЦикла; - Иначе - - // TODO. Корякин А. 2021.11.24 А надо ли добавлять при отсутствии тестов - ИсполняемыеТестовыеНаборы.Добавить(ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль)); - КонецЕсли; КонецЦикла; - КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения(); - КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля); - КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения(); - - Для Каждого Набор Из ИсполняемыеТестовыеНаборы Цикл - - КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим); - - ОшибкаКонтекста = Неопределено; - Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда - ОшибкаКонтекста = "Неподдерживаемый режим запуска"; - ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда - ОшибкаКонтекста = "Модуль не доступен в этом контексте"; - ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда - ОшибкаКонтекста = "Неизвестный контекст/режим исполнения"; - КонецЕсли; - - Если ОшибкаКонтекста <> Неопределено Тогда - Набор.Выполнять = Ложь; - ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста); - Для Каждого Тест Из Набор.Тесты Цикл - ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста); - КонецЦикла; - КонецЕсли; - - Если НЕ Набор.Выполнять Тогда - КатегорииНаборов.Пропущенные.Добавить(Набор); - Продолжить; - КонецЕсли; - - Если КонтекстИсполнения = КонтекстыИсполнения.Сервер Тогда - - КатегорииНаборов.Серверные.Добавить(Набор); - - ИначеЕсли КонтекстИсполнения = КонтекстыИсполнения.Клиент Тогда - - КатегорииНаборов.Клиентские.Добавить(Набор); - - КонецЕсли; - - КонецЦикла; - - Возврат КатегорииНаборов; + Возврат Результат; КонецФункции Процедура ПоказатьОтчет(РезультатыТестирования, Параметры) Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры); - АдресДанных = ПоместитьВоВременноеХранилище(Данные); + АдресДанных = ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор()); ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная", Новый Структура("АдресХранилища", АдресДанных)); @@ -303,7 +355,7 @@ // Записать код возврата. // // Параметры: -// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля // Параметры - см. ЮТФабрика.ПараметрыЗапуска Процедура ЗаписатьКодВозврата(РезультатыТестирования, Параметры) @@ -313,20 +365,28 @@ Возврат; КонецЕсли; - Для Каждого Набор Из РезультатыТестирования Цикл - - Если ЗначениеЗаполнено(Набор.Ошибки) Тогда - Успешно = Ложь; - Прервать; - КонецЕсли; + Для Каждого Модуль Из РезультатыТестирования Цикл - Для Каждого Тест Из Набор.Тесты Цикл + Для Каждого Набор Из Модуль.НаборыТестов Цикл - Если ЗначениеЗаполнено(Тест.Ошибки) Тогда + Если ЗначениеЗаполнено(Набор.Ошибки) Тогда Успешно = Ложь; Прервать; КонецЕсли; + Для Каждого Тест Из Набор.Тесты Цикл + + Если ЗначениеЗаполнено(Тест.Ошибки) Тогда + Успешно = Ложь; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если НЕ Успешно Тогда + Прервать; + КонецЕсли; + КонецЦикла; Если НЕ Успешно Тогда @@ -345,4 +405,20 @@ КонецПроцедуры +Функция НаборыТестовРежима(ТестовыйМодуль, ОжидаемыйРежимИсполнения) + + Результат = Новый Массив(); + + Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл + + Если Набор.Выполнять И ЮТФабрика.КонтекстИсполнения(Набор.Режим) = ОжидаемыйРежимИсполнения Тогда + Результат.Добавить(Набор); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" index 52f420d5f..5ca0daa8d 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" @@ -21,7 +21,7 @@ // Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер) // Параметры: // Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Наборы тестов модуля -// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля +// ТестовыйМодуль - см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля // // Возвращаемое значение: // Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Module.bsl" new file mode 100644 index 000000000..29aa27ece --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Module.bsl" @@ -0,0 +1,160 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область ПрограммныйИнтерфейс + +// Возвращает внешнюю компоненту, реализующую паузу +// Предоставляет метод `Ожидать`, `Sleep` +// +// Возвращаемое значение: +// ВнешнийОбъект +Функция Пауза() Экспорт + + Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза(), Истина); + +КонецФункции + +// Возвращает внешнюю компоненту, реализующую вывод в консоль +// Предоставляет метод `Напечатать`, `Print` +// +// Возвращаемое значение: +// ВнешнийОбъект +Функция Консоль() Экспорт + + Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза(), Истина); + +КонецФункции + +// Возвращает внешнюю компоненту, реализующую функциональность регулярных выражений +// Подробнее с документацией можно ознакомиться по ссылке: https://github.com/alexkmbk/RegEx1CAddin +// +// Возвращаемое значение: +// ВнешнийОбъект +Функция РегулярныеВыражения() Экспорт + +#Если НЕ Сервер Тогда + Если НЕ ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда + ВызватьИсключение "Компонента регулярных выражений не доступна на клиенте при отключении синхронных вызовов"; + КонецЕсли; +#КонецЕсли + + Компонента = СоздатьКомпоненту(ОписаниеКомпонентыРегулярныхВыражений()); + Компонента.ВызыватьИсключения = Истина; + Возврат Компонента; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Создает внешнюю компоненту по описанию +// +// Параметры: +// ОписаниеКомпоненты - см. ОписаниеКомпоненты +// Кэшировать - Булево - Кэшировать созданную компоненту +// +// Возвращаемое значение: +// ВнешнийОбъект +Функция СоздатьКомпоненту(ОписаниеКомпоненты, Кэшировать = Ложь) Экспорт + + Если Кэшировать Тогда + Возврат ЮТПовторногоИспользования.СоздатьКомпоненту(ОписаниеКомпоненты); + КонецЕсли; + +#Если Сервер Тогда + Подключена = ПодключитьКомпоненту(ОписаниеКомпоненты.ИмяМакета, ОписаниеКомпоненты.ИмяКомпоненты, Истина); +#Иначе + Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда + Подключена = ПодключитьКомпоненту(ОписаниеКомпоненты.ИмяМакета, ОписаниеКомпоненты.ИмяКомпоненты, Истина); + Иначе + Подключена = Истина; // Подключены при старте системы + КонецЕсли; +#КонецЕсли + + Если Подключена Тогда + Возврат Новый (ОписаниеКомпоненты.ИмяКласса); + Иначе + ВызватьИсключение "Не удалось подключить внешнюю компоненту " + ОписаниеКомпоненты.ИмяКласса; + КонецЕсли; + +КонецФункции + +// Подключает внещнюю компоненту из макета +// +// Параметры: +// ИмяМакета - Строка - Имя макета, в котором хранится компонента +// ИмяКомпоненты - Строка - Имя компоненты +// Кэшировать - Булево - Кэшировать создание компоненты +// +// Возвращаемое значение: +// Булево - Успешность подключения +Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Кэшировать) Экспорт + + Если Кэшировать Тогда + Возврат ЮТПовторногоИспользования.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты); + КонецЕсли; + + Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native); + +КонецФункции + +// Описание компоненты реализующей паузу. +// +// Возвращаемое значение: +// см. ОписаниеКомпоненты +Функция ОписаниеКомпонентыПауза() Экспорт + + Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТYaxUnitAddIn", "YaxUnitAddin", "Common"); + +КонецФункции + +// Описание компоненты реализующей функциональность регулярных выражений. +// +// Возвращаемое значение: +// см. ОписаниеКомпоненты +Функция ОписаниеКомпонентыРегулярныхВыражений() Экспорт + + Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТRegEx1CAddin", "RegEx1CAddin", "RegEx"); + +КонецФункции + +// Описание внешней компоненты. +// +// Параметры: +// ИмяМакета - Строка - Имя макета, в котором хранится компонента +// ИмяКомпоненты - Строка -Имя компоненты +// ИмяКласса - Строка - Имя класса, по которому создается компонента +// +// Возвращаемое значение: +// Структура - Описание компоненты: +// * ИмяМакета - Строка - Имя макета, в котором хранится компонента +// * ИмяКомпоненты - Строка -Имя компоненты +// * ИмяКласса - Строка - Имя класса +Функция ОписаниеКомпоненты(ИмяМакета, ИмяКомпоненты, ИмяКласса) Экспорт + + Описание = Новый Структура; + Описание.Вставить("ИмяМакета", ИмяМакета); + Описание.Вставить("ИмяКомпоненты", ИмяКомпоненты); + Описание.Вставить("ИмяКласса", СтрШаблон("AddIn.%1.%2", ИмяКомпоненты, ИмяКласса)); + + Возврат Описание; + +КонецФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213.mdo" new file mode 100644 index 000000000..2a4b2c61b --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213.mdo" @@ -0,0 +1,11 @@ + + + ЮТКомпоненты + + ru + Компоненты + + true + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" new file mode 100644 index 000000000..ec01d6304 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" @@ -0,0 +1,108 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ФайлКомпоненты(Знач ИмяМакета, Знач ОперационнаяСистема, Знач Архитектура) Экспорт + + Данные = ЮТОбщийВызовСервера.Макет(ИмяМакета); + ЧтениеАрхива = Новый ЧтениеZipФайла(); + ЧтениеАрхива.Открыть(Данные.ОткрытьПотокДляЧтения()); + + ИмяФайлаКомпоненты = ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура); + + Если ИмяФайлаКомпоненты = Неопределено Тогда + ВызватьИсключение "Компонента не поддерживает клиентское окружение"; + КонецЕсли; + + Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайлаКомпоненты); + + Возврат Новый ФиксированнаяСтруктура("ИмяФайла, Данные", ИмяФайлаКомпоненты, Данные); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура) + + Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, "MANIFEST.XML"); + + Если Данные = Неопределено Тогда + ВызватьИсключение "Архив компоненты не содержит манифеста"; + КонецЕсли; + + ЧтениеXML = Новый ЧтениеXML(); + ЧтениеXML.ОткрытьПоток(Данные.ОткрытьПотокДляЧтения()); + + ИмяФайлаКомпоненты = Неопределено; + + Пока ЧтениеXML.Прочитать() Цикл + + Если ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура) Тогда + ИмяФайлаКомпоненты = ЧтениеXML.ЗначениеАтрибута("path"); + Прервать; + КонецЕсли; + + КонецЦикла; + + ЧтениеXML.Закрыть(); + + Возврат ИмяФайлаКомпоненты; + +КонецФункции + +Функция ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура) + + Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента ИЛИ СтрСравнить(ЧтениеXML.Имя, "component") <> 0 Тогда + Возврат Ложь; + КонецЕсли; + + ОперационнаяСистемаУзла = ЧтениеXML.ЗначениеАтрибута("os"); + АрхитектураУзла = ЧтениеXML.ЗначениеАтрибута("arch"); + + Возврат ОперационнаяСистема = ОперационнаяСистемаУзла И Архитектура = АрхитектураУзла; + +КонецФункции + +Функция ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайла) + + ЭлементФайла = Неопределено; + + Для Каждого Элемент Из ЧтениеАрхива.Элементы Цикл + Если СтрСравнить(Элемент.ПолноеИмя, ИмяФайла) = 0 Тогда + ЭлементФайла = Элемент; + КонецЕсли; + КонецЦикла; + + Если ЭлементФайла = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ЧтениеАрхива.Извлечь(ЭлементФайла, ИмяВременногоФайла, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + + Данные = Новый ДвоичныеДанные(ЮТФайлы.ОбъединитьПути(ИмяВременногоФайла, ИмяФайла)); + УдалитьФайлы(ИмяВременногоФайла); + + Возврат Данные; + +КонецФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo" new file mode 100644 index 000000000..2fdf4a25f --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo" @@ -0,0 +1,10 @@ + + + ЮТКомпонентыВызовСервера + + ru + Компоненты вызов сервера + + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" new file mode 100644 index 000000000..5480d3b5c --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" @@ -0,0 +1,217 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ТихаяУстановкаКомпонент(ОбработчикЗавершения) Экспорт + + ПараметрыТихойУстановки = ПараметрыТихойУстановки(); + ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыПауза()); + ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыРегулярныхВыражений()); + + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки, + ЭтотОбъект, + "УстановитьПараметрыОкружения"); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки, + ЭтотОбъект, + "ТихаяУстановкаВнешнихКомпонент"); + + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки, + ЭтотОбъект, + "ТихаяУстановкаВнешнихКомпонент"); + Если НЕ ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки, + ЭтотОбъект, + "ПодключениеВнешнихКомпонент"); + КонецЕсли; + + ПараметрыТихойУстановки.Цепочка.Добавить(ОбработчикЗавершения); + + Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ПараметрыТихойУстановки); + НачатьПолучениеРабочегоКаталогаДанныхПользователя(Обработчик); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПараметрыТихойУстановки() + + ПараметрыТихойУстановки = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки(); + ПараметрыТихойУстановки.Вставить("Компоненты", Новый Массив()); + ПараметрыТихойУстановки.Вставить("РабочийКаталог", ""); + ПараметрыТихойУстановки.Вставить("ОперационнаяСистема", ""); + ПараметрыТихойУстановки.Вставить("Архитектура", ""); + ПараметрыТихойУстановки.Вставить("ДанныеРеестра", ""); + ПараметрыТихойУстановки.Вставить("ИзмененРеестр", Ложь); + ПараметрыТихойУстановки.Вставить("ПодключенныеКомпоненты", Новый Массив()); + + Возврат ПараметрыТихойУстановки; + +КонецФункции + +Процедура УстановитьПараметрыОкружения(Результат, ПараметрыТихойУстановки) Экспорт + + КорневойКаталог = ЮТФайлы.ОбъединитьПути(Результат, "..", "..", ".."); + КаталогКомпонент = ЮТФайлы.ОбъединитьПути(КорневойКаталог, "ExtCompT"); + + ПараметрыТихойУстановки.РабочийКаталог = КаталогКомпонент; + Информация = Новый СистемнаяИнформация(); + ОперационнаяСистема = Неопределено; + Архитектура = Неопределено; + + Linux = "Linux"; + Windows = "Windows"; + MacOS = "MacOS"; + + x86 = "i386"; + x64 = "x86_64"; + + ТипКлиентскойПлатформы = Информация.ТипПлатформы; + + Если ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86 Тогда + ОперационнаяСистема = Linux; + Архитектура = x86; + ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86_64 Тогда + ОперационнаяСистема = Linux; + Архитектура = x64; + ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86 Тогда + ОперационнаяСистема = Windows; + Архитектура = x86; + ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86_64 Тогда + ОперационнаяСистема = Windows; + Архитектура = x64; + ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86 Тогда + ОперационнаяСистема = MacOS; + Архитектура = x86; + ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86_64 Тогда + ОперационнаяСистема = MacOS; + Архитектура = x64; + Иначе + ЮТИсполнительКлиент.ОбработкаОшибки("Неподдерживаемый тип платформы"); + КонецЕсли; + + ПараметрыТихойУстановки.ОперационнаяСистема = ОперационнаяСистема; + ПараметрыТихойУстановки.Архитектура = Архитектура; + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки); + +КонецПроцедуры + +Процедура ПрочитатьФайлRegistry(ПараметрыТихойУстановки) Экспорт + +#Если ВебКлиент Тогда + ЮТИсполнительКлиент.ОбработкаОшибки(ЮТОбщий.МетодНеДоступен("ЮТКомпонентыКлиент.ПрочитатьФайлRegistry")); + Возврат; +#Иначе + ФайлРеестра = ЮТФайлы.ОбъединитьПути(ПараметрыТихойУстановки.РабочийКаталог, "registry.xml"); + Чтение = Новый ЧтениеТекста(ФайлРеестра); + Данные = Чтение.Прочитать(); + Чтение.Закрыть(); + ПараметрыТихойУстановки.ДанныеРеестра = Данные; + +#КонецЕсли + +КонецПроцедуры + +Процедура ЗаписатьФайлRegistry(ПараметрыТихойУстановки) Экспорт + +#Если ВебКлиент Тогда + ЮТИсполнительКлиент.ОбработкаОшибки(ЮТОбщий.МетодНеДоступен("ЮТКомпонентыКлиент.ЗаписатьФайлRegistry")); + Возврат; +#Иначе + Если ПараметрыТихойУстановки.ИзмененРеестр Тогда + ФайлРеестра = ЮТФайлы.ОбъединитьПути(ПараметрыТихойУстановки.РабочийКаталог, "registry.xml"); + Запись = Новый ЗаписьТекста(ФайлРеестра); + Запись.Записать(ПараметрыТихойУстановки.ДанныеРеестра); + Запись.Закрыть(); + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +Процедура ТихаяУстановкаВнешнихКомпонент(Результат, ПараметрыТихойУстановки) Экспорт + + ПрочитатьФайлRegistry(ПараметрыТихойУстановки); + + Для Каждого Компонента Из ПараметрыТихойУстановки.Компоненты Цикл + ТихаяУстановкаВнешнейКомпоненты(Компонента, ПараметрыТихойУстановки); + КонецЦикла; + + ЗаписатьФайлRegistry(ПараметрыТихойУстановки); + + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки); + +КонецПроцедуры + +Процедура ПодключениеВнешнихКомпонент(Результат, ПараметрыТихойУстановки) Экспорт + + КомпонентаДляПодключения = Неопределено; + + Для Каждого Компонента Из ПараметрыТихойУстановки.Компоненты Цикл + Если ПараметрыТихойУстановки.ПодключенныеКомпоненты.Найти(Компонента) = Неопределено Тогда + КомпонентаДляПодключения = Компонента; + Прервать; + КонецЕсли; + КонецЦикла; + + Если КомпонентаДляПодключения = Неопределено Тогда + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки); + КонецЕсли; + + ПараметрыТихойУстановки.ПодключенныеКомпоненты.Добавить(КомпонентаДляПодключения); + Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ТекущийОбработчик(ПараметрыТихойУстановки); + НачатьПодключениеВнешнейКомпоненты(Обработчик, + КомпонентаДляПодключения.ИмяМакета, + КомпонентаДляПодключения.ИмяКомпоненты, + ТипВнешнейКомпоненты.Native); + +КонецПроцедуры + +Процедура ТихаяУстановкаВнешнейКомпоненты(Компонента, Параметры) + + ДанныеФайла = ЮТКомпонентыВызовСервера.ФайлКомпоненты(Компонента.ИмяМакета, Параметры.ОперационнаяСистема, Параметры.Архитектура); + + Если ЗаписатьВРеестр(Параметры.ДанныеРеестра, ДанныеФайла.ИмяФайла) Тогда + Параметры.ИзмененРеестр = Истина; + КонецЕсли; + + ФайлКомпоненты = ЮТФайлы.ОбъединитьПути(Параметры.РабочийКаталог, ДанныеФайла.ИмяФайла); + ДанныеФайла.Данные.Записать(ФайлКомпоненты); + +КонецПроцедуры + +Функция ЗаписатьВРеестр(ДанныеРеестра, ИмяФайла) + + Если СтрНайти(ДанныеРеестра, " + | + | + |", ИмяФайла); + ИначеЕсли СтрНайти(ДанныеРеестра, СтрШаблон("path=""%1""", ИмяФайла)) <> 0 Тогда // Компонента уже зарегистрированна + Возврат Ложь; + Иначе // Добавляем компоненту + Запись = СтрШаблон(" ", ИмяФайла); + ДанныеРеестра = СтрЗаменить(ДанныеРеестра, "", Запись + Символы.ПС + ""); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202.mdo" new file mode 100644 index 000000000..3a4492e06 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202.mdo" @@ -0,0 +1,10 @@ + + + ЮТКомпонентыКлиент + + ru + Компоненты клиент + + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" index bb9daf196..0cfef8464 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" @@ -30,7 +30,9 @@ КонецПроцедуры -Процедура Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт +Процедура Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения, Знач ОграничениеТипа) Экспорт + + ЮТПроверкиСлужебный.ПроверитьТипПараметра(ОграничениеТипа, "Тип, ОписаниеТипов, Строка", "Фикция", "ЮТКонструкторТестовыхДанных", Истина); Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда ОписаниеРеквизита = Контекст.Метаданные.ТабличныеЧасти[Контекст.ТекущаяТабличнаяЧасть][ИмяРеквизита]; @@ -40,7 +42,14 @@ ТекущаяЗапись = Контекст.Данные; КонецЕсли; - Значение = ЮТТестовыеДанныеСлужебный.Фикция(ОписаниеРеквизита.Тип, РеквизитыЗаполнения); + Если ОграничениеТипа <> Неопределено Тогда + ПолноеИмяРеквизита = ЮТОбщий.ДобавитьСтроку(Контекст.ТекущаяТабличнаяЧасть, ИмяРеквизита, "."); + ТипЗначения = ПересечениеТипов(ОписаниеРеквизита.Тип, ОграничениеТипа, ПолноеИмяРеквизита); + Иначе + ТипЗначения = ОписаниеРеквизита.Тип; + КонецЕсли; + + Значение = ЮТТестовыеДанныеСлужебный.Фикция(ТипЗначения, РеквизитыЗаполнения); ТекущаяЗапись.Вставить(ИмяРеквизита, Значение); КонецПроцедуры @@ -175,7 +184,7 @@ // Структура - Новый контекст конструктора: // * Менеджер - Произвольный // * Данные - Структура -// * Метаданные - см. ЮТМетаданные.ОписаниеОбъектМетаданных +// * Метаданные - см. ЮТМетаданные.ОписаниеОбъектаМетаданных // * ТекущаяТабличнаяЧасть - Строка // * ДополнительныеСвойства - Структура Функция НовыйКонтекстКонструктора(Менеджер) Экспорт @@ -183,7 +192,7 @@ Контекст = Новый Структура("Менеджер, Данные, Метаданные", Менеджер, Новый Структура()); Контекст.Вставить("Менеджер", Менеджер); Контекст.Вставить("Данные", Новый Структура()); - Контекст.Вставить("Метаданные", ЮТМетаданные.ОписаниеОбъектМетаданных(Менеджер)); + Контекст.Вставить("Метаданные", ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер)); Контекст.Вставить("ТекущаяТабличнаяЧасть", ""); Контекст.Вставить("ДополнительныеСвойства", Новый Структура()); @@ -197,4 +206,39 @@ КонецФункции +Функция ПересечениеТипов(Знач ОписаниеТипов, Знач ОграничениеТипов, ИмяРеквизита) + + ТипОграничения = ТипЗнч(ОграничениеТипов); + + Если ТипОграничения = Тип("Строка") Тогда + ОграничениеТипов = Новый ОписаниеТипов(ОграничениеТипов); + ТипОграничения = Тип("ОписаниеТипов"); + КонецЕсли; + + Если ТипОграничения = Тип("Тип") И ОписаниеТипов.СодержитТип(ОграничениеТипов) И ОграничениеТипов <> Тип("Неопределено") Тогда + Результат = ЮТОбщий.ЗначениеВМассиве(ОграничениеТипов); + ИначеЕсли ТипОграничения = Тип("ОписаниеТипов") Тогда + Результат = ЮТОбщий.ПересечениеМассивов(ОписаниеТипов.Типы(), ОграничениеТипов.Типы()); + Иначе + Результат = Неопределено; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Результат) Тогда + + Сообщение = СтрШаблон("Исправьте ограничение типов для реквизита `%1` (`%2`), оно не входит в множество типов реквизита (`%3`)", + ИмяРеквизита, + ОграничениеТипов, + ОписаниеТипов); + ВызватьИсключение Сообщение; + + КонецЕсли; + + Возврат Новый ОписаниеТипов(Результат, + ОписаниеТипов.КвалификаторыЧисла, + ОписаниеТипов.КвалификаторыСтроки, + ОписаниеТипов.КвалификаторыДаты, + ОписаниеТипов.КвалификаторыДвоичныхДанных); + +КонецФункции + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl" index c447efb9e..e852d7cb1 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl" @@ -16,7 +16,7 @@ // //©///////////////////////////////////////////////////////////////////////////©// -#Область СлужебныйПрограммныйИнтерфейс +#Область ПрограммныйИнтерфейс // Возвращает значение контекста // diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl" index abb848b40..ad386ced4 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl" @@ -62,12 +62,12 @@ #Если Клиент Тогда Контекст = Контекст(); - Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.ДоступенНаСервере Тогда + Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.ФайлЛогаДоступенНаСервере Тогда Возврат; КонецЕсли; Сообщения = ЮТЛогированиеВызовСервера.НакопленныеСообщенияЛогирования(Истина); - ЗаписатьСообщения(Контекст.ФайлЛога, Сообщения); + ЗаписатьСообщения(Контекст, Сообщения); #Иначе ВызватьИсключение "Метод вывода серверных сообщений в лог должен вызываться с клиента"; #КонецЕсли @@ -86,13 +86,16 @@ // ПараметрыЗапуска - см. ЮТФабрика.ПараметрыЗапуска Процедура Инициализация(ПараметрыЗапуска) Экспорт + УровниЛога = УровниЛога(); + ДанныеКонтекста = НовыйДанныеКонтекста(); - ДанныеКонтекста.ФайлЛога = ПараметрыЗапуска.logging.file; + ДанныеКонтекста.ФайлЛога = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "file"); + ДанныеКонтекста.ВыводВКонсоль = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "console", Ложь); + ДанныеКонтекста.Включено = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "enable", Неопределено); + УровеньЛога = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "level", УровниЛога.Отладка); - Если ПараметрыЗапуска.logging.enable = Неопределено Тогда - ДанныеКонтекста.Включено = ЗначениеЗаполнено(ДанныеКонтекста.ФайлЛога); - Иначе - ДанныеКонтекста.Включено = ПараметрыЗапуска.logging.enable; + Если ДанныеКонтекста.Включено = Неопределено Тогда + ДанныеКонтекста.Включено = ДанныеКонтекста.ВыводВКонсоль ИЛИ ЗначениеЗаполнено(ДанныеКонтекста.ФайлЛога); КонецЕсли; Если НЕ ДанныеКонтекста.Включено Тогда @@ -100,24 +103,24 @@ Возврат; КонецЕсли; - УровниЛога = УровниЛога(); - - Если СтрСравнить(ПараметрыЗапуска.logging.level, УровниЛога.Ошибка) = 0 Тогда + Если СтрСравнить(УровеньЛога, УровниЛога.Ошибка) = 0 Тогда ДанныеКонтекста.УровеньЛога = 2; - ИначеЕсли СтрСравнить(ПараметрыЗапуска.logging.level, УровниЛога.Информация) = 0 Тогда + ИначеЕсли СтрСравнить(УровеньЛога, УровниЛога.Информация) = 0 Тогда ДанныеКонтекста.УровеньЛога = 1; Иначе ДанныеКонтекста.УровеньЛога = 0; КонецЕсли; ЗначениеПроверки = Строка(Новый УникальныйИдентификатор()); - ЗаписатьСообщения(ДанныеКонтекста.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(ЗначениеПроверки), Ложь); - ДанныеКонтекста.ДоступенНаСервере = ЮТЛогированиеВызовСервера.ФайлЛогаДоступенНаСервере(ДанныеКонтекста.ФайлЛога, ЗначениеПроверки); + ЗаписатьСообщения(ДанныеКонтекста, ЮТОбщий.ЗначениеВМассиве(ЗначениеПроверки), Ложь); + + ДанныеКонтекста.ФайлЛогаДоступенНаСервере = ЮТЛогированиеВызовСервера.ФайлЛогаДоступенНаСервере(ДанныеКонтекста.ФайлЛога, ЗначениеПроверки); ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования(), ДанныеКонтекста, Истина); Разделитель = "------------------------------------------------------"; - ЗаписатьСообщения(ДанныеКонтекста.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(Разделитель), Ложь); + ЗаписатьСообщения(ДанныеКонтекста, ЮТОбщий.ЗначениеВМассиве(Разделитель), Ложь); + Информация("Старт"); КонецПроцедуры @@ -162,19 +165,19 @@ // Обработка события "ПослеФормированияИсполняемыхНаборовТестов" // Параметры: -// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов -Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт +// ИсполняемыеТестовыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля - Набор исполняемых наборов +Процедура ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули) Экспорт Количество = 0; - Для Каждого Наборы Из КоллекцияКатегорийНаборов Цикл - - Для Каждого Набор Из Наборы.Клиентские Цикл - ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество()); - КонецЦикла; + Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл - Для Каждого Набор Из Наборы.Серверные Цикл - ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество()); + Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл + + Если Набор.Выполнять Тогда + ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество()); + КонецЕсли; + КонецЦикла; КонецЦикла; @@ -228,6 +231,10 @@ Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт Контекст = Контекст(); + Если НЕ ЛогированиеВключено(Контекст) Тогда + Возврат; + КонецЕсли; + ЮТОбщий.Инкремент(Контекст.КоличествоВыполненныхТестов); Информация(СтрШаблон("%1 Завершен тест `%2`", Прогресс(), ОписаниеСобытия.Тест.Имя)); @@ -249,9 +256,12 @@ // ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт + Контекст = Контекст(); + Если НЕ ЛогированиеВключено(Контекст) Тогда + Возврат; + КонецЕсли; #Если Клиент Тогда - Прогресс = Контекст().КоличествоВыполненныхТестов; - ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования() + ".КоличествоВыполненныхТестов", Прогресс, Истина); + ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования() + ".КоличествоВыполненныхТестов", Контекст.КоличествоВыполненныхТестов, Истина); #КонецЕсли Информация(СтрШаблон("Завершен модуль `%1`", ОписаниеСобытия.Модуль.МетаданныеМодуля.ПолноеИмя)); @@ -284,7 +294,8 @@ // Структура - Новый данные контекста: // * Включено - Булево - Логирование включено // * ФайлЛога - Неопределено - Файл вывода лога -// * ДоступенНаСервере - Булево - Файл лога доступен на сервере +// * ВыводВКонсоль- Булево - Вывод лога в консоль +// * ФайлЛогаДоступенНаСервере - Булево - Файл лога доступен на сервере // * НакопленныеЗаписи - Массив из Строка - Буфер для серверных сообщений // * ОбщееКоличествоТестов - Число // * КоличествоВыполненныхТестов - Число @@ -294,7 +305,8 @@ ДанныеКонтекста = Новый Структура(); ДанныеКонтекста.Вставить("Включено", Ложь); ДанныеКонтекста.Вставить("ФайлЛога", Неопределено); - ДанныеКонтекста.Вставить("ДоступенНаСервере", Ложь); + ДанныеКонтекста.Вставить("ВыводВКонсоль", Ложь); + ДанныеКонтекста.Вставить("ФайлЛогаДоступенНаСервере", Ложь); ДанныеКонтекста.Вставить("НакопленныеЗаписи", Новый Массив()); ДанныеКонтекста.Вставить("ОбщееКоличествоТестов", 0); ДанныеКонтекста.Вставить("КоличествоВыполненныхТестов", 0); @@ -308,6 +320,16 @@ #Область Запись +Функция ЛогированиеВключено(Знач Контекст = Неопределено, Приоритет = Неопределено) + + Если Контекст = Неопределено Тогда + Контекст = Контекст(); + КонецЕсли; + + Возврат Контекст <> Неопределено И Контекст.Включено И (Приоритет = Неопределено ИЛИ Контекст.УровеньЛога <= Приоритет); + +КонецФункции + Функция НакопленныеСообщенияЛогирования(Очистить = Ложь) Экспорт Контекст = Контекст(); @@ -325,7 +347,7 @@ Процедура Записать(УровеньЛога, Сообщение, Приоритет) Контекст = Контекст(); - Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.УровеньЛога > Приоритет Тогда + Если НЕ ЛогированиеВключено(Контекст, Приоритет) Тогда Возврат; КонецЕсли; @@ -336,10 +358,10 @@ #КонецЕсли Текст = СтрШаблон("%1 [%2][%3]: %4", ЮТОбщий.ПредставлениеУниверсальнойДата(), КонтекстИсполнения, УровеньЛога, Сообщение); #Если Клиент Тогда - ЗаписатьСообщения(Контекст.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(Текст)); + ЗаписатьСообщения(Контекст, ЮТОбщий.ЗначениеВМассиве(Текст)); #Иначе - Если Контекст.ДоступенНаСервере Тогда - ЗаписатьСообщения(Контекст.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(Текст)); + Если Контекст.ФайлЛогаДоступенНаСервере Тогда + ЗаписатьСообщения(Контекст, ЮТОбщий.ЗначениеВМассиве(Текст)); Иначе Контекст.НакопленныеЗаписи.Добавить(Текст); КонецЕсли; @@ -347,11 +369,30 @@ КонецПроцедуры -Процедура ЗаписатьСообщения(ФайлЛога, Сообщения, Дописывать = Истина) +Процедура ЗаписатьСообщения(Контекст, Сообщения, Дописывать = Истина) #Если ВебКлиент Тогда ВызватьИсключение "Метод записи лога не доступен в web-клиенте"; #Иначе + + Если Контекст.ВыводВКонсоль Тогда + ЗаписатьЛогВКонсоль(Сообщения); + КонецЕсли; + + Если ЗначениеЗаполнено(Контекст.ФайлЛога) Тогда + ЗаписатьЛогВФайл(Контекст.ФайлЛога, Сообщения, Дописывать); + КонецЕсли; + +#КонецЕсли + +КонецПроцедуры + +Процедура ЗаписатьЛогВФайл(ФайлЛога, Сообщения, Дописывать = Истина) + +#Если ВебКлиент Тогда + ВызватьИсключение "Метод записи лога не доступен в web-клиенте"; +#Иначе + Запись = Новый ЗаписьТекста(ФайлЛога, КодировкаТекста.UTF8, , Дописывать); Для Каждого Сообщение Из Сообщения Цикл @@ -363,6 +404,22 @@ КонецПроцедуры +Процедура ЗаписатьЛогВКонсоль(Сообщения) + +#Если ВебКлиент Тогда + ВызватьИсключение "Метод записи лога не доступен в web-клиенте"; +#Иначе + + Попытка + Для Каждого Сообщение Из Сообщения Цикл + ЮТОбщий.ВывестиВКонсоль(Сообщение); + КонецЦикла; + Исключение + КонецПопытки; +#КонецЕсли + +КонецПроцедуры + Функция Прогресс() Контекст = Контекст(); diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" index c3009acda..fb73b8d57 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" @@ -30,6 +30,8 @@ Чтение = Новый ЧтениеТекста(ИмяФайла); Строка = Чтение.ПрочитатьСтроку(); + Чтение.Закрыть(); + Возврат Строка = ЗначениеПроверки; Исключение diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" index 3187cd915..53e1606c5 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" @@ -23,45 +23,82 @@ // Подсистема должна находится в подсистеме "ЮТФункциональность" // Параметры: // ИмяПодсистемы - Строка - Имя подсистемы -// +// Серверные - Булево - Возвращять модули доступные на сервере +// Клиентские - Булево - Возвращять модули доступные на клиенте // Возвращаемое значение: // Массив из Строка - Имена модулей входящих в подсистему -Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт +Функция МодулиПодсистемы(ИмяПодсистемы, Серверные = Истина, Клиентские = Истина) Экспорт - Возврат ЮТМетаданныеПовтИсп.МодулиПодсистемы(ИмяПодсистемы); + Возврат ЮТМетаданныеПовтИсп.МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские); КонецФункции -// Описание менеджера. +// Описание объекта метаданных. // // Параметры: -// Значение - Произвольный +// Значение - ОбъектМетаданных +// - Тип - Тип объекта информационной базы +// - Строка - Полное имя объекта метаданных +// - см. ОписаниеОбъектаМетаданных +// - Произвольный - Объект информационной базы // // Возвращаемое значение: // Структура - Описание менеджера: // * ОписаниеТипа - см. ЮТМетаданныеСервер.ОписаниеТипаМетаданных -// * Реквизиты - Структура из см. ЮТМетаданныеСервер.ОписаниеРеквизита +// * Реквизиты - Структура из см. ЮТФабрика.ОписаниеРеквизита // * ТабличныеЧасти - Структура из Структура - -Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт +Функция ОписаниеОбъектаМетаданных(Знач Значение) Экспорт ТипЗначения = ТипЗнч(Значение); + Если ТипЗначения = Тип("Структура") И ЭтоОписаниеОбъектаМетаданных(Значение) Тогда + Возврат Значение; + КонецЕсли; + +#Если Сервер Тогда + Если ТипЗначения = Тип("ОбъектМетаданных") Тогда + Значение = Значение.ПолноеИмя(); + ТипЗначения = Тип("Строка"); + КонецЕсли; +#КонецЕсли + Если ТипЗначения <> Тип("Тип") И ТипЗначения <> Тип("Строка") Тогда Значение = ТипЗнч(Значение); ТипЗначения = Тип("Тип"); КонецЕсли; Если ТипЗначения = Тип("Тип") Тогда - Возврат ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(Значение); + ИдентификаторТипа = ЮТТипыДанныхСлужебный.ИдентификаторТипа(Значение); // Для работы кэширования + Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектаМетаданныхПоИдентификаторуТипа(ИдентификаторТипа); Иначе - Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектМетаданных(Значение); + Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектаМетаданных(Значение); КонецЕсли; КонецФункции +Функция ЭтоОписаниеОбъектаМетаданных(Параметры) Экспорт + + Возврат ЮТОбщий.ЭтаСтруктураИмеетТип(Параметры, "ОписаниеОбъектаМетаданных"); + +КонецФункции + Функция ТипыМетаданных() Экспорт - Возврат ЮТМетаданныеСервер.ТипыМетаданных(); + Возврат ЮТМетаданныеПовтИсп.ТипыМетаданных(); + +КонецФункции + +Функция ЭтоПеречисление(Значение) Экспорт + + Описание = ОписаниеОбъектаМетаданных(Значение); + + Возврат Описание <> Неопределено И Описание.ОписаниеТипа.Имя = "Перечисление"; + +КонецФункции + +Функция РазрешеныСинхронныеВызовы() Экспорт + + Возврат ЮТМетаданныеПовтИсп.РазрешеныСинхронныеВызовы(); КонецФункции diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" index 37613b03c..c19d62a08 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" @@ -18,15 +18,22 @@ #Область СлужебныйПрограммныйИнтерфейс -Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт +Функция МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские) Экспорт - Возврат ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы); + Возврат ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские); КонецФункции -Функция ОписаниеОбъектМетаданных(Знач Менеджер) Экспорт +Функция ОписаниеОбъектаМетаданных(Знач Менеджер) Экспорт - Возврат ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(Менеджер); + Возврат ЮТМетаданныеСервер.ОписаниеОбъектаМетаданных(Менеджер); + +КонецФункции + +Функция ОписаниеОбъектаМетаданныхПоИдентификаторуТипа(Знач ИдентификаторТипа) Экспорт + + Тип = ЮТТипыДанныхСлужебный.ТипПоИдентификатору(ИдентификаторТипа); + Возврат ЮТМетаданныеСервер.ОписаниеОбъектаМетаданных(Тип); КонецФункции @@ -36,4 +43,10 @@ КонецФункции +Функция РазрешеныСинхронныеВызовы() Экспорт + + Возврат ЮТМетаданныеСервер.РазрешеныСинхронныеВызовы(); + +КонецФункции + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" index edce53984..4ec4f6186 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" @@ -49,10 +49,12 @@ // Подсистема должна находится в подсистеме "ЮТФункциональность" // Параметры: // ИмяПодсистемы - Строка - Имя подсистемы +// Серверные - Булево - Возвращять модули доступные на сервере +// Клиентские - Булево - Возвращять модули доступные на клиенте // // Возвращаемое значение: // Массив из Строка - Имена модулей входящих в подсистему -Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт +Функция МодулиПодсистемы(Знач ИмяПодсистемы, Знач Серверные, Знач Клиентские) Экспорт Подсистема = Метаданные.Подсистемы.ЮТФункциональность.Подсистемы.Найти(ИмяПодсистемы); @@ -68,7 +70,14 @@ Если Метаданные.ОбщиеМодули.Содержит(Объект) Тогда - Модули.Добавить(Объект.Имя); + Добавить = (Серверные И Клиентские) + ИЛИ (Серверные И (Объект.Сервер)) + ИЛИ (Клиентские И (Объект.КлиентУправляемоеПриложение Или Объект.ВызовСервера)); + // КлиентОбычноеПриложение сознательно не анализируется, он должен идти в паре с другой настройкой + + Если Добавить Тогда + Модули.Добавить(Объект.Имя); + КонецЕсли; КонецЕсли; @@ -78,14 +87,6 @@ КонецФункции -// МетаданныеМодуля -// Создает описание метаданных модуля -// -// Параметры: -// Модуль - ОбъектМетаданныхОбщийМодуль, Структура, Строка - Общий модуль либо структура с аналогичными атрибутами или имя модуля -// -// Возвращаемое значение: -// Структура - см. ЮТФабрика.ОписаниеМодуля Функция МетаданныеМодуля(Знач Модуль) Экспорт Если ТипЗнч(Модуль) = Тип("Строка") Тогда @@ -101,6 +102,7 @@ Описание.Имя = Модуль.Имя; Описание.КлиентУправляемоеПриложение = Модуль.КлиентУправляемоеПриложение; Описание.КлиентОбычноеПриложение = Модуль.КлиентОбычноеПриложение; + Описание.Глобальный = Модуль.Глобальный; Описание.Сервер = Модуль.Сервер; Описание.ВызовСервера = Модуль.ВызовСервера; Описание.Расширение = Модуль.РасширениеКонфигурации().Имя; @@ -110,7 +112,7 @@ КонецФункции -Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт +Функция ОписаниеОбъектаМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт МетаданныеОбъекта = ОбъектМетаданных(Значение); ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта); @@ -120,6 +122,7 @@ ОписаниеОбъект.Вставить("ОписаниеТипа", ОписаниеТипа); ОписаниеОбъект.Вставить("Реквизиты", Новый Структура()); ОписаниеОбъект.Вставить("ТабличныеЧасти", Новый Структура()); + ЮТОбщий.УказатьТипСтруктуры(ОписаниеОбъект, "ОписаниеОбъектаМетаданных"); Если НЕ ЗаполнятьРеквизиты Тогда Возврат ОписаниеОбъект; @@ -219,6 +222,13 @@ КонецФункции +Функция РазрешеныСинхронныеВызовы() Экспорт + + Возврат Метаданные.РежимИспользованияСинхронныхВызововРасширенийПлатформыИВнешнихКомпонент + = Метаданные.СвойстваОбъектов.РежимИспользованияСинхронныхВызововРасширенийПлатформыИВнешнихКомпонент.Использовать; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -238,12 +248,15 @@ ИначеЕсли ТипЗначение = Тип("Строка") Тогда ЧастиСтроки = СтрРазделить(Значение, "."); + Если ЧастиСтроки.Количество() = 2 Тогда + ТипыМетаданных = ЮТМетаданные.ТипыМетаданных(); ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]]; Если ОписаниеТипа <> Неопределено Тогда ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]]; КонецЕсли; + КонецЕсли; Иначе @@ -273,22 +286,10 @@ ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено; КонецЕсли; - КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч)); + КоллекцияОписаний.Вставить(Реквизит.Имя, ЮТФабрика.ОписаниеРеквизита(Реквизит, ЭтоКлюч)); КонецЦикла; КонецПроцедуры -Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт - - Описание = Новый Структура(); - Описание.Вставить("Имя", Реквизит.Имя); - Описание.Вставить("Тип", Реквизит.Тип); - Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку); - Описание.Вставить("ЭтоКлюч", ЭтоКлюч); - - Возврат Описание; - -КонецФункции - #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl" index b36354853..698ce9cd6 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl" @@ -109,11 +109,14 @@ // Параметры: // Значение - Число // Шаг - Число -Процедура Инкремент(Значение, Знач Шаг = 1) Экспорт +// Возвращаемое значение: +// Число - Результат инкремента +Функция Инкремент(Значение, Знач Шаг = 1) Экспорт Значение = Значение + Шаг; + Возврат Значение; -КонецПроцедуры +КонецФункции Функция ЧислоВСтроку(Значение) Экспорт @@ -135,7 +138,7 @@ Функция ПредставлениеПродолжительности(Знач Продолжительность) Экспорт Представление = ЧислоВСтроку(Цел(Продолжительность / 1000)); - Представление = ДобавитьСтроку(Представление, Продолжительность % 1000, "."); + Представление = ДобавитьСтроку(Представление, Формат(Продолжительность % 1000, "ЧЦ=3; ЧВН=;"), "."); Инкремент(Представление, " сек"); @@ -683,14 +686,18 @@ КонецПроцедуры -Функция СтрокаJSON(Значение) Экспорт +Функция СтрокаJSON(Значение, ИспользоватьСериализатор = Истина) Экспорт #Если ВебКлиент Тогда ВызватьИсключение МетодНеДоступен("ЮТОбщий.СтрокаJSON"); #Иначе ЗаписьJSON = Новый ЗаписьJSON(); ЗаписьJSON.УстановитьСтроку(); - СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение); + Если ИспользоватьСериализатор Тогда + СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение); + Иначе + ЗаписатьJSON(ЗаписьJSON, Значение); + КонецЕсли; Возврат ЗаписьJSON.Закрыть(); #КонецЕсли @@ -709,23 +716,13 @@ Функция ПредставлениеТипа(Тип) Экспорт -#Если ВебКлиент Тогда - ВызватьИсключение МетодНеДоступен("ЮТОбщий.ПредставлениеТипа"); -#Иначе - ТипXML = СериализаторXDTO.XMLТип(Тип); - - Если ТипXML = Неопределено Тогда - Возврат Строка(Тип); - Иначе - Возврат ТипXML.ИмяТипа; - КонецЕсли; -#КонецЕсли + Возврат ЮТТипыДанныхСлужебный.ПредставлениеТипа(Тип); КонецФункции Функция МетодНеДоступен(ИмяМетода, ИмяКонтекста = "веб-клиенте") Экспорт - Возврат СтрШаблон("Метод `%1` не доступен в %2", ИмяМетода, ИмяКонтекста); + Возврат СтрШаблон("Метод `%1` не доступен в/на %2", ИмяМетода, ИмяКонтекста); КонецФункции @@ -825,7 +822,11 @@ Функция Менеджер(Знач Менеджер) Экспорт +#Если Сервер Тогда Возврат ЮТОбщийВызовСервера.Менеджер(Менеджер); +#Иначе + ВызватьИсключение МетодНеДоступен("ЮТОбщий.Менеджер", "клиенте"); +#КонецЕсли КонецФункции @@ -835,12 +836,73 @@ КонецФункции +Функция ЭтаСтруктураИмеетТип(Структура, ИмяТипа) Экспорт + + Возврат ТипСтруктуры(Структура) = ИмяТипа; + +КонецФункции + Процедура УказатьТипСтруктуры(Структура, ИмяТипа) Экспорт Структура.Вставить("__type__", ИмяТипа); КонецПроцедуры +// Преостанавливает поток выполнения на указанное количество секунд +// +// Параметры: +// Время - Число - Продолжительность паузы в секундах, возможно указывать дробное значение +Процедура Пауза(Время) Экспорт + + Задержка = Цел(1000 * Время); + Компонента = ЮТКомпоненты.Пауза(); +#Если Сервер Тогда + Компонента.Ожидать(Задержка); +#Иначе + Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда + Компонента.Ожидать(Задержка); + Иначе + ВызватьИсключение "Пауза не работает на клиенте при отключенных синхронных вызовах"; + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +// Выводит сообщение в консоль (stdout) приложения +// +// Параметры: +// Сообщение - Строка - Выводимое сообщение +Процедура ВывестиВКонсоль(Сообщение) Экспорт + + Компонента = ЮТКомпоненты.Консоль(); +#Если Сервер Тогда + Компонента.Напечатать(Сообщение); +#Иначе + Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда + Компонента.Напечатать(Сообщение); + Иначе + Компонента.НачатьВызовНапечатать(ЮТАсинхроннаяОбработкаСлужебныйКлиент.НовыйПустойОбработчик1(), Сообщение); + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +// Возвращяет макет +// +// Параметры: +// ИмяМакета - Строка - Возможные значения +// * Общий макет, например, ОбщийМакет.ЮТМетаданные +// * Макет объекта метаданных, например, Справочник.Товары.ПечатнаяФорма +// * Область макета, например, Справочник.Товары.ПечатнаяФорма.Шапка, ОбщийМакет.ЮТМетаданные.Заголовок +// +// Возвращаемое значение: +// ТабличныйДокумент, ТекстовыйДокумент, ДвоичныеДанные - Макет или его область +Функция Макет(ИмяМакета) Экспорт + + Возврат ЮТОбщийВызовСервера.Макет(ИмяМакета); + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" index 0b4dd2ee1..7cd9bb788 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" @@ -27,7 +27,7 @@ |"); Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML); - + КонецФункции Функция УстановленБезопасныйРежим() Экспорт @@ -38,11 +38,47 @@ Функция Менеджер(Знач Менеджер) Экспорт - Если ТипЗнч(Менеджер) = Тип("Строка") Тогда - Менеджер = ЮТОбщий.ВычислитьБезопасно(Менеджер); + Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер); + + Если Описание = Неопределено Тогда + ВызватьИсключение "Несуществующий объект метаданных, либо " + ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТОбщийВызовСервера.Менеджер", Менеджер); + КонецЕсли; + + ИмяТипа = СтрШаблон("%1Менеджер.%2", Описание.ОписаниеТипа.Имя, Описание.Имя); + + Возврат Новый(ИмяТипа); + +КонецФункции + +Функция Макет(ИмяМакета) Экспорт + + ЧастиИмени = СтрРазделить(ИмяМакета, "."); + + КоличествоБлоковДляОбщегоМакета = 2; + КоличествоБлоковМакетаМенеджера = 3; + + Если ЧастиИмени.Количество() < КоличествоБлоковДляОбщегоМакета Тогда + ВызватьИсключение СтрШаблон("Некорректное имя макет, если вы хотите получить данные общего макета необходимо указать `ОбщийМакет.%1`", + ИмяМакета); + КонецЕсли; + + ИндексОбласти = 0; + Если СтрСравнить(ЧастиИмени[0], "ОбщийМакет") = 0 Тогда + Макет = ПолучитьОбщийМакет(ЧастиИмени[1]); + ИндексОбласти = КоличествоБлоковДляОбщегоМакета; + ИначеЕсли ЧастиИмени.Количество() >= КоличествоБлоковМакетаМенеджера Тогда + Менеджер = Менеджер(СтрШаблон("%1.%2", ЧастиИмени[0], ЧастиИмени[1])); + Макет = Менеджер.ПолучитьМакет(ЧастиИмени[КоличествоБлоковМакетаМенеджера - 1]); + ИндексОбласти = КоличествоБлоковМакетаМенеджера; + Иначе + ВызватьИсключение СтрШаблон("Некорректное имя макета `%1`", ИмяМакета); + КонецЕсли; + + Если ЧастиИмени.Количество() > ИндексОбласти Тогда + Макет = Макет.ПолучитьОбласть(ЧастиИмени[ИндексОбласти]); КонецЕсли; - Возврат Менеджер; + Возврат Макет; КонецФункции diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl" index 693865690..68d11ef90 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl" @@ -21,7 +21,7 @@ // СформироватьОтчет // Формирует отчет о результатах тестирования по заданным параметрам // Параметры: -// РезультатВыполнения - Массив - Коллекция результатов выполнения, каждый элемент - структура, см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля // ПараметрыЗапуска - Структура - Параметры запуска, см. ЮТФабрика.ПараметрыЗапуска // Обработчик - ОписаниеОповещения Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска, Обработчик) Экспорт @@ -85,7 +85,7 @@ ДанныеОтчета.Записать(ИмяФайлаОтчета); КонецЕсли; - ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик); КонецПроцедуры @@ -98,7 +98,7 @@ ИмяФайла = ПутьКОтчету; КонецЕсли; - ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла); КонецПроцедуры diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl" index b8a4ce2de..0a34775ae 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl" @@ -30,6 +30,13 @@ КонецФункции +// Формирует отчет в формате JSON +// +// Параметры: +// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля +// +// Возвращаемое значение: +// ДвоичныеДанные - Данные отчета Функция ДанныеОтчета(РезультатВыполнения) Экспорт #Если ВебКлиент Тогда diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl" index 55ec07dd0..83927d3cf 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl" @@ -30,6 +30,13 @@ КонецФункции +// Формирует отчет в формате jUnit +// +// Параметры: +// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля +// +// Возвращаемое значение: +// ДвоичныеДанные - Данные отчета Функция ДанныеОтчета(Знач РезультатВыполнения) Экспорт Возврат СформироватьОтчетОТестировании(РезультатВыполнения); @@ -44,7 +51,7 @@ // Формирует отчет (xml-файл) и возвращает его в виде двоичных данных // // Параметры: -// РезультатТестирования - Массив - результаты всех сценариев теста +// РезультатТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля // Возвращаемое значение: // ДвоичныеДанные - полученный отчет Функция СформироватьОтчетОТестировании(РезультатТестирования) Экспорт @@ -58,9 +65,15 @@ Номер = 0; - Для Каждого Набор Из РезультатТестирования Цикл - ЗаписатьНабор(ЗаписьXML, Набор, Номер); - Номер = Номер + 1; + Для Каждого Модуль Из РезультатТестирования Цикл + + Для Каждого Набор Из Модуль.НаборыТестов Цикл + + ЗаписатьНабор(ЗаписьXML, Набор, Номер); + Номер = Номер + 1; + + КонецЦикла; + КонецЦикла; ЗаписатьСвойства(ЗаписьXML, Новый Структура("executor, reportDate", "BIA YAXUnit", ТекущаяДатаСеанса())); diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl" index 26bdc456f..e42b7e5f0 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl" @@ -69,7 +69,7 @@ Параметры = ЮТФабрика.ПараметрыЗапуска(); Если Не ЗначениеЗаполнено(ПараметрыЗапускаСтрокой) Тогда - ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Параметры); Возврат Параметры; КонецЕсли; @@ -94,7 +94,8 @@ Если ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Булево") Тогда Параметры.ВыполнятьМодульноеТестирование = ЗначениеКлючаЗапуска; - Возврат Параметры; + Параметры.showReport = Истина; + Параметры.closeAfterTests = Ложь; ИначеЕсли ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Строка") Тогда @@ -110,7 +111,7 @@ КонецЕсли; - ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Параметры); Возврат Параметры; diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" index 7d64a2308..ca68d9757 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" @@ -42,4 +42,29 @@ КонецФункции +Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты) Экспорт + + Возврат ЮТКомпоненты.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Ложь); + +КонецФункции + +Функция СоздатьКомпоненту(ОписаниеКомпоненты) Экспорт + + Возврат ЮТКомпоненты.СоздатьКомпоненту(ОписаниеКомпоненты, Ложь); + +КонецФункции + +Функция ПримитивныеТипы() Экспорт + + Типы = Новый Массив(); + Типы.Добавить(Тип("Строка")); + Типы.Добавить(Тип("Число")); + Типы.Добавить(Тип("Дата")); + Типы.Добавить(Тип("Булево")); + Типы.Добавить(Тип("УникальныйИдентификатор")); + + Возврат Новый ФиксированныйМассив(Типы); + +КонецФункции + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl" index 670035af2..935d73e6c 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl" @@ -134,7 +134,7 @@ ЧастиСнилс[0], ЧастиСнилс[1], ЧастиСнилс[2], - Формат(КонтрольноеЧисло, "ЧЦ=2; ЧВН=;") + Формат(КонтрольноеЧисло, "ЧЦ=2; ЧН=00; ЧВН=;") ); КонецФункции diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl" index b1409ce07..7fb765c39 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl" @@ -267,6 +267,34 @@ КонецФункции +// Добавляет предикат, проверяющий, что строка соответствует указанному регулярному выражению +// +// Параметры: +// Значение - Строка +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция СодержитСтрокуПоШаблону(Значение) Экспорт + + ДобавитьПредикат(Выражения().СодержитСтрокуПоШаблону, Значение); + Возврат ЮТПредикаты; + +КонецФункции + +// Добавляет предикат, проверяющий, что строка не соответствует указанному регулярному выражению +// +// Параметры: +// Значение - Строка +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеСодержитСтрокуПоШаблону(Значение) Экспорт + + ДобавитьПредикат(Выражения().НеСодержитСтрокуПоШаблону, Значение); + Возврат ЮТПредикаты; + +КонецФункции + // Возвращает набор сформированных утверждений. // // Рекомендуется использовать этот метод, если планируется отложенная проверка предикатов. Например, вы хотите сформировать два набору предикатов @@ -316,6 +344,8 @@ Выражения.Вставить("НеИмеетСвойство", "НеИмеетСвойство"); Выражения.Вставить("Содержит", "Содержит"); Выражения.Вставить("НеСодержит", "НеСодержит"); + Выражения.Вставить("СодержитСтрокуПоШаблону", "СодержитСтрокуПоШаблону"); + Выражения.Вставить("НеСодержитСтрокуПоШаблону", "НеСодержитСтрокуПоШаблону"); Возврат Новый ФиксированнаяСтруктура(Выражения); diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" index 50de087d1..b212083c6 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" @@ -151,6 +151,8 @@ Шаблон = "содержит свойство `%1`"; ИначеЕсли Выражение = Выражения.Содержит Тогда Шаблон = "содержит `%1`"; + ИначеЕсли Выражение = Выражения.СодержитСтрокуПоШаблону Тогда + Шаблон = "содержит подстроку соответствующую шаблону `%1`"; Иначе ВызватьИсключение "Не описан шаблон сообщения для выражения предиката " + Выражение; КонецЕсли; @@ -279,6 +281,10 @@ ЮТСравнениеКлиентСервер.ПроверитьСодержит(СтатусПроверки, ПараметрыПроверки); + ИначеЕсли ВидСравненияВыражения = ВидыСравнения.СодержитСтрокуПоШаблону Тогда + + ЮТСравнениеКлиентСервер.ПроверитьСоответствуетШаблону(СтатусПроверки, ПараметрыПроверки); + Иначе ВызватьИсключение СтрШаблон("Неизвестное выражение предиката `%1`", Выражение.ВидСравнения); @@ -290,23 +296,21 @@ Функция ЭтоПредикатОбщийМодуль(ТипПредикатов, Предикаты) - Возврат ТипПредикатов = Тип("ОбщийМодуль") - И Предикаты = ЮТПредикаты; + Возврат ТипПредикатов = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты; -КонецФункции +КонецФункции Функция ЭтоПредикатМассив(ТипПредикатов, Предикаты) - Возврат ТипПредикатов = Тип("Массив") - И Предикаты.Количество() - И ЭтоПредикатСтруктура(ТипЗнч(Предикаты[0]), Предикаты[0]); + Возврат ТипПредикатов = Тип("Массив") + И Предикаты.Количество() + И ЭтоПредикатСтруктура(ТипЗнч(Предикаты[0]), Предикаты[0]); КонецФункции Функция ЭтоПредикатСтруктура(ТипПредикатов, Предикаты) - Возврат ТипПредикатов = Тип("Структура") - И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат"; + Возврат ТипПредикатов = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат"; КонецФункции diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" new file mode 100644 index 000000000..72a70e3d2 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" @@ -0,0 +1,153 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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) Экспорт + + МассивДанных = Новый Массив; + СведенияКолонок = Новый Массив; + + ЗаменяемыеСтроки = ЮТТестовыеДанныеСлужебный.ПодстрокиДляЗаменыВИменахСвойств(); + + ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст; + Пока ЗначениеЗаполнено(ЗначениеКолонки) Цикл + + Для Каждого Замена Из ЗаменяемыеСтроки Цикл + ПодстрокаПоиска = Замена.Ключ; + ПодстрокаЗамены = Замена.Значение; + ИмяКолонки = СтрЗаменить(ЗначениеКолонки, ПодстрокаПоиска, ПодстрокаЗамены); + КонецЦикла; + + Сведения = Новый Структура("НомерКолонки, ИмяКолонки", НомерКолонки, ИмяКолонки); + СведенияКолонок.Добавить(Сведения); + + НомерКолонки = НомерКолонки + 1; + ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст; + + КонецЦикла; + + НомерСтроки = НомерСтроки + 1; + + Пока ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) Цикл + + Структура = Новый Структура; + + Для Каждого Сведения Из СведенияКолонок Цикл + Значение = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, Сведения.НомерКолонки).Текст); + Структура.Вставить(Сведения.ИмяКолонки, Значение); + КонецЦикла; + + МассивДанных.Добавить(Структура); + + НомерСтроки = НомерСтроки + 1; + + КонецЦикла; + + Возврат МассивДанных; + +КонецФункции + +Функция ПривестиЗначениеКДате(ОписаниеТипа, Знач Значение) Экспорт + + Результат = ОписаниеТипа.ПривестиЗначение(Значение); + Если ЗначениеЗаполнено(Результат) Тогда + Возврат Результат; + КонецЕсли; + + МассивРазделителей = Новый Массив; + МассивРазделителей.Добавить("."); + МассивРазделителей.Добавить("/"); + МассивРазделителей.Добавить("-"); + + СтрокаДаты = Неопределено; + + КоличествоБлоковДаты = 3; + ДлинаГода = 4; + + Для Каждого Разделитель Из МассивРазделителей Цикл + + Если ЗначениеЗаполнено(СтрокаДаты) Тогда + Прервать; + КонецЕсли; + + МассивЧастейДат = СтрРазделить(Значение, Разделитель); + + Если МассивЧастейДат.Количество() = КоличествоБлоковДаты Тогда + + Если СтрДлина(МассивЧастейДат[2]) = ДлинаГода Тогда + СтрокаДаты = МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0]; + ИначеЕсли СтрДлина(МассивЧастейДат[0]) = ДлинаГода Тогда + СтрокаДаты = МассивЧастейДат[0] + МассивЧастейДат[1] + МассивЧастейДат[2]; + Иначе + СтрокаДаты = "20" + МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0]; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Результат = ОписаниеТипа.ПривестиЗначение(СтрокаДаты); + + Возврат Результат; + +КонецФункции + +Функция ПривестиЗначениеКЧислу(ОписаниеТипа, Знач Значение) Экспорт + + Результат = ОписаниеТипа.ПривестиЗначение(Значение); + Если ЗначениеЗаполнено(Результат) Тогда + Возврат Результат; + КонецЕсли; + + Значение = СтрЗаменить(Значение, " ", ""); + Результат = ОписаниеТипа.ПривестиЗначение(Значение); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) + + ЕстьЗаполненныеЗначения = Ложь; + + Для Каждого Сведения Из СведенияКолонок Цикл + Если ЕстьЗаполненныеЗначения Тогда + Прервать; + КонецЕсли; + НомерКолонки = Сведения.НомерКолонки; + ЕстьЗаполненныеЗначения = ЗначениеЗаполнено(ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст); + КонецЦикла; + + Возврат ЕстьЗаполненныеЗначения; + +КонецФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217.mdo" new file mode 100644 index 000000000..543964086 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217.mdo" @@ -0,0 +1,9 @@ + + + ЮТПреобразования + + ru + Преобразования + + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" new file mode 100644 index 000000000..a2f4bf796 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" @@ -0,0 +1,73 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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)", + ИмяПараметра, + ИмяМетода, + ОжидаемыйТип, + ТипЗнч(Значение), + Значение); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры + +Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип) Экспорт + + ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип); + + Если ТипОжидаемогоТипа = Тип("Строка") Тогда + Если СтрНайти(ОжидаемыйТип, ",") Тогда + ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип); + ТипОжидаемогоТипа = Тип("ОписаниеТипов"); + Иначе + ОжидаемыйТип = Тип(ОжидаемыйТип); + ТипОжидаемогоТипа = Тип("Тип"); + КонецЕсли; + КонецЕсли; + + ТипЗначения = ТипЗнч(Значение); + + Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда + // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено") + Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено + И ОжидаемыйТип.ПривестиЗначение(Значение) = Значение; + Иначе + Соответствует = ТипЗначения = ОжидаемыйТип; + КонецЕсли; + + Возврат Соответствует; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" new file mode 100644 index 000000000..895017eb2 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" @@ -0,0 +1,11 @@ + + + ЮТПроверкиСлужебный + + ru + Проверки служебный + + true + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl" index 4b7022828..4ef579240 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl" @@ -26,7 +26,17 @@ Функция ОбработчикиСобытий() Экспорт - Возврат ЮТМетаданные.МодулиПодсистемы("ЮТОбработчикиСобытий"); + Серверные = Ложь; + Клиентские = Ложь; +#Если Сервер Тогда + Серверные = Истина; +#КонецЕсли + +#Если Клиент Тогда + Клиентские = Истина; +#КонецЕсли + + Возврат ЮТМетаданные.МодулиПодсистемы("ЮТОбработчикиСобытий", Серверные, Клиентские); КонецФункции diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl" index 2508fd171..d785f2fd3 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl" @@ -155,6 +155,28 @@ КонецПроцедуры +// Перед выполнением тестов. +// +// Параметры: +// ИсполняемыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля +Процедура ПередВыполнениемТестов(ИсполняемыеМодули) Экспорт + + Параметры = ЮТОбщий.ЗначениеВМассиве(ИсполняемыеМодули); + ВызватьОбработчикРасширения("ПередВыполнениемТестов", Параметры); + +КонецПроцедуры + +// После выполнения тестов. +// +// Параметры: +// РезультатТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля +Процедура ПослеВыполненияТестов(РезультатТестирования) Экспорт + + Параметры = ЮТОбщий.ЗначениеВМассиве(РезультатТестирования); + ВызватьОбработчикРасширения("ПослеВыполненияТестов", Параметры); + +КонецПроцедуры + #КонецОбласти #Область СобытияЗагрузкиТестов @@ -202,10 +224,10 @@ // Обработка события "ПослеФормированияИсполняемыхНаборовТестов" // Параметры: -// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов -Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт +// ИсполняемыеТестовыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля - Набор исполняемых наборов +Процедура ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули) Экспорт - Параметры = ЮТОбщий.ЗначениеВМассиве(КоллекцияКатегорийНаборов); + Параметры = ЮТОбщий.ЗначениеВМассиве(ИсполняемыеТестовыеМодули); ВызватьОбработчикРасширения("ПослеФормированияИсполняемыхНаборовТестов", Параметры); КонецПроцедуры @@ -307,7 +329,7 @@ ИначеЕсли ОбработчикСобытияПереопределен Тогда ТекстИсключения = СтрШаблон("Не найден обработчик тестового модуля %1", Команда); - ВызватьИсключение ТекстИсключения + ВызватьИсключение ТекстИсключения; КонецЕсли; diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" index f7e130db8..4612c28fd 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" @@ -143,7 +143,7 @@ ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки); - Результат = ТипЗначенияСоответствует(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение); + Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение); Реверс(Результат, ПараметрыПроверки); @@ -249,6 +249,30 @@ КонецПроцедуры +Процедура ПроверитьСоответствуетШаблону(РезультатПроверки, ПараметрыПроверки) Экспорт + + Если НЕ ПроверитьТипЗначения(РезультатПроверки, ПараметрыПроверки.ОжидаемоеЗначение, "Строка") Тогда + Возврат; + КонецЕсли; + + ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки); + СоответствуетШаблону = СоответствуетШаблону(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение); + + Если СоответствуетШаблону = Неопределено Тогда + ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение)); + ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки); + Возврат; + КонецЕсли; + + Результат = СоответствуетШаблону; + Реверс(Результат, ПараметрыПроверки); + + Если НЕ Результат Тогда + ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение); + КонецЕсли; + +КонецПроцедуры + // Параметры проверки. // // Параметры: @@ -360,7 +384,7 @@ Возврат Истина; КонецЕсли; - Соответствует = ТипЗначенияСоответствует(Значение, ОжидаемыйТип); + Соответствует = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(Значение, ОжидаемыйТип); Если НЕ Соответствует Тогда ТекстОшибки = СтрШаблон("Не верный тип %1 (`%2`), должен быть `%3`%4", @@ -375,34 +399,6 @@ КонецФункции -Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип) - - ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип); - - Если ТипОжидаемогоТипа = Тип("Строка") Тогда - Если СтрНайти(ОжидаемыйТип, ",") Тогда - ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип); - ТипОжидаемогоТипа = Тип("ОписаниеТипов"); - Иначе - ОжидаемыйТип = Тип(ОжидаемыйТип); - ТипОжидаемогоТипа = Тип("Тип"); - КонецЕсли; - КонецЕсли; - - ТипЗначения = ТипЗнч(Значение); - - Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда - // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено") - Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено - И ОжидаемыйТип.ПривестиЗначение(Значение) = Значение; - Иначе - Соответствует = ТипЗначения = ОжидаемыйТип; - КонецЕсли; - - Возврат Соответствует; - -КонецФункции - Функция СравнитьПоЗначению(Значение1, Значение2) Попытка @@ -602,6 +598,24 @@ КонецФункции +Функция СоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение) + + Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда + Возврат Неопределено; + КонецЕсли; + + РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения(); + + Попытка + Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение); + Исключение + ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки; + КонецПопытки; + + Возврат Результат; + +КонецФункции + Функция НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение) ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение); diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/Module.bsl" new file mode 100644 index 000000000..e05741f15 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/Module.bsl" @@ -0,0 +1,57 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область ПрограммныйИнтерфейс + +Функция РусскиеБуквы(НижнийРегистр = Истина, ВерхнийРегистр = Ложь) Экспорт + + Возврат Буквы("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", НижнийРегистр, ВерхнийРегистр); + +КонецФункции + +Функция АнглийскиеБуквы(НижнийРегистр = Истина, ВерхнийРегистр = Ложь) Экспорт + + Возврат Буквы("abcdefghijklmnopqrstuvwxyz", НижнийРегистр, ВерхнийРегистр); + +КонецФункции + +Функция Цифры() Экспорт + + Возврат "1234567890"; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция Буквы(Буквы, НижнийРегистр, ВерхнийРегистр) + + Если НижнийРегистр И ВерхнийРегистр Тогда + Возврат Буквы + ВРег(Буквы); + ИначеЕсли НижнийРегистр Тогда + Возврат Буквы; + ИначеЕсли ВерхнийРегистр Тогда + Возврат ВРег(Буквы); + Иначе + Возврат ""; + КонецЕсли; + +КонецФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270.mdo" new file mode 100644 index 000000000..e92381266 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270.mdo" @@ -0,0 +1,11 @@ + + + ЮТСтроки + + ru + Строки + + true + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" index 09092d1c8..07bae0617 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" @@ -98,6 +98,8 @@ КонецФункции +#Область ГенерацияСлучайныхЗначений + // Генерирует и возвращает случайное число. // // Параметры: @@ -166,28 +168,26 @@ // Генерирует и возвращает случайную строку указанной длины, строка может содержать цифры, английские и русские буквы в разных регистрах. // // Параметры: -// Длина - Число - Длина генерируемой строки, без учета префикса +// Длина - Число - Длина генерируемой строки с учетом префикса // Префикс - Строка - Префикс строки -// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайно строка +// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайная строка // // Возвращаемое значение: // Строка - Случайная строка -Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", ДопустимыеСимволы = Неопределено) Экспорт +Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", Знач ДопустимыеСимволы = Неопределено) Экспорт Если ДопустимыеСимволы = Неопределено Тогда - Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - Иначе - Строка = ДопустимыеСимволы; + ДопустимыеСимволы = ЮТСтроки.РусскиеБуквы(Истина, Истина) + ЮТСтроки.АнглийскиеБуквы(Истина, Истина) + ЮТСтроки.Цифры(); КонецЕсли; Результат = ""; - КоличествоСимволов = СтрДлина(Строка); + КоличествоСимволов = СтрДлина(ДопустимыеСимволы); Длина = Длина - СтрДлина(Префикс); Для Инд = 1 По Длина Цикл - Результат = Результат + Сред(Строка, СлучайноеЧисло(1, КоличествоСимволов), 1); + Результат = Результат + Сред(ДопустимыеСимволы, СлучайноеЧисло(1, КоличествоСимволов), 1); КонецЦикла; @@ -195,6 +195,28 @@ КонецФункции +// Возвращяет случайный валидный идентификатор +// +// Параметры: +// Длина - Число - Длина генерируемой строки с учетом префикса +// Префикс - Строка - Префикс строки +// +// Возвращаемое значение: +// Строка - Случайный идентификатор +Функция СлучайныйИдентификатор(Знач Длина = 10, Знач Префикс = "") Экспорт + + НаборСимволов = "_" + ЮТСтроки.РусскиеБуквы(Истина, Истина) + ЮТСтроки.АнглийскиеБуквы(Истина, Истина); + + Если ПустаяСтрока(Префикс) Тогда + Префикс = СлучайнаяСтрока(1, "", НаборСимволов); + КонецЕсли; + + НаборСимволов = НаборСимволов + ЮТСтроки.Цифры(); + + Возврат СлучайнаяСтрока(Длина, Префикс, НаборСимволов); + +КонецФункции + // Генерирует и возвращает случайную дату в указанном интервале (если не указан используется `0001-01-01 - 3999-12-31`). // // Параметры: @@ -237,19 +259,6 @@ КонецФункции -// Генерирует и возвращает уникальную строку, формируется из уникального идентификатора. -// -// Параметры: -// Префикс - Строка - Префикс строки -// -// Возвращаемое значение: -// Строка - Уникальная строка -Функция УникальнаяСтрока(Префикс = "") Экспорт - - Возврат Префикс + Новый УникальныйИдентификатор(); - -КонецФункции - // Возвращает случайный элемент списка. // // Параметры: @@ -275,6 +284,35 @@ КонецФункции +// Возвращает случайное значение перечисления +// +// Параметры: +// Перечисление - ПеречислениеМенеджер - Менеджер +// - Строка - Имя объекта метаданных +// +// Возвращаемое значение: +// ПеречислениеСсылка +Функция СлучайноеЗначениеПеречисления(Перечисление) Экспорт + + Возврат ЮТТестовыеДанныеВызовСервера.СлучайноеЗначениеПеречисления(Перечисление); + +КонецФункции + +#КонецОбласти + +// Генерирует и возвращает уникальную строку, формируется из уникального идентификатора. +// +// Параметры: +// Префикс - Строка - Префикс строки +// +// Возвращаемое значение: +// Строка - Уникальная строка +Функция УникальнаяСтрока(Префикс = "") Экспорт + + Возврат Префикс + Новый УникальныйИдентификатор(); + +КонецФункции + // Создает новый файл, который будет удален после теста // // Параметры: @@ -480,7 +518,53 @@ // Возвращаемое значение: // ОбщийМодуль - Подражатель Функция Подражатель() Экспорт + Возврат ЮТПодражательСлужебный.Инициализировать(); + +КонецФункции + +// Возвращает таблицу значений из табличного документа +// +// Параметры: +// Макет - ТабличныйДокумент - Исходный табличный документ +// ОписанияТипов - Соответствие из ОписаниеТипов - Соответствие имен колонок таблицы к типам значений +// КэшЗначений - Соответствие из Произвольный - Соответствие для хранения создаваемых значений +// ЗаменяемыеЗначения - Соответствие из Произвольный - Значения, использующиеся для замены +// ПараметрыСозданияОбъектов - Структура - Настройки создание объектов: +// * ФикцияОбязательныхПолей - Булево - По умолчанию, Ложь +// * ОбменДаннымиЗагрузка - Булево - По умолчанию, Истина +// Возвращаемое значение: +// ТаблицаЗначений - Для сервера, данные загруженные из макета +// Массив из Структура - Для клиента, данные загруженные из макета +Функция ЗагрузитьИзМакета(Макет, + ОписанияТипов, + КэшЗначений = Неопределено, + ЗаменяемыеЗначения = Неопределено, + ПараметрыСозданияОбъектов = Неопределено) Экспорт + +#Если Сервер Тогда + ТаблицаЗначений = Истина; +#Иначе + ТаблицаЗначений = Ложь; +#КонецЕсли + + Если Макет = Неопределено Тогда + ВызватьИсключение "Укажите источник данных (Макет)"; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ОписанияТипов) Тогда + ВызватьИсключение "Укажите описание загружаемых колонок (ОписанияТипов)"; + КонецЕсли; + + ЮТПроверкиСлужебный.ПроверитьТипПараметра(ОписанияТипов, "Структура, Соответствие", "ЮТТестовыеДанные.ЗагрузитьИзМакета", "ОписанияТипов"); + + Возврат ЮТТестовыеДанныеСлужебный.ЗагрузитьИзМакета(Макет, + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения, + ПараметрыСозданияОбъектов, + ТаблицаЗначений); + КонецФункции #Если Сервер Тогда @@ -493,6 +577,7 @@ Возврат Обработки.ЮТHTTPСервисЗапрос.Создать(); КонецФункции + #КонецЕсли #КонецОбласти @@ -518,4 +603,4 @@ КонецПроцедуры -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/Module.bsl" new file mode 100644 index 000000000..f43d0389c --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/Module.bsl" @@ -0,0 +1,578 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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, Инд).Текст; + КолонкиМакета.Добавить(ИмяКолонки); + КонецЦикла; + + ПараметрыЗагрузки = ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения); + + Выборка = ВыборкаИзТабличногоДокумента(ДанныеМакета); + + Пока Выборка.Следующий() Цикл + + Строка = ПараметрыЗагрузки.Таблица.Добавить(); + + Для Каждого ОписаниеКолонки Из ПараметрыЗагрузки.ОписаниеКолонок Цикл + + ЗначениеПредставления = Выборка[ОписаниеКолонки.Индекс]; + + Если ПустаяСтрока(ЗначениеПредставления) Тогда + Продолжить; + КонецЕсли; + + Значение = ЗначениеЯчейки(Выборка, + ЗначениеПредставления, + ОписаниеКолонки, + ЗаменяемыеЗначения, + КэшЗначений, + ПараметрыЗагрузки.ПараметрыСоздания); + Строка[ОписаниеКолонки.Имя] = Значение; + + КонецЦикла; + + КонецЦикла; + + Возврат ПараметрыЗагрузки.Таблица; + +КонецФункции + +Функция ЗагрузитьДанныеИзСтроки(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения) + + Разделитель = "|"; + ПараметрыИтератора = ПараметрыИтератора(ДанныеМакета); + + Пока СледующаяСтрока(ПараметрыИтератора) Цикл + + Строка = СокрЛП(ПараметрыИтератора.Строка); + + Если НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда + Продолжить; + КонецЕсли; + + КолонкиМакета = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина); + + СледующаяСтрока(ПараметрыИтератора); + Прервать; + + КонецЦикла; + + ПараметрыЗагрузки = ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения); + + Пока СледующаяСтрока(ПараметрыИтератора) Цикл + + Строка = СокрЛП(ПараметрыИтератора.Строка); + + Если ПустаяСтрока(Строка) Тогда + Продолжить; + ИначеЕсли НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда + Прервать; + КонецЕсли; + + СтрокаДанных = ПараметрыЗагрузки.Таблица.Добавить(); + Блоки = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина); + + Для Каждого ОписаниеКолонки Из ПараметрыЗагрузки.ОписаниеКолонок Цикл + + ЗначениеПредставления = Блоки[ОписаниеКолонки.Индекс]; + + Если ПустаяСтрока(ЗначениеПредставления) Тогда + Продолжить; + КонецЕсли; + + Значение = ЗначениеЯчейки(Блоки, + ЗначениеПредставления, + ОписаниеКолонки, + ЗаменяемыеЗначения, + КэшЗначений, + ПараметрыЗагрузки.ПараметрыСоздания); + СтрокаДанных[ОписаниеКолонки.Имя] = Значение; + + КонецЦикла; + + КонецЦикла; + + Возврат ПараметрыЗагрузки.Таблица; + +КонецФункции + +Функция ПараметрыИтератора(Источник) + + ПараметрыЧтения = Новый Структура; + + ПараметрыЧтения.Вставить("ИзТекстовогоДокумента", Ложь); + ПараметрыЧтения.Вставить("ИзЧтенияТекста", Ложь); + ПараметрыЧтения.Вставить("ИзВыборки", Ложь); + ПараметрыЧтения.Вставить("ДостиглиКонца", Ложь); + ПараметрыЧтения.Вставить("Строка", Неопределено); + + ТипЗначения = ТипЗнч(Источник); + + Если ТипЗначения = Тип("ТекстовыйДокумент") Тогда + ПараметрыЧтения.ИзТекстовогоДокумента = Истина; + ПараметрыЧтения.Вставить("ТекстовыйДокумент", Источник); + ПараметрыЧтения.Вставить("КоличествоСтрок", Источник.КоличествоСтрок()); + ПараметрыЧтения.Вставить("ИндексСтроки", 0); + ИначеЕсли ТипЗначения = Тип("Строка") Тогда + ПараметрыЧтения.ИзЧтенияТекста = Истина; + Кодировка = КодировкаТекста.UTF8; + Поток = ПолучитьДвоичныеДанныеИзСтроки(Источник, Кодировка).ОткрытьПотокДляЧтения(); + Чтение = Новый ЧтениеТекста(Поток, Кодировка); + ПараметрыЧтения.Вставить("Чтение", Чтение); + ПараметрыЧтения.Вставить("Поток", Поток); + ИначеЕсли ТипЗначения = Тип("ВыборкаДанных") Тогда + ПараметрыЧтения.ИзВыборки = Истина; + ПараметрыЧтения.Вставить("Выборка", Источник); + Иначе + ВызватьИсключение "Неподдерживаемый параметр"; + КонецЕсли; + + Возврат ПараметрыЧтения; + +КонецФункции + +Функция СледующаяСтрока(ПараметрыЧтения) + + Если ПараметрыЧтения.ДостиглиКонца Тогда + ВызватьИсключение "Построчное чтение уже завершено. Обнаружена попытка чтения завершенного потока"; + КонецЕсли; + + Если ПараметрыЧтения.ИзТекстовогоДокумента Тогда + + ЮТОбщий.Инкремент(ПараметрыЧтения.ИндексСтроки); + Если ПараметрыЧтения.ИндексСтроки > ПараметрыЧтения.КоличествоСтрок Тогда + ПараметрыЧтения.ДостиглиКонца = Истина; + Возврат Ложь; + КонецЕсли; + ПараметрыЧтения.Строка = ПараметрыЧтения.ТекстовыйДокумент.ПолучитьСтроку(ПараметрыЧтения.ИндексСтроки); + + ИначеЕсли ПараметрыЧтения.ИзЧтенияТекста Тогда + + ПараметрыЧтения.Строка = ПараметрыЧтения.Чтение.ПрочитатьСтроку(); + + Если ПараметрыЧтения.Строка = Неопределено Тогда + ПараметрыЧтения.Чтение.Закрыть(); + ПараметрыЧтения.Поток.Закрыть(); + ПараметрыЧтения.ДостиглиКонца = Истина; + Возврат Ложь; + КонецЕсли; + + ИначеЕсли ПараметрыЧтения.ИзВыборки Тогда + + Если ПараметрыЧтения.Выборка.Следующий() Тогда + ПараметрыЧтения.Строка = ПараметрыЧтения.Выборка; + Иначе + ПараметрыЧтения.ДостиглиКонца = Истина; + ПараметрыЧтения.Строка = Неопределено; + Возврат Ложь; + КонецЕсли; + + Иначе + + ВызватьИсключение "Некорректные/неподдерживаемые параметры чтения"; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент) + + ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы; + ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы; + + Область = ТабличныйДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок); + + ИсточникДанных = Новый ОписаниеИсточникаДанных(Область); + ПостроительОтчета = Новый ПостроительОтчета; + ПостроительОтчета.ИсточникДанных = ИсточникДанных; + ПостроительОтчета.Выполнить(); + + Возврат ПостроительОтчета.Результат.Выбрать(); + +КонецФункции + +Функция ДанныеМакета(Знач Макет) + + ТипПараметра = ТипЗнч(Макет); + ДанныеМакета = Неопределено; + + ПараметрыСодержитДанные = ТипПараметра = Тип("ТабличныйДокумент") + Или ТипПараметра = Тип("ТекстовыйДокумент") + Или ТипПараметра = Тип("Строка") + И СтрНачинаетсяС(Макет, "|"); + + Если ПараметрыСодержитДанные Тогда + ДанныеМакета = Макет; + ИначеЕсли ТипПараметра = Тип("Строка") Тогда + ДанныеМакета = ЮТОбщийВызовСервера.Макет(Макет); + Иначе + ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.ДанныеМакета", Макет); + КонецЕсли; + + Возврат ДанныеМакета; + +КонецФункции + +Функция ЗначениеЯчейки(СтрокаДанных, ЗначениеПредставления, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания) + + Значение = ЗаменяемыеЗначения[ЗначениеПредставления]; + + КэшироватьЗначение = Значение = Неопределено И ОписаниеКолонки.Менеджер <> Неопределено; + + Если КэшироватьЗначение Тогда + Если КэшЗначений[ОписаниеКолонки.Менеджер] = Неопределено Тогда + КэшЗначений.Вставить(ОписаниеКолонки.Менеджер, Новый Соответствие()); + Иначе + Значение = КэшЗначений[ОписаниеКолонки.Менеджер][ЗначениеПредставления]; + КонецЕсли; + КонецЕсли; + + Если Значение <> Неопределено Тогда + Возврат Значение; + КонецЕсли; + + ЗначенияРеквизитов = ЗначенияРеквизитов(СтрокаДанных, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания); + Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания); + + Если КэшироватьЗначение Тогда + КэшЗначений[ОписаниеКолонки.Менеджер].Вставить(ЗначениеПредставления, Значение); + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Процедура ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки) + + Если ЗаменяемыеЗначения = Неопределено Тогда + ЗаменяемыеЗначения = Новый Соответствие; + КонецЕсли; + + Если Не ЗначениеЗаполнено(КэшЗначений) Тогда + КэшЗначений = Новый Соответствие; + КонецЕсли; + + Для Каждого Колонка Из Колонки Цикл + + Если НЕ Колонка.Ссылочный Тогда + Продолжить; + КонецЕсли; + + Если КэшЗначений[Колонка.Менеджер] = Неопределено Тогда + КэшЗначений.Вставить(Колонка.Менеджер, Новый Соответствие); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ЗначенияРеквизитов(СтрокаТаблицы, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, Параметры) + + ЗначенияРеквизитов = Новый Структура(); + + Для Каждого ОписаниеВложеннойКолонки Из ОписаниеКолонки.ДополнительныеРеквизиты Цикл + + ПредставлениеЗначения = СтрокаТаблицы[ОписаниеВложеннойКолонки.Индекс]; + Если ПустаяСтрока(ПредставлениеЗначения) Тогда + Продолжить; + КонецЕсли; + + Значение = ЗначениеЯчейки(СтрокаТаблицы, ПредставлениеЗначения, ОписаниеВложеннойКолонки, ЗаменяемыеЗначения, КэшЗначений, Параметры); + ЗначенияРеквизитов.Вставить(ОписаниеВложеннойКолонки.Имя, Значение); + + КонецЦикла; + + ОписаниеОбъектаМетаданных = ОписаниеКолонки.ОписаниеОбъектаМетаданных; + + Если ОписаниеОбъектаМетаданных <> Неопределено И ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда + ИмяРеквизита = "Наименование"; + Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда + ИмяРеквизита = "Код"; + КонецЕсли; + ЗначенияРеквизитов.Вставить(ИмяРеквизита, СтрокаТаблицы[ОписаниеКолонки.Индекс]); + КонецЕсли; + + Возврат ЗначенияРеквизитов; + +КонецФункции + +Функция ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыЗаписи) + + Если ОписаниеКолонки.ЭтоПеречисление Тогда + Значение = ОписаниеКолонки.Менеджер[ЗначениеПредставления]; + ИначеЕсли ОписаниеКолонки.Ссылочный Тогда + Значение = СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи); + ИначеЕсли ОписаниеКолонки.ЭтоДата Тогда + Значение = ЮТПреобразования.ПривестиЗначениеКДате(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления); + ИначеЕсли ОписаниеКолонки.ЭтоЧисло Тогда + Значение = ЮТПреобразования.ПривестиЗначениеКЧислу(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления); + Иначе + Значение = ОписаниеКолонки.ОписаниеТипа.ПривестиЗначение(ЗначениеПредставления); + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи) + + Конструктор = ЮТТестовыеДанные.КонструкторОбъекта(ОписаниеКолонки.Менеджер); + + Если ЗначениеЗаполнено(ЗначенияРеквизитов) Тогда + Для Каждого ДанныеЗначения Из ЗначенияРеквизитов Цикл + Конструктор.Установить(ДанныеЗначения.Ключ, ДанныеЗначения.Значение); + КонецЦикла; + КонецЕсли; + + Если ПараметрыЗаписи.ФикцияОбязательныхПолей Тогда + Конструктор.ФикцияОбязательныхПолей(); + КонецЕсли; + + Возврат Конструктор.Записать(, ПараметрыЗаписи.ПараметрыЗаписи.ОбменДаннымиЗагрузка); + +КонецФункции + +Функция НоваяТаблица(ОписаниеКолонок) + + ТаблицаЗначений = Новый ТаблицаЗначений(); + + Для Каждого ОписаниеКолонки Из ОписаниеКолонок Цикл + ТаблицаЗначений.Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.ОписаниеТипа); + КонецЦикла; + + Возврат ТаблицаЗначений; + +КонецФункции + +Функция ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения) + + ОписаниеКолонок = ОписаниеКолонок(КолонкиМакета, ОписанияТипов); + ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, ОписаниеКолонок); + ПараметрыСоздания = ПараметрыЗаполнения.СозданиеОбъектовМетаданных; + + ТаблицаЗначений = НоваяТаблица(ОписаниеКолонок); + + ПараметрыЗагрузки = Новый Структура; + + ПараметрыЗагрузки.Вставить("ОписаниеКолонок", ОписаниеКолонок); + ПараметрыЗагрузки.Вставить("ПараметрыСоздания", ПараметрыСоздания); + ПараметрыЗагрузки.Вставить("Таблица", ТаблицаЗначений); + + Возврат ПараметрыЗагрузки; + +КонецФункции + +#Область ОписаниеКолонок + +Функция ОписаниеКолонок(КолонкиМакета, ОписанияТипов) + + ОсновныеКолонки = ОсновныеКолонкиМакета(КолонкиМакета); + + Для Каждого Элемент Из ОписанияТипов Цикл + + Если НЕ ОсновныеКолонки.Свойство(Элемент.Ключ) Тогда + + Сообщение = СтрШаблон("Макет не содержит колонку `%1`", Элемент.Ключ); + ВызватьИсключение Сообщение; + + КонецЕсли; + + КонецЦикла; + + Если ТипЗнч(ОписанияТипов) = Тип("Структура") Тогда + ОписанияТипов = ЮТОбщий.ВСоответствие(ОписанияТипов, "Ключ", "Значение"); + КонецЕсли; + + ЗагружаемыеКолонки = Новый Массив(); + + Для Каждого Элемент Из ОсновныеКолонки Цикл + + ОписаниеТиповКолонки = ОписанияТипов[Элемент.Ключ]; + + Если ОписаниеТиповКолонки = Неопределено Тогда + Продолжить; + КонецЕсли; + + ОсновнаяКолонка = Элемент.Значение; + ЗагружаемыеКолонки.Добавить(ОсновнаяКолонка); + + ОсновнаяКолонка.ОписаниеТипа = ОписаниеТиповКолонки; + ДозаполнитьОписаниеКолонки(ОсновнаяКолонка); + + ДополнительныеКолонки = ОсновнаяКолонка.ДополнительныеРеквизиты; + ОсновнаяКолонка.ДополнительныеРеквизиты = Новый Массив(); + + Для Каждого ВложеннаяКолонка Из ДополнительныеКолонки Цикл + + ВложеннаяКолонка.ОписаниеТипа = ОписаниеТипаВложеннойКолонки(ОписанияТипов, ОсновнаяКолонка, ВложеннаяКолонка); + + Если ВложеннаяКолонка.ОписаниеТипа = Неопределено Тогда + Продолжить; + КонецЕсли; + + ОсновнаяКолонка.ДополнительныеРеквизиты.Добавить(ВложеннаяКолонка); + ДозаполнитьОписаниеКолонки(ВложеннаяКолонка); + + КонецЦикла; + + ОсновнаяКолонка.Составное = ЗначениеЗаполнено(ОсновнаяКолонка.ДополнительныеРеквизиты); + + КонецЦикла; + + Возврат ЗагружаемыеКолонки; + +КонецФункции + +Функция ОписаниеТипаВложеннойКолонки(ОписанияТипов, ОсновнаяКолонка, ВложеннаяКолонка) + + ПолноеИмя = СтрШаблон("%1.%2", ОсновнаяКолонка.Имя, ВложеннаяКолонка.Имя); + ОписаниеТипа = ОписанияТипов[ПолноеИмя]; + + Если ОписаниеТипа = Неопределено Тогда + Реквизиты = ОсновнаяКолонка.ОписаниеОбъектаМетаданных.Реквизиты; + + Если Реквизиты.Свойство(ВложеннаяКолонка.Имя) Тогда + ОписаниеТипа = Реквизиты[ВложеннаяКолонка.Имя].Тип; + КонецЕсли; + КонецЕсли; + + Возврат ОписаниеТипа; + +КонецФункции + +Функция ОписаниеКолонки(Индекс) + + ОписаниеКолонки = Новый Структура; + ОписаниеКолонки.Вставить("Индекс", Индекс); + ОписаниеКолонки.Вставить("Имя", ""); + + ОписаниеКолонки.Вставить("ОписаниеТипа", Неопределено); + ОписаниеКолонки.Вставить("ТипЗначения", Неопределено); + ОписаниеКолонки.Вставить("Ссылочный", Ложь); + ОписаниеКолонки.Вставить("ДополнительныеРеквизиты", Новый Массив()); + ОписаниеКолонки.Вставить("Составное", Ложь); + ОписаниеКолонки.Вставить("Менеджер", Неопределено); + ОписаниеКолонки.Вставить("ОписаниеОбъектаМетаданных", Неопределено); + ОписаниеКолонки.Вставить("ЭтоПеречисление", Ложь); + ОписаниеКолонки.Вставить("ЭтоЧисло", Ложь); + ОписаниеКолонки.Вставить("ЭтоДата", Ложь); + + Возврат ОписаниеКолонки; + +КонецФункции + +Функция ОсновныеКолонкиМакета(КолонкиМакета) + + ОсновныеКолонки = Новый Структура(); + + ВторойУровеньВложенности = 2; + + // Сначала соберем основные колонки + Для Инд = 0 По КолонкиМакета.ВГраница() Цикл + + ИмяКолонки = КолонкиМакета[Инд]; + ЧастиИмени = СтрРазделить(ИмяКолонки, "."); + + Если ПустаяСтрока(ИмяКолонки) ИЛИ ЧастиИмени.Количество() = ВторойУровеньВложенности Тогда + Продолжить; + ИначеЕсли ЧастиИмени.Количество() > ВторойУровеньВложенности Тогда + Сообщение = СтрШаблон("Некорректное имя колонки макета `%1`, доступно использовать максимум 1 уровень вложенности", ИмяКолонки); + ВызватьИсключение Сообщение; + Иначе + ОписаниеКолонки = ОписаниеКолонки(Инд); + ОписаниеКолонки.Имя = ИмяКолонки; + + ОсновныеКолонки.Вставить(ИмяКолонки, ОписаниеКолонки); + КонецЕсли; + + КонецЦикла; + + Для Инд = 0 По КолонкиМакета.ВГраница() Цикл + + ЧастиИмени = СтрРазделить(КолонкиМакета[Инд], "."); + + Если ЧастиИмени.Количество() <> ВторойУровеньВложенности Тогда + Продолжить; + КонецЕсли; + + Если НЕ ОсновныеКолонки.Свойство(ЧастиИмени[0]) Тогда + Сообщение = СтрШаблон("Для колонки `%1` не найдена в макете основная колонка с именем `%2`", ИмяКолонки, ЧастиИмени[0]); + ВызватьИсключение Сообщение; + КонецЕсли; + + ОсновнаяКолонка = ОсновныеКолонки[ЧастиИмени[0]]; + ОписаниеКолонки = ОписаниеКолонки(Инд); + ОписаниеКолонки.Имя = ЧастиИмени[1]; + + ОсновнаяКолонка.ДополнительныеРеквизиты.Добавить(ОписаниеКолонки); + + КонецЦикла; + + Возврат ОсновныеКолонки; + +КонецФункции + +Процедура ДозаполнитьОписаниеКолонки(ОписаниеКолонки) + + ТипЗначения = ОписаниеКолонки.ОписаниеТипа.Типы()[0]; + ОписаниеКолонки.ТипЗначения = ТипЗначения; + + ОписаниеКолонки.Ссылочный = ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗначения); + ОписаниеКолонки.ЭтоЧисло = ТипЗначения = Тип("Число"); + ОписаниеКолонки.ЭтоДата = ТипЗначения = Тип("Дата"); + + Если ОписаниеКолонки.Ссылочный Тогда + ОписаниеКолонки.ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ТипЗначения); + ОписаниеКолонки.ЭтоПеречисление = ЮТМетаданные.ЭтоПеречисление(ОписаниеКолонки.ОписаниеОбъектаМетаданных); + ОписаниеКолонки.Менеджер = ЮТОбщий.Менеджер(ОписаниеКолонки.ОписаниеОбъектаМетаданных); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.mdo" new file mode 100644 index 000000000..6c6dc00b0 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.mdo" @@ -0,0 +1,10 @@ + + + ЮТТестовыеДанные_ТаблицыЗначений + + ru + Тестовые данные таблицы значений + + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" index 62f44cdc7..b77cd5e8e 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" @@ -32,7 +32,7 @@ Объект = НовыйОбъект(Менеджер, Данные, ПараметрыЗаписи.ДополнительныеСвойства); - ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектМетаданных(ТипЗнч(Менеджер)); + ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер); РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено); КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи); @@ -58,7 +58,7 @@ Менеджер = ЮТОбщий.Менеджер(Менеджер); - ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектМетаданных(ТипЗнч(Менеджер)); + ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер); Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, Данные); ЗаполнитьЗначенияСвойств(Объект, Данные); @@ -114,7 +114,7 @@ Объект.Удалить(); КонецЕсли; Иначе - Менеджер = Менеджер(ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗначения, Ложь)); + Менеджер = ЮТОбщий.Менеджер(ТипЗначения); Запись = Менеджер.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(Запись, Ссылка); Запись.Прочитать(); @@ -146,13 +146,11 @@ Если Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда - Менеджер = Новый ("ПеречислениеМенеджер." + ОбъектМетаданных.Имя); - НомерЗначения = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(Менеджер.Количество()); - Возврат Менеджер.Получить(НомерЗначения - 1); + Возврат СлучайноеЗначениеПеречисления(ОбъектМетаданных); КонецЕсли; - ОписаниеОбъектаМетаданных = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ОбъектМетаданных); + ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОбъектМетаданных); ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа; ИмяТипаМенеджера = СтрШаблон("%1Менеджер.%2", ОписаниеТипа.Имя, ОбъектМетаданных.Имя); @@ -170,6 +168,45 @@ КонецФункции +Функция ЗагрузитьИзМакета(Знач Макет, + Знач ОписанияТипов, + Знач КэшЗначений, + Знач ЗаменяемыеЗначения, + Знач ПараметрыЗаполнения, + Знач ТаблицаЗначений) Экспорт + + Таблица = ЮТТестовыеДанные_ТаблицыЗначений.ЗагрузитьИзМакета(Макет, + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения, + ПараметрыЗаполнения); + + Если ТаблицаЗначений Тогда + Возврат Таблица; + КонецЕсли; + + Реквизиты = СтрСоединить(ЮТОбщий.ВыгрузитьЗначения(Таблица.Колонки, "Имя"), ","); + Результат = Новый Массив(Таблица.Количество()); + + Для Инд = 0 По Таблица.Количество() - 1 Цикл + Запись = Новый Структура(Реквизиты); + ЗаполнитьЗначенияСвойств(Запись, Таблица[Инд]); + Результат[Инд] = Запись; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция СлучайноеЗначениеПеречисления(Знач Перечисление) Экспорт + + Менеджер = ЮТОбщий.Менеджер(Перечисление); + + НомерЗначения = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(Менеджер.Количество()); + Возврат Менеджер.Получить(НомерЗначения - 1); + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -179,7 +216,7 @@ // Параметры: ОписаниеМенеджера - // См. ОписаниеМенеджера // Менеджер - Произвольный - Менеджер -// ОписаниеТипа - см. ЮТМетаданные.ОписаниеОбъектМетаданных +// ОписаниеТипа - см. ЮТМетаданные.ОписаниеОбъектаМетаданных // Данные - Структура // Возвращаемое значение: // Произвольный - Создать объект @@ -283,7 +320,7 @@ ИначеЕсли СтрНайти(ПредставлениеТипа, "менеджер записи:") Тогда // TODO - Описание = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗнч(Объект)); + Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Объект); КлючевыеРеквизиты = Новый Структура(); Для Каждого Реквизит Из Описание.Реквизиты Цикл @@ -292,7 +329,7 @@ КонецЕсли; КонецЦикла; - Менеджер = Менеджер(Описание); + Менеджер = ЮТОбщий.Менеджер(Описание); Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты); Иначе @@ -304,8 +341,4 @@ КонецФункции -Функция Менеджер(ОписаниеОбъектМетаданных) - Возврат Новый(СтрШаблон("%1Менеджер.%2", ОписаниеОбъектМетаданных.ОписаниеТипа.Имя, ОписаниеОбъектМетаданных.Имя)); -КонецФункции - #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" index 33662e438..60019a164 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" @@ -58,7 +58,7 @@ Значение = ЮТТестовыеДанные.СлучайноеБулево(); - ИначеЕсли ЭтоСистемноеПеречисление(Тип) Тогда + ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоСистемноеПеречисление(Тип) Тогда Значение = СлучайноЗначениеСистемногоПеречисления(Тип); @@ -116,6 +116,18 @@ КонецПроцедуры +// Возвращает соответствие с подстроками поиска и замены +// Возвращаемое значение: +// Соответствие из Строка +Функция ПодстрокиДляЗаменыВИменахСвойств() Экспорт + + ЗаменяемыеПодстроки = Новый Соответствие; + ЗаменяемыеПодстроки.Вставить(".", "_tchk_"); + + Возврат ЗаменяемыеПодстроки; + +КонецФункции + #Область ОбработчикиСобытий Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт @@ -138,44 +150,26 @@ #КонецОбласти -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЭтоСистемноеПеречисление(Тип) +Функция ЗагрузитьИзМакета(Макет, ОписанияТипов, КэшЗначений, ЗаменяемыеЗначения, ПараметрыСозданияОбъектов, ТаблицаЗначений) Экспорт - Возврат ТипыСистемныхПеречислений().СодержитТип(Тип); + ПараметрыЗаполнения = ЮТФабрика.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов); -КонецФункции - -Функция ТипыСистемныхПеречислений() - - Возврат Новый ОписаниеТипов( - "ВидДвиженияБухгалтерии, - |ВидДвиженияНакопления, - |ВидПериодаРегистраРасчета, - |ВидСчета, - |ВидТочкиМаршрутаБизнесПроцесса, - |ИспользованиеГруппИЭлементов, - |ИспользованиеСреза, - |ИспользованиеРежимаПроведения, - |РежимАвтоВремя, - |РежимЗаписиДокумента, - |РежимПроведенияДокумента, - |ПериодичностьАгрегатаРегистраНакопления, - |ИспользованиеАгрегатаРегистраНакопления"); + Возврат ЮТТестовыеДанныеВызовСервера.ЗагрузитьИзМакета(Макет, + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения, + ПараметрыЗаполнения, + ТаблицаЗначений); КонецФункции -Функция ИмяСистемногоПеречисления(Тип) - - Возврат Строка(Тип); - -КонецФункции +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции Функция СлучайноЗначениеСистемногоПеречисления(Тип) - Менеджер = ЮТОбщий.ВычислитьБезопасно(ИмяСистемногоПеречисления(Тип)); + Менеджер = ЮТОбщий.ВычислитьБезопасно(ЮТТипыДанныхСлужебный.ИмяСистемногоПеречисления(Тип)); Значения = Новый Массив(); diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" new file mode 100644 index 000000000..4b5cde52d --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" @@ -0,0 +1,171 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ПредставлениеТипа(Тип) Экспорт + +#Если ВебКлиент Тогда + ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа"); +#Иначе + //@skip-check Undefined variable + ТипXML = СериализаторXDTO.XMLТип(Тип); + + Если ТипXML = Неопределено Тогда + Возврат Строка(Тип); + Иначе + Возврат ТипXML.ИмяТипа; + КонецЕсли; +#КонецЕсли + +КонецФункции + +Функция ИдентификаторТипа(Тип) Экспорт + +#Если ВебКлиент Тогда + ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа"); +#ИначеЕсли Сервер Тогда + Возврат ЗначениеВСтрокуВнутр(Тип); // Не все серверные типы сериализуются через СериализаторXDTO +#Иначе + Попытка + Запись = Новый ЗаписьJSON(); + Запись.УстановитьСтроку(); + СериализаторXDTO.ЗаписатьJSON(Запись, Тип); + Возврат Запись.Закрыть(); + Исключение + ВызватьИсключение СтрШаблон("Не удалось определить индетификатор типа для `%1` + |%2", Тип, ОписаниеОшибки()); + КонецПопытки; +#КонецЕсли + +КонецФункции + +Функция ТипПоИдентификатору(ИдентификаторТипа) Экспорт + +#Если ВебКлиент Тогда + ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа"); +#ИначеЕсли Сервер Тогда + Если СтрНачинаетсяС(ИдентификаторТипа, "{") Тогда + Возврат ЗначениеИзСтрокиВнутр(ИдентификаторТипа); + КонецЕсли; +#КонецЕсли + + Возврат ТипПоПредставлению(ИдентификаторТипа); + +КонецФункции + +Функция ТипПоПредставлению(ПредставлениеТипа) Экспорт + +#Если ВебКлиент Тогда + ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ТипПоПредставлению"); +#Иначе + Чтение = Новый ЧтениеJSON(); + Чтение.УстановитьСтроку(ПредставлениеТипа); + Результат = СериализаторXDTO.ПрочитатьJSON(Чтение, Тип("Тип")); + + Если Результат = Неопределено Тогда + ВызватьИсключение СтрШаблон("Не удалось определить тип по представлению `%1`", ПредставлениеТипа); + КонецЕсли; + + Возврат Результат; +#КонецЕсли + +КонецФункции + +Функция ЭтоСсылочныйТип(Тип) Экспорт + + Возврат Тип <> Неопределено И ЮТОбщий.ОписаниеТиповЛюбаяСсылка().СодержитТип(Тип); + +КонецФункции + +#Область СистемныеПеречисления + +Функция ЭтоСистемноеПеречисление(Тип) Экспорт + + Возврат ТипыСистемныхПеречислений().СодержитТип(Тип); + +КонецФункции + +Функция ТипыСистемныхПеречислений() Экспорт + + Возврат Новый ОписаниеТипов( + "ВидДвиженияБухгалтерии, + |ВидДвиженияНакопления, + |ВидПериодаРегистраРасчета, + |ВидСчета, + |ВидТочкиМаршрутаБизнесПроцесса, + |ИспользованиеГруппИЭлементов, + |ИспользованиеСреза, + |ИспользованиеРежимаПроведения, + |РежимАвтоВремя, + |РежимЗаписиДокумента, + |РежимПроведенияДокумента, + |ПериодичностьАгрегатаРегистраНакопления, + |ИспользованиеАгрегатаРегистраНакопления"); + +КонецФункции + +Функция ИмяСистемногоПеречисления(Тип) Экспорт + + Возврат Строка(Тип); + +КонецФункции + +Функция ЭтоКоллекцияПримитивныхТипов(Типы) Экспорт + + Для Каждого Тип Из Типы Цикл + + Если НЕ ЭтоПримитивныйТип(Тип) Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Функция ЭтоПримитивныйТип(Тип) Экспорт + + ПримитивныеТипы = ЮТПовторногоИспользования.ПримитивныеТипы(); + + ТипПараметра = ТипЗнч(Тип); + + Если ТипПараметра = Тип("Тип") Тогда + Возврат ПримитивныеТипы.Найти(Тип) <> Неопределено; + КонецЕсли; + + Для Каждого Тип Из Тип.Типы() Цикл + + Если ПримитивныеТипы.Найти(Тип) = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" new file mode 100644 index 000000000..539418b45 --- /dev/null +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" @@ -0,0 +1,11 @@ + + + ЮТТипыДанныхСлужебный + + ru + Типы данных + + true + true + true + diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" index 9b647dbd4..b8b6ebe97 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" @@ -696,6 +696,40 @@ КонецФункции +// Проверяет установленное значение Контекста (или его свойство) на наличие подстроки, соответствующей регулярному выражению +// +// Параметры: +// Шаблон - Строка - Регулярное выражение, по которому ищем подстроку +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция СодержитСтрокуПоШаблону(Знач Шаблон, Знач ОписаниеПроверки = Неопределено) Экспорт + + Контекст = Контекст(); + УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки); + ПроверитьСоответствиеШаблону(Контекст, Шаблон, Ложь); + Возврат ЮТУтверждения; + +КонецФункции + +// Проверяет установленное значение Контекста (или его свойство) на отсутствие подстроки, соответствующей регулярному выражению +// +// Параметры: +// Шаблон - Строка - Регулярное выражение, по которому ищем подстроку +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция НеСодержитСтрокуПоШаблону(Знач Шаблон, Знач ОписаниеПроверки = Неопределено) Экспорт + + Контекст = Контекст(); + УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки); + ПроверитьСоответствиеШаблону(Контекст, Шаблон, Истина); + Возврат ЮТУтверждения; + +КонецФункции + // Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции. // // Проверка поддерживается для следующих типов проверяемого значения: @@ -1547,6 +1581,10 @@ ИскомоеЗначениеНайдено = ПроверяемоеЗначение.НайтиПоЗначению(ОжидаемоеЗначение) <> Неопределено; + ИначеЕсли ПроверяемоеЗначение <> Неопределено И ЮТОбщий.МетодМодуляСуществует(ПроверяемоеЗначение, "Найти", , Ложь) Тогда + + ИскомоеЗначениеНайдено = ПроверяемоеЗначение.Найти(ОжидаемоеЗначение) <> Неопределено; + КонецЕсли; Возврат ИскомоеЗначениеНайдено; @@ -1622,7 +1660,7 @@ Попытка ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст); ПроверитьТипЗначения(Контекст, ОжидаемоеЗначение, Новый ОписаниеТипов("ОписаниеТипов, Тип, Строка")); - Результат = ТипЗначенияСоответствует(ПроверяемоеЗначение, ОжидаемоеЗначение); + Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ОжидаемоеЗначение); Исключение ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст); КонецПопытки; @@ -1643,7 +1681,7 @@ Возврат; КонецЕсли; - Соответствует = ТипЗначенияСоответствует(Значение, ОжидаемыйТип); + Соответствует = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(Значение, ОжидаемыйТип); Если НЕ Соответствует Тогда ТекстОшибки = СтрШаблон("Не верный тип %1 (`%2`), должен быть `%3`%4", @@ -1656,34 +1694,6 @@ КонецПроцедуры -Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип) - - ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип); - - Если ТипОжидаемогоТипа = Тип("Строка") Тогда - Если СтрНайти(ОжидаемыйТип, ",") Тогда - ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип); - ТипОжидаемогоТипа = Тип("ОписаниеТипов"); - Иначе - ОжидаемыйТип = Тип(ОжидаемыйТип); - ТипОжидаемогоТипа = Тип("Тип"); - КонецЕсли; - КонецЕсли; - - ТипЗначения = ТипЗнч(Значение); - - Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда - // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено") - Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено - И ОжидаемыйТип.ПривестиЗначение(Значение) = Значение; - Иначе - Соответствует = ТипЗначения = ОжидаемыйТип; - КонецЕсли; - - Возврат Соответствует; - -КонецФункции - Функция ЭтоТипМассива(Тип) Возврат Тип = Тип("Массив") Или Тип = Тип("ФиксированныйМассив"); @@ -1774,6 +1784,25 @@ КонецПроцедуры +Процедура ПроверитьСоответствиеШаблону(Контекст, ОжидаемоеЗначение, Реверс) + + Попытка + ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст); + Результат = ВыполнитьПроверкуСоответствуетШаблону(ПроверяемоеЗначение, ОжидаемоеЗначение); + Исключение + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст); + КонецПопытки; + + Если Результат = Неопределено Тогда + ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение)); + ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки, Контекст); + КонецЕсли; + + Сообщение = СтрШаблон("содержит подстроку соответствующую шаблону `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение); + +КонецПроцедуры + Функция ДлинаПроверяемогоЗначения(Контекст) Попытка @@ -1956,4 +1985,22 @@ КонецПроцедуры +Функция ВыполнитьПроверкуСоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение) + + Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда + Возврат Неопределено; + КонецЕсли; + + РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения(); + + Попытка + Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение); + Исключение + ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки; + КонецПопытки; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl" index c577469cc..6688db3d3 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl" @@ -161,7 +161,6 @@ ТипыОшибок = Новый Массив(); ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ТестНеРеализован", "Не реализован", Статусы.НеРеализован)); - ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ТестНеРеализован", "Не реализован", Статусы.НеРеализован)); ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ОшибкаСравнения", "Ошибка сравнения", Статусы.Ошибка)); ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ОшибкаОбработкиСобытия", "Ошибка обработки события", Статусы.Сломан)); ТипыОшибок.Добавить(Новый Структура(Реквизиты, "Утверждений", "Ошибка утверждений", Статусы.Ошибка)); @@ -279,12 +278,36 @@ КонецФункции +// Описание исполняемого тестового модуля. +// Содержит всю необходимую информацию для прогона тестов, а также данные результата +// Параметры: +// ТестовыйМодуль - см. ОписаниеТестовогоМодуля +// +// Возвращаемое значение: +// Структура - Описание тестового модуля: +// * МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля +// * НаборыТестов - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов +// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки +// * НастройкиВыполнения- Структура - Настройки исполнения теста +Функция ОписаниеИсполняемогоТестовогоМодуля(ТестовыйМодуль) Экспорт + + Описание = Новый Структура; + + Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля); + Описание.Вставить("НаборыТестов", Новый Массив); + Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(ТестовыйМодуль.Ошибки)); + Описание.Вставить("НастройкиВыполнения", ЮТОбщий.СкопироватьСтруктуру(ТестовыйМодуль.НастройкиВыполнения)); + + Возврат Описание; + +КонецФункции + // ОписаниеИсполняемогоНабораТестов // Возвращает описание исполняемого тестового набора. // Содержит данные необходимые для выполнения прогона тестов // Параметры: -// НаборТестов - Массив из см. ОписаниеТеста - Коллекция зарегистрированных тестовых наборов, см. ОписаниеТестовогоНабора -// ТестовыйМодуль - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля +// НаборТестов - См. ОписаниеТестовогоНабора +// ТестовыйМодуль - См. ОписаниеТестовогоМодуля // // Возвращаемое значение: // Структура - Описание исполняемого набора тестов: @@ -308,6 +331,7 @@ Описание.Вставить("Теги", НаборТестов.Теги); Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(НаборТестов.Ошибки)); Описание.Вставить("Режим", ""); + Описание.Вставить("ТестовыйМодуль", ТестовыйМодуль); Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля); Описание.Вставить("Тесты", Новый Массив); Описание.Вставить("Выполнять", Описание.Ошибки.Количество() = 0); @@ -324,9 +348,9 @@ // Содержит данные необходимые для выполнения прогона тестов // // Параметры: -// Тест - Структура из см. ОписаниеТеста - Описание зарегистрированного теста, см. ОписаниеТеста -// Режим - Строка - Режим исполнения, см. КонтекстыВызова -// ТестовыйМодуль - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля +// Тест - См. ОписаниеТеста +// Режим - См. КонтекстыВызова +// ТестовыйМодуль - См. ОписаниеТестовогоМодуля // // Возвращаемое значение: // Структура - Описание исполняемого теста: @@ -378,7 +402,10 @@ // * logging - см. ПараметрыЛогирования // * showReport - Булево - Признак необходмости отобразить отчет в 1с по окончании тестирования // * exitCode - Строка - Путь к файлу, в который будет записан коды выхода -Функция ПараметрыЗапуска() Экспорт +// * ПодключатьВнешниеКомпоненты - Булево - Выполнять установку и подключение внешних компонент при старте. +// Если выключено и включен запрет синхронных вызовов, то компоненты не будут доступы в тонком клиенте. +// Если выключено и разрешены синхронные вызовы, то компоненты можно установить вручную и тогда они будут доступны на клиенте. + Функция ПараметрыЗапуска() Экспорт Параметры = Новый Структура; @@ -393,6 +420,8 @@ Параметры.Вставить("logging", ПараметрыЛогирования()); Параметры.Вставить("exitCode", ""); + Параметры.Вставить("ПодключатьВнешниеКомпоненты", Истина); + Возврат Параметры; КонецФункции @@ -426,6 +455,7 @@ // * КлиентОбычноеПриложение - Булево - Доступность контекста // * Сервер - Булево - Доступность контекста // * ВызовСервера - Булево - Доступность контекста +// * Глобальный - Булево - Доступность контекста Функция ОписаниеМодуля() Экспорт Описание = Новый Структура; @@ -436,6 +466,7 @@ Описание.Вставить("КлиентОбычноеПриложение", Ложь); Описание.Вставить("Сервер", Ложь); Описание.Вставить("ВызовСервера", Ложь); + Описание.Вставить("Глобальный", Ложь); Возврат Описание; @@ -592,6 +623,30 @@ КонецФункции +// Описание реквизита объекта метаданных +// +// Параметры: +// Реквизит - ОбъектМетаданных +// ЭтоКлюч - Булево - Это ключевой реквизит (ссылка, измерение) +// +// Возвращаемое значение: +// Структура - Описание реквизита: +// * Имя - Строка +// * Тип - ОписаниеТипов +// * Обязательный - Булево +// * ЭтоКлюч - Булево +Функция ОписаниеРеквизита(Знач Реквизит, Знач ЭтоКлюч) Экспорт + + Описание = Новый Структура(); + Описание.Вставить("Имя", Реквизит.Имя); + Описание.Вставить("Тип", Реквизит.Тип); + Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку); + Описание.Вставить("ЭтоКлюч", ЭтоКлюч); + + Возврат Описание; + +КонецФункции + #КонецОбласти #Область КонструкторыКонтекстов @@ -668,10 +723,10 @@ // КонтекстыМодуля // Возвращает коллекцию доступных контекстов выполнения модуля // Параметры: -// Модуль Модуль +// Модуль - См. ОписаниеМодуля // // Возвращаемое значение: -// Массив - Контексты модуля +// Массив из Строка - Контексты модуля, возможные значения см. КонтекстыВызова Функция КонтекстыМодуля(Модуль) Экспорт Контексты = КонтекстыВызова(); @@ -697,7 +752,7 @@ // КонтекстыПриложения // Возвращает коллекцию доступных контекстов приложения // Возвращаемое значение: -// Массив из см. КонтекстыВызова - Контексты приложения +// Массив из Строка - Контексты приложения, возможные значения см. КонтекстыВызова Функция КонтекстыПриложения() Экспорт #Если НЕ Клиент Тогда @@ -771,6 +826,34 @@ КонецФункции +Функция ПараметрыСозданияОбъектов(Знач ПараметрыЗаписи = Неопределено, ФикцияОбязательныхПолей = Ложь) Экспорт + + Если ПараметрыЗаписи = Неопределено Тогда + ПараметрыЗаписи = ПараметрыЗаписи(); + Иначе + ВходныеПараметрыЗаписи = ПараметрыЗаписи; + ПараметрыЗаписи = ПараметрыЗаписи(); + ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ВходныеПараметрыЗаписи); + КонецЕсли; + + Возврат Новый ФиксированнаяСтруктура("ФикцияОбязательныхПолей, ПараметрыЗаписи", ФикцияОбязательныхПолей, ПараметрыЗаписи); + +КонецФункции + +Функция ПараметрыЗаполненияТаблицыЗначений(Знач ПараметрыСозданияОбъектов = Неопределено) Экспорт + + Если ПараметрыСозданияОбъектов = Неопределено Тогда + ПараметрыСозданияОбъектов = ПараметрыСозданияОбъектов(); + Иначе + ВходныеПараметрыСозданияОбъектов = ПараметрыСозданияОбъектов; + ПараметрыСозданияОбъектов = ПараметрыСозданияОбъектов(); + ЗаполнитьЗначенияСвойств(ПараметрыСозданияОбъектов, ВходныеПараметрыСозданияОбъектов); + КонецЕсли; + + Возврат Новый ФиксированнаяСтруктура("СозданиеОбъектовМетаданных", ПараметрыСозданияОбъектов); + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -814,10 +897,9 @@ Функция НастройкиВыполнения() Экспорт - ПараметрыИсполнения = ПараметрыИсполненияТеста(); - Настройки = Новый Структура(); + ПараметрыИсполнения = ПараметрыИсполненияТеста(); Настройки.Вставить(ПараметрыИсполнения.ВТранзакции, Ложь); Возврат Настройки; @@ -828,6 +910,7 @@ Параметры = Новый Структура(); Параметры.Вставить("file", ""); + Параметры.Вставить("console", Ложь); Параметры.Вставить("enable", Неопределено); Параметры.Вставить("level", ЮТЛогирование.УровниЛога().Отладка); diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl" index 249d5d762..528c0fe52 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl" @@ -77,26 +77,28 @@ // Параметры: // Путь1 - Строка - базовый путь к каталогу // Путь2 - Строка - относительный путь к вложенному элементу +// Путь3 - Строка - относительный путь к вложенному элементу +// Путь4 - Строка - относительный путь к вложенному элементу +// Путь5 - Строка - относительный путь к вложенному элементу // // Возвращаемое значение: // Строка - Объединенный путь -Функция ОбъединитьПути(Путь1, Путь2) Экспорт +Функция ОбъединитьПути(Путь1, Путь2, Путь3 = Неопределено, Путь4 = Неопределено, Путь5 = Неопределено) Экспорт - Результат = Неопределено; + Разделитель = ПолучитьРазделительПути(); - Если ЗначениеЗаполнено(Путь1) И ЗначениеЗаполнено(Путь2) Тогда - Разделитель = ПолучитьРазделительПути(); - - Если НЕ СтрЗаканчиваетсяНа(Путь1, Разделитель) И НЕ СтрНачинаетсяС(Разделитель, Путь2) Тогда - Результат = СтрШаблон("%1%2%3", Путь1, Разделитель, Путь2); - Иначе - Результат = Путь1 + Путь2; - КонецЕсли; - - ИначеЕсли ЗначениеЗаполнено(Путь1) Тогда - Результат = Путь1; - Иначе - Результат = Путь2; + Результат = ДополнитьПуть(Путь1, Путь2, Разделитель); + + Если Путь3 <> Неопределено Тогда + Результат = ДополнитьПуть(Результат, Путь3, Разделитель); + КонецЕсли; + + Если Путь4 <> Неопределено Тогда + Результат = ДополнитьПуть(Результат, Путь4, Разделитель); + КонецЕсли; + + Если Путь5 <> Неопределено Тогда + Результат = ДополнитьПуть(Результат, Путь5, Разделитель); КонецЕсли; Возврат Результат; @@ -163,7 +165,7 @@ Процедура ПолучитьАтрибутФайла(Результат, Параметры) Экспорт Если НЕ Результат Тогда - ВыполнитьОбработкуОповещения(Параметры.Обработчик, Параметры.ЗначениеПоУмолчанию); + ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик, Параметры.ЗначениеПоУмолчанию); Возврат; КонецЕсли; @@ -174,4 +176,26 @@ КонецПроцедуры #КонецЕсли +Функция ДополнитьПуть(Путь1, Путь2, Разделитель) + + Результат = Неопределено; + + Если ЗначениеЗаполнено(Путь1) И ЗначениеЗаполнено(Путь2) Тогда + + Если НЕ СтрЗаканчиваетсяНа(Путь1, Разделитель) И НЕ СтрНачинаетсяС(Разделитель, Путь2) Тогда + Результат = СтрШаблон("%1%2%3", Путь1, Разделитель, Путь2); + Иначе + Результат = Путь1 + Путь2; + КонецЕсли; + + ИначеЕсли ЗначениеЗаполнено(Путь1) Тогда + Результат = Путь1; + Иначе + Результат = Путь2; + КонецЕсли; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" index 8c6be621b..1710a2124 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" @@ -58,7 +58,7 @@ Функция ИсполняемыеСценарииМодуля(МетаданныеМодуля) Экспорт ЭтоТестовыйМодуль = Истина; - ОписаниеТестовогоМодуля = ЮТФабрика.ОписаниеТестовогоМодуля(МетаданныеМодуля, Неопределено); + ОписаниеТестовогоМодуля = ЮТФабрика.ОписаниеТестовогоМодуля(МетаданныеМодуля, Новый Массив); ЮТТесты.ПередЧтениемСценариевМодуля(МетаданныеМодуля); @@ -115,6 +115,10 @@ // Булево - Этот модуль содержит тесты Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт + Если МетаданныеМодуля.Глобальный Тогда + Возврат Ложь; + КонецЕсли; + #Если Сервер Тогда Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев()); #КонецЕсли diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl" index 6453e191e..5def9d1bd 100644 --- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl" +++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl" @@ -38,7 +38,7 @@ // Возвращает API формирования утверждения для проверки данных базы. // // Параметры: -// ИмяТаблицы - Произвольный - Имя таблицы базы, например, `Справочник.Пользователи`, `Документ.ПКО`, `РегистрСведений.ИнформацияОбОшибках` +// ИмяТаблицы - Строка - Имя таблицы базы, например, `Справочник.Пользователи`, `Документ.ПКО`, `РегистрСведений.ИнформацияОбОшибках` // Сообщение - Строка - Описание проверки, которое будет выведено при возникновении ошибки // // Возвращаемое значение: @@ -83,6 +83,13 @@ КонецФункции +// Умный контекст, в который можно сохранять и получать из него промежуточные данные +// Этот контекст работает с см. КонтекстТеста, см. КонтекстТестовогоНабора и см. КонтекстМодуля. +// При получении значения оно ущется во всех 3 контекста поочереди. +// При установке значения, оно устанавливается в текущий контекст, например, в событии перед тестовым наборов в м. КонтекстТестовогоНабора +// +// Возвращаемое значение: +// ОбщийМодуль - Контекст теста, см. ЮТКонтекстТеста Функция Контекст() Экспорт Возврат ЮТКонтекстТеста; @@ -149,4 +156,24 @@ КонецФункции +// Преостанавливает поток выполнения на указанное количество секунд +// +// Параметры: +// Время - Число - Продолжительность паузы в секундах, возможно указывать дробное значение +Процедура Пауза(Время) Экспорт + + ЮТОбщий.Пауза(Время); + +КонецПроцедуры + +// Выводит сообщение в консоль (stdout) приложения +// +// Параметры: +// Сообщение - Строка - Выводимое сообщение +Процедура ВывестиВКонсоль(Сообщение) Экспорт + + ЮТОбщий.ВывестиВКонсоль(Сообщение); + +КонецПроцедуры + #КонецОбласти diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/Template.addin" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/Template.addin" new file mode 100644 index 000000000..3e59669eb Binary files /dev/null and "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/Template.addin" differ diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/\320\256\320\242RegEx1CAddin.mdo" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/\320\256\320\242RegEx1CAddin.mdo" new file mode 100644 index 000000000..2ce9212dd --- /dev/null +++ "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/\320\256\320\242RegEx1CAddin.mdo" @@ -0,0 +1,9 @@ + + + ЮТRegEx1CAddin + + ru + Reg ex1 c addin + + AddIn + diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/Template.addin" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/Template.addin" new file mode 100644 index 000000000..c65129374 Binary files /dev/null and "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/Template.addin" differ diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/\320\256\320\242YaxUnitAddIn.mdo" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/\320\256\320\242YaxUnitAddIn.mdo" new file mode 100644 index 000000000..23825ac97 --- /dev/null +++ "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/\320\256\320\242YaxUnitAddIn.mdo" @@ -0,0 +1,9 @@ + + + ЮТYaxUnitAddIn + + ru + ЮТYax unit add in + + AddIn + diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt" index 31e02b130..b8c822dd0 100644 --- "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt" +++ "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt" @@ -14,3 +14,4 @@ | РегистрРасчета | РегистрыРасчета | | | | + | + | + | | | | БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + | | Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + | +| Перечисление | Перечисления | | | + | | | | | | diff --git a/exts/yaxunit/src/Configuration/Configuration.mdo b/exts/yaxunit/src/Configuration/Configuration.mdo index 3bdcd3a19..d46ee9259 100644 --- a/exts/yaxunit/src/Configuration/Configuration.mdo +++ b/exts/yaxunit/src/Configuration/Configuration.mdo @@ -16,7 +16,7 @@ 8.3.10 AddOn Russian - 23.07.0 + 23.08.0 Русский Adopted @@ -43,11 +43,14 @@ CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеИмена_ru CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеОтчества_ru CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru + CommonTemplate.ЮТRegEx1CAddin + CommonTemplate.ЮТYaxUnitAddIn CommonTemplate.ЮТОписаниеМетаданных CommonModule.Мокито CommonModule.МокитоОбучение CommonModule.МокитоПроверки CommonModule.МокитоСлужебный + CommonModule.ЮТАсинхроннаяОбработкаСлужебныйКлиент CommonModule.ЮТест CommonModule.ЮТЗапросы CommonModule.ЮТЗапросыВызовСервера @@ -55,6 +58,9 @@ CommonModule.ЮТИсполнительКлиент CommonModule.ЮТИсполнительКлиентСервер CommonModule.ЮТИсполнительСервер + CommonModule.ЮТКомпоненты + CommonModule.ЮТКомпонентыВызовСервера + CommonModule.ЮТКомпонентыКлиент CommonModule.ЮТКонструкторВариантов CommonModule.ЮТКонструкторТестовыхДанныхСлужебный CommonModule.ЮТКонтекст @@ -83,15 +89,20 @@ CommonModule.ЮТПодражательСлужебный CommonModule.ЮТПредикаты CommonModule.ЮТПредикатыКлиентСервер + CommonModule.ЮТПреобразования + CommonModule.ЮТПроверкиСлужебный CommonModule.ЮТРасширения CommonModule.ЮТРегистрацияОшибок CommonModule.ЮТСобытия CommonModule.ЮТСравнениеКлиентСервер CommonModule.ЮТСравнениеСервер + CommonModule.ЮТСтроки CommonModule.ЮТТестовыеДанные + CommonModule.ЮТТестовыеДанные_ТаблицыЗначений CommonModule.ЮТТестовыеДанныеВызовСервера CommonModule.ЮТТестовыеДанныеСлужебный CommonModule.ЮТТесты + CommonModule.ЮТТипыДанныхСлужебный CommonModule.ЮТУтверждения CommonModule.ЮТУтвержденияИБ CommonModule.ЮТФабрика diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl" index 432a61896..91fc4eaa5 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl" @@ -59,13 +59,15 @@ // ИмяРеквизита - Строка - Имя реквизита объекта или табличной части // РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы // - Неопределено +// ОграничениеТипа - Тип, ОписаниеТипов - Испольуется для ограничения типа составного реквизита, будет сгерерировано значение указанного типа +// - Неопределено - Будет сгенерировано значение, на основании типа реквизита, если реквизит составной, то будет использован случайный тип // // Возвращаемое значение: // ОбщийМодуль - Конструктор &НаКлиенте -Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт +Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено, ОграничениеТипа = Неопределено) Экспорт - ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения); + ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения, ОграничениеТипа); Возврат ЭтотОбъект; КонецФункции diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl" index 78f8800ee..3858f0e7b 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl" @@ -58,12 +58,14 @@ // ИмяРеквизита - Строка - Имя реквизита объекта или табличной части // РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы // - Неопределено +// ОграничениеТипа - Тип, ОписаниеТипов - Испольуется для ограничения типа составного реквизита, будет сгерерировано значение указанного типа +// - Неопределено - Будет сгенерировано значение, на основании типа реквизита, если реквизит составной, то будет использован случайный тип // // Возвращаемое значение: // ОбщийМодуль - Конструктор -Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт +Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено, ОграничениеТипа = Неопределено) Экспорт - ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения); + ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения, ОграничениеТипа); Возврат ЭтотОбъект; КонецФункции diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" index 19c994e55..f1fd944d9 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" @@ -9,7 +9,6 @@ ru Конструктор тестовых данных - true DataProcessor.ЮТКонструкторТестовыхДанных.Form.КлиентскийКонструктор КлиентскийКонструктор diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\227\320\260\320\277\321\203\321\201\320\272\320\242\320\265\321\201\321\202\320\276\320\262/CommandModule.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\227\320\260\320\277\321\203\321\201\320\272\320\242\320\265\321\201\321\202\320\276\320\262/CommandModule.bsl" new file mode 100644 index 000000000..df1cbfc5a --- /dev/null +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\227\320\260\320\277\321\203\321\201\320\272\320\242\320\265\321\201\321\202\320\276\320\262/CommandModule.bsl" @@ -0,0 +1,35 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\241\321\204\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217/CommandModule.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\241\321\204\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217/CommandModule.bsl" new file mode 100644 index 000000000..e8a3aa1d6 --- /dev/null +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\241\321\204\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217/CommandModule.bsl" @@ -0,0 +1,33 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca" index 2f5f3c51a..6913bcce3 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca" @@ -126,7 +126,7 @@ ДеревоТестов.ВремяВыполнения Greater - 1 + 1000 @@ -139,7 +139,7 @@ ДеревоТестов.ВремяВыполнения Greater - 10 + 10000 diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form" index 471d5e806..c18a45d3a 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form" @@ -3,9 +3,233 @@ ОсновнаяКоманднаяПанель 122 + + ГруппаЗапуск + 140 + + ЗапуститьВсеТестыОсновная + 138 + true + true + + true + + + ЗапуститьВсеТестыОсновнаяРасширеннаяПодсказка + 139 + true + true + + true + + Label + true + true + + Left + + + Form.Command.ЗапуститьВсеТесты + Auto + true + true + UserCmds + Auto + + + ГруппаМенюЗапуск + 134 + + ПерезапуститьУпавшиеТесты + 136 + + <key>ru</key> + <value>Упавшие тесты</value> + + true + true + + true + + + ПерезапуститьУпавшиеТестыРасширеннаяПодсказка + 137 + true + true + + true + + Label + true + true + + Left + + + Form.Command.ПерезапуститьУпавшиеТесты + Auto + true + true + UserCmds + Auto + + + ЗапуститьВсеТесты + 126 + + <key>ru</key> + <value>Все тесты</value> + + true + true + + true + + + ЗапуститьВсеТестыРасширеннаяПодсказка + 127 + true + true + + true + + Label + true + true + + Left + + + Form.Command.ЗапуститьВсеТесты + Auto + true + true + UserCmds + Auto + + + ЗапуститьВыделенныеТесты + 142 + true + true + + true + + + ЗапуститьВыделенныеТестыРасширеннаяПодсказка + 143 + true + true + + true + + Label + true + true + + Left + + + Form.Command.ЗапуститьВыделенныеТесты + Auto + true + true + UserCmds + Auto + + + ЗамерВремениВыполнения + 128 + true + true + + true + + + ЗамерВремениВыполненияРасширеннаяПодсказка + 129 + true + true + + true + + Label + true + true + + Left + + + Form.Command.ЗамерВремениВыполнения + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value> </value> + + + ГруппаМенюЗапускРасширеннаяПодсказка + 135 + true + true + + true + + Label + true + true + + Left + + + Popup + + + StdPicture.GenerateReport + + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаЗапускРасширеннаяПодсказка + 141 + true + true + + true + + Label + true + true + + Left + + + + Compact + + ФормаСформироватьНастройки - 125 + 17 true true @@ -596,12 +820,45 @@ ДеревоТестовКонтекстноеМеню 31 + + ДеревоТестовКонтекстноеМенюЗапуститьВыделенныеТесты + 130 + + <key>ru</key> + <value>Запустить выбранные тесты</value> + + true + true + + true + + + ДеревоТестовКонтекстноеМенюЗапуститьВыделенныеТестыРасширеннаяПодсказка + 131 + true + true + + true + + Label + true + true + + Left + + + Form.Command.ЗапуститьВыделенныеТесты + Auto + true + true + UserCmds + Auto + true true true - true Tree true @@ -625,6 +882,8 @@ CommonPicture.ЮТЭлементыТестов + None + None ГруппаДанныеОшибок @@ -1106,6 +1365,10 @@ OnCreateAtServer ПриСозданииНаСервере + + OnOpen + ПриОткрытии + true true Vertical @@ -1150,7 +1413,7 @@ ru Представление - 4 + 12 String @@ -1168,7 +1431,7 @@ ru Состояние - 6 + 20 String @@ -1403,10 +1666,10 @@ - АдресДанных + АдресОтчета <key>ru</key> - <value>Адрес данных</value> + <value>Адрес отчета</value> 16 @@ -1440,6 +1703,23 @@ true + + ЗагрузитьТестыПриОткрытии + + <key>ru</key> + <value>Загрузить тесты при открытии</value> + + 125 + + Boolean + + + true + + + true + + Сравнить @@ -1471,11 +1751,99 @@ <use> <common>true</common> </use> + <picture xsi:type="core:PictureRef"> + <picture>StdPicture.ReportSettings</picture> + </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> <name>СформироватьНастройки</name> </handler> </action> + <representation>TextPicture</representation> + <currentRowUse>DontUse</currentRowUse> + </formCommands> + <formCommands> + <name>ЗапуститьВсеТесты</name> + <title> + <key>ru</key> + <value>Запустить все тесты</value> + + 3 + + true + + + StdPicture.GenerateReport + + + + ЗапуститьВсеТесты + + + TextPicture + DontUse + + + ЗамерВремениВыполнения + + <key>ru</key> + <value>Замер времени выполнения</value> + + 4 + + true + + + StdPicture.BusinessProcessStart + + + + ЗамерВремениВыполнения + + + TextPicture + DontUse + + + ЗапуститьВыделенныеТесты + + <key>ru</key> + <value>Выбранные тесты</value> + + 5 + + true + + + StdPicture.GenerateReport + + + + ЗапуститьВыделенныеТесты + + + TextPicture + DontUse + + + ПерезапуститьУпавшиеТесты + + <key>ru</key> + <value>Перезапустить упавшие тесты</value> + + 6 + + true + + + CommonPicture.ЮТУпал + + + + ПерезапуститьУпавшиеТесты + + + TextPicture DontUse diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl" index 11be3a052..d86639e43 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl" @@ -16,22 +16,40 @@ // //©///////////////////////////////////////////////////////////////////////////©// +#Область ОписаниеПеременных + +&НаКлиенте +Перем ИсполняемыеТестовыеМодули; + +&НаКлиенте +Перем ПараметрыЗапускаТестирования; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Свойство("АдресХранилища") И ЭтоАдресВременногоХранилища(Параметры.АдресХранилища) Тогда - - ОтобразитьРезультатыТестирования(Параметры.АдресХранилища); - + АдресОтчета = Параметры.АдресХранилища; КонецЕсли; + Параметры.Свойство("ЗагрузитьТесты", ЗагрузитьТестыПриОткрытии); + КонецПроцедуры -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ЗначениеЗаполнено(АдресОтчета) Тогда + ДанныеОтчета = ДанныеОтчета(АдресОтчета); + ПослеЗагрузкиТестов(ДанныеОтчета.РезультатыТестирования, ДанныеОтчета.ПараметрыЗапуска); + ИначеЕсли ЗагрузитьТестыПриОткрытии Тогда + ЗагрузитьТесты(); + КонецЕсли; + +КонецПроцедуры #КонецОбласти @@ -90,67 +108,114 @@ КонецПроцедуры +&НаКлиенте +Процедура ЗамерВремениВыполнения(Команда) + + Обработчик = Новый ОписаниеОповещения("ПослеВодаКоличестваИтерацийЗамера", ЭтотОбъект); + ПоказатьВводЧисла(Обработчик, 100, "Укажите количество итераций замера", 3, 0); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапуститьВсеТесты(Команда) + + ВыполнитьТестовыеМодули(ИсполняемыеТестовыеМодули); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерезапуститьУпавшиеТесты(Команда) + + СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста(); + Статусы = ЮТОбщий.ЗначениеВМассиве(СтатусыИсполненияТеста.Ошибка, СтатусыИсполненияТеста.Сломан); + + Модули = МодулиСоответствующиеСтатусу(Статусы); + ВыполнитьТестовыеМодули(Модули); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапуститьВыделенныеТесты(Команда) + + Модули = ВыделенныеТестовыеМодули(); + ВыполнитьТестовыеМодули(Модули); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -&НаСервере -Процедура ОтобразитьРезультатыТестирования(АдресХранилища) +#Область ВыводОтчета + +&НаСервереБезКонтекста +Функция ДанныеОтчета(Знач АдресХранилища) Данные = ПолучитьИзВременногоХранилища(АдресХранилища); УдалитьИзВременногоХранилища(АдресХранилища); - РезультатТестирования = Данные.РезультатыТестирования; + Возврат Данные; + +КонецФункции + +&НаКлиенте +Процедура ОтобразитьРезультатТеста(СтрокаТеста, Тест, Набор) + + СтрокаТеста.Представление = Тест.Имя; + СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим); + СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность); + СтрокаТеста.ВремяВыполнения = Тест.Длительность; + СтрокаТеста.Состояние = Тест.Статус; + СтрокаТеста.ТипОбъекта = 3; + СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус); + + ЗаполнитьОшибки(СтрокаТеста, Тест); + +КонецПроцедуры + +&НаКлиенте +Функция ОбновитьСтатистикуНабора(СтрокаНабора) + + СтатистикаНабора = СтатистикаНабора(СтрокаНабора); Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + Если СтатистикаНабора.Сломано Тогда + СтрокаНабора.Состояние = Статусы.Сломан; + ИначеЕсли СтатистикаНабора.Упало Тогда + СтрокаНабора.Состояние = Статусы.Ошибка; + ИначеЕсли СтатистикаНабора.Пропущено Тогда + СтрокаНабора.Состояние = Статусы.Пропущен; + ИначеЕсли СтатистикаНабора.Неизвестно Тогда + СтрокаНабора.Состояние = Статусы.Ошибка; + ИначеЕсли СтатистикаНабора.Ожидание Тогда + СтрокаНабора.Состояние = Статусы.Ожидание; + Иначе + СтрокаНабора.Состояние = Статусы.Успешно; + КонецЕсли; + + СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора); + СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние); + + СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(СтатистикаНабора.Продолжительность); + СтрокаНабора.ВремяВыполнения = СтатистикаНабора.Продолжительность; + + Возврат СтатистикаНабора; + +КонецФункции + +&НаКлиенте +Процедура ОбновитьОбщуюСтатистику(ОбновлятьСтатистикуНаборов) + ОбщаяСтатистика = Статистика(); - Для Каждого Набор Из РезультатТестирования Цикл - - СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить(); - СтрокаНабора.Набор = Истина; - СтрокаНабора.Представление = Набор.Представление; - СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим); - СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность); - СтрокаНабора.ВремяВыполнения = Набор.Длительность / 1000; - СтрокаНабора.ТипОбъекта = 2; - - ЗаполнитьОшибки(СтрокаНабора, Набор); - - СтатистикаНабора = Статистика(); - - Для Каждого Тест Из Набор.Тесты Цикл - - СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить(); - СтрокаТеста.Представление = Тест.Имя; - СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим); - СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность); - СтрокаТеста.ВремяВыполнения = Тест.Длительность / 1000; - СтрокаТеста.Состояние = Тест.Статус; - СтрокаТеста.ТипОбъекта = 3; - - СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус); - ЗаполнитьОшибки(СтрокаТеста, Тест); - ИнкрементСтатистики(СтатистикаНабора, Тест.Статус, Статусы); - - КонецЦикла; + Для Каждого СтрокаНабора Из ДеревоТестов.ПолучитьЭлементы() Цикл - Если СтатистикаНабора.Сломано Тогда - СтрокаНабора.Состояние = Статусы.Сломан; - ИначеЕсли СтатистикаНабора.Упало Тогда - СтрокаНабора.Состояние = Статусы.Ошибка; - ИначеЕсли СтатистикаНабора.Пропущено Тогда - СтрокаНабора.Состояние = Статусы.Пропущен; - ИначеЕсли СтатистикаНабора.Неизвестно Тогда - СтрокаНабора.Состояние = Статусы.Ошибка; + Если ОбновлятьСтатистикуНаборов Тогда + СтатистикаНабора = ОбновитьСтатистикуНабора(СтрокаНабора); Иначе - СтрокаНабора.Состояние = Статусы.Успешно; + СтатистикаНабора = СтатистикаНабора(СтрокаНабора); КонецЕсли; - СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора); - - СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние); - Для Каждого Элемент Из СтатистикаНабора Цикл ЮТОбщий.Инкремент(ОбщаяСтатистика[Элемент.Ключ], Элемент.Значение); КонецЦикла; @@ -158,10 +223,27 @@ КонецЦикла; Элементы.СтатистикаВыполнения.Заголовок = ПредставлениеСтатистики(ОбщаяСтатистика); - + КонецПроцедуры -&НаСервереБезКонтекста +&НаКлиенте +Функция СтатистикаНабора(СтрокаНабора) + + СтатистикаНабора = Статистика(); + Статусы = ЮТФабрика.СтатусыИсполненияТеста(); + + Для Каждого СтрокаТеста Из СтрокаНабора.ПолучитьЭлементы() Цикл + + ИнкрементСтатистики(СтатистикаНабора, СтрокаТеста.Состояние, Статусы); + ЮТОбщий.Инкремент(СтатистикаНабора.Продолжительность, СтрокаТеста.ВремяВыполнения); + + КонецЦикла; + + Возврат СтатистикаНабора; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста Процедура ЗаполнитьОшибки(СтрокаДерева, ОписаниеОбъекта) Для Каждого Ошибка Из ОписаниеОбъекта.Ошибки Цикл @@ -176,7 +258,7 @@ КонецПроцедуры -&НаСервереБезКонтекста +&НаКлиенте Функция Статистика() Статистика = Новый Структура(); @@ -185,13 +267,15 @@ Статистика.Вставить("Упало", 0); Статистика.Вставить("Сломано", 0); Статистика.Вставить("Пропущено", 0); + Статистика.Вставить("Ожидание", 0); Статистика.Вставить("Неизвестно", 0); + Статистика.Вставить("Продолжительность", 0); Возврат Статистика; КонецФункции -&НаСервереБезКонтекста +&НаКлиентеНаСервереБезКонтекста Функция НормализоватьКонтекст(Контекст) Если СтрНачинаетсяС(Контекст, "Клиент") Тогда @@ -202,7 +286,7 @@ КонецФункции -&НаСервереБезКонтекста +&НаКлиентеНаСервереБезКонтекста Процедура ИнкрементСтатистики(Статистика, Статус, Знач Статусы = Неопределено) Если Статусы = Неопределено Тогда @@ -227,6 +311,10 @@ ЮТОбщий.Инкремент(Статистика.Пропущено); + ИначеЕсли Статус = Статусы.Ожидание Тогда + + ЮТОбщий.Инкремент(Статистика.Ожидание); + Иначе ЮТОбщий.Инкремент(Статистика.Неизвестно); @@ -235,6 +323,8 @@ КонецПроцедуры +#КонецОбласти + #Область Интерфейсное &НаСервереБезКонтекста @@ -272,7 +362,13 @@ БлокиСтатистики = Новый Массив(); Разделитель = "; "; - БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего, Статистика.Всего - Статистика.Пропущено)); + БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего - Статистика.Пропущено - Статистика.Ожидание, Статистика.Всего)); + + Если Статистика.Ожидание Тогда + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТНеизвестный); + БлокиСтатистики.Добавить(" Ожидание: " + Статистика.Ожидание); + КонецЕсли; Если Статистика.Пропущено Тогда БлокиСтатистики.Добавить(Разделитель); @@ -298,6 +394,9 @@ БлокиСтатистики.Добавить(" Неизвестно: " + Статистика.Неизвестно); КонецЕсли; + БлокиСтатистики.Добавить(Разделитель); + БлокиСтатистики.Добавить(" Время выполнения: " + ЮТОбщий.ПредставлениеПродолжительности(Статистика.Продолжительность)); + Возврат Новый ФорматированнаяСтрока(БлокиСтатистики); КонецФункции @@ -315,11 +414,14 @@ Функция БлокиСтатистики(Статистика) Блоки = Новый Массив(); - Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Успешно, "25AE88")); - Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Пропущено, "999999")); - Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Упало, "EFCE4A")); - Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Сломано, "D75A4A")); - Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Неизвестно, "9400d3")); + Ключи = "Количество, Цвет"; + + Блоки.Добавить(Новый Структура(Ключи, Статистика.Успешно, "25AE88")); + Блоки.Добавить(Новый Структура(Ключи, Статистика.Пропущено, "999999")); + Блоки.Добавить(Новый Структура(Ключи, Статистика.Упало, "EFCE4A")); + Блоки.Добавить(Новый Структура(Ключи, Статистика.Сломано, "D75A4A")); + Блоки.Добавить(Новый Структура(Ключи, Статистика.Ожидание, "BBBBBB")); + Блоки.Добавить(Новый Структура(Ключи, Статистика.Неизвестно, "9400d3")); Сдвиг = 0; Высота = 20; @@ -348,6 +450,233 @@ #КонецОбласти +#Область ЗагрузкаТестов + +&НаКлиенте +Процедура ЗагрузитьТесты() + + ПараметрыЗапуска = ПараметрыЗапуска(); + + ПараметрыЗагрузки = ЮТИсполнительКлиент.ПараметрыИсполнения(); + ПараметрыЗагрузки.Цепочка.Добавить(Новый ОписаниеОповещения("ПослеЗагрузкиТестов", ЭтотОбъект, ПараметрыЗапуска)); + ПараметрыЗагрузки.ПараметрыЗапуска = ПараметрыЗапуска; + + ЮТСобытия.Инициализация(ПараметрыЗагрузки.ПараметрыЗапуска); + ЮТИсполнительКлиент.ОбработчикЗагрузитьТесты(Неопределено, ПараметрыЗагрузки); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗагрузкиТестов(Результат, ПараметрыЗапуска) Экспорт + + ИсполняемыеТестовыеМодули = Результат; + ПараметрыЗапускаТестирования = ПараметрыЗапуска; + + Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл + + Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл + + СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить(); + СтрокаНабора.Набор = Истина; + СтрокаНабора.Представление = Набор.Представление; + СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим); + СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность); + СтрокаНабора.ВремяВыполнения = Набор.Длительность; + СтрокаНабора.ТипОбъекта = 2; + + ЗаполнитьОшибки(СтрокаНабора, Набор); + + Набор.Вставить("Идентификатор", СтрокаНабора.ПолучитьИдентификатор()); + + Для Каждого Тест Из Набор.Тесты Цикл + + СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить(); + + ОтобразитьРезультатТеста(СтрокаТеста, Тест, Набор); + + Тест.Вставить("Идентификатор", СтрокаТеста.ПолучитьИдентификатор()); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + ОбновитьОбщуюСтатистику(Истина); + + ЮТКонтекст.УдалитьКонтекст(); + +КонецПроцедуры + +#КонецОбласти + +#Область ЗапускТестов + +&НаКлиенте +Процедура ВыполнитьТестовыеМодули(Модули) + + Если Модули.Количество() = 0 Тогда + ПоказатьПредупреждение(, "Нет тестов для запуска"); + Возврат; + КонецЕсли; + + ОповещениеПользователю("Прогон тестов", "Запушено выполнение тестов"); + + ЮТСобытия.Инициализация(ПараметрыЗапускаТестирования); + ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(Модули); + ЮТСобытия.ПередВыполнениемТестов(Модули); + + Для Каждого Модуль Из Модули Цикл + + Результат = ЮТИсполнительКлиент.ВыполнитьТестыМодуля(Модуль); + + Для Каждого Набор Из Результат.НаборыТестов Цикл + + Для Каждого Тест Из Набор.Тесты Цикл + + Строка = ДеревоТестов.НайтиПоИдентификатору(Тест.Идентификатор); + ОтобразитьРезультатТеста(Строка, Тест, Набор); + + КонецЦикла; + + Строка = ДеревоТестов.НайтиПоИдентификатору(Набор.Идентификатор); + ОбновитьСтатистикуНабора(Строка); + + КонецЦикла; + + КонецЦикла; + + ОбновитьОбщуюСтатистику(Ложь); + + ЮТКонтекст.УдалитьКонтекст(); + + ОповещениеПользователю("Прогон тестов завершен", "Завершено выполнение тестов"); + +КонецПроцедуры + +&НаКлиенте +Функция ВыделенныеТестовыеМодули() + + МодулиКЗапуску = Новый Массив(); + + ВыделенныеСтроки = Элементы.ДеревоТестов.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Возврат МодулиКЗапуску; + КонецЕсли; + + Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл + + НаборыКЗапуску = Новый Массив(); + + Для Каждого Набор Из Модуль.НаборыТестов Цикл + + Если ВыделенныеСтроки.Найти(Набор.Идентификатор) <> Неопределено Тогда + НаборыКЗапуску.Добавить(Набор); + Продолжить; + КонецЕсли; + + ТестыКЗапуску = Новый Массив(); + + Для Каждого Тест Из Набор.Тесты Цикл + Если ВыделенныеСтроки.Найти(Тест.Идентификатор) <> Неопределено Тогда + ТестыКЗапуску.Добавить(Тест); + КонецЕсли; + КонецЦикла; + + Если ТестыКЗапуску.Количество() Тогда + ЗапускаемыйНабор = ЮТОбщий.СкопироватьСтруктуру(Набор); + ЗапускаемыйНабор.Тесты = ТестыКЗапуску; + НаборыКЗапуску.Добавить(ЗапускаемыйНабор); + КонецЕсли; + + КонецЦикла; + + Если НаборыКЗапуску.Количество() Тогда + + ЗапускаемыйМодуль = ЮТОбщий.СкопироватьСтруктуру(Модуль); + ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску; + МодулиКЗапуску.Добавить(ЗапускаемыйМодуль); + + КонецЕсли; + + КонецЦикла; + + Возврат МодулиКЗапуску; + +КонецФункции + +&НаКлиенте +Функция МодулиСоответствующиеСтатусу(Статусы) + + МодулиКЗапуску = Новый Массив(); + + ВыделенныеСтроки = Элементы.ДеревоТестов.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Возврат МодулиКЗапуску; + КонецЕсли; + + Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл + + НаборыКЗапуску = Новый Массив(); + + Для Каждого Набор Из Модуль.НаборыТестов Цикл + + ТестыКЗапуску = Новый Массив(); + + Для Каждого Тест Из Набор.Тесты Цикл + Если Статусы.Найти(Тест.Статус) <> Неопределено Тогда + ТестыКЗапуску.Добавить(Тест); + КонецЕсли; + КонецЦикла; + + Если ТестыКЗапуску.Количество() Тогда + ЗапускаемыйНабор = ЮТОбщий.СкопироватьСтруктуру(Набор); + ЗапускаемыйНабор.Тесты = ТестыКЗапуску; + НаборыКЗапуску.Добавить(ЗапускаемыйНабор); + КонецЕсли; + + КонецЦикла; + + Если НаборыКЗапуску.Количество() Тогда + + ЗапускаемыйМодуль = ЮТОбщий.СкопироватьСтруктуру(Модуль); + ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску; + МодулиКЗапуску.Добавить(ЗапускаемыйМодуль); + + КонецЕсли; + + КонецЦикла; + + Возврат МодулиКЗапуску; + +КонецФункции + +&НаКлиенте +Процедура ВыполнитьЗапускТестовПоПараметрам(ПараметрыЗапуска, Обработчик) + + ЮТИсполнительКлиент.ВыполнитьМодульноеТестированиеПоНастройке(ПараметрыЗапуска, Обработчик); + +КонецПроцедуры + +#КонецОбласти + +#Область ПараметрыЗапуска + +&НаКлиенте +Функция ПараметрыЗапуска() + + ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска(); + ПараметрыЗапуска.closeAfterTests = Ложь; + ПараметрыЗапуска.showReport = Ложь; + ПараметрыЗапуска.ВыполнятьМодульноеТестирование = Истина; + + Возврат ПараметрыЗапуска; + +КонецФункции + +#КонецОбласти &НаКлиенте Процедура ОбновитьДоступностьСравнения() @@ -356,4 +685,74 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеВодаКоличестваИтерацийЗамера(Результат, ДополнительныеПараметры) Экспорт + + Если НЕ ЗначениеЗаполнено(Результат) Тогда + Возврат; + КонецЕсли; + + ПараметрыЗамера = Новый Структура(); + ПараметрыЗамера.Вставить("ПараметрыЗапуска", ПараметрыЗапуска()); + ПараметрыЗамера.Вставить("КоличествоИтераций", Результат); + ПараметрыЗамера.Вставить("ТекущаяИтерация", 0); + ПараметрыЗамера.Вставить("Замеры", Новый Массив()); + ПараметрыЗамера.Вставить("НачалоИтерации"); + + ПослеВыполненияИтерации(Неопределено, ПараметрыЗамера); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВыполненияИтерации(Результат, ПараметрыЗамера) Экспорт + + Если ПараметрыЗамера.ТекущаяИтерация > 0 Тогда + Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - ПараметрыЗамера.НачалоИтерации; + ПараметрыЗамера.Замеры.Добавить(Длительность); + КонецЕсли; + + Если ЮТОбщий.Инкремент(ПараметрыЗамера.ТекущаяИтерация) <= ПараметрыЗамера.КоличествоИтераций Тогда + + Обработчик = Новый ОписаниеОповещения("ПослеВыполненияИтерации", ЭтотОбъект, ПараметрыЗамера); + ПараметрыЗамера.НачалоИтерации = ТекущаяУниверсальнаяДатаВМиллисекундах(); + ВыполнитьЗапускТестовПоПараметрам(ПараметрыЗамера.ПараметрыЗапуска, Обработчик); + + Иначе + + ОбщееВремя = 0; + Для Каждого Замер Из ПараметрыЗамера.Замеры Цикл + ЮТОбщий.Инкремент(ОбщееВремя, Замер); + КонецЦикла; + + Список = Новый СписокЗначений(); + Список.ЗагрузитьЗначения(ПараметрыЗамера.Замеры); + Список.СортироватьПоЗначению(); + + ОбщееВремя = Окр(ОбщееВремя / 1000, 2); + СреднееВремя = Окр(ОбщееВремя / ПараметрыЗамера.Замеры.Количество(), 2); + МедианноеВремя = Окр(Список[Цел(Список.Количество() / 2) + 1].Значение / 1000, 2); + + Сообщение = СтрШаблон("Количество итераций: %1 + |Общее время: %2 сек + |Среднее время: %3 сек + |Медианное время: %4 сек", ПараметрыЗамера.Замеры.Количество(), ОбщееВремя, СреднееВремя, МедианноеВремя); + + ЮТОбщий.СообщитьПользователю(Сообщение); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОповещениеПользователю(Текст, Пояснение) + + ПоказатьОповещениеПользователя(Текст, + , + Пояснение, + БиблиотекаКартинок.ЮТПодсистема, + СтатусОповещенияПользователя.Важное, + УникальныйИдентификатор); + +КонецПроцедуры + #КонецОбласти diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form" index 8520786b0..f0763784d 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form" @@ -517,7 +517,7 @@ ВыводЛога - 66 + 26 true true @@ -659,6 +659,49 @@ DontUse + + ЛогированиеВКонсоль + 84 + true + true + + true + + + ЛогированиеВКонсоль + + + ЛогированиеВКонсольРасширеннаяПодсказка + 86 + true + true + + true + + Label + true + true + + Left + + + + ЛогированиеВКонсольКонтекстноеМеню + 85 + true + true + + true + + true + + CheckBoxField + Enter + true + Left + true + + ФайлКонфигурации 55 @@ -1073,7 +1116,7 @@ ИмяФайлаЛога <key>ru</key> - <value>Отладочные сообщения</value> + <value>Логирование в файл</value> 61 @@ -1152,6 +1195,23 @@ ИмяФайлаОтчета + + ЛогированиеВКонсоль + + <key>ru</key> + <value>Логирование в консоль</value> + + 66 + + Boolean + + + true + + + true + + УстановитьФлажки diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl" index f690eacaf..f5386f475 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl" @@ -323,8 +323,7 @@ #КонецЕсли ПутьЗапускаемогоКлиента = ЮТФайлы.ОбъединитьПути(КаталогПрограммы(), Файл); - Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы - = ТипПлатформы.Windows_x86_64 Тогда + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда ПутьЗапускаемогоКлиента = ПутьЗапускаемогоКлиента + ".exe"; КонецЕсли; @@ -427,8 +426,8 @@ Конфигурация.closeAfterTests = Истина; Конфигурация.reportPath = ИмяФайлаОтчета; - Конфигурация.logging.enable = ЗначениеЗаполнено(ИмяФайлаЛога); Конфигурация.logging.file = ИмяФайлаЛога; + Конфигурация.logging.console = ЛогированиеВКонсоль; Если ЗначениеЗаполнено(ИмяФайлаКодаВозврата) Тогда Конфигурация.exitCode = ИмяФайлаКодаВозврата; @@ -538,6 +537,7 @@ ДобавитьОтмеченныеТесты(Строка.ПолучитьЭлементы(), Тесты); КонецЕсли; КонецЦикла; + КонецПроцедуры #КонецОбласти diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo" index d1cb4e19f..943d35224 100644 --- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo" +++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo" @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c1bdc484-8502-4c5d-bead-0a5861739c3c"> +<mdclass:DataProcessor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c1bdc484-8502-4c5d-bead-0a5861739c3c"> <producedTypes> <objectType typeId="5b4ab199-21bb-4d2c-9b3f-76400ff90d09" valueTypeId="46e26617-02e4-4719-87a0-982b4820504f"/> <managerType typeId="cea40759-07dd-409f-8c26-be7e738c7fbe" valueTypeId="e3a7e7ca-1e0d-4fdf-9390-258825a6bba5"/> @@ -7,9 +7,8 @@ <name>ЮТЮнитТесты</name> <synonym> <key>ru</key> - <value>Юнит тесты</value> + <value>Юнит-тесты</value> </synonym> - <useStandardCommands>true</useStandardCommands> <defaultForm>DataProcessor.ЮТЮнитТесты.Form.Основная</defaultForm> <forms uuid="c3c0fc7f-1c5e-47d9-b103-201517e2c100"> <name>Основная</name> @@ -54,4 +53,25 @@ </synonym> <templateType>TextDocument</templateType> </templates> + <commands uuid="38dff93f-270f-4fd9-9d79-aa529d5c4f89"> + <name>ЗапускТестов</name> + <synonym> + <key>ru</key> + <value>Запуск тестирования</value> + </synonym> + <group>NavigationPanelImportant</group> + <representation>PictureAndText</representation> + <picture xsi:type="core:PictureRef"> + <picture>CommonPicture.ЮТПодсистема</picture> + </picture> + </commands> + <commands uuid="608d6673-e26c-4216-bc5f-fc19acdc3baf"> + <name>СформироватьНастройкиТестирования</name> + <synonym> + <key>ru</key> + <value>Сформировать настройки тестирования</value> + </synonym> + <group>NavigationPanelOrdinary</group> + <representation>Auto</representation> + </commands> </mdclass:DataProcessor> diff --git "a/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo" "b/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo" index 0e0a76b65..8d6ab383c 100644 --- "a/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo" +++ "b/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo" @@ -8,6 +8,7 @@ <includeHelpInContents>true</includeHelpInContents> <includeInCommandInterface>true</includeInCommandInterface> <content>CommonModule.МокитоСлужебный</content> + <content>CommonModule.ЮТИсполнительКлиент</content> <content>CommonModule.ЮТЛогирование</content> <content>CommonModule.ЮТТестовыеДанныеСлужебный</content> <content>CommonModule.ЮТУтверждения</content> diff --git a/fixtures/demo-configuration/src/Configuration/Configuration.mdo b/fixtures/demo-configuration/src/Configuration/Configuration.mdo index 5e9368721..f6eaab094 100644 --- a/fixtures/demo-configuration/src/Configuration/Configuration.mdo +++ b/fixtures/demo-configuration/src/Configuration/Configuration.mdo @@ -91,199 +91,199 @@ <subsystems>Subsystem.Финансы</subsystems> <subsystems>Subsystem.ТоварныеЗапасы</subsystems> <subsystems>Subsystem.Интеграция</subsystems> - <styleItems>StyleItem.ЦветТекстаСущественныхИзмененийДанных</styleItems> + <styleItems>StyleItem.ЦветТекстаВажнойИнформации</styleItems> <styleItems>StyleItem.ЦветТекстаНормальногоСостояния</styleItems> <styleItems>StyleItem.ЦветТекстаОшибочногоСостояния</styleItems> + <styleItems>StyleItem.ЦветТекстаСущественныхИзмененийДанных</styleItems> <styleItems>StyleItem.ШрифтВажнойИнформации</styleItems> - <styleItems>StyleItem.ЦветТекстаВажнойИнформации</styleItems> + <commonPictures>CommonPicture.ВыделитьВажное</commonPictures> + <commonPictures>CommonPicture.КоллекцияВидыАктивныхПользователей</commonPictures> + <commonPictures>CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации</commonPictures> + <commonPictures>CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов</commonPictures> + <commonPictures>CommonPicture.ОткрытьХранимыйФайл</commonPictures> + <commonPictures>CommonPicture.ОтправитьСМС</commonPictures> <commonPictures>CommonPicture.ПодсистемаЗакупки</commonPictures> <commonPictures>CommonPicture.ПодсистемаПредприятие</commonPictures> <commonPictures>CommonPicture.ПодсистемаПродажи</commonPictures> <commonPictures>CommonPicture.ПодсистемаТоварныеЗапасы</commonPictures> <commonPictures>CommonPicture.ПодсистемаФинансы</commonPictures> - <commonPictures>CommonPicture.КоллекцияВидыАктивныхПользователей</commonPictures> - <commonPictures>CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации</commonPictures> - <commonPictures>CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов</commonPictures> + <commonPictures>CommonPicture.Позвонить</commonPictures> <commonPictures>CommonPicture.ПолнотекстовыйПоискДалее</commonPictures> <commonPictures>CommonPicture.ПолнотекстовыйПоискНазад</commonPictures> - <commonPictures>CommonPicture.ОткрытьХранимыйФайл</commonPictures> - <commonPictures>CommonPicture.ВыделитьВажное</commonPictures> <commonPictures>CommonPicture.ПроверитьПочту</commonPictures> <commonPictures>CommonPicture.СписокЗаказов</commonPictures> - <commonPictures>CommonPicture.Позвонить</commonPictures> <commonPictures>CommonPicture.ШтрихКод</commonPictures> - <commonPictures>CommonPicture.ОтправитьСМС</commonPictures> <sessionParameters>SessionParameter.ТекущийПользователь</sessionParameters> <sessionParameters>SessionParameter.ЯщикIMAP</sessionParameters> <roles>Role.Администратор</roles> <roles>Role.МенеджерПоЗакупкам</roles> <roles>Role.МенеджерПоПродажам</roles> - <roles>Role.Продавец</roles> <roles>Role.Помощник</roles> + <roles>Role.Продавец</roles> <commonTemplates>CommonTemplate.ДрайверСканераШтрихкодов</commonTemplates> - <commonTemplates>CommonTemplate.КомпонентаПечатиШтрихкодовWindows32</commonTemplates> - <commonTemplates>CommonTemplate.КомпонентаПечатиШтрихкодовWindows64</commonTemplates> <commonTemplates>CommonTemplate.КомпонентаПечатиШтрихкодовLinux32</commonTemplates> <commonTemplates>CommonTemplate.КомпонентаПечатиШтрихкодовLinux64</commonTemplates> + <commonTemplates>CommonTemplate.КомпонентаПечатиШтрихкодовWindows32</commonTemplates> + <commonTemplates>CommonTemplate.КомпонентаПечатиШтрихкодовWindows64</commonTemplates> <filterCriteria>FilterCriterion.ДокументыКонтрагента</filterCriteria> - <commonModules>CommonModule.РаботаСТорговымОборудованием</commonModules> - <commonModules>CommonModule.РаботаСПолнотекстовымПоиском</commonModules> - <commonModules>CommonModule.РаботаСХранилищемОбщихНастроек</commonModules> - <commonModules>CommonModule.РегламентныеЗаданияАгрегатов</commonModules> - <commonModules>CommonModule.СервисныеМеханизмы</commonModules> - <commonModules>CommonModule.РаботаСПочтой</commonModules> - <commonModules>CommonModule.РаботаСПочтойВызовСервера</commonModules> + <commonModules>CommonModule.ГеопозиционированиеКлиент</commonModules> + <commonModules>CommonModule.ГеопозиционированиеСервер</commonModules> + <commonModules>CommonModule.Интеграция</commonModules> + <commonModules>CommonModule.ИнтеграцияМагазин</commonModules> <commonModules>CommonModule.ОбменМобильныеОбщее</commonModules> <commonModules>CommonModule.ОбменМобильныеПереопределяемый</commonModules> <commonModules>CommonModule.Пользователи</commonModules> - <commonModules>CommonModule.РаботаСПанельюЗадач</commonModules> <commonModules>CommonModule.Помощник</commonModules> <commonModules>CommonModule.ПомощникКлиент</commonModules> <commonModules>CommonModule.РаботаСИсториейДанных</commonModules> - <commonModules>CommonModule.ГеопозиционированиеКлиент</commonModules> - <commonModules>CommonModule.ГеопозиционированиеСервер</commonModules> + <commonModules>CommonModule.РаботаСПанельюЗадач</commonModules> + <commonModules>CommonModule.РаботаСПолнотекстовымПоиском</commonModules> + <commonModules>CommonModule.РаботаСПочтой</commonModules> + <commonModules>CommonModule.РаботаСПочтойВызовСервера</commonModules> + <commonModules>CommonModule.РаботаСТорговымОборудованием</commonModules> + <commonModules>CommonModule.РаботаСХранилищемОбщихНастроек</commonModules> + <commonModules>CommonModule.РегистрацияОшибок</commonModules> + <commonModules>CommonModule.РегламентныеЗаданияАгрегатов</commonModules> + <commonModules>CommonModule.СервисныеМеханизмы</commonModules> <commonModules>CommonModule.УведомленияКлиент</commonModules> <commonModules>CommonModule.УведомленияСервер</commonModules> - <commonModules>CommonModule.Интеграция</commonModules> - <commonModules>CommonModule.ИнтеграцияМагазин</commonModules> - <commonModules>CommonModule.РегистрацияОшибок</commonModules> <exchangePlans>ExchangePlan.Мобильные</exchangePlans> <xDTOPackages>XDTOPackage.ОбменСМобильнымУстройством</xDTOPackages> <webServices>WebService.MAExchange</webServices> - <httpServices>HTTPService.Товары</httpServices> <httpServices>HTTPService.ОписанияТоваров</httpServices> - <scheduledJobs>ScheduledJob.ОбновлениеИндексаППД</scheduledJobs> - <scheduledJobs>ScheduledJob.СлияниеИндексаППД</scheduledJobs> + <httpServices>HTTPService.Товары</httpServices> <scheduledJobs>ScheduledJob.ОбновлениеАгрегатовПродаж</scheduledJobs> + <scheduledJobs>ScheduledJob.ОбновлениеИндексаППД</scheduledJobs> + <scheduledJobs>ScheduledJob.ОбновлениеИсторииДанных</scheduledJobs> <scheduledJobs>ScheduledJob.ПерестроениеАгрегатовПродаж</scheduledJobs> <scheduledJobs>ScheduledJob.ПомощникНеотработанныеЗаказы</scheduledJobs> - <scheduledJobs>ScheduledJob.ОбновлениеИсторииДанных</scheduledJobs> + <scheduledJobs>ScheduledJob.СлияниеИндексаППД</scheduledJobs> <settingsStorages>SettingsStorage.ХранилищеВариантовОтчетов</settingsStorages> + <functionalOptions>FunctionalOption.ВалютныйУчет</functionalOptions> <functionalOptions>FunctionalOption.РаботаСТорговымОборудованием</functionalOptions> <functionalOptions>FunctionalOption.УчетПоСкладам</functionalOptions> - <functionalOptions>FunctionalOption.ВалютныйУчет</functionalOptions> <functionalOptionsParameters>FunctionalOptionsParameter.Организация</functionalOptionsParameters> - <commonCommands>CommonCommand.УстановитьСканерШтрихкодов</commonCommands> <commonCommands>CommonCommand.НастроитьСканерШтрихКодов</commonCommands> - <commonCommands>CommonCommand.УстановитьРасширениеРаботыСФайлами</commonCommands> - <commonCommands>CommonCommand.УстановитьРасширениеРаботыСКриптографией</commonCommands> - <commonCommands>CommonCommand.УстановитьВидимостьОбъектовЧерезODataAPI</commonCommands> <commonCommands>CommonCommand.ОбщиеНастройки</commonCommands> + <commonCommands>CommonCommand.УстановитьВидимостьОбъектовЧерезODataAPI</commonCommands> + <commonCommands>CommonCommand.УстановитьРасширениеРаботыСКриптографией</commonCommands> + <commonCommands>CommonCommand.УстановитьРасширениеРаботыСФайлами</commonCommands> + <commonCommands>CommonCommand.УстановитьСканерШтрихкодов</commonCommands> <commandGroups>CommandGroup.Информация</commandGroups> <commandGroups>CommandGroup.Печать</commandGroups> - <constants>Constant.РаботаСТорговымОборудованием</constants> - <constants>Constant.УчетПоСкладам</constants> - <constants>Constant.АдресSMTPСервера</constants> - <constants>Constant.ПортSMTP</constants> - <constants>Constant.ПользовательSMTP</constants> - <constants>Constant.ПарольSMTP</constants> - <constants>Constant.АдресPOP3Сервера</constants> - <constants>Constant.ПортPOP3</constants> - <constants>Constant.ПользовательPOP3</constants> - <constants>Constant.ПарольPOP3</constants> - <constants>Constant.ТаймаутИнтернетПочты</constants> - <constants>Constant.ИмяОтправителяПочтовогоСообщения</constants> - <constants>Constant.ПользовательIMAP</constants> - <constants>Constant.ПарольIMAP</constants> - <constants>Constant.АдресIMAPСервера</constants> - <constants>Constant.ПортIMAP</constants> <constants>Constant.SSLIMAP</constants> - <constants>Constant.ИспользоватьIMAP</constants> <constants>Constant.SSLPOP3</constants> <constants>Constant.SSLSMTP</constants> - <constants>Constant.ТолькоЗащищеннаяАутентификацияIMAP</constants> - <constants>Constant.ТолькоЗащищеннаяАутентификацияPOP3</constants> - <constants>Constant.ТолькоЗащищеннаяАутентификацияSMTP</constants> - <constants>Constant.КодНовогоУзлаПланаОбмена</constants> - <constants>Constant.ИспользоватьPushУведомления</constants> + <constants>Constant.АдресIMAPСервера</constants> + <constants>Constant.АдресPOP3Сервера</constants> + <constants>Constant.АдресSMTPСервера</constants> + <constants>Constant.ВоспроизводитьТекстУведомления</constants> + <constants>Constant.ВыборПровайдераГеопозиционирования</constants> + <constants>Constant.ИдентификаторПриложенияWNS</constants> + <constants>Constant.ИмяОтправителяПочтовогоСообщения</constants> + <constants>Constant.ИмяПровайдера</constants> <constants>Constant.ИспользоватьAPNS</constants> - <constants>Constant.СертификатМобильногоПриложенияIOS</constants> <constants>Constant.ИспользоватьGCM</constants> - <constants>Constant.НомерПриложенияGoogleCloud</constants> - <constants>Constant.КлючCервераОтправителяGCM</constants> + <constants>Constant.ИспользоватьIMAP</constants> + <constants>Constant.ИспользоватьPushУведомления</constants> <constants>Constant.ИспользоватьWNS</constants> + <constants>Constant.ИспользоватьСетьПередачиДанных</constants> + <constants>Constant.ИспользоватьСотовуюСеть</constants> + <constants>Constant.ИспользоватьСпутники</constants> + <constants>Constant.КлючCервераОтправителяGCM</constants> <constants>Constant.КлючПриложенияWNS</constants> - <constants>Constant.МаркерДоступаWNS</constants> - <constants>Constant.ИдентификаторПриложенияWNS</constants> + <constants>Constant.КодНовогоУзлаПланаОбмена</constants> <constants>Constant.ЛогинСервисаПередачиPushУведомлений</constants> + <constants>Constant.МаркерДоступаWNS</constants> + <constants>Constant.НомерПриложенияGoogleCloud</constants> + <constants>Constant.ПарольIMAP</constants> + <constants>Constant.ПарольPOP3</constants> + <constants>Constant.ПарольSMTP</constants> <constants>Constant.ПериодПроверкиНеотработанныхЗаказов</constants> - <constants>Constant.ВоспроизводитьТекстУведомления</constants> - <constants>Constant.ВыборПровайдераГеопозиционирования</constants> - <constants>Constant.ИмяПровайдера</constants> + <constants>Constant.ПользовательIMAP</constants> + <constants>Constant.ПользовательPOP3</constants> + <constants>Constant.ПользовательSMTP</constants> + <constants>Constant.ПортIMAP</constants> + <constants>Constant.ПортPOP3</constants> + <constants>Constant.ПортSMTP</constants> + <constants>Constant.РаботаСТорговымОборудованием</constants> + <constants>Constant.СертификатМобильногоПриложенияIOS</constants> + <constants>Constant.ТаймаутИнтернетПочты</constants> <constants>Constant.ТолькоБесплатные</constants> - <constants>Constant.ИспользоватьСотовуюСеть</constants> - <constants>Constant.ИспользоватьСетьПередачиДанных</constants> - <constants>Constant.ИспользоватьСпутники</constants> - <commonForms>CommonForm.ОбщиеНастройки</commonForms> - <commonForms>CommonForm.НастройкиМобильногоУстройства</commonForms> + <constants>Constant.ТолькоЗащищеннаяАутентификацияIMAP</constants> + <constants>Constant.ТолькоЗащищеннаяАутентификацияPOP3</constants> + <constants>Constant.ТолькоЗащищеннаяАутентификацияSMTP</constants> + <constants>Constant.УчетПоСкладам</constants> + <commonForms>CommonForm.Звонок</commonForms> + <commonForms>CommonForm.НастройкаPushУведомлений</commonForms> + <commonForms>CommonForm.НастройкаПомощникаНеотработанныхЗаказов</commonForms> <commonForms>CommonForm.НастройкаПочты</commonForms> + <commonForms>CommonForm.НастройкиМобильногоУстройства</commonForms> + <commonForms>CommonForm.ОбщиеНастройки</commonForms> <commonForms>CommonForm.ФормаПодбора</commonForms> - <commonForms>CommonForm.НастройкаПомощникаНеотработанныхЗаказов</commonForms> - <commonForms>CommonForm.НастройкаPushУведомлений</commonForms> <commonForms>CommonForm.ФормаПодбораМобильная</commonForms> - <commonForms>CommonForm.Звонок</commonForms> - <catalogs>Catalog.Товары</catalogs> - <catalogs>Catalog.Контрагенты</catalogs> - <catalogs>Catalog.Склады</catalogs> + <catalogs>Catalog.Банки</catalogs> <catalogs>Catalog.Валюты</catalogs> - <catalogs>Catalog.Регионы</catalogs> <catalogs>Catalog.ВидыЦен</catalogs> - <catalogs>Catalog.РасчетныеСчетаКонтрагентов</catalogs> - <catalogs>Catalog.ЗначенияХарактеристик</catalogs> - <catalogs>Catalog.Банки</catalogs> - <catalogs>Catalog.РасчетныеСчета</catalogs> - <catalogs>Catalog.ХранимыеФайлы</catalogs> - <catalogs>Catalog.НастройкиТорговогоОборудования</catalogs> - <catalogs>Catalog.ХранилищеВариантовОтчетов</catalogs> - <catalogs>Catalog.Организации</catalogs> + <catalogs>Catalog.Встречи</catalogs> <catalogs>Catalog.ВходящиеПисьма</catalogs> + <catalogs>Catalog.ЗначенияХарактеристик</catalogs> <catalogs>Catalog.ИсходящиеПисьма</catalogs> - <catalogs>Catalog.ПочтовыеВложения</catalogs> - <catalogs>Catalog.Пользователи</catalogs> - <catalogs>Catalog.Встречи</catalogs> + <catalogs>Catalog.Контрагенты</catalogs> <catalogs>Catalog.МобильныеУстройства</catalogs> <catalogs>Catalog.НастройкиИнтеграции</catalogs> - <documents>Document.ПриходТовара</documents> - <documents>Document.РасходТовара</documents> + <catalogs>Catalog.НастройкиТорговогоОборудования</catalogs> + <catalogs>Catalog.Организации</catalogs> + <catalogs>Catalog.Пользователи</catalogs> + <catalogs>Catalog.ПочтовыеВложения</catalogs> + <catalogs>Catalog.РасчетныеСчета</catalogs> + <catalogs>Catalog.РасчетныеСчетаКонтрагентов</catalogs> + <catalogs>Catalog.Регионы</catalogs> + <catalogs>Catalog.Склады</catalogs> + <catalogs>Catalog.Товары</catalogs> + <catalogs>Catalog.ХранилищеВариантовОтчетов</catalogs> + <catalogs>Catalog.ХранимыеФайлы</catalogs> + <documents>Document.Заказ</documents> + <documents>Document.ОперацияПоУчетуТоваров</documents> <documents>Document.Оплата</documents> <documents>Document.ПоступлениеДенег</documents> - <documents>Document.ОперацияПоУчетуТоваров</documents> - <documents>Document.Заказ</documents> - <documentJournals>DocumentJournal.ФинансовыеДокументы</documentJournals> + <documents>Document.ПриходТовара</documents> + <documents>Document.РасходТовара</documents> <documentJournals>DocumentJournal.ДокументыПродаж</documentJournals> - <enums>Enum.ВидыТоваров</enums> - <enums>Enum.НазначениеХарактеристик</enums> + <documentJournals>DocumentJournal.ФинансовыеДокументы</documentJournals> + <enums>Enum.PushУведомления</enums> <enums>Enum.ВидНастройкиАутентификацииSMTP</enums> - <enums>Enum.ВидыМобильныхОтчетов</enums> - <enums>Enum.СостоянияЗаказов</enums> <enums>Enum.ВидСодержимогоВходящегоПисьма</enums> - <enums>Enum.PushУведомления</enums> + <enums>Enum.ВидыМобильныхОтчетов</enums> + <enums>Enum.ВидыТоваров</enums> <enums>Enum.ИспользоватьПровайдерГеопозиционирования</enums> - <reports>Report.ОстаткиТоваровНаСкладах</reports> + <enums>Enum.НазначениеХарактеристик</enums> + <enums>Enum.СостоянияЗаказов</enums> + <reports>Report.ВзаимосвязьПродажТоваров</reports> <reports>Report.ДинамикаПродаж</reports> - <reports>Report.ОтчетПоВзаиморасчетам</reports> <reports>Report.ДокументыОплата</reports> - <reports>Report.ВзаимосвязьПродажТоваров</reports> - <dataProcessors>DataProcessor.УправлениеПолнотекстовымПоиском</dataProcessors> + <reports>Report.ОстаткиТоваровНаСкладах</reports> + <reports>Report.ОтчетПоВзаиморасчетам</reports> <dataProcessors>DataProcessor.АдминистративныйСервис</dataProcessors> + <dataProcessors>DataProcessor.ЖурналРегистрации</dataProcessors> + <dataProcessors>DataProcessor.НастройкиПользователя</dataProcessors> <dataProcessors>DataProcessor.ПроведениеДокументов</dataProcessors> <dataProcessors>DataProcessor.Путеводитель</dataProcessors> <dataProcessors>DataProcessor.СписокАктивныхПользователей</dataProcessors> - <dataProcessors>DataProcessor.ЖурналРегистрации</dataProcessors> <dataProcessors>DataProcessor.УдалениеПомеченныхОбъектов</dataProcessors> - <dataProcessors>DataProcessor.УправлениеНастройкамиФорм</dataProcessors> - <dataProcessors>DataProcessor.НастройкиПользователя</dataProcessors> <dataProcessors>DataProcessor.УправлениеАгрегатамиПродаж</dataProcessors> - <dataProcessors>DataProcessor.ЭлектроннаяПочта</dataProcessors> + <dataProcessors>DataProcessor.УправлениеНастройкамиФорм</dataProcessors> + <dataProcessors>DataProcessor.УправлениеПолнотекстовымПоиском</dataProcessors> <dataProcessors>DataProcessor.УправлениеСистемойВзаимодействия</dataProcessors> + <dataProcessors>DataProcessor.ЭлектроннаяПочта</dataProcessors> <informationRegisters>InformationRegister.КурсыВалют</informationRegisters> - <informationRegisters>InformationRegister.Характеристики</informationRegisters> - <informationRegisters>InformationRegister.ЦеныТоваров</informationRegisters> + <informationRegisters>InformationRegister.МобильныеОтчеты</informationRegisters> <informationRegisters>InformationRegister.СостояниеВходящихПисем</informationRegisters> <informationRegisters>InformationRegister.СостояниеИсходящихПисем</informationRegisters> - <informationRegisters>InformationRegister.МобильныеОтчеты</informationRegisters> - <accumulationRegisters>AccumulationRegister.ТоварныеЗапасы</accumulationRegisters> + <informationRegisters>InformationRegister.Характеристики</informationRegisters> + <informationRegisters>InformationRegister.ЦеныТоваров</informationRegisters> <accumulationRegisters>AccumulationRegister.Взаиморасчеты</accumulationRegisters> <accumulationRegisters>AccumulationRegister.Продажи</accumulationRegisters> + <accumulationRegisters>AccumulationRegister.ТоварныеЗапасы</accumulationRegisters> <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.ВидыХарактеристик</chartsOfCharacteristicTypes> </mdclass:Configuration> diff --git a/sonar-project.properties b/sonar-project.properties index 2b3a6eee6..95289ab94 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -7,7 +7,7 @@ sonar.projectName=YAxUnit # Since SonarQube 4.2, this property is optional if sonar.modules is set. # If not set, SonarQube starts looking for source code from the directory containing # the sonar-project.properties file. -sonar.sources=./ +sonar.sources=./exts/yaxunit/src sonar.inclusions=**/*.bsl, **/*.os # Encoding of the source code. Default is default system encoding diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl" index 2178a095c..a154d3527 100644 --- "a/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl" +++ "b/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl" @@ -25,10 +25,32 @@ .ДобавитьТест("ОбъединитьВСтруктуру") .ДобавитьТест("СформироватьСтрокуСимволов") .ДобавитьТест("ДанныеСовпадают") + .ДобавитьТест("Пауза") + .ДобавитьТест("ВывестиВКонсоль") + .ДобавитьСерверныйТест("Менеджер") ; КонецПроцедуры +Процедура Пауза() Экспорт + + Начало = ТекущаяУниверсальнаяДатаВМиллисекундах(); + ЮТОбщий.Пауза(1); + ЮТОбщий.Пауза(1); + ЮТОбщий.Пауза(1); + Дельта = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало; + + ЮТест.ОжидаетЧто(Дельта) + .МеждуИсключаяГраницы(3000, 3200); + +КонецПроцедуры + +Процедура ВывестиВКонсоль() Экспорт + + ЮТОбщий.ВывестиВКонсоль(ТекущаяДата()); + +КонецПроцедуры + Процедура ДобавитьСтроку() Экспорт Варианты = ЮТест.Варианты("Исходная, Дополнение, Разделитель, Результат") @@ -111,6 +133,31 @@ КонецПроцедуры +#Если Сервер Тогда +Процедура Менеджер() Экспорт + + Варианты = ЮТест.Варианты("Параметр, Результат") + .Добавить("Справочник.Товары", Справочники.Товары) + .Добавить("Справочники.Товары", Справочники.Товары) + .Добавить(Справочники.Товары, Справочники.Товары) + .Добавить(Справочники.Товары.ПустаяСсылка(), Справочники.Товары) + .Добавить(Тип("СправочникМенеджер.Товары"), Справочники.Товары) + .Добавить(Тип("СправочникСсылка.Товары"), Справочники.Товары) + .Добавить(ЮТМетаданные.ОписаниеОбъектаМетаданных("Справочник.Товары"), Справочники.Товары) + .Добавить("РегистрыНакопления.Взаиморасчеты", РегистрыНакопления.Взаиморасчеты) + ; + + Для Каждого Вариант Из Варианты.СписокВариантов() Цикл + + Описание = СтрШаблон("%1 (%2)", Вариант.Параметр, ТипЗнч(Вариант.Параметр)); + ЮТест.ОжидаетЧто(ЮТОбщий.Менеджер(Вариант.Параметр), Описание) + .Равно(Вариант.Результат); + + КонецЦикла; + +КонецПроцедуры +#КонецЕсли + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl" index 89f752a91..de98b8db6 100644 --- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl" +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl" @@ -24,6 +24,7 @@ .ДобавитьТест("ЗаполнитьСправочник") .ДобавитьТест("ЗаполнитьДокумент") .ДобавитьТест("Фикция") + .ДобавитьТест("Фикция_Типизированная") .ДобавитьТест("ФикцияОбязательныхПолей") .ДобавитьТест("СоздатьГруппу") ; @@ -145,6 +146,48 @@ КонецПроцедуры +Процедура Фикция_Типизированная() Экспорт + + ИмяТипа = "ПланОбменаСсылка.Мобильные"; + Тип = Тип(ИмяТипа); + + Варианты = ЮТест.Варианты("Тип, ОжилаемыйТип, Описание") + .Добавить(ИмяТипа, Тип, "По представлению типа") + .Добавить(Тип, Тип, "По типу") + .Добавить(Новый ОписаниеТипов(ИмяТипа), Тип, "По описаниею типов") + .Добавить("Строка", Тип("Строка"), "Другой тип") + ; + + Для Каждого Вариант Из Варианты.СписокВариантов() Цикл + + Данные = ЮТест.Данные().КонструкторОбъекта("Справочник.МобильныеУстройства") + .Фикция("Подписчик", , Вариант.Тип) + .ДанныеОбъекта(); + + ЮТест.ОжидаетЧто(Данные, Вариант.Описание).Свойство("Подписчик") + .Заполнено() + .ИмеетТип(Вариант.ОжилаемыйТип); + + КонецЦикла; +// + Варианты = ЮТест.Варианты("Тип, Описание") + .Добавить("Дата", "Неподходящий тип") + .Добавить(Новый ОписаниеТипов("Число, Дата"), "Неподходящее описание типов") + .Добавить("Неопределено", "Неопределено") + .Добавить(Тип("Неопределено"), "Тип Неопределено") + ; + + Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочник.МобильныеУстройства"); + + Для Каждого Вариант Из Варианты.СписокВариантов() Цикл + + ЮТест.ОжидаетЧто(Конструктор, Вариант.Описание).Метод("Фикция", ЮТОбщий.ЗначениеВМассиве("Подписчик", Неопределено, Вариант.Тип)) + .ВыбрасываетИсключение("Исправьте ограничение типов для реквизита `Подписчик`"); + + КонецЦикла; + +КонецПроцедуры + Процедура ФикцияОбязательныхПолей() Экспорт Данные = ЮТест.Данные().КонструкторОбъекта("Справочники.Контрагенты") diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" new file mode 100644 index 000000000..53888a4e3 --- /dev/null +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" @@ -0,0 +1,53 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265.mdo" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265.mdo" new file mode 100644 index 000000000..a987a69b3 --- /dev/null +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265.mdo" @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="16b464c9-e5a2-4c92-9afb-1ab4a3532a87"> + <name>ОМ_ЮТМетаданные</name> + <synonym> + <key>ru</key> + <value>ЮТМетаданные</value> + </synonym> + <clientManagedApplication>true</clientManagedApplication> + <server>true</server> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" index 8400530e5..ec0e6ef9f 100644 --- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" @@ -81,6 +81,8 @@ .Добавить(Выражения.НеИмеетСвойство, "Число", "не содержит свойство `Число`", "ВложенныйОбъект") .Добавить(Выражения.Содержит, "4", "содержит `4`", "Строка") .Добавить(Выражения.НеСодержит, "2", "не содержит `2`", "Строка") + .Добавить(Выражения.СодержитСтрокуПоШаблону, "\D{3}", "содержит подстроку соответствующую шаблону `\D{3}`", "Строка") + .Добавить(Выражения.НеСодержитСтрокуПоШаблону, "\d{3}", "не содержит подстроку соответствующую шаблону `\d{3}`", "Строка") ; Для Каждого Вариант Из Варианты.СписокВариантов() Цикл diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" index 4aa6e819e..372f3994c 100644 --- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" @@ -26,6 +26,12 @@ .ДобавитьТест("Удалить") .ДобавитьТест("ВариантыПараметров") .ДобавитьТест("СоздатьГруппу") + .ДобавитьТест("ЗагрузитьИзМакета_ТабличныйДокумент") + .ДобавитьТест("ЗагрузитьИзМакета_MarkDown") + .ДобавитьТест("ЗагрузитьИзМакета_ЧастичнаяЗагрузкаДанных") + .ДобавитьТест("ЗагрузитьИзМакета_Проверки") + .ДобавитьТест("СлучайныйИдентификатор") + .ДобавитьТест("СлучайноеЗначениеПеречисления") ; КонецПроцедуры @@ -88,5 +94,250 @@ КонецПроцедуры -#КонецОбласти +Процедура СлучайныйИдентификатор() Экспорт + + Проверка = Новый Структура(); + + Для Инд = 1 По 100 Цикл + + Идентификатор = ЮТест.Данные().СлучайныйИдентификатор(Инд); + + ЮТест.ОжидаетЧто(Проверка) + .Метод("Вставить").Параметр(Идентификатор) + .НеВыбрасываетИсключение(, "Сформирован не валидный идентификатор: " + Идентификатор); + + КонецЦикла; + +КонецПроцедуры +Процедура ЗагрузитьИзМакета_ТабличныйДокумент() Экспорт + + // Подготовка тестового окружения + + ОписанияТипов = Новый Соответствие; + ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата")); + ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); + ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); + ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); + + КэшЗначений = Неопределено; + + Поставщик = ЮТест.Данные().СоздатьЭлемент("Справочники.Контрагенты", "Поставщик"); + + ЗаменяемыеЗначения = Новый Соответствие; + ЗаменяемыеЗначения.Вставить("Поставщик 1", Поставщик); + + ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11", + ОписанияТипов, + КэшЗначений, + ЗаменяемыеЗначения + ); + + // Проверка поведения и результатов + +#Если Сервер Тогда + Ютест.ОжидаетЧто(ТаблицаРезультатов) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(3) + .Свойство("[0].Товар.Поставщик").Равно(Поставщик) + .Свойство("[0].Товар.Артикул").Равно("Артикул 1") + .Свойство("[0].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар")) + .Свойство("[0].Товар.Описание").Заполнено() + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100.55) + .Свойство("[1].Товар.Поставщик").Заполнено().НеРавно(Поставщик) + .Свойство("[1].Товар.Артикул").Равно("Артикул 2") + .Свойство("[1].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар")) + .Свойство("[1].Товар.Описание").НеЗаполнено() + .Свойство("[1].Количество").Равно(1) + .Свойство("[1].Цена").Равно(1500.2) + .Свойство("[2].Товар.Поставщик").НеЗаполнено() + .Свойство("[2].Товар.Артикул").Равно("Артикул 3") + .Свойство("[2].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Услуга")) + .Свойство("[2].Товар.Описание").Заполнено() + .Свойство("[2].Количество").Равно(1) + .Свойство("[2].Цена").Равно(1000000) + ; +#Иначе + Ютест.ОжидаетЧто(ТаблицаРезультатов) + .ИмеетТип("Массив") + .ИмеетДлину(3) + .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат() + .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары") + .Реквизит("Период").Заполнено().ИмеетТип("Дата") + .Реквизит("Количество").Заполнено().ИмеетТип("Число") + .Реквизит("Цена").Заполнено().ИмеетТип("Число") + ) + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100.55) + .Свойство("[1].Количество").Равно(1) + .Свойство("[1].Цена").Равно(1500.2) + .Свойство("[2].Количество").Равно(1) + .Свойство("[2].Цена").Равно(1000000) + ; +#КонецЕсли + +КонецПроцедуры + +Процедура ЗагрузитьИзМакета_MarkDown() Экспорт + + ИмяМакета = "ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown"; + Макет = ЮТОбщий.Макет(ИмяМакета); + + Варианты = ЮТест.Варианты("Данные, Описание") + .Добавить(ИмяМакета, "По имени макета") + .Добавить(Макет, "Из текстового документа") + .Добавить(Макет.ПолучитьТекст(), "Из строки") + ; + + Для Каждого Вариант Из Варианты.СписокВариантов() Цикл + + ОписанияТипов = Новый Соответствие; + ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")); + ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число")); + ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); + ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число")); + + // Вызов тестируемого сценария + + ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета( + Вариант.Данные, + ОписанияТипов + ); + + // Проверка поведения и результатов + +#Если Сервер Тогда + Ютест.ОжидаетЧто(ТаблицаРезультатов, Вариант.Описание) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(3) + .Свойство("[0].Товар.Наименование").Равно("Товар 1") + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100) + .Свойство("[0].Сумма").Равно(100) + .Свойство("[1].Товар.Наименование").Равно("Товар 2") + .Свойство("[1].Количество").Равно(1) + .Свойство("[1].Цена").Равно(2000) + .Свойство("[1].Сумма").Равно(2000) + .Свойство("[2].Товар.Наименование").Равно("Услуга") + .Свойство("[2].Количество").Равно(1) + .Свойство("[2].Цена").Равно(300.9) + .Свойство("[2].Сумма").Равно(300.9) + ; +#Иначе + Ютест.ОжидаетЧто(ТаблицаРезультатов, Вариант.Описание) + .ИмеетТип("Массив") + .ИмеетДлину(3) + .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат() + .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары") + .Реквизит("Количество").Равно(1) + .Реквизит("Цена").Заполнено().ИмеетТип("Число") + .Реквизит("Сумма").Заполнено().ИмеетТип("Число")) + .Свойство("[0].Количество").Равно(1) + .Свойство("[0].Цена").Равно(100) + .Свойство("[0].Сумма").Равно(100) + .Свойство("[1].Цена").Равно(2000) + .Свойство("[1].Сумма").Равно(2000) + .Свойство("[2].Цена").Равно(300.9) + .Свойство("[2].Сумма").Равно(300.9) + ; +#КонецЕсли + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьИзМакета_ЧастичнаяЗагрузкаДанных() Экспорт + + ОписанияТипов = Новый Структура; + ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата")); + ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число")); + + ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11", ОписанияТипов); + +#Если Сервер Тогда + Ютест.ОжидаетЧто(ТаблицаРезультатов) + .ИмеетДлину(3) + .Свойство("Колонки").ИмеетДлину(2) + .Содержит("Период") + .Содержит("Количество") + ; +#Иначе + Ютест.ОжидаетЧто(ТаблицаРезультатов) + .ИмеетТип("Массив") + .ИмеетДлину(3) + .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат() + .ИмеетДлину(2) + .ИмеетСвойство("Период") + .ИмеетСвойство("Количество") + ) + ; +#КонецЕсли +КонецПроцедуры + +Процедура ЗагрузитьИзМакета_Проверки() Экспорт + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр(Неопределено) + .Параметр(Новый Массив) + .ВыбрасываетИсключение("Укажите источник данных (Макет)"); + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown") + .Параметр(Новый Массив) + .ВыбрасываетИсключение("Укажите описание загружаемых колонок (ОписанияТипов)"); + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown") + .Параметр(1) + .ВыбрасываетИсключение("Некорректный тип параметра `ОписанияТипов` метода `ЮТТестовыеДанные.ЗагрузитьИзМакета`. Метод принимает `Соответствие, Структура`, а получили `Число` (1)"); + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown") + .Параметр(Новый Структура("Количество, Резерв", Новый ОписаниеТипов("Число"), Новый ОписаниеТипов("Число"))) + .ВыбрасываетИсключение("Макет не содержит колонку `Резерв`"); + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown") + .Параметр(Новый Структура("Количество, Резерв", Новый ОписаниеТипов("Число"), Новый ОписаниеТипов("Число"))) + .ВыбрасываетИсключение("Макет не содержит колонку `Резерв`"); + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C4:R5C5") + .Параметр(Новый Структура("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"))) + .ВыбрасываетИсключение("не найдена в макете основная колонка с именем `Товар`"); + + ЮТест.ОжидаетЧто(ЮТест.Данные()) + .Метод("ЗагрузитьИзМакета") + .Параметр("ОбщийМакет.ЮТ_МакетТестовыхДанных.ОсновнаяТаблица") + .Параметр(Новый Структура("Цена", Новый ОписаниеТипов("Дата"))) + .ВыбрасываетИсключение("Область не найдена: ОсновнаяТаблица"); + +КонецПроцедуры + +Процедура СлучайноеЗначениеПеречисления() Экспорт + + Варианты = ЮТест.Варианты("Перечисление, Описание") + .Добавить("Перечисление.PushУведомления", "По имени") + .Добавить("Перечисления.PushУведомления", "По имени коллекции") +#Если Сервер Тогда + .Добавить(Перечисления.PushУведомления, "Через менеджер") +#КонецЕсли + ; + + Для Каждого Вариант Из Варианты.СписокВариантов() Цикл + + ЮТест.ОжидаетЧто(ЮТест.Данные().СлучайноеЗначениеПеречисления(Вариант.Перечисление)) + .Заполнено() + .ИмеетТип("ПеречислениеСсылка.PushУведомления"); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" new file mode 100644 index 000000000..0fd8bf4cd --- /dev/null +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" @@ -0,0 +1,89 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2023 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ИсполняемыеСценарии() Экспорт + + ЮТТесты + .ДобавитьТест("ЭтоСистемноеПеречисление") + .СПараметрами(Тип("ВидДвиженияБухгалтерии"), Истина) + .СПараметрами(Тип("Дата"), Ложь) + .СПараметрами(Тип("ПеречислениеСсылка.PushУведомления"), Ложь) + .ДобавитьТест("ТипыСистемныхПеречислений") + .ДобавитьТест("ИмяСистемногоПеречисления") + .СПараметрами(Тип("ВидДвиженияБухгалтерии"), "ВидДвиженияБухгалтерии") + .ДобавитьТест("ЭтоПримитивныйТип") + .СПараметрами(Тип("ПеречислениеСсылка.PushУведомления"), Ложь) + .СПараметрами(Тип("Строка"), Истина) + .СПараметрами(Тип("Число"), Истина) + .СПараметрами(Тип("Неопределено"), Ложь) + .СПараметрами(Новый ОписаниеТипов("УникальныйИдентификатор"), Истина) + .СПараметрами(Новый ОписаниеТипов("Число, Дата"), Истина) + .СПараметрами(Новый ОписаниеТипов("Число, ПеречислениеСсылка.PushУведомления, Дата"), Ложь) + .ДобавитьТест("ЭтоКоллекцияПримитивныхТипов") + .СПараметрами(ЮТОбщий.ЗначениеВМассиве(Тип("Строка"), Тип("Дата")), Истина) + .СПараметрами(ЮТОбщий.ЗначениеВМассиве(Тип("Строка"), Тип("Дата"), Тип("ПеречислениеСсылка.PushУведомления")), Ложь) + + ; + +КонецПроцедуры + +Процедура ЭтоСистемноеПеречисление(Тип, ОжидаемыйРезультат) Экспорт + + ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоСистемноеПеречисление(Тип)) + .Равно(ОжидаемыйРезультат); + +КонецПроцедуры + +Процедура ТипыСистемныхПеречислений() Экспорт + + ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ТипыСистемныхПеречислений()) + .ИмеетТип("ОписаниеТипов") + .Что(ЮТТипыДанныхСлужебный.ТипыСистемныхПеречислений().Типы()) + .Содержит(Тип("ВидДвиженияБухгалтерии")) + .Содержит(Тип("ИспользованиеАгрегатаРегистраНакопления")); + +КонецПроцедуры + +Процедура ИмяСистемногоПеречисления(Тип, ОжидаемыйРезультат) Экспорт + + ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ИмяСистемногоПеречисления(Тип)) + .Равно(ОжидаемыйРезультат); + +КонецПроцедуры + +Процедура ЭтоПримитивныйТип(Тип, ОжидаемыйРезультат) Экспорт + + ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоПримитивныйТип(Тип)) + .Равно(ОжидаемыйРезультат); + +КонецПроцедуры + +Процедура ЭтоКоллекцияПримитивныхТипов(Тип, ОжидаемыйРезультат) Экспорт + + ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоКоллекцияПримитивныхТипов(Тип)) + .Равно(ОжидаемыйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" new file mode 100644 index 000000000..cacbdb5e1 --- /dev/null +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fc1e1bfd-0413-4459-8831-8ff915f46096"> + <name>ОМ_ЮТТипыДанныхСлужебный</name> + <synonym> + <key>ru</key> + <value>Типы данных служебный</value> + </synonym> + <server>true</server> +</mdclass:CommonModule> diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" index ea7060214..057605e24 100644 --- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" @@ -49,6 +49,8 @@ .ДобавитьТест("НеИмеетТип") .ДобавитьТест("Содержит") .ДобавитьТест("НеСодержит") + .ДобавитьТест("СодержитСтрокуПоШаблону") + .ДобавитьТест("НеСодержитСтрокуПоШаблону") .ДобавитьТест("ИмеетДлину") .ДобавитьТест("НеИмеетДлину") .ДобавитьТест("ВыбрасываетИсключение") @@ -1358,6 +1360,48 @@ КонецПроцедуры +Процедура СодержитСтрокуПоШаблону() Экспорт + + // Позитивные тесты + ЮТУтверждения.Что("123321") + .СодержитСтрокуПоШаблону("\d{3}") + .СодержитСтрокуПоШаблону(".{6}") + ; + + // Негативные тесты + Попытка + Ошибка = Неопределено; + ЮТУтверждения.Что("123321") + .СодержитСтрокуПоШаблону(".{7}"); + Исключение + Ошибка = ИнформацияОбОшибке(); + КонецПопытки; + ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `123321` содержит подстроку соответствующую шаблону `.{7}`, но это не так"); + ПроверитьДанныеОшибкиСравнения("123321", ".{7}"); + +КонецПроцедуры + +Процедура НеСодержитСтрокуПоШаблону() Экспорт + + // Позитивные тесты + ЮТУтверждения.Что("123321") + .НеСодержитСтрокуПоШаблону("\D{3}") + .НеСодержитСтрокуПоШаблону(".{7}") + ; + + // Негативные тесты + Попытка + Ошибка = Неопределено; + ЮТУтверждения.Что("123321") + .НеСодержитСтрокуПоШаблону(".{6}"); + Исключение + Ошибка = ИнформацияОбОшибке(); + КонецПопытки; + ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `123321` не содержит подстроку соответствующую шаблону `.{6}`, но это не так"); + ПроверитьДанныеОшибкиСравнения("123321", ".{6}"); + +КонецПроцедуры + Процедура ИмеетДлину() Экспорт // Позитивные тесты diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" index 27220fd09..3062ad3ce 100644 --- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" +++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" @@ -93,7 +93,7 @@ Наборы = ЮТЧитатель.ЗагрузитьТесты(ПараметрыЗапуска); ЮТест.ОжидаетЧто(Наборы, "Прочитанные наборы расширения tests") - .ИмеетДлину(21); + .ИмеетДлину(23); КонецПроцедуры @@ -158,4 +158,4 @@ КонецПроцедуры -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git "a/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" index 33e7ec306..5181d8616 100644 --- "a/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" +++ "b/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" @@ -71,4 +71,37 @@ КонецПроцедуры +Функция ТестовыеДанныеДляОписаниеОбъектаМетаданных(ДляСервера) Экспорт + + Данные = Новый Массив(); + + Вид = "Справочник"; + + Для Каждого Справочник Из Метаданные.Справочники Цикл + + Данные.Добавить(Справочник.ПолноеИмя()); + Данные.Добавить(Тип(СтрШаблон("%1Ссылка.%2", Вид, Справочник.Имя))); + Данные.Добавить(Новый(СтрШаблон("%1Ссылка.%2", Вид, Справочник.Имя))); + + Если ДляСервера Тогда + Данные.Добавить(Справочник); + Данные.Добавить(Новый(СтрШаблон("%1Менеджер.%2", Вид, Справочник.Имя))); + Данные.Добавить(Новый(СтрШаблон("%1Объект.%2", Вид, Справочник.Имя))); + Данные.Добавить(Тип(СтрШаблон("%1Объект.%2", Вид, Справочник.Имя))); + Данные.Добавить(Тип(СтрШаблон("%1Менеджер.%2", Вид, Справочник.Имя))); + КонецЕсли; + + КонецЦикла; + + Количество = Данные.Количество(); + Для Инд = 0 По Количество - 1 Цикл + Данные.Добавить(Данные[Инд]); + Данные.Добавить(Данные[Инд]); + Данные.Добавить(Данные[Инд]); + КонецЦикла; + + Возврат Данные; + +КонецФункции + #КонецОбласти diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Template.mxlx" "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Template.mxlx" new file mode 100644 index 000000000..6e67f1c6a --- /dev/null +++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Template.mxlx" @@ -0,0 +1,1005 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document xmlns="http://v8.1c.ru/8.2/data/spreadsheet" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <languageSettings> + <currentLanguage>ru</currentLanguage> + <defaultLanguage>#</defaultLanguage> + <languageInfo> + <id>ru</id> + <code>Русский</code> + </languageInfo> + </languageSettings> + <columns> + <size>11</size> + <columnsItem> + <index>0</index> + <column> + <formatIndex>1</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>1</index> + <column> + <formatIndex>2</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>2</index> + <column> + <formatIndex>3</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>3</index> + <column> + <formatIndex>4</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>4</index> + <column> + <formatIndex>5</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>5</index> + <column> + <formatIndex>6</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>7</index> + <column> + <formatIndex>7</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>6</index> + <column> + <formatIndex>8</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>8</index> + <column> + <formatIndex>9</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>9</index> + <column> + <formatIndex>10</formatIndex> + </column> + </columnsItem> + <columnsItem> + <index>10</index> + <column> + <formatIndex>9</formatIndex> + </column> + </columnsItem> + </columns> + <rowsItem> + <index>0</index> + <row> + <c> + <c> + <f>11</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Исходная таблица</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>0</f> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>1</index> + <row> + <c> + <c> + <f>12</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>13</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активность</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>13</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>14</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар.Артикул</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>15</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар.Поставщик</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>16</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар.Вид</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>17</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар.Описание</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>17</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар.ОтсутствующийРеквизит</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>18</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Цена</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>18</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>19</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сумма</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>2</index> + <row> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>01.01.2023 0:00:00</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Да</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар 1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>21</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Артикул 1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>22</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Поставщик 1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>23</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>24</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Некоторое описание товара</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>25</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>100,55</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>26</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>100,55</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>3</index> + <row> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>2023-01-01</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Истина</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар 2</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>21</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Артикул 2</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>22</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Поставщик 2</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>23</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>24</f> + </c> + </c> + <c> + <c> + <f>24</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1 500.2</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>26</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1 500.2</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>4</index> + <row> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>01/01/23</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>false</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Услуга</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>21</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Артикул 3</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>22</f> + </c> + </c> + <c> + <c> + <f>23</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Услуга</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>24</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Некоторое описание услуги</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>25</f> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1 000 000</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>26</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1 000 000</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>6</index> + <row> + <c> + <c> + <f>0</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ожидаемое значение</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>7</index> + <row> + <c> + <c> + <f>13</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>13</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активность</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>13</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>14</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Цена</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>18</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>16</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сумма</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>8</index> + <row> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>01.01.2023 0:00:00</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Истина</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар 1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>100.55</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>26</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>100.55</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>9</index> + <row> + <c> + <c> + <f>27</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>01.01.2023 0:00:00</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Истина</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Товар 2</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1500.2</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>26</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1500.2</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <rowsItem> + <index>10</index> + <row> + <c> + <c> + <f>27</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>01.01.2023 0:00:00</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ложь</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Услуга</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1000000</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>26</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1</v8:content> + </v8:item> + </tl> + </c> + </c> + <c> + <c> + <f>20</f> + <tl> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>1000000</v8:content> + </v8:item> + </tl> + </c> + </c> + </row> + </rowsItem> + <templateMode>true</templateMode> + <height>11</height> + <vgRows>11</vgRows> + <line width="1" gap="false"> + <v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Solid</v8ui:style> + </line> + <font faceName="Arial" height="8" bold="true" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/> + <format> + <width>123</width> + </format> + <format> + <width>83</width> + </format> + <format> + <width>56</width> + </format> + <format> + <width>105</width> + </format> + <format> + <width>122</width> + </format> + <format> + <width>77</width> + </format> + <format> + <width>209</width> + </format> + <format> + <width>176</width> + </format> + <format> + <width>65</width> + </format> + <format> + <width>86</width> + </format> + <format> + <width>147</width> + </format> + <format> + <font>0</font> + <border>0</border> + <width>95</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <width>95</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <width>147</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <width>163</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <width>120</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <width>176</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <width>81</width> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <font>0</font> + <border>0</border> + <horizontalAlignment>Center</horizontalAlignment> + </format> + <format> + <border>0</border> + <width>95</width> + </format> + <format> + <border>0</border> + <width>147</width> + </format> + <format> + <border>0</border> + <width>163</width> + </format> + <format> + <border>0</border> + <width>120</width> + </format> + <format> + <border>0</border> + <width>176</width> + </format> + <format> + <border>0</border> + <width>209</width> + </format> + <format> + <border>0</border> + <width>81</width> + </format> + <format> + <border>0</border> + </format> +</document> \ No newline at end of file diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" new file mode 100644 index 000000000..a56bd4a93 --- /dev/null +++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0bb835ed-1ddd-467f-94d5-02e1259cde62"> + <name>ЮТ_МакетТестовыхДанных</name> + <synonym> + <key>ru</key> + <value>Ю т макет тестовых данных</value> + </synonym> +</mdclass:CommonTemplate> diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/Template.txt" "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/Template.txt" new file mode 100644 index 000000000..d22550824 --- /dev/null +++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/Template.txt" @@ -0,0 +1,5 @@ +| Товар | Цена | Количество | Сумма | +|---------|-------|------------|-------| +| Товар 1 | 100 | 1 | 100 | +| Товар 2 | 2 000 | 1 | 2000 | +| Услуга | 300,9 | 1 | 300,9 | \ No newline at end of file diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown.mdo" "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown.mdo" new file mode 100644 index 000000000..3cb336705 --- /dev/null +++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown.mdo" @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2e31e77f-a18c-4b2d-bc19-f038eb6ec143"> + <name>ЮТ_ТестовыеДанныеMarkdown</name> + <synonym> + <key>ru</key> + <value>Ю т тестовые данные markdown</value> + </synonym> + <templateType>TextDocument</templateType> +</mdclass:CommonTemplate> diff --git a/tests/src/Configuration/Configuration.mdo b/tests/src/Configuration/Configuration.mdo index 53a0bfc48..02b5d323b 100644 --- a/tests/src/Configuration/Configuration.mdo +++ b/tests/src/Configuration/Configuration.mdo @@ -22,6 +22,8 @@ </extension> <languageCode>ru</languageCode> </languages> + <commonTemplates>CommonTemplate.ЮТ_МакетТестовыхДанных</commonTemplates> + <commonTemplates>CommonTemplate.ЮТ_ТестовыеДанныеMarkdown</commonTemplates> <commonModules>CommonModule.Интеграция</commonModules> <commonModules>CommonModule.Обр_ЮТHTTPСервисЗапрос</commonModules> <commonModules>CommonModule.ОМ_Мокито</commonModules> @@ -32,6 +34,7 @@ <commonModules>CommonModule.ОМ_ЮТестПереопределяемый</commonModules> <commonModules>CommonModule.ОМ_ЮТЗапросы</commonModules> <commonModules>CommonModule.ОМ_ЮТКонструкторТестовыхДанных</commonModules> + <commonModules>CommonModule.ОМ_ЮТМетаданные</commonModules> <commonModules>CommonModule.ОМ_ЮТПодражатель_Банки</commonModules> <commonModules>CommonModule.ОМ_ЮТПодражатель_Компании</commonModules> <commonModules>CommonModule.ОМ_ЮТПодражатель_Люди</commonModules> @@ -40,6 +43,7 @@ <commonModules>CommonModule.ОМ_ЮТТестовыеДанные</commonModules> <commonModules>CommonModule.ОМ_ЮТТестовыеДанныеСлужебный</commonModules> <commonModules>CommonModule.ОМ_ЮТТесты</commonModules> + <commonModules>CommonModule.ОМ_ЮТТипыДанныхСлужебный</commonModules> <commonModules>CommonModule.ОМ_ЮТУтверждения</commonModules> <commonModules>CommonModule.ОМ_ЮТУтвержденияИБ</commonModules> <commonModules>CommonModule.ОМ_ЮТФильтрация</commonModules>