From 614a0e00bd0285c3a938de5cdf83a9c3aa547202 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 19 Feb 2024 23:47:32 +0200 Subject: [PATCH 001/144] Remove deprecated github actions and update releasing documentation. --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 2 +- development/releasing.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 668f1e5a4..3d2f9a0a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -88,7 +88,7 @@ jobs: --health-cmd healthcheck.sh steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: c-py/action-dotenv-to-setenv@v2 @@ -183,7 +183,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e29bd5c1..1c4db5d59 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: c-py/action-dotenv-to-setenv@v2 diff --git a/development/releasing.md b/development/releasing.md index c1e49184d..ac2091632 100644 --- a/development/releasing.md +++ b/development/releasing.md @@ -6,7 +6,7 @@ To create a release follow the below steps - Create a **draft** of a Release with a new tag number `vX.Y.X` sourced from the `develop` branch on [github releases page](https://github.com/utPLSQL/utPLSQL/releases) - Populate release description using the `Generate release notes` button - Review the auto-generated release notes and update tem if needed - - Split the default `## What's Changed` list into `## New features`, `## Enhancements`, `## Bug fixes`. See previous release notes for details + - Optionally, split the default `## What's Changed` list into `## New features`, `## Enhancements`, `## Bug fixes`. See previous release notes for details ## Performing a release - Publish [the previously prepared](#release-preparation) release draft. From 5a42ce5ea71045b4cafa063ccc57781fa7ce09ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Feb 2024 21:56:00 +0000 Subject: [PATCH 002/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 26de2ed80..8c8049510 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4197 +4198 diff --git a/docs/about/authors.md b/docs/about/authors.md index 203d450d1..541662a36 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 28aea5fed..f07bdd4b4 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 8e6730847..0cd02e09e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 0748fd479..195b194e3 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 320784892..8f1cc584e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 34b4eddcc..4068e2d09 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index b3602ef10..57cb29685 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 379024e73..b016fdac0 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 24855cbb5..f48051ba5 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e2a8bc7da..b580b7077 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 472c9654e..19e77835a 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 9c4d8813a..1cf1f9d2f 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index c322639df..4fdd04af6 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 463bcef97..2c6ae2d95 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 41468a3a5..8042fcd55 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 502bd49bd..7f8f6d620 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index cb49a0424..11410dd2b 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 463aa1604..36264fafc 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4197-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4198-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 42b923be7f4c46768c4f62eeb347b45590f11ad3 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Tue, 20 Feb 2024 00:39:24 +0200 Subject: [PATCH 003/144] Removed unneeded files from the release archives. --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 5e0c801de..2cda5ad55 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,6 +6,8 @@ test export-ignore .gitignore export-ignore .gitmodules export-ignore mkdocs.yml export-ignore +BUILD_NO export-ignore +mkdocs_offline.yml export-ignore sonar-project.properties export-ignore ^docs/** linguist-documentation *.pkb linguist-language=PLSQL From 629e6116887b1921f956ff6dd449ed9b9b1e29da Mon Sep 17 00:00:00 2001 From: bozo030 Date: Tue, 21 May 2024 11:59:34 +0200 Subject: [PATCH 004/144] Matcher shortcut syntax example fixed --- docs/userguide/expectations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 19e77835a..ec24b570c 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -52,7 +52,7 @@ Shortcut syntax, where matcher is directly part of expectation: ut.expect( a_actual ).not_to_{matcher}; --example - ut.expect( 1 ).to_( be_null() ); + ut.expect( 1 ).to_be_null(); ``` When using shortcut syntax you don't need to surround matcher with brackets. Shortcut syntax is provided for convenience. From 3f4dc81ccaa2625b8da111e446105d6d51ef32de Mon Sep 17 00:00:00 2001 From: Samuel Nitsche Date: Tue, 17 Sep 2024 22:58:03 +0200 Subject: [PATCH 005/144] Update build.yml to use actions/upload-artifact@v4 as described in https://github.blog/news-insights/product-news/get-started-with-v4-of-github-actions-artifacts/ --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d2f9a0a0..af2e4875d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,7 +172,7 @@ jobs: - name: Upload ORACLE_BASE/diag data Artifact id: upload if: ${{ always() && steps.run-tests.outcome == 'failure' }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: my-artifact$-${{matrix.db_version_name}} path: ${{github.workspace}}/database-diag From ca88e498e8e374776f76a5f63d136f2609c6c60c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 23 Oct 2024 00:30:02 +0300 Subject: [PATCH 006/144] Update test_realtime_reporter.pkb Fixing failing test for 23ai --- test/ut3_user/reporters/test_realtime_reporter.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_user/reporters/test_realtime_reporter.pkb b/test/ut3_user/reporters/test_realtime_reporter.pkb index 2dafa71d0..84053c3c9 100644 --- a/test/ut3_user/reporters/test_realtime_reporter.pkb +++ b/test/ut3_user/reporters/test_realtime_reporter.pkb @@ -408,7 +408,7 @@ create or replace package body test_realtime_reporter as from table(g_events) t where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() = 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error'; - ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); From 5241c43e2b25d718a8ecc3e5c26820af852310ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 23 Oct 2024 00:38:54 +0300 Subject: [PATCH 007/144] Update test_documentation_reporter.pkb Fixed failing unit test --- test/ut3_user/reporters/test_documentation_reporter.pkb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ut3_user/reporters/test_documentation_reporter.pkb b/test/ut3_user/reporters/test_documentation_reporter.pkb index 2a05679ff..016cec256 100644 --- a/test/ut3_user/reporters/test_documentation_reporter.pkb +++ b/test/ut3_user/reporters/test_documentation_reporter.pkb @@ -34,7 +34,6 @@ Failures: "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3_USER.TEST_REPORTERS%", line 36 ut3_develop.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); -% % 2) erroring_test ORA-06502: PL/SQL: %: character to number conversion error From 1819ca766160a4b6c82090b7304512b68d08b063 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 22:47:42 +0100 Subject: [PATCH 008/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 8c8049510..fab85b21d 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4198 +4206 diff --git a/docs/about/authors.md b/docs/about/authors.md index 541662a36..499398993 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index f07bdd4b4..03cc286eb 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 0cd02e09e..5579a943b 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 195b194e3..6d68864bd 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8f1cc584e..b277c9d16 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4068e2d09..45fca1871 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 57cb29685..31a91cac2 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b016fdac0..6becefc5c 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index f48051ba5..c9015b438 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index b580b7077..824aaecd5 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index ec24b570c..54c204d58 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1cf1f9d2f..1ff54a7d6 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 4fdd04af6..9d8167739 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 2c6ae2d95..24159fede 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 8042fcd55..9b1a7e75b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 7f8f6d620..375a05125 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 11410dd2b..6fdaa6a48 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 36264fafc..0e1e0a851 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4198-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4206-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 808fcdfc31c17dac2fedc41a440f55d7f7bd9bbe Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sat, 29 Mar 2025 16:43:12 +0000 Subject: [PATCH 009/144] Update documentation for customer reporter --- docs/userguide/reporters.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 9b1a7e75b..24d1065fe 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -175,6 +175,16 @@ If you need to produce a colored text output from the custom reporter, then you It is recommended to create the reporter type in the schema where utPLSQL is installed (by default it is the `UT3` schema). Note that before running the utPLSQL uninstall scripts, all custom reporters should be dropped (cf. [the installation documentation](install.md)). In particular, when upgrading to a newer version of utPLSQL, one has to drop the custom reporters and recreate them after the upgrade. +!!! note + Please make sure that grants have been added and synonyms created for the custom reporter in order for reporter to be accessible the same way as other reporters. + Assuming that reporter with name `customer_reporter` was created in schema `UT3` +```sql + grant execute on ut3.custom_reporter to public; + create or replace public synonym custom_reporter for ut3.custom_reporter; +``` + + + !!! note It is possible, but cumbersome, to use another schema for storing the custom reporters. This requires to create a synonym for the base reporter type in the schema that is going to own the custom reporter, and to provide appropriate grants both to the owner of the custom reporter and to the user running the reporter. After upgrading or reinstalling utPLSQL, the extra privileges need to be recreated. This approach is not recommended. From 39ff2ed0090a22fe680f5de38a2aa87f31b95226 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Wed, 2 Apr 2025 20:41:46 +0100 Subject: [PATCH 010/144] Adding tests for issue 1293 --- .../expectations/test_expectations_cursor.pkb | 42 +++++++++++++++++++ .../expectations/test_expectations_cursor.pks | 6 +++ 2 files changed, 48 insertions(+) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 847cce9a0..867a5f3db 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2950,5 +2950,47 @@ Rows: [ 2 differences ] ); end; + procedure cursor_joinby_compare_issue_1293 is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + --Arrange + open l_expected for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual + order by 1 desc; + open l_actual for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual union all + -- DUPLICATE!!! + select 'TEST' username, -600 user_id from dual + order by 1 asc; + --Act + ut3_develop.ut.expect(l_actual).to_equal(l_expected).join_by('USERNAME'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure cursor_not_joinby_compare_issue_1293 is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + --Arrange + open l_expected for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual + order by 1 desc; + open l_actual for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual union all + -- DUPLICATE!!! + select 'TEST' username, -600 user_id from dual + order by 1 asc; + --Act + ut3_develop.ut.expect(l_actual).to_equal(l_expected); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index 0f34486a9..53f754322 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -485,5 +485,11 @@ create or replace package test_expectations_cursor is --%test( Multiple failures reported correctly - Issue #998 ) procedure multiple_cursor_expectations; + --%test( Compares cursors with duplicate rows using join by - Issue #1293 ) + procedure cursor_joinby_compare_issue_1293; + + --%test( Compares cursors with duplicate rows - Issue #1293 ) + procedure cursor_not_joinby_compare_issue_1293; + end; / From 85734ffec7f57efff073d833ee2d43de1a9ad0f2 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Thu, 3 Apr 2025 18:38:33 +0100 Subject: [PATCH 011/144] For a join by key we need to also compare by duplicate numbers to make sure that we have same amount of rows when rows are identical but row counts is different. --- source/expectations/data_values/ut_compound_data_helper.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 4517cd43c..875ec760a 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -300,8 +300,8 @@ create or replace package body ut_compound_data_helper is ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) '); if a_pk_table.count > 0 then - -- If key defined do the join or these and where on diffrences - a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and '); + -- If key defined do the join or these and where on diffrences as well as on duplicate number when rows are same. + a_join_by_stmt := ' e."UT3$_Dup#No" = a."UT3$_Dup#No" and '||ut_utils.table_to_clob(l_join_by_list, ' and '); elsif a_unordered then -- If no key defined do the join on all columns a_join_by_stmt := ' e."UT3$_Dup#No" = a."UT3$_Dup#No" and '||ut_utils.table_to_clob(l_equal_list, ' and '); From 6f273df2752c7a0665debbc9532886ea01f8ff5a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Thu, 3 Apr 2025 19:49:58 +0100 Subject: [PATCH 012/144] Change procedure nameto be less 30 to work for 11 and 12 --- test/ut3_user/expectations/test_expectations_cursor.pkb | 4 ++-- test/ut3_user/expectations/test_expectations_cursor.pks | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 867a5f3db..a4ef4e8f2 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2950,7 +2950,7 @@ Rows: [ 2 differences ] ); end; - procedure cursor_joinby_compare_issue_1293 is + procedure cr_joinby_compare_issue_1293 is l_actual sys_refcursor; l_expected sys_refcursor; begin @@ -2971,7 +2971,7 @@ Rows: [ 2 differences ] ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; - procedure cursor_not_joinby_compare_issue_1293 is + procedure cr_not_joinby_comp_issue_1293 is l_actual sys_refcursor; l_expected sys_refcursor; begin diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index 53f754322..8cceb5e01 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -486,10 +486,10 @@ create or replace package test_expectations_cursor is procedure multiple_cursor_expectations; --%test( Compares cursors with duplicate rows using join by - Issue #1293 ) - procedure cursor_joinby_compare_issue_1293; + procedure cr_joinby_compare_issue_1293; --%test( Compares cursors with duplicate rows - Issue #1293 ) - procedure cursor_not_joinby_compare_issue_1293; + procedure cr_not_joinby_comp_issue_1293; end; / From 933f41a70510a04c2eef89846301458009a312e8 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Thu, 10 Jul 2025 13:16:55 +0200 Subject: [PATCH 013/144] Added TAP reporter and synonyms --- source/create_grants.sql | 1 + source/create_synonyms.sql | 1 + source/reporters/ut_tap_reporter.tpb | 104 +++++++++++++++++++++++++++ source/reporters/ut_tap_reporter.tps | 13 ++++ 4 files changed, 119 insertions(+) create mode 100644 source/reporters/ut_tap_reporter.tpb create mode 100644 source/reporters/ut_tap_reporter.tps diff --git a/source/create_grants.sql b/source/create_grants.sql index 0e9f46cc5..2cdea9970 100644 --- a/source/create_grants.sql +++ b/source/create_grants.sql @@ -104,6 +104,7 @@ grant execute on &&ut3_owner..ut_tfs_junit_reporter to &ut3_user; grant execute on &&ut3_owner..ut_documentation_reporter to &ut3_user; grant execute on &&ut3_owner..ut_sonar_test_reporter to &ut3_user; grant execute on &&ut3_owner..ut_realtime_reporter to &ut3_user; +grant execute on &&ut3_owner..ut_tap_reporter to &ut3_user; --reporters - coverage grant execute on &&ut3_owner..ut_coverage_html_reporter to &ut3_user; grant execute on &&ut3_owner..ut_coverage_sonar_reporter to &ut3_user; diff --git a/source/create_synonyms.sql b/source/create_synonyms.sql index fa1c1dc45..d839e11b7 100644 --- a/source/create_synonyms.sql +++ b/source/create_synonyms.sql @@ -119,6 +119,7 @@ create &action_type. synonym &ut3_user.ut_tfs_junit_reporter for &&ut3_owner..ut create &action_type. synonym &ut3_user.ut_documentation_reporter for &&ut3_owner..ut_documentation_reporter; create &action_type. synonym &ut3_user.ut_sonar_test_reporter for &&ut3_owner..ut_sonar_test_reporter; create &action_type. synonym &ut3_user.ut_realtime_reporter for &&ut3_owner..ut_realtime_reporter; +create &action_type. synonym &ut3_user.ut_tap_reporter for &&ut3_owner..ut_tap_reporter; --reporters - coverage create &action_type. synonym &ut3_user.ut_coverage_html_reporter for &&ut3_owner..ut_coverage_html_reporter; create &action_type. synonym &ut3_user.ut_coverage_sonar_reporter for &&ut3_owner..ut_coverage_sonar_reporter; diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb new file mode 100644 index 000000000..f3f511d05 --- /dev/null +++ b/source/reporters/ut_tap_reporter.tpb @@ -0,0 +1,104 @@ +create or replace type body ut_tap_reporter is + + + constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result is + begin + self.init($$plsql_unit); + self.lvl := 0; + return; + end ut_tap_reporter; + + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as + begin + self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name)); + lvl := lvl + 2; + self.print_text('1..' || a_suite.items.count); + end before_calling_suite; + + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as + l_message varchar2(4000); + l_test_name varchar2(300) := coalesce(a_test.description, a_test.name); + + procedure print_failed_expectation(a_test ut_test) is + l_lines ut_varchar2_list; + l_failed boolean; + begin + if a_test.get_error_stack_traces().count = 0 then + -- If no error occurred, print failed expectation + l_lines := a_test.all_expectations(a_test.all_expectations.last).get_result_lines(); + l_failed := a_test.all_expectations(a_test.all_expectations.last).status >= ut_utils.gc_success; + if l_failed then + self.print_text('message: ''' || l_lines(1) || ''''); + self.print_text('severity: fail'); + end if; + else + -- Print multi-line YAML-String with implicit newline characters + self.print_text('message: |'); + self.lvl := self.lvl + 1; + self.print_text(ut_utils.table_to_clob(a_test.get_error_stack_traces())); + self.lvl := self.lvl - 1; + self.print_text('severity: error'); + end if; + end print_failed_expectation; + + begin + + if a_test.result = ut_utils.gc_disabled then + self.print_text('ok - ' || l_test_name || ' # SKIP'|| + case when a_test.disabled_reason is not null + then ': '||a_test.disabled_reason + else null + end ); + elsif a_test.result = ut_utils.gc_success then + self.print_text('ok - ' || l_test_name); + elsif a_test.result > ut_utils.gc_success then + if self.lvl = 0 then + self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_test_name); + else + self.print_text('not ok - ' || l_test_name); + end if; + self.lvl := self.lvl + 1; + self.print_text('---'); + print_failed_expectation(a_test); + self.print_text('...'); + self.lvl := self.lvl - 1; + end if; + + end after_calling_test; + + overriding member procedure after_calling_before_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is + begin + if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then + self.print_clob(a_executable.serveroutput); + end if; + end after_calling_before_all; + + overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as + l_suite_name varchar2(300) := coalesce(a_suite.description, a_suite.name); + begin + lvl := lvl - 2; + if lvl = 0 then + if a_suite.result = ut_utils.gc_success then + self.print_text('ok - ' || l_suite_name); + elsif a_suite.result > ut_utils.gc_success then + self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name); + end if; + + self.print_text(' '); + end if; + + end after_calling_suite; + + overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) as + begin + self.print_text('TAP version 14'); + self.print_text('1..' || a_run.items.count); + self.print_text(' '); + end before_calling_run; + + overriding member procedure after_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) as + begin + self.lvl := 0; + end; +end; +/ \ No newline at end of file diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps new file mode 100644 index 000000000..3e792b1f7 --- /dev/null +++ b/source/reporters/ut_tap_reporter.tps @@ -0,0 +1,13 @@ +create or replace type ut_tap_reporter under ut_documentation_reporter( + + constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), + overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), + overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run), + overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), + overriding member procedure after_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) + +) +not final +/ \ No newline at end of file From c5f07a76885105d2044a655925e94f9dcbf9de9e Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Thu, 10 Jul 2025 13:21:28 +0200 Subject: [PATCH 014/144] Larger variables to prevent failure during reporting --- source/reporters/ut_tap_reporter.tpb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index f3f511d05..6ae764399 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -17,7 +17,7 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); - l_test_name varchar2(300) := coalesce(a_test.description, a_test.name); + l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); procedure print_failed_expectation(a_test ut_test) is l_lines ut_varchar2_list; @@ -74,7 +74,7 @@ create or replace type body ut_tap_reporter is end after_calling_before_all; overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as - l_suite_name varchar2(300) := coalesce(a_suite.description, a_suite.name); + l_suite_name varchar2(4000) := coalesce(a_suite.description, a_suite.name); begin lvl := lvl - 2; if lvl = 0 then From 4ed6837276570eac30c7fd674d47ff927077695b Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 11 Jul 2025 21:29:06 +0200 Subject: [PATCH 015/144] Added TAP Reporter to install script --- source/install.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/install.sql b/source/install.sql index 827213e6c..22ce75365 100644 --- a/source/install.sql +++ b/source/install.sql @@ -346,6 +346,8 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'reporters/ut_xunit_reporter.tpb' @@install_component.sql 'reporters/ut_sonar_test_reporter.tps' @@install_component.sql 'reporters/ut_sonar_test_reporter.tpb' +@@install_component.sql 'reporters/ut_tap_reporter.tps' +@@install_component.sql 'reporters/ut_tap_reporter.tpb' @@install_component.sql 'reporters/ut_coverage_html_reporter.tps' @@install_component.sql 'reporters/ut_coverage_report_html_helper.pks' From 5e656fe4a953f207fcf0618232886d32764d158e Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 11 Jul 2025 21:40:41 +0200 Subject: [PATCH 016/144] Add TAP to expected reporters --- test/ut3_user/api/test_ut_runner.pkb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index b6b7c67e7..d665718e1 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -393,7 +393,8 @@ end;'; select 'UT3_DEVELOP.UT_SONAR_TEST_REPORTER', 'Y' from dual union all select 'UT3_DEVELOP.UT_TEAMCITY_REPORTER', 'Y' from dual union all select 'UT3_DEVELOP.UT_TFS_JUNIT_REPORTER', 'Y' from dual union all - select 'UT3_DEVELOP.UT_XUNIT_REPORTER', 'Y' from dual + select 'UT3_DEVELOP.UT_XUNIT_REPORTER', 'Y' from dual union all + select 'UT3_DEVELOP.UT_TAP_REPORTER', 'Y' from dual order by 1; --Act open l_actual for select * from table(ut3_develop.ut_runner.GET_REPORTERS_LIST()) order by 1; From 6f47bb9999e3a07713416372bc42d2a41a47b692 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 14 Jul 2025 21:06:20 +0200 Subject: [PATCH 017/144] Added simple test for TAP reporter --- source/reporters/ut_tap_reporter.tpb | 9 ++++++++- source/reporters/ut_tap_reporter.tps | 1 + test/install_ut3_user_tests.sql | 2 ++ test/ut3_user/reporters/test_tap_reporter.pkb | 17 +++++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 10 ++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/ut3_user/reporters/test_tap_reporter.pkb create mode 100644 test/ut3_user/reporters/test_tap_reporter.pks diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 6ae764399..05779cfcf 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -69,10 +69,17 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_before_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is begin if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob(a_executable.serveroutput); + self.print_clob('# ' || a_executable.serveroutput); end if; end after_calling_before_all; + overriding member procedure after_calling_after_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is + begin + if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then + self.print_clob('# ' || a_executable.serveroutput); + end if; + end after_calling_after_all; + overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as l_suite_name varchar2(4000) := coalesce(a_suite.description, a_suite.name); begin diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index 3e792b1f7..cec7afebc 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -4,6 +4,7 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), + overriding member procedure after_calling_after_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run), overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), overriding member procedure after_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index ad7f014bc..518e07841 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -43,6 +43,7 @@ set define off @@ut3_user/reporters/test_documentation_reporter.pks @@ut3_user/reporters/test_debug_reporter.pks @@ut3_user/reporters/test_realtime_reporter.pks +@@ut3_user/reporters/test_tap_reporter.pks @@ut3_user/reporters/test_coverage.pks @@ut3_user/reporters/test_coverage/test_coverage_standalone.pks set define on @@ -86,6 +87,7 @@ set define off @@ut3_user/reporters/test_documentation_reporter.pkb @@ut3_user/reporters/test_debug_reporter.pkb @@ut3_user/reporters/test_realtime_reporter.pkb +@@ut3_user/reporters/test_tap_reporter.pkb @@ut3_user/reporters/test_coverage/test_coverage_standalone.pkb set define on @@ut3_user/reporters/test_coverage/test_extended_coverage.pkb diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb new file mode 100644 index 000000000..6eaf2e4bb --- /dev/null +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -0,0 +1,17 @@ +create or replace package body test_tap_reporter as + + procedure simple_succeeding_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end simple_succeeding_test; + +end test_tap_reporter; +/ \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks new file mode 100644 index 000000000..9dca659e6 --- /dev/null +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -0,0 +1,10 @@ +create or replace package test_tap_reporter as + + --%suite(ut_tap_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%test(Simple succeeding test) + procedure simple_succeeding_test; + +end test_tap_reporter; +/ \ No newline at end of file From 641ef7d2434334c7cfd5c8e184d5c110042eb08c Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 15 Jul 2025 16:36:52 +0200 Subject: [PATCH 018/144] Added failing test for TAP --- test/ut3_user/reporters/test_tap_reporter.pkb | 13 +++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 16 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 6eaf2e4bb..82a02af8a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -13,5 +13,18 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end simple_succeeding_test; + procedure simple_failing_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.failing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end simple_failing_test; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 9dca659e6..2bc35a8db 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -6,5 +6,8 @@ create or replace package test_tap_reporter as --%test(Simple succeeding test) procedure simple_succeeding_test; + --%test(Simple failing test) + procedure simple_failing_test; + end test_tap_reporter; / \ No newline at end of file From 2500604651a2e97d8b52f9b7fc5e298f2d6a0a1e Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 15 Jul 2025 17:12:44 +0200 Subject: [PATCH 019/144] Added erroring Test for TAP reporter --- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 17 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 82a02af8a..1aadeb5f7 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -26,5 +26,19 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end simple_failing_test; + + procedure simple_erroring_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.erroring_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end simple_erroring_test; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 2bc35a8db..72b72ab4c 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -9,5 +9,8 @@ create or replace package test_tap_reporter as --%test(Simple failing test) procedure simple_failing_test; + --%test(Simple erroring test) + procedure simple_erroring_test; + end test_tap_reporter; / \ No newline at end of file From 9d765a42fa329f1710938d8db505dae5b7917048 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Wed, 16 Jul 2025 21:32:33 +0200 Subject: [PATCH 020/144] Added test for disabled TAP test --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 05779cfcf..3eb783287 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -85,7 +85,7 @@ create or replace type body ut_tap_reporter is begin lvl := lvl - 2; if lvl = 0 then - if a_suite.result = ut_utils.gc_success then + if a_suite.result = ut_utils.gc_success or a_suite.result = ut_utils.gc_disabled then self.print_text('ok - ' || l_suite_name); elsif a_suite.result > ut_utils.gc_success then self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name); diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 1aadeb5f7..6772dcd3f 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -40,5 +40,19 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end simple_erroring_test; + + procedure disabled_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.disabled_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end disabled_test; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 72b72ab4c..a3c6475ab 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -12,5 +12,8 @@ create or replace package test_tap_reporter as --%test(Simple erroring test) procedure simple_erroring_test; + --%test(Skipped test) + procedure disabled_test; + end test_tap_reporter; / \ No newline at end of file From ef7f8114e4123c675a93f6b57a7b36ac94ff3a02 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Wed, 16 Jul 2025 21:43:17 +0200 Subject: [PATCH 021/144] Added boilerplate expression for shorter tests --- test/ut3_user/reporters/test_tap_reporter.pkb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 6772dcd3f..40b66318b 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -1,10 +1,12 @@ create or replace package body test_tap_reporter as + gc_boilerplate_suitepath_expression constant varchar2(300) := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters'; + procedure simple_succeeding_test as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; select * bulk collect into l_output_data @@ -17,7 +19,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; select * bulk collect into l_output_data @@ -31,7 +33,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; select * bulk collect into l_output_data @@ -45,7 +47,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; select * bulk collect into l_output_data From 78cc7721c0ccd05d8b048d4bc53cb365652f9ff1 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 12:16:27 +0200 Subject: [PATCH 022/144] Added skipped test with no reason --- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 17 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 40b66318b..51678c8a2 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -56,5 +56,19 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end disabled_test; + + procedure disabled_test_no_description as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test with no reason # SKIP\s*# \s*ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.disabled_test_no_reason',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end disabled_test_no_description; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index a3c6475ab..7f3c7843a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -15,5 +15,8 @@ create or replace package test_tap_reporter as --%test(Skipped test) procedure disabled_test; + --%test(Skipped test without description) + procedure disabled_test_no_description; + end test_tap_reporter; / \ No newline at end of file From 1e78987ace0e5a7199f170eddb0f67edf0c6e832 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 12:32:40 +0200 Subject: [PATCH 023/144] Add explicit spaces for correct indentation --- test/ut3_user/reporters/test_tap_reporter.pkb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 51678c8a2..1c24407cf 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -6,7 +6,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || '\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}# \sok - org\s*'; select * bulk collect into l_output_data @@ -19,7 +19,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -33,7 +33,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: .*\s{25}ORA-06512: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -47,7 +47,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test # SKIP: Disabled for testing purpose\s{21}# \sok - org\s*]'; select * bulk collect into l_output_data @@ -61,7 +61,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test with no reason # SKIP\s*# \s*ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test with no reason # SKIP\s{21}# \sok - org\s*]'; select * bulk collect into l_output_data From ee226695879800a408ed39b4aba8685ed91fa215 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 21:50:18 +0200 Subject: [PATCH 024/144] Added test for multiple test outcomes in one go --- test/ut3_user/reporters/test_tap_reporter.pkb | 13 +++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 16 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 1c24407cf..9803f5779 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -70,5 +70,18 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end disabled_test_no_description; + + procedure multiple_tests_different_outcome as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n'); + end multiple_tests_different_outcome; end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 7f3c7843a..9183bd558 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -18,5 +18,8 @@ create or replace package test_tap_reporter as --%test(Skipped test without description) procedure disabled_test_no_description; + --%test(Multiple tests with different outcome) + procedure multiple_tests_different_outcome; + end test_tap_reporter; / \ No newline at end of file From 55d5b612d77f97a442038a61f9b773cc8b413929 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 22:23:35 +0200 Subject: [PATCH 025/144] Added serverout for beforetest procedures --- source/reporters/ut_tap_reporter.tpb | 9 +++++++++ source/reporters/ut_tap_reporter.tps | 3 +++ test/ut3_user/reporters/test_tap_reporter.pkb | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 3eb783287..6782bda32 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -15,6 +15,15 @@ create or replace type body ut_tap_reporter is self.print_text('1..' || a_suite.items.count); end before_calling_suite; + + overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable) as + begin + if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then + self.print_clob('# ' || a_executable.serveroutput); + end if; + end after_calling_before_test; + + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index cec7afebc..17f3784d9 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -2,6 +2,9 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), + + overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable), + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure after_calling_after_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 9803f5779..3c8320d4f 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -6,7 +6,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}# \sok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}# \sok - org\s*'; select * bulk collect into l_output_data @@ -75,7 +75,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data From e451e4b7bfc856daae7e17657ffc1cc483ee62b2 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 21 Jul 2025 13:03:11 +0200 Subject: [PATCH 026/144] Included print of serverout as comment --- source/reporters/ut_tap_reporter.tpb | 15 +++++++-------- source/reporters/ut_tap_reporter.tps | 4 ++-- test/ut3_user/reporters/test_tap_reporter.pkb | 8 ++++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 6782bda32..a6ae51b3c 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -8,6 +8,11 @@ create or replace type body ut_tap_reporter is return; end ut_tap_reporter; + member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob) as + begin + self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); + end print_comment; + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as begin self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name)); @@ -16,14 +21,6 @@ create or replace type body ut_tap_reporter is end before_calling_suite; - overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable) as - begin - if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob('# ' || a_executable.serveroutput); - end if; - end after_calling_before_test; - - overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); @@ -72,6 +69,8 @@ create or replace type body ut_tap_reporter is self.print_text('...'); self.lvl := self.lvl - 1; end if; + + self.print_comment(a_test.get_serveroutputs); end after_calling_test; diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index 17f3784d9..c706fecd2 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -1,11 +1,11 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, + member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob), overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), - overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable), - overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), + overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure after_calling_after_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run), diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 3c8320d4f..bda706809 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -6,7 +6,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}# \sok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{25}# \s{25}# \s{25}# \s{21}# \sok - org\s*'; select * bulk collect into l_output_data @@ -19,7 +19,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \snot ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -33,7 +33,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: .*\s{25}ORA-06512: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \snot ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -75,7 +75,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite.*\s{21}1..5\s{21}# \s{21}# Subtest: A desc.*\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{21}not ok - a test w.*\s{23}---\s{23}message:.*\s{21}# .*\s{21}# not ok - a test rai.*\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a dis.* # SKIP\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data From fb9ef0badc83c3d90eb37d393add96d693b8f729 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 21 Jul 2025 14:10:50 +0200 Subject: [PATCH 027/144] Added suite name escaping --- source/reporters/ut_tap_reporter.tpb | 11 ++- source/reporters/ut_tap_reporter.tps | 1 + test/ut3_user/reporters/test_tap_reporter.pkb | 71 +++++++++++++++++-- test/ut3_user/reporters/test_tap_reporter.pks | 10 +++ 4 files changed, 84 insertions(+), 9 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index a6ae51b3c..8ad880cee 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -13,9 +13,14 @@ create or replace type body ut_tap_reporter is self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); end print_comment; + member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as + begin + return regexp_replace(a_string_to_escape, '([\\#])', '\\\1'); + end escape_special_chars; + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as begin - self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name)); + self.print_text('# Subtest: ' || self.escape_special_chars(coalesce(a_suite.description, a_suite.name))); lvl := lvl + 2; self.print_text('1..' || a_suite.items.count); end before_calling_suite; @@ -94,9 +99,9 @@ create or replace type body ut_tap_reporter is lvl := lvl - 2; if lvl = 0 then if a_suite.result = ut_utils.gc_success or a_suite.result = ut_utils.gc_disabled then - self.print_text('ok - ' || l_suite_name); + self.print_text('ok - ' || self.escape_special_chars(l_suite_name)); elsif a_suite.result > ut_utils.gc_success then - self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name); + self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || self.escape_special_chars(l_suite_name)); end if; self.print_text(' '); diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index c706fecd2..e38d809f9 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -2,6 +2,7 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob), + member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob, overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index bda706809..9c45a431b 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -2,6 +2,44 @@ create or replace package body test_tap_reporter as gc_boilerplate_suitepath_expression constant varchar2(300) := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters'; + + procedure compile_tests as + pragma autonomous_transaction; + begin + + execute immediate q'[ + create or replace package test_tap_escaping as + --%suite(Some \ and # to be escaped) + + --%test(Even more \\ and multiple ###) + procedure more_escaping; + + --%test(Disabled test) + --%disabled(With \ and # in skip reason) + procedure not_skipping_escapes; + end test_tap_escaping; + ]'; + + execute immediate q'[ + create or replace package body test_tap_escaping as + + procedure more_escaping as + begin + ut.expect(1).to_equal(1); + end more_escaping; + + + procedure not_skipping_escapes as + begin + ut.expect(10).to_equal(1); + end not_skipping_escapes; + + end test_tap_escaping; + ]'; + + end compile_tests; + + procedure simple_succeeding_test as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); @@ -9,7 +47,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{25}# \s{25}# \s{25}# \s{21}# \sok - org\s*'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -22,7 +60,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.failing_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -36,7 +74,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.erroring_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -50,7 +88,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test # SKIP: Disabled for testing purpose\s{21}# \sok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.disabled_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -64,7 +102,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test with no reason # SKIP\s{21}# \sok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.disabled_test_no_reason',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -78,10 +116,31 @@ create or replace package body test_tap_reporter as l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite.*\s{21}1..5\s{21}# \s{21}# Subtest: A desc.*\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{21}not ok - a test w.*\s{23}---\s{23}message:.*\s{21}# .*\s{21}# not ok - a test rai.*\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a dis.* # SKIP\s{21}# \snot ok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n'); end multiple_tests_different_outcome; + + + procedure escape_suite_name as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%# Subtest: Some \\ and \# to be escaped%ok - Some \\ and \# to be escaped%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.more_escaping',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end escape_suite_name; + + + procedure drop_help_tests as + pragma autonomous_transaction; + begin + execute immediate 'drop package test_tap_escaping'; + end drop_help_tests; end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 9183bd558..44247dbfa 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -3,6 +3,9 @@ create or replace package test_tap_reporter as --%suite(ut_tap_reporter) --%suitepath(utplsql.test_user.reporters) + --%beforeall + procedure compile_tests; + --%test(Simple succeeding test) procedure simple_succeeding_test; @@ -21,5 +24,12 @@ create or replace package test_tap_reporter as --%test(Multiple tests with different outcome) procedure multiple_tests_different_outcome; + --%test(Escape special characters in suite name) + procedure escape_suite_name; + + + --%afterall + procedure drop_help_tests; + end test_tap_reporter; / \ No newline at end of file From f18981d278e92d9f69ddfa8c243b840a4f2687f7 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sat, 26 Jul 2025 21:28:49 +0200 Subject: [PATCH 028/144] Included escaped test name --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 8ad880cee..d348f61e1 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -28,7 +28,7 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); - l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); + l_test_name varchar2(4000) := self.escape_special_chars(coalesce(a_test.description, a_test.name)); procedure print_failed_expectation(a_test ut_test) is l_lines ut_varchar2_list; diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 9c45a431b..5135cffde 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -137,6 +137,20 @@ create or replace package body test_tap_reporter as end escape_suite_name; + procedure escape_multiple_characters_test_name as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%ok - Even more \\\\ and multiple \#\#\#%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.more_escaping',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end escape_multiple_characters_test_name; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 44247dbfa..e77ab8515 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -27,6 +27,9 @@ create or replace package test_tap_reporter as --%test(Escape special characters in suite name) procedure escape_suite_name; + --%test(Escape multiple special characters in test name) + procedure escape_multiple_characters_test_name; + --%afterall procedure drop_help_tests; From f1c0f860f84efe389dc6b3db79a950ff4c266259 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sat, 26 Jul 2025 21:49:52 +0200 Subject: [PATCH 029/144] Included escaped skip reason --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index d348f61e1..4472c2f2f 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -57,7 +57,7 @@ create or replace type body ut_tap_reporter is if a_test.result = ut_utils.gc_disabled then self.print_text('ok - ' || l_test_name || ' # SKIP'|| case when a_test.disabled_reason is not null - then ': '||a_test.disabled_reason + then ': '|| self.escape_special_chars(a_test.disabled_reason) else null end ); elsif a_test.result = ut_utils.gc_success then diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 5135cffde..a4c3a1b6a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -151,6 +151,20 @@ create or replace package body test_tap_reporter as end escape_multiple_characters_test_name; + procedure special_characters_in_deisabled_reason as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%ok - Disabled test # SKIP: With \\ and \# in skip reason%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.not_skipping_escapes',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end special_characters_in_deisabled_reason; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index e77ab8515..7385b91bb 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -30,6 +30,9 @@ create or replace package test_tap_reporter as --%test(Escape multiple special characters in test name) procedure escape_multiple_characters_test_name; + --%test(Disabled Test with special characters in disable reason) + procedure special_characters_in_deisabled_reason; + --%afterall procedure drop_help_tests; From 33865dd88a80729a6db01b9c511e79e1f9d3a542 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sun, 27 Jul 2025 13:47:27 +0200 Subject: [PATCH 030/144] Added escaped comment test --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 22 +++++++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 4472c2f2f..3738a0f7a 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -10,7 +10,7 @@ create or replace type body ut_tap_reporter is member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob) as begin - self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); + self.print_clob(regexp_replace(self.escape_special_chars(a_comment), '^', '# ', 1, 0, 'm')); end print_comment; member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index a4c3a1b6a..a037e50e5 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -17,6 +17,9 @@ create or replace package body test_tap_reporter as --%test(Disabled test) --%disabled(With \ and # in skip reason) procedure not_skipping_escapes; + + --%test(Escaped Comments) + procedure escaped_comments; end test_tap_escaping; ]'; @@ -34,6 +37,11 @@ create or replace package body test_tap_reporter as ut.expect(10).to_equal(1); end not_skipping_escapes; + procedure escaped_comments as + begin + dbms_output.put_line('This \ and # should be escaped, but this not!!!'); + ut.expect(1).to_equal(1); + end escaped_comments; end test_tap_escaping; ]'; @@ -165,6 +173,20 @@ create or replace package body test_tap_reporter as end special_characters_in_deisabled_reason; + procedure special_characters_in_comment as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%ok - Escaped Comments%# This \\ and \# should be escaped, but this not!!!%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.escaped_comments',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end special_characters_in_comment; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 7385b91bb..b5ac6c31e 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -33,6 +33,9 @@ create or replace package test_tap_reporter as --%test(Disabled Test with special characters in disable reason) procedure special_characters_in_deisabled_reason; + --%test(Escape special characters in comment) + procedure special_characters_in_comment; + --%afterall procedure drop_help_tests; From a477d688bc278ebc60c2aa400370af75f58a4520 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sun, 27 Jul 2025 14:05:57 +0200 Subject: [PATCH 031/144] Central use of comment procedure --- source/reporters/ut_tap_reporter.tpb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 3738a0f7a..a2540ef97 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -82,14 +82,14 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_before_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is begin if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob('# ' || a_executable.serveroutput); + self.print_comment(a_executable.serveroutput); end if; end after_calling_before_all; overriding member procedure after_calling_after_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is begin if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob('# ' || a_executable.serveroutput); + self.print_comment(a_executable.serveroutput); end if; end after_calling_after_all; From 2e399fdc33d6b1ce8dfdbb3f3b27281c2a0350ab Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 29 Jul 2025 13:53:32 +0200 Subject: [PATCH 032/144] Comments shouldn't escape special characters --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 4 ++-- test/ut3_user/reporters/test_tap_reporter.pks | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index a2540ef97..5a75fcac8 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -10,7 +10,7 @@ create or replace type body ut_tap_reporter is member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob) as begin - self.print_clob(regexp_replace(self.escape_special_chars(a_comment), '^', '# ', 1, 0, 'm')); + self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); end print_comment; member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index a037e50e5..87ec1dd9d 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -39,7 +39,7 @@ create or replace package body test_tap_reporter as procedure escaped_comments as begin - dbms_output.put_line('This \ and # should be escaped, but this not!!!'); + dbms_output.put_line('This \ and # should not be escaped, and this not as well!!!'); ut.expect(1).to_equal(1); end escaped_comments; end test_tap_escaping; @@ -177,7 +177,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[%ok - Escaped Comments%# This \\ and \# should be escaped, but this not!!!%]'; + l_expected := q'[%ok - Escaped Comments%# This \ and # should not be escaped, and this not as well!!!%]'; select * bulk collect into l_output_data diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index b5ac6c31e..aef27fa0a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -33,7 +33,7 @@ create or replace package test_tap_reporter as --%test(Disabled Test with special characters in disable reason) procedure special_characters_in_deisabled_reason; - --%test(Escape special characters in comment) + --%test(Don't escape special characters in comment) procedure special_characters_in_comment; From 3193f5bdd221250433c434a1110fb0efc733eee1 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sat, 2 Aug 2025 12:41:09 +0200 Subject: [PATCH 033/144] Added TAP reporter to documentation --- docs/images/tap_reporter_colored.png | Bin 0 -> 36097 bytes docs/images/tap_reporter_no_color.png | Bin 0 -> 44916 bytes docs/userguide/reporters.md | 10 ++++++++++ 3 files changed, 10 insertions(+) create mode 100644 docs/images/tap_reporter_colored.png create mode 100644 docs/images/tap_reporter_no_color.png diff --git a/docs/images/tap_reporter_colored.png b/docs/images/tap_reporter_colored.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a5e932670135bb14350020592eeb9d821131c5 GIT binary patch literal 36097 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
taID(0kCn^@n4t z0$ZJNQr*TXnTgm#3fyngNx{T~8`P_;z4)b zOd%AkYU|dm{U7poLF>BJc2Dx`5|A0}DSuVb<_!ZCPv9KD-@&mXUU1r%w;a%ROi!Hf z*?(n4^6T@?&dNGEOy9@H35P`+-n3^=ek)BY?9tbEcCAE*?{7|HKUEhU3>7DNLJkL~ zDWjIr14Y6~1AUJ3+t84=ex<1$P7PGoxB6TI6_22W-Q0c@ng?|HgtPcLmOL9b?z7gf zrF$aI`X5E6Hs1?|h8z&|={PxqHRF{xiHR`+*y`6k^plUJL>nD1y!1l|9kQB83kTNP zrH`hhr!R(AK>Md8WtHwir3B~53HO)Eymsvxkx*Ur$(CuJp z+nM(Ur@#t{j*d>69fbh~N!`z^+|Nw4?TEnNvH<8Y@Uv~h%u^pfrdzRMMSo*512qjz zqkx!HU1DRF^Mb zKBB4Vjr~j0aN5pJ)avcVZy%pACnO|*h3VN@nvuww+FB(ja-ycCUZ*&j?9>(7jgK7hidFD0 zgI`EiGB?)`<;dK^!uOs#oTK&Ym!JV1*s^|ldV1rwZL3s5IGzJF@JofWz~Zi2oU2=e zQMiKWD>5!3uzNu3<+`x&`opZG{^>@t57@nip*>dTxxlbl`Px3nVvt=!f%I1&?r4TI zAw`THLBTb@HLNOvhqmh2!Dp?|HF5U^sfX6JKYr-+Bfs3e!osw>PQ5OL^GL_QuoU9s zhXN-Wxy8Ax$8KlOib^>R5V{a?=T7W{2g_hipe*YOgtL%`M%fr^Hn5KcDA@)+g)*Lb zzE5MvBsxOa8LOkedkar(k>ihF84S&j|0LJ{n^}ziJKsIutZ_f*^}Rg|5JFTN@OJMe zpnuZWU%ej{A8+Ag%U924Xk@f0?7+>$?Hhtl{kAQ5-nRbM<61_!{ zbO0(|AfamGAXJ&A&oArLCa00!4su#N_q_&gknwu-6}`u%ROkQ>kQJIW`h2U$^%{y^ z_lX*h#q+}daT%|b7>w$KCHvybxog~V#RtzKe*&7^^uTF1@1{*uuzyQ^Rx`kyZ%WOy zS;HYo2NV0UI&Z_P8JGs6Z=^@8P8!*HCnRhwo*kB+0Eo*u8p|Z5(KHtKrD47PjLZ}S z01JpE2h`NcXC?iNBiqH(p;?Nj=I#cj%BrGL(A$dekea0n1&?crR_Fi<^iWN468qw8k zvZ22oMCw9l3do?uq{*?zU9ZS)nq9E6^`&Df2Z;bumP03#; zce27iT?1y&%D1lGqGJclq;Bs7YI;Ep6^}LoNkno z%`KjrA!Lxd1|5pxMVKM@1TB&StJvAue|zJ`*6aXBS0y^#7=ZPUrgZkczHG)O4$H#}l^MhNo`WcJ)Odpy`DJY)r$qx4)MsCyH{zM%Ji;1Cy>kSq_9udMU zd5lX_g3YPNuRsH=&$QV+Dapt#uzU9gm|uR-P{Ce(h$z!^Vc>Jm|AIaPK7T%u^C|FS zI)EQDv3-F192Vv-rh;nV(=)!&v>TIIL4iliA7dM0>w(VK z?A^N;iJ%W9o+jI)BgE0V;odxlA7^S|aRmzRMqXZJ$q1}6k<)l~>{x60=H7k~xY1V2 znC)o_r{7RaZEUFVq9vuI#Pj8D3!8)>$X4{`A_5fPCBNVi#B4Y`P40oQv$ULy37)q}?}&Mo*JB+l zqVrj9KhKfZ4pa?Bgkae|uo!4B*c!sA0(e4v{Jm)Z_4t&;G6Ws3&bDq)tiBu`a#S>P z;rs0pQ|L>ORwM}M28Vzxo807SKK`{OgPXub1c)|o-@Y0YFCZxBGTufl$>KEW;`*jhc$7SpK%Hf|8g;PY+O&FTIRuh;u8l3OI8M!CQ91YhD>N%)i$3@f-a$HAGKl5M1 z3YFk8T$Cjg*!NygHY}hd=i#+R4dx;8Lb?Cs$$ALW^s=^bf7=2dK7Ks=<<%|MK3!d1 zfxWT0KpwAS+@UDzWezk=FE&jfd!0nswd?$J93_ zOwar~>u;z0(T2f)P#~SYenq2-)4Enx+hC&e8yJ|82d|SIO^PEg?cQ+OCV}b^` z>hWJLa@o$wG`}4&6m`rUP01HD)YROh{f4AML4qiyH8nI~A1u4AuD^Qn=FOWIuU^S} zc*qiQ%C=b$u~b3<`RyvRsl4E-5)6R+gUHUEm$69i=9lB_SN-Vp%*cM-nq_&5T26FN zOY{2WYN(&SW_R)Ox&TlR#0q^&i+YPru3S{2o}Gr3YPqU4LFMJ^t8`_4dhTW1scrH+ zVM$J9r@y_Y+PGn_7%A@*hqGt*Bc0baJAk7;xYyaHagDoU|J(gTzcQATQS@h4>^Ru| zx38<2nZ>@%&74>HhJ%+mKMt3RINN#!j@#AM)o=PG+sG`cO`s3KO7w%BMb!1*?>!t+ zGof_7CoL^)wKs|-qG0o9LMroyVgYwh!Lgg~)H9N|g3-Obw&vBVcUI4g8^B8X`&q;eAF?ODE*wNLHLnlPRhi|5rnbjG## z!U&145WYj)Dx~^6XBuLVC=gyV`6z2KU=QDJ#i)fqWHgaptS|BO1QJmB!taacf3rS!DP2Y3(OG2$DeIZ$~)0Ly_7DWtN;qI5YpIoUb7V=>FFe;5b;1yFmq zI}PwuHKuYRtKjZ4+9pjct#=P}bp!B{&|lLh@(;(zQoNvD>?`j{5ryLB^8NGbGavF| zr=Cch`QQ~A8Y=Sn7Lr18^Is2x=`;AbinV%H++!Hv$@N4&$`o`Ob)g56PT5lSoW0!b z(6*0^TgImKXsf3JdQvM4iA67_hWLGd3HPeA*!@=G&)L~{>>o+bg~EOo^V~r|XP3z) z-CK!G9!ab0re&r8F;>%Z*qobdsv3{z?Gw#J6s`v!(HFQ1*=|43C4_v<08UA&!$+Ki zM*;))V}H0#4)_vC#l^){rm-pakh8OR$HhKQlEfp4B9i(*PJH{9EC?Nd^(3>^-#7NeA?N0BTIMQMC)kuZfcS%O^3_tOXh-3#Rl?c50#_DoCt%GZ^ z6#@KA&CIAEy}xg3dz6iQdUJ(M5Y)D0BhyCSMB2(nI9ITIx{-3n9=9M7YBWp0%VkNK z83hFeWgQ({NT}k$Cl{7fXDxX+)sQ+sQt$#9g*chCDhfRJtq3V<509t7kA(7N>^^yn$b4+`WXA^uPL6mkvU_`bL+IOwejsXI zv8tOnotN#EWli`F44#z2903WV1%x-l14??#5;e%K0gWj z!m4MgvjCD)z=p{5T=Z}p{=f=Zin+LAE_PHVx_Y-lc<_M4l_Ax5ffbE10dQ6zTQC)t-(~kUc>#B4jS^MBX3_0~1qqOZ25QDl2Awlq{0@ z0^(=kqa4|`K`+lC)`8%Ak_!7o*G=Y{WfXo_&FY}2+SQ@BjKS=rKCChj1i91<+gEUA;O%>cU`1iJ=<2&a zWU692#LYid1QO>WLGAYFXt#pnVDnmRRsP#y2cK@=KuxSwKqaZ8%OE*#5)e=u+O(C& zRh0ZXz3Ci!_?^|Le?;=bOZ!ml&W_IcSy);t_N&^J_D5I{u9b?ytoUWLe|KW4NkZ&@ z9Q<+%HDS+&6is?I#0dK#ZN)*9t+@F3?%rNMz}udZ#rcd;IhrQT&fL1+vR7Fjkd_5P zSo$xc0s{I^q8|tUBU3eCM}nb$d>p0owlC1S&mx*9sGq$GyPo7tnv7Kx+M{75+n3BU zQRvv&Q*PZOhK{)4Tw4URlQrD3h0n!d7{jCKr8zq7^!43xPASJyD1>7W0c;AR{c?-` zLntcP0&(D?*Dj%*YA=wo%{h9+{PgKHlst5Q+lTT{aT^?`f@09%Al4)I=?BJlAEGh> zcKd-B-YO&DMUKeCgyOMdjL_!8A|e9t7!Wizf;D+A&UTKWI0&Rk18AUJS3((LGoqyc zIsZ2T0m*e^CFsmKWL%DX<=XS#=620&ZLcCpX@N-~AiR58ZxAXdhviBHQM0?q)P)Nk zzl^{*eR9Q?vP zd-jlO3-FFV$fkBf@Q!OwyZ;zczV!e zF$kyW6V55ci}36rNI%#A`s*^z1`)myf8LMO<&inD+#zJcw}fagdEom*cJEenb(MOO zl|@AX@K&|s`Ip`gVYM(~le6z(J_p|blql%BmqMa1;AKST0&^s-NVNlHj%e3_d;=fS z@0vgQO*A$6(`~+WmT<>-%p||dZZW>JmRZPhyWMwe%E+|igH~Vl^+fmW|CA`kyoQ%5J7^op2fw|)pMM_GaoX zll#E`62h^aXe1$iF?Bu~IT?22wKOyej*h#PgV}r=8?_OdrWp^ucI~m#pw2y+i&`gJ zq0>?JAu!-EKdD=|Ff$0djLuKp)+CJ~E4qzK#^ruxT53D=uK>`)IrtH1M;L_3c_m`6 z#=7&wD#*`|QH1VEUsy*dCr&DSrWXF6zm7EsX?d2v2y7ye)9*!4si}aDu}POle`H4V zPuKFSPCFn11|C<-u=m!!dbOUb?TF=GG5t@fE$C08_$Fl5pF=tZS+>pLJ9Fjl+`z02 z;Kg7oGqFWDP5PFY{v#{mV-0`>;9&3AifJlL>BYf+CqY)2y|;R=8ik5uaIvhdt)Sy4 zzNs9behgz0<@hbIHj3t>*=wirluYN(K|PI<7( za_%6yk%iv$*9dHwUsT2U8w)Ds?Secmv8U=4RP`(bsH#J=8% zjP&eiJDAM`VG&AvDRQH55o+6heL3gr1Y-$0O>AKynLDcO`2Dy4c{mII=9lYbRQB(s z(*LFFWqWGriZxz_LiR(u@r(hE&ql|`#=LLe*8LOc$l2kI-4~G$zzHb> zk`l4qrGo%3wrutjA#x<+8%U7Q-S**I8)QLp7;6Bvflc3I>R6|lc)+$ur%*XT`o4!@ zP=d{=sV^(?Ky(s`nRWeaysfLBA`NeME$RphpX`}uEuLQ%G< zTwhaOzBHp~ij64es4Nnhd}O7LMheU!cRBXu_LtfhWq->8m{7++z7702-d7Ip0#-&+ zBL8|W=s#<|DQd{kqDcP7K_PizD~;E=D*w~zATq1vESO2gQs9DaU}Ur|Tt~J}OD}Z^ z>Q+MC|3A@><20=pK!pur4ynDC=?ZW?b9R1N1~MaWz5+`#aPcI$bL$7gcGA<+v)V!H zWR9j}4(%J`q}Y4!BwY^OZP=BkA?v4uy{v2iJ=BR z6CoE2hx233-4{YHx3u%OBhtMH;b1PNgZETN9-a`3pKNH9riS?8e{SXcy89!sO_xF; zB3cWe+dG+j!*v+GK&nCCmP}e2pF-NiRvnV_%+%1;%_~}QahSV@fXA}ebvGK;C|U>n zZFX+=33>#ZHp?8-FaPJJo2YYkD=+b=Q86&zvV`*DKcqicnHW=I?S!{&D}`j+-Ph+& z7S_O^9KshFmU{y=3d)K%x+X$sz}s{iHu&IWbb$gea;jYe{@v!jM^dsB!rkBk_oWM5 zOqF-iLl?u9bgY+WhP~if&9eFaGOAD-(J-rPU99n+w>fh#b38p;^)bSXXHUfQ`ul+z zpA`M`HcfAi6V07ne}S_{{8#O|fqhZk z(LWMci2<{dM$vTWxP_h1L}xSI7(>gJ*?(|=|7Jud3{CqWYZ z=dusJKM|4D|1Z8=mK4v>zYS?Juac6Iq#Yt6j}Oh@-OQBJk zfARBuG*$TCc0dyG$MphT75sP=}Hf^Pv;^oNPZA?ucRsKXX7a>l9t8M>pf>({L$ zYhdCwwwyFP1hR<{8{_tUH3*15oXm2}M}&oiNuK?*tayIP0BHjrOt4{@h;Aj)9J4UN zN2Z`jQh4`npOh2<;91472NTG$E1y0sh`D`c+@)dKmTiq;gpeb1!N@BTaDjj%q;M)` zW@gNE23B3ayNePL8CeeciossH(RB=n6lH`NGkH)PkWV~u>XdowlatW3Wl%duiDruG zvx2g112y4HsOXH%2Qj<=iiTTE&dyHRNlHtT^ebVq=Qi~ds=324+hb|PMkQAJsPzI8}N<1JxvJ; zD`g+@<-fQz>R*3bj=(RE5ceeDCY5Vd1teeVJ}Zv&UC8y^8sNO zs(Uc{emMfszeg9=hfCv98C1SFCxlnF^3Of^Z1_81IUo1b*Te`ZM>aeBhJdSA%aP;W z9gg3;8Y9|{+X;lg{Til_X33!6+0QTNH5Yqlh-Qq&`98;%nW(jhke8t{LJ$S|fnp3; zzW?mmOsfww8411WKuj}%z9yRy4>Ee8RR;ttglzvi|G3D~p;7-R8egaSGG7N1Mo_ykO46=8vXRumw!hWE0}?P@;DRV(Jl(&SY*awi{Rvu5R$O@0 z#@)sPLlwrChQxyTE%(9D+gtQ>a96tp3>r zdlYF27ByAw?V0*F^wX*!@fx@rqR=oe$5bx-0kQ}AV%&JLp%#+M2*@ZubsT^Z5-&?B z#N7ljyT-LwKYnz4a# zJquwNYz(v=o(&eT5fD|{k6070dISZvIap6?=0IT6T>|}Jap-X0#v4?E-n|@0PRVlW z$kF$;QPO1M26Or+t_+?$al-V)^-Xc&z^`CbMBPWga&&UCsbF;J#trUHCO-yS4&NLH zk@0Q83nAAYAku&D-aRl3Zv@s!c%DMBu;^LQbKvXdtvVlvOrDS<36f-ol5 zU4&%IPC}`GRG*_`ka-fgZCfX)NNV^KLJj^^LL(M@T>)So{{wBtuVq0pJ1KQ|%jgupk6D3KY8>(}3Yk})zgB(_EOq?&NimJK&S z{m7m`{+^zZ5wjO7HAS1X+A4NRNcdyu^V_#?jv+13W_fQ58x?Fo+IOVr2NxL*Tu#HZ z5l$CO4$zXnK3HOWc^WbxDWaHwDu;;;TR;UV=uD4!*OxuOK{*mk9#V+QFC$rdD?x$n z+xJ5n^l8ai9*9e=-~xn@z&I3`I43A+zBSL0r%?e)$82?@P0pJ=1^M~Uky^ost$ZXJ z`1Nrh$Fu!!H{oc+BZ&->DphS0AfD;5@Y50@xBE)I5Ag|b6^QBisnwX#9n<3O&; zz{fzqau0mb2cjD1-4oUCT>h2rQo!COcXh>w%9f##`I_sh;@*niFB*I(SO|058;a5m zu4{vn;Xx&xzeOa4`uneZ6TO$Fal?N68>qF<5!P^gg%J}oOn@Ir)-KC)TE1dM8OGQq z=mNd>x4$0VET*GYC;q6(Ce`SfPGj>Cvyi);Cg(@&EZnhgMllN()J8;Pdu)ds$HR7XXZk-L2i6L1SX+*Rh0&(N*{_?MbtbMuHCm3u>vf0_ zuoiGF8})4`&7)mkdV9?=lp`OB{?_3(eyAR9&Tu7k-pJY=JUk?8rI&v$q3Q|DS5sVS zhI#P~Tygy!Mbbps{Pykij!xgi97{nvF{i5BWYVto9Xe|gbLYQl)|^YkX944R^L+HI)}nbhNf|%Om>2HZ&X&gw(ej1@x-BvxYSgX~_9 zh}dR*Y4AHtGo+5LBgX;LA;1G#|HcX2%tYcOa3;t|8WjcBkCKI0%ftKkDG2&ek;k6< zd7i|?N@hQfkUPQZwRdZoH+^&lodev@dOl>ECJPMJ>5}}EY!1`|GK!3{sgR~a!iA1< z1`6OM-pFhGxpau|Xqb7*B?v#$gA|iVg{|AU;gnEH9~``~JG>GJJ8^L)>;zJIaA{5u zjNec))rXrrM4q2dgBQFHE^&q}x5gb=_W}{dL+9NeRLR#?v{Y7BmL+H#q0!Vc6z15B zTuEK5updg8L@_32#$U4}oJg|K1ULiP#G$~zEnwW6yyN7(nRa8(byd0jxW8y7?P^q% zk&_A^F7v>MYv}K}hOhtE=w^|F^H7^FCVZS7*%TXnsunbKQ}wXs+vie^iwYFJZ+6vW zb#h!1^$}@3a-A0;3DEJ$y&F(n9vj9UF~v;`6fbz6G9Gg*Bp3@4CRR1jSt8e*VG@eQ zjw-JI&<){91bNqx@5h>|Camvt{}H8Jg4H1R0OIC0Z)6KF?X~^$mfJP#*A{Uxi0R_O zd|WQcS;JRB&I<|qTUAm-bccwr9AZyg91pod3g^b4WsfunS`3P8>~X!o0y!91()hp_h~+ zhJwn+7z~!-k4fL@pFh89PvauZ%>Z!xx2Pen`T@hpD=27U_#K2|^*l+UqfqwzzWAsV z9A)hDO9r!iwSFxrWK{U`|NnZ4^ z;lRRCEv?HJIxenUoUWE*tL4LWL1+|8AcQCk#Hj{DwdGW!&e0DBRDz4EPH*hW-OJa@;48V=xGED<{gPy#og>T%eTV6tV>$ z!|S?va|5|}6XR@1s@C^2aB`xb1Oi)7O0hdkVf@42%01rQVobt5w5`beB{kX9pF?g7 zcg3#5Fija^M?O;^ZZwPG1&fBb#tJ5xP4?*ck01WPLQhWCV7?`O#q5FLt)!V^rkg+C z(;c0OZSY}YqPXO#^O<+sf4{WIc3Oj@L!xWMEGe9voSA@7;#XU^9&p4z;Lr_}V(92; zS%L_zq|?C7q#>|IqG`ZYi6_7ocPZ&N^4_lL#x-DA;x7201lVqm!TzGjz~lhATN1?m zR}P%KLICvm`Z!uK-%en=$ZN;oY6=%mFTqSdY`HVpCPP#?!-Mz+>j{h*z0W_-M?BvX zAF41k5im@nU+9vl9P{GE0dn~d$&+Ey;tKAn1PEfn;nlBBxs;eN>~Eijq618KHK=&z z!LS_8KAFZtNonemL=tzo&6%xM)~RolU*#^gWuJOeJLGS75_F7Qeu+4*(hz71DC0gP z(>{Ir^cX>^`a71}Js)a`F{?f5#iqKK1})}z+_>CRTX2 zU(661=?9y-@`G0#4!3j}YaTQX9KrqBA20-rI%MnUZa4Kyb-=|SE`3oK*f`V@w7Stw zq0F7RYH_eWL5(?W=BXmtC{rPCqxVQW<<4D>2}N9Ow(8QbjB?nbm*QW89?s% zg)zXZ5B)+n@8&tA<;i#s?+t6GuT@y?7nUerl8*g!BzJ+JJrDtf+?h!(ltBnYQCS&L zE+XrY5v^Y)6>2Am4$?C-uf$v=Qu?T;3=r62){QhS_Q09~27q8-Ejar}&8m0zX?ykZ z<$gpeQGnQojv5&SABq%Toq^*Uib0<`Ok6U3?AxaFkv4tihtzQc1Br`2wIk=N-@c_I z6#>K@x0O7|JdCzsit&>_Rxy#C$VAFRJuOIn&_jaSP~_>Em=c>L)96$3?M7A&MV&u7 zYi0miOCqXOosS>`;8s79qln!B5{=L((Q6R&p$fz%Ja>J)n!#GmKZg^12*$FF<8jRK z_B(x~y$r-pF2ck35yRvdSQ+Y>_gx-b0zwU%#&)~!0p?D95ZUdgqF;JtQ99oiiCPF8 zSA$~U%ahAWkct5VRmSE=(EU0t@jxp?EQIJ4q#g#Gc)%qEUDdWKsF9~OxT72I>;W37xA!Y2r~ zTj*MFF#U!N56*Z0fYVE~KUh9t8iP;6tA@R8hH7r3_8#i6e^9${bP$#K7u2~aY!e0BK~R(%>SE!3`8HgD*qMuE4{^rs>J_|&eL=jEWZ!|ENQPoAAl)!O zE;Dt(Gf)4~4s$W*Yk#>KZXFOrkYF3aQ(%&$x8&W1b*1)C(#z_2E$5D8dOTQvm_zBjZQ>aN|f-0R-AZ(X2Qu zSCW&hca5l)LqbF65-?O9K7hgeq4j)w_ON2mIasLW)ME0jh=^6_<(m}zcC&i|_JQSk zLm5ZRAv>h$PE+U9oBO*y%V4GfcKL3p5i=;sh{+ffy|4|{JM_2R9{uo)H@O!L93(Cm zf+0vWNqntMCwGwi9z`{_8pm8AHYNb52Q(5hjE!L~BGv>vAnEXY7Ils&q!FR)U|5?r zIr@_OARgOnxCs>Ng8_&e+>&_WvXh#2P~iV?xL^%2ts2~EGC1a$hQ(e94F?wtJgJv0 z_$EhAex!YI>$k0KZ4axUA326Ju}OWppzql(eP!y!MOaplwclQJ2T?)8lW^sZRZS=h zpx>;2J=QUeH6`ET=FMNbb(hDE$4DlklHpDo4%}+wgL~SD;FO@%+F$V)Njq{SmMBQJ z8wTeIv4f@oD@AAkDzQIig#ZBq->ef?g7Aj%Z=4EmAZ1Ke(BTd{^t{#Xco(?tl}MOf zFTyq>A4B@*7i>$uR&wJrnw5;(^pS|+o?wZNQpDcbuG!+;sLvR-;6`(D{T!L`Lo78e znHB+IMNF)F>>_#Feo9I(vb1r)qX_Kda&d-Jt@btfwQT2so(v0J=yAXnF^cKRNAP&*PSwA$*b?}Z5 zbu-MigIgePmW}sJL^!BGxOVLRXd^j}N}aqsUq-ZrZeI-%Kn289LZFpr`2W}4naAav zw|o3YBW93&s~K6QF}5-zAxoCBC)*?;OGq`@Q??jHF|s5}Nfat=qJRg_PTL@2{7^fRO^jch+d#f}eg}gtcWldb zdg^@-*z3RD%f-dX?k^5^;tL+2;fen}r(4%WYpvh-V~cA2ejglSxF&w|7?*Da0Q}uP z&Gel+<~+DJf(=Yf5B{q-LoIjC35(h@_%%exH`8c`Jc?{NpA?NcMwFWYHn_TLeH z^`d{u4-`e%O~EGe-KkTjxX2fuYaj3+R2IRPd_5scst7yJD#VC0Kw5Sx(iGG{5_5%{ z7iq9c%MU*E;M@-#g}oJ6=T}QQwwf}3gM5D z)C=K5FV$5`>tteaXskh2yY}sWd>M~O%lh5rD$rxI=q27y&5Z40Gt9jESp`~<&RLw+4$Q}H86$O8BfMv>^zuGue+PF&;wXAh)>@to)8YucBVoU0injU%E zB*fH`9#_sMpjOPUO<8{8{ntH;z5_1?x(ffP`Bq3C$srDy)Xr+loS7r^pl2t%wGbpA}aj z#|@N}B?{l96@ir|NNdGy#Box)SXa8D!5cocX2sF$IMY^$-^#vMcj_K0^WaQpx!g-N(})z=E>Apk*=8?RvtL38MTe>bl3bNYeF)qtCseeH(sfe(QCnPQ>_p6?Q zC)`@slrM{_p*ay`u&|esla2gLpt$*NsaN@R+OsxEWWC$B4;DGkS=U`#yY0{gJ9q9p zZW?5CW60pa5)LM1Znud?nrEXy?Nv4NRn5vj-z`MzbUM8*wiFAE=tx=S>aV-@JAksQ zjf|0aT2tPpZCjgQA5YKh$A?mrZI*og%9boK_|-V_YM+cF^+*uALKu8@FN<~mIL91! z&uL7~!V@_{qsU@OqUMAf+7)^bzdCUblf7nXZ%5N1517j;i4Mqr{Vg8@oj5gCAJMm9 z*Q#g`luLYtc(`|s+Br0%wG&{8-Or}bd>1R8H0FrDeEF0AD6ff&t;k(@Yy zx4nCOdgUHd%f|OZ(gfdVx}`vb5djxGj-3qG*XW*8V|&-Lt}XOHypfN!9tC!r$k><| zO2PVocEZZjCm2~BJz3>FE^}6|K+i#68p2*xtIAk;mjQF2mwZ=qo6>-gH9RWIuJBy| z+Y)hzM0O$ELO^X&bVPI+`Mr+gt4E_Hxd0+J#%!-_67Y}0btIL9;J=((^U>n_s+|PoJ$uqsMzyFutpo~hX$-^uGf9U z6eW$U9!n~f-1jTcRKrw+rI$xO*eJqh!9Bbka;=y3g8RXoV@c`K+fB=eyENieUdy_L zGHArQ=MNt`-ES)(se}YcR9gw>JiC_Yh3yNh&cjJ7iiAF)H|ZRD9P6hg-$~IK#;T;SN#X7zC8e!oN&k;2Z^B zDO4h+V2Xa#?`yorT^l|Q{%6&fB7u; zJC4DRR8&+fo^{l{OP@Z?Ir4oQ8a8QC^X6%&tLxXqB4D7ZvSfgCz2$vX(ORH8WbrOMC<^O4PZF2U>5KLUH73k(Fzx?S3snyUKIQ?AamV zni(fkYwiNVkRS0F6HGTr2)UA+Y#qFk$ZHYMi4XcM^BSJ8{1Q2LB45PJ2}NV(k(Q?HS>0q!`54e&P`)o2>)`b?dcof2H+6jeLGUleyYv42?RK} z|I@fv%RK_l&CU1sgUBO|mHyADz(RZG%$ey;FY{rf{3lEsOdO!D$J!CM0E4-?eAk>s z@glCj9VwJ2I!KVS7f)=~aquN7d3=uD2M@_6DM?IzP#nWjM|RND(^D@}@6e&&nni4u zrW9nUaXp*v#5NHU60)rOg|5F$pB_E_2r?BE9sOfwc~$$Hl4ZwDjPu8?orz!Ns;d>S$bV4>Ywcbjh=>wtLegyXy-Hh9Q^kMR}WV8XyyTRJdU)>;{(C z#lyGViCh%?4=^^ZBJvVzh?C5f0#3S46mybdyMNq5zgCx@L*)>AaZT{c{~v=(DW*gtBk?yj(eZ{DEF#13t4fZzvqA>#3pQgL<^z zqB2#1qxDq@))UN@cQ4&Bo!y~@3B6zF+1{jj5+#dlFyQwJG09T3vVrFuIx_uWwdl5R z%s8VMxlMsL_}KH@+mLgY@Mm+6ktXX_y2({99DYjoRA9im8?bN7w^)5wl-758<)CU# z4bLO%W4iy1eb|!~T0_LDO zCULAFy>Pi0kNT@Kr?V871Z;|n8Qn0%#)he80a0Lf|- zZxWfO&mGs(dS=m1!h=b?EzKs09Ry5OAyU&wclnBSGh$cw7D*v{Cm)0arQ_jc&9uzV z)Jmtj>Yg5-6FqZ#zB;)uvFGt@T)$atH(y3~L}d1EyWr;;#B1EEy&jdFXFXn9tAD%k z*Q27N=UCnn0giD0FYjo1-*Z^KTGi%axqoQPoCioLwt>)CB4I=*swOW?K6Q-0*>!fv z(11VN9*@~@;>x}e*MAy!oujMo%lTGTSws5|VYah;Qu2GO;g zafXZ-YIK9`EabTxN1?je@nh zd31;d2i%C^(~$pZ^k1SV+7@w*C^Vs=ZCg9xTfi+lK;|kS8KVfc_Ao)J1yJU^9u1S= zmISmPFV*(7LdD&JwftpSv{Ts%6+0Kpnb6bs&_*@3uT* z0_WfQG-VTquwS*!&WkZ&mE}eLbzK^-DwQsDgxBwn5ZE<`>ueOp&xI@>s0Y1fP*c$r zV+4*Jg)fiZT#iThz6||EA^)ZA5|XBncrU8h<(%aZLB<2Nbknj5^xUcC{N>XQeR$mO z;2ft8!1wri+C>Is+R#3Z)IQihX35BdqpK15fhc2dm6@QVtC_zjyE9(r>tx@5x$#19 z72C({U+%qhXIw!v=tpfP?45`?P}S)=F7=%T6pvbN*+7Z4mvgU^%xzK0V!l-uX5Oeo3o5e!SiA?B5k71l1F8>D5# zdhA+gP+QfvZ7;K9???6y80d8fJ{$?ys7e?zNhFab0m_jxNp=Cgo}$)MKX)>|m72CW zY2JgjqZ@fbeRdvwr{K1LOGyl93OaJ~X(uhyl_y?nfRJ8zOM^%wqdwbo#*FT3?LPNP zy$~2`kW28xs{(W*Kza5184`jGFJ7e*U z$F&9K23Mp-l|i;-ivE@&(%I44Ip}8flhrIkY-Jlxe%qCeAw-N-I&vO@{tu za^4vK@|ojl6}A*dS}ly^!dUj<^$Zf~hglw`@uM7BhIxP2!t$MI2W(Q!rhI6MiahRb z1Y9C$gy9V&#zxKh(UwR(M5YUZ0MLqn!oW#%?2;k32v?w=P* z!3yy)Okg57lKLzQQ&ZKEBQKlkyvzRiKxo}<)iLgB*uU2n&@1S!wz~;K-PjHl%4YMB zwmUY%%kSE}g7GW#A%+-W{BmBEl!Rus@{Qy!rAygNzW%Ph-sPy4Y==0Fo(%nsJ;!h5 z$G~Yl2(h{UE-!qif~t-V5wS13d3Z0Xi0$ z)0g0tZ7*5}KD{qF8dHvNS;(9-l*ZeTK_GnC!eS;4$n?jr&YeBmhdvHIkZB@KKzU@l z(uu+htsLmL=(GmCm`rGe_vHMSA!A#wMV?Htar=BfL~GMIg{&+dZ_<=F96 za;~sOAGDXZ#6aQM5f%Xdk~)emP##xe*e6en!IF>>zGSL+zNp*F$hSl%$!ZQrnSLVv z)2kqvgJQAfS)0Fzu0I>8)UV&XefvhdD;XBVjVrmHg%=H!`<$&?OgeHA%E%9bETaow zK93>t(&!EJN8Ri&Toc~U-+r#yM{l{ou*l5<&vR)aIqkx@LG019Z=Ly<$Yfjel=zgHJ2o&d%c#?XQIP| z46%upNs)zFyRE7$h7r2;s<5^Ed3wMXL1}u6|JgfNSnxkN?l@;9e+u_pt=QOIQ*!Y< zu^mME|9XHT(Ue3z)Kf%WPHk=pKOq}{%^$wD+=kkv6Ru*H<=lN_6;F12L{3*#dDup0 zKzS4rMt^cQ0Ywq)`Uyg&9k`iz>~EtflZI2KdT`e3$ESsa7f<=5 zhzIs9M7RtQ;gXP$SVXFOc4jQ+lUqz%JF}vggca6w5(O)ktwscSiYEjKn4&-fi|R^j zd&uFwL6L{rLI7ya*spB9afOs~`KFKP&7Ga+LD`@l_Rv+c*%2&me44>gyspIH(<8~a zVzdAwG^xnAghX=Kx}72vnj$@^1SB6f((Q-VZ>9T!NgGUCfsfV@Ckl(MiL`c4(+TnUo>} zMLMybQS0Ydz1%k{7YJ9X5=!|kIUWe`Wf1dKdekm)p+%^i%+TNk6erXaC7{m#zQ-r! z@fQdfw@P~9x(EC3<$gHzNg`>XVlJWTV&bRAH|*l%(V82?AKe97c7>QC+Ie7Q1pKea zN~m$hyeHAv$d2z67W^HX93nZ5JfpcnqYZXEGiku5ii)|YyUce@osP_9%byVkT)He* zlqS8$8V;X!0Nh^WZz3vMhBZprgsq#eAZzZ%**k|uq(}9?cNOaq!<|C{WRSQh{5RE8 z*_veHB_0VK_4r;@ij2KDq-)($hHhiVc!Du887zA1Gmg!_yoUEe;(z_bxA&0Z0e0~+ zwWMJCSf*TVbs5{iKa}G+>WQh|Yf4JNI%q0oz$n!u09ANqK}2#?{|x^R^A2QJsupqV zlkMg)Q7p<9x-8`5&pZFlK{XGJ=%FF&^e8sBo*VTA);lvSu!tiaRApG|!d%RCJHKfj zSdbw~uynn#(k@FP4&U`QcoeZY24uc6-F>%hPVOY1?C}{*+cr5WBh>2}vsvK~S33*P~h!p~{)>9_Ek z=!fza&*3EZe!n=)j-gUl!MzOaB%2LDMl-upmoBI0Ew;Aqkefa>qCb@nvUuTWA>3qp z5va&3?5>OKrOyB7x7fk0li%wWOFj)8FYHPB&w&N>W@6$bpCoBo&vMNtLgG+b=97bs z91abpsIky~_&UkSkNO4qMH6_DI4&egz3^28R;kmrH2$pxvk2EcI4}%BRPbORGEFdAv0Dgnr+5o5<_BWViS?U6P+Cmj0W@_2VDwLR@0YN#g19 zYRoq9wEXY94M#7xw@;=8{`!lt#JEx{_V&8*Lkk#XzZC|aUMFHrowwfYUh=J5p)r2$ ztX)Pn`ey-^@n0G8U;d)Yzxf8=Cbe;@w|ez}HqCFRTSo+<)0)S#{H|{Nk^Rr3iaXrQ zN>TO5%sl`0>DYDKikJOUg97;&>1%`kYXu#EF#eH3Y%-~V22 zM>a@VXekxc6@bwexFKkh@JSv+&81(bR2O0YwV@QADO~nB5v4^r(K-Z$@4(!K-Z>%l z3E$o1BI~TAv|Be@^J>|B7i|B#27R^b1GW}5%Xwo8#WnTU?KK&JB;=9&9`P`*wkEljAG@aQrZ#u)ptgovi}~C8j5}Y>?(t@YL_u z*Apr`D03f0_S9?A@pp?Kekiozw(r>?*I`9{Ik#I_16tHFF4t)%TyWi)BEecD3>(i*XE}kJv!!(n^*GO zr{2!F+2q{p*>CqZm9`R;O)@7#DTHtm)h0 z2d!4lnjQW&H-5FwCj~C-i>_N6^54E=Hw-b-Iv~qH`Ko&WhVd~W8x8Bi3#le9Q-u7s z*2o`JRr2tjT={xEaOoMw6v2kDcm(bAt{Y-LCt*=z5@2k8J?~)RSZy~-wZ`Fgr~9jl zcg#6zaJ8XM?Bic2szrT|_Q|P7FT-maYqpgBrqaUwz_y!KY0LbdPq_2`bdRSV2OEb) zYH69yb|WKbrNhiELJre8GLvyM)iIv4q4 z0Z*}oMb=5W^OA=HndSJ);>y~bSf4$5Zw9y(_)IgtskbZL%r0PGX!#U>qcagric<|* zEo^6}qBgkAa>pY{+U^!V49Lb1^hCc!?dvX$8t9btdH%fDNV6v=qKxaijp$bsxU0xz z_A70@X?=_L-47{#?=)O3?S0j|%ApB4+pB7>ym)UtckVDa+;@(HzXlCf9INAXEB+jD zd`MPNPR_pXXPSH7i;8}>_T!LUC0;h(YN~D4e3)=@^|}e|$B!Bu`P$n0)7jt&3Be&R zZGCG0$nD&Mb7@8FBO7aLPzY}uTU&dM^+y-K%hUZh8ARMYdH!T$W8<5B{qK$~#XQja z!=1+;D>l6}bH8>Xu58uVJ1KYle@d(U-EjZjwX4>ReiGQm&9LmjgL7vOr=EQi8b02T zlx7;Yh!+-6wn^1Z)zoa3Et|y9^jC$2lcr9+` z*i%or6jUB|YHhQ#aj~m!erUF{GH=}0A-pW?ZItKi#W8!mg{jnf}v>ygNJWpQX*nRbX+jK80>)9&(%#4f^^s0r4S1rP( zLk^mb9JyuvP#>s`U!WQ99=x0n*>xb;H0W17R6hsdfg>Q0{U1Gf!Wfp*zz_bzIvr!x z8=IJn-v^(Xardqt`WH0%BaTlRLr+UOvnln}2usR`Y1D8d@){^gt@nv7dAk#jg{~R= z>FNIQnm&UAL&g~94O!p*(V9x%+(8ZthOC}2eU|ov)J46wUtZoI!Ot_eh@^smNr>kQZ>UlkT>zI+5 zc@n$pVy}{tCG-b|VI+?F<)5L*Uc2hX`y!CzetLS>mqd$vSiP#sDM4RfKjY!UV9<#f zA*KzsByQF7Y|^aRjYa2-!pP&(8k>HuAxo<$dB2a(#?mfB6-9~bx6h)Wp`vW+uaekI zQ7(0AL^h?OI-KRM^l7wNlYbfByo$eSviULp+uY_~8SsZKov4(Q_Fw&LKeACJabD(; UycK2V`B7!8(L}@05py^H2gM*Zo&W#< literal 0 HcmV?d00001 diff --git a/docs/images/tap_reporter_no_color.png b/docs/images/tap_reporter_no_color.png new file mode 100644 index 0000000000000000000000000000000000000000..e7379a889f3f66af1a50e90b5b0c3e1a6f316343 GIT binary patch literal 44916 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 literal 0 HcmV?d00001 diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 24d1065fe..47fb226fa 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -126,6 +126,16 @@ Details: utPLSQL comes with a set of build-in coverage reporters. [Code coverage](coverage.md) section describes in details how to use configure and use code coverage. +## TAP Reporter + +The `ut_tap_reporter` produces output compatible with the [Test Anything Protocol](https://testanything.org) (Version 14). TAP output can be consumed by a TAP consumer that can aggregate results from testsuites across different programming languages while maintaining good readability for humans. + +![tap_output_no_color](../images/tap_reporter_no_color.png) + +If you use a compatible terminal, you can also have a colored result. Only top level `not ok`-results will be colored: + +![tap_colored_output](../images/tap_reporter_colored.png) + ## Debug reporter The `ut_debug_reporter` provides a highly verbose output containing thorough details about framework and test execution. From 8de19cc8c29b8bf1653a69c11386b48b39b0a406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 14:40:03 +0200 Subject: [PATCH 034/144] Small refresh of project setup scripts and documentation. --- CONTRIBUTING.md | 27 +++++++++++++-------------- development/template.env.sh | 10 +++++----- readme.md | 4 ++-- test/install_and_run_tests.sh | 6 ++++-- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41a86ecdd..926f0df80 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,7 +57,7 @@ To get started with development, follow the below steps. _If you're using Windows, run the shell scripts using `GIT bash` - Windows-based bash command line._ -**Caution**: If you are using jetBrains DataGrip, don't use the ingegrated console to run the shell scripts (not even with GIT bash configured). It might disconnect from oracle randomly during script-run. +**Caution**: If you are using jetBrains DataGrip, don't use the integrated console to run the shell scripts (not even with GIT bash configured). It might disconnect from oracle randomly during script-run. ### Clone your fork of utPLSQL git repository @@ -94,13 +94,13 @@ export ORACLE_PWD=oracle # Adjust your local SYS password The below script is fetching latest release version from utPLSQL repository. Latest release version is used for self-testing. ```bash -development/refresh_sources.sh +./development/refresh_sources.sh ``` ### Setup local database for utPLSQL development ```bash -development/install.sh +./development/install.sh ``` ### That's it @@ -135,9 +135,9 @@ Whenever a new version of utPLSQL or a new version of utPLSQL-cli is available, utPLSQL v3 unit tests are located in the `test` directory -Before you push any changes and create a pull request to the utPLSQL project repository, make sure that all of the tests are executing successfully in your local environment. +Before you push any changes and create a pull request to the utPLSQL project repository, make sure that all the tests are executing successfully in your local environment. -Every new functionality needs to be documented by unit tests that cover both happy-path scenarios as well as edge-cases and exception paths. +Every new functionality needs to be documented by unit tests that cover happy-path scenarios as well as edge-cases and exception paths. > **Important notice:** > We do our best to keep utPLSQL covered with unit tests. @@ -145,8 +145,8 @@ Every new functionality needs to be documented by unit tests that cover both hap To run a full suite of unit tests execute: ```bash -development/env.sh -test/install_and_run_tests.sh +. ./development/env.sh +./test/install_and_run_tests.sh ``` You can review the results of tests as well as see information about code coverage in `./coverage.html` file. @@ -189,18 +189,17 @@ docker build --force-rm --no-cache --squash -t oracle/db-prebuilt . Travis will use your Docker Hub credentials to pull the private images, and the following secure environment variables must be defined. -Variable | Description ----------|------------ -**DOCKER_USER**
**DOCKER_PASSWORD** | _Your Docker Hub website credentials. They will be used to pull the private database images._ +| Variable | Description | +|------------------------------------------|-----------------------------------------------------------------------------------------------| +| **DOCKER_USER**
**DOCKER_PASSWORD** | _Your Docker Hub website credentials. They will be used to pull the private database images._ | ### SQLCL Our build configuration uses SQLCL to run the scripts, and you need to configure a few additional secure environment variables. After the first build, the downloaded file will be cached. -Variable | Description ----------|------------ -**ORACLE_OTN_USER
ORACLE_OTN_PASSWORD** | _Your Oracle website credentials. They will be used to download SQLCL._ - +| Variable | Description | +|----------------------------------------------|-------------------------------------------------------------------------| +| **ORACLE_OTN_USER
ORACLE_OTN_PASSWORD** | _Your Oracle website credentials. They will be used to download SQLCL._ | ## New to GIT diff --git a/development/template.env.sh b/development/template.env.sh index 7761a70c4..fdbed4b6b 100755 --- a/development/template.env.sh +++ b/development/template.env.sh @@ -1,10 +1,10 @@ #!/bin/bash -export SQLCLI=sql # For sqlcl client -#export SQLCLI=sqlplus # For sqlplus client -export CONNECTION_STR=127.0.0.1:1521/xe ORACLE_VERSION=11g-r2-xe# Adjust the connect string -export ORACLE_PWD=oracle # Adjust your local SYS password -export UTPLSQL_CLI_VERSION="3.1.6" +export SQLCLI=sql # For sqlcl client +#export SQLCLI=sqlplus # For sqlplus client +export CONNECTION_STR=127.0.0.1:1521/xe # Adjust the connect string +export ORACLE_PWD=oracle # Adjust your local SYS password +export UTPLSQL_CLI_VERSION="v3.1.8" export SELFTESTING_BRANCH=develop export UTPLSQL_DIR="utPLSQL_latest_release" diff --git a/readme.md b/readme.md index 141c68ffe..3c2d7fb3a 100644 --- a/readme.md +++ b/readme.md @@ -9,8 +9,8 @@ [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) [![build](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml/badge.svg)](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml) -[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL&metric=coverage)](https://sonarcloud.io/summary/new_code?id=utPLSQL) +[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=coverage)](https://sonarcloud.io/summary/new_code?id=utPLSQL_utPLSQL) ---------- utPLSQL version 3 is a complete rewrite of utPLSQL v2 from scratch. diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 04f51fb3c..1719f137a 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -1,9 +1,11 @@ #!/bin/bash set -ev +. ./development/env.sh + #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" cd test -time . ./${DIR}/install_tests.sh -time . ./${DIR}/run_tests.sh +time . ./install_tests.sh +time . ./run_tests.sh From 5d2faaf80bd352bbabe2bd7ca6fd4b829004c1bc Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 12:47:04 +0000 Subject: [PATCH 035/144] Removing old builds from build workflow --- .github/workflows/build.yml | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c2fe3971e..8ddfbd584 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,41 +28,21 @@ jobs: matrix: include: - id: 1 - db_version_name: '11XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:11-full" - oracle-base: '/u01/app/oracle' - - id: 2 - db_version_name: '12.1EE' + db_version_name: '19se' oracle-sid: 'ORCLCDB' - oracle-version: "utplsqlv3/oracledb:12c-r1-ee-small" - oracle-base: '/opt/oracle' -# - id: 3 -# db_version_name: '12.2se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:12c-r2-se2-small" -# oracle-base: '/opt/oracle' - - id: 4 - db_version_name: '18XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:18-slim" + oracle-version: "utplsqlv3/oracledb:19c-se2-small" oracle-base: '/opt/oracle' -# TODO - need to add healthcheck.sh into our containers -# - id: 5 -# db_version_name: '19se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:19c-se2-small" -# oracle-base: '/opt/oracle' - - id: 6 + - id: 2 db_version_name: '21XE' oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" oracle-base: '/opt/oracle' - - id: 7 + - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" oracle-base: '/opt/oracle' +# TODO - need to add healthcheck.sh into our containers services: html_checker: @@ -124,17 +104,17 @@ jobs: run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh - name: Check code style - if: ${{ matrix.id == 1 }} + if: ${{ matrix.db_version_name == '21XE' }} id: check-coding-style run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint "$SQLCLI" ${DOCKER_ENV} ${ORACLE_VERSION} $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql - name: Validate utPLSQL uninstall - if: ${{ matrix.id == 1 }} + if: ${{ matrix.db_version_name == '21XE' }} id: validate-uninstall run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL - if: ${{ matrix.id == 1 }} + if: ${{ matrix.db_version_name == '21XE' }} id: reinstall-utplsql run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh From 098aca2ad405f34e1f8da4908543e6b1d97c4e4f Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:06:20 +0000 Subject: [PATCH 036/144] Improvments --- .github/workflows/build.yml | 50 ++++++++++++++++++++++++++--------- .github/workflows/release.yml | 16 ++++++++--- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ddfbd584..270249b7a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,7 @@ jobs: build: name: Build and test on ${{matrix.db_version_name}} DB runs-on: ubuntu-latest + timeout-minutes: 90 env: ORACLE_VERSION: ${{matrix.oracle-version}} ORACLE_SID: ${{matrix.oracle-sid}} @@ -68,13 +69,13 @@ jobs: --health-cmd healthcheck.sh steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: c-py/action-dotenv-to-setenv@v2 + - uses: c-py/action-dotenv-to-setenv@v5 with: env-file: .github/variables/.env - - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action + - uses: FranzDiebold/github-env-vars-action@v2.8.0 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set build version number env variables id: set-build-version-number-vars @@ -91,11 +92,27 @@ jobs: - name: Update privileges on sources run: chmod -R go+w ./{source,test,examples,${UTPLSQL_DIR}/source} + - name: Cache OJDBC jars + id: cache-ojdbc + uses: actions/cache@v4 + with: + path: ${{ env.OJDBC_HOME }} + key: ${{ runner.os }}-ojdbc-${{ env.OJDBC_URL }}-v1 + - name: Add OJDBC home + if: steps.cache-ojdbc.outputs.cache-hit != 'true' id: get-ojdbc run: mkdir -p ${OJDBC_HOME} && curl -Lk -o ${OJDBC_HOME}/ojdbc8.jar ${OJDBC_URL}/ojdbc8.jar && curl -Lk -o ${OJDBC_HOME}/orai18n.jar ${OJDBC_URL}/orai18n.jar + - name: Cache utPLSQL-cli + id: cache-utplsql-cli + uses: actions/cache@v4 + with: + path: utPLSQL-cli + key: ${{ runner.os }}-utplsql-cli-v3.1.8 + - name: Install utPLSQL-cli + if: steps.cache-utplsql-cli.outputs.cache-hit != 'true' id: install-utplsql-cli run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli @@ -152,7 +169,7 @@ jobs: - name: Upload ORACLE_BASE/diag data Artifact id: upload if: ${{ always() && steps.run-tests.outcome == 'failure' }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: my-artifact$-${{matrix.db_version_name}} path: ${{github.workspace}}/database-diag @@ -163,7 +180,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml @@ -171,7 +188,7 @@ jobs: fail_ci_if_error: true # optional (default = false) - name: Publish unit test results - uses: EnricoMi/publish-unit-test-result-action@v1.24 + uses: EnricoMi/publish-unit-test-result-action@v2 if: always() with: files: junit_test_results.xml @@ -179,7 +196,7 @@ jobs: - name: SonarCloud Scan id: sonar if: ${{ always() && matrix.db_version_name == '21XE' }} - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarcloud-github-action@v5.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -194,6 +211,7 @@ jobs: needs: [ build ] concurrency: publish runs-on: ubuntu-latest + timeout-minutes: 30 env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} if: | @@ -205,14 +223,14 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: echo "API_TOKEN_GITHUB=${GITHUB_TOKEN}" >> $GITHUB_ENV - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ env.API_TOKEN_GITHUB }} - - uses: c-py/action-dotenv-to-setenv@v2 + - uses: c-py/action-dotenv-to-setenv@v5 with: env-file: .github/variables/.env - - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action + - uses: FranzDiebold/github-env-vars-action@v2.8.0 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set buid version number env variables id: set-build-version-number-vars @@ -234,6 +252,12 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" + - name: Setup Python for docs + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + - name: Build and publish documentation run: | pip install mkdocs @@ -247,6 +271,7 @@ jobs: concurrency: trigger needs: [ build, publish ] runs-on: ubuntu-latest + timeout-minutes: 15 if: | github.repository == 'utPLSQL/utPLSQL' && github.base_ref == null && ( startsWith( github.ref, 'refs/heads/release/v' ) || github.ref == 'refs/heads/develop' ) @@ -256,7 +281,7 @@ jobs: # repo: [ 'utPLSQL/utPLSQL-v2-v3-migration' ] steps: - name: Repository Dispatch - uses: peter-evans/repository-dispatch@v1 + uses: peter-evans/repository-dispatch@v4 with: token: ${{ secrets.API_TOKEN_GITHUB }} repository: ${{ matrix.repo }} @@ -267,9 +292,10 @@ jobs: name: Post Workflow Status To Slack needs: [ build, publish, dispatch ] runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@master + uses: Gamesight/slack-workflow-status@v1.3.0 with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a748d1cbd..19bf5007f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,15 +14,16 @@ jobs: name: Upload archives concurrency: upload runs-on: ubuntu-latest + timeout-minutes: 60 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: c-py/action-dotenv-to-setenv@v2 + - uses: c-py/action-dotenv-to-setenv@v5 with: env-file: .github/variables/.env - - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action + - uses: FranzDiebold/github-env-vars-action@v2.8.0 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set build version number env variables run: .github/scripts/set_version_numbers_env.sh @@ -35,6 +36,12 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" + - name: Setup Python for docs + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + - name: Build and publish documentation run: | pip install mkdocs @@ -69,9 +76,10 @@ jobs: name: Post Workflow Status To Slack needs: [ upload_artifacts ] runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@master + uses: Gamesight/slack-workflow-status@v1.3.0 with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} From c2138900c2585bea7de12e7a92e239d9b11a603d Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:13:49 +0000 Subject: [PATCH 037/144] Fixing 19c --- .github/workflows/build.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3c7f80b93..80f734149 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,11 +62,7 @@ jobs: ports: - 1521:1521 options: >- - --health-interval 10s - --health-timeout 5s - --health-retries 10 --name oracle - --health-cmd healthcheck.sh steps: - uses: actions/checkout@v4 From 77d2eccf177284e6a469aef703a88751fa628ddc Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:19:26 +0000 Subject: [PATCH 038/144] Adding healthchecks --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 80f734149..ffdab246b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -63,6 +63,10 @@ jobs: - 1521:1521 options: >- --name oracle + --health-interval 10s + --health-timeout 5s + --health-retries 10 + --health-cmd healthcheck.sh steps: - uses: actions/checkout@v4 From 6dd676436709c07c1cd63a9ea0004bbd51730cfd Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:39:45 +0000 Subject: [PATCH 039/144] Testing delays --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ffdab246b..113f9a06a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -116,6 +116,9 @@ jobs: id: install-utplsql-cli run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli + - name: Wait for Oracle DB to be fully ready + run: sleep 30 + - name: Install utPLSQL id: install-utplsql run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh From a0d13444cf332bc02a9197572698045112779af7 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:53:20 +0000 Subject: [PATCH 040/144] Change images --- .github/workflows/build.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 113f9a06a..5ea5e3706 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,12 +36,12 @@ jobs: - id: 2 db_version_name: '21XE' oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:21-slim" + oracle-version: "gvenzl/oracle-xe:21-slim-faststart" oracle-base: '/opt/oracle' - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23-slim" + oracle-version: "gvenzl/oracle-free:23-slim-faststart" oracle-base: '/opt/oracle' # TODO - need to add healthcheck.sh into our containers @@ -116,9 +116,6 @@ jobs: id: install-utplsql-cli run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli - - name: Wait for Oracle DB to be fully ready - run: sleep 30 - - name: Install utPLSQL id: install-utplsql run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh From 55b02ba924251f6626616d2e67fb87511af478b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 15:56:13 +0200 Subject: [PATCH 041/144] Removed 11 and 12 DB's - added support for 19c (added health check in docker repository) --- .github/workflows/build.yml | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index af2e4875d..870f4b007 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,37 +28,16 @@ jobs: matrix: include: - id: 1 - db_version_name: '11XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:11-full" - oracle-base: '/u01/app/oracle' - - id: 2 - db_version_name: '12.1EE' + db_version_name: '19se' oracle-sid: 'ORCLCDB' - oracle-version: "utplsqlv3/oracledb:12c-r1-ee-small" + oracle-version: "utplsqlv3/oracledb:19c-se2-small" oracle-base: '/opt/oracle' -# - id: 3 -# db_version_name: '12.2se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:12c-r2-se2-small" -# oracle-base: '/opt/oracle' - - id: 4 - db_version_name: '18XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:18-slim" - oracle-base: '/opt/oracle' -# TODO - need to add healthcheck.sh into our containers -# - id: 5 -# db_version_name: '19se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:19c-se2-small" -# oracle-base: '/opt/oracle' - - id: 6 + - id: 2 db_version_name: '21XE' oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" oracle-base: '/opt/oracle' - - id: 7 + - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" From 9df078c1323ea77c03c8047d65da3eb5916573a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 15:59:35 +0200 Subject: [PATCH 042/144] Fixing Sonar Scan --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 870f4b007..0be56e66d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -178,7 +178,7 @@ jobs: - name: SonarCloud Scan id: sonar if: ${{ always() && matrix.db_version_name == '21XE' }} - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 40d9998230260225681885f73c9ba51ee7780df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 16:36:34 +0200 Subject: [PATCH 043/144] Update of CONTRIBUTING.md --- CONTRIBUTING.md | 42 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 926f0df80..744495e76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -162,44 +162,20 @@ Dependencies to `ut_util` are not shown as most of modules are depending on it. ## Build Environment -We are using private docker images to test utPLSQL for our Travis CI builds. The following versions of Oracle Database are being used. +We are using a combination of private and publicly available docker images to test utPLSQL. The following versions of Oracle Database are used for testing: -* 11g XE R2 -* 12c SE R1 -* 12c SE R2 -* 18c SE +* 19c-Standard Edition (private image) +* 21-free +* 23-free -These images are based on the slimmed versions [official dockerfiles released by Oracle](https://github.com/utPLSQL/docker-scripts), but due to licensing restrictions, we can't make the images public. -You can build your own and use it locally, or push to a private docker repository. - -The build steps are simple if you already have some experience using Docker. You can find detailed information about how to build your own image with a running database in: [example of creating an image with pre-built DB](https://github.com/oracle/docker-images/blob/master/OracleDatabase/samples/prebuiltdb/README.md) - -> You can find more info about the official Oracle images on the [Oracle Database on Docker](https://github.com/oracle/docker-images/tree/master/OracleDatabase) GitHub page. +The Free varsions are publicly available and you can set up your local development environment to use one of from [here](https://github.com/gvenzl/oci-oracle-free) -> If you are new to Docker, you can start by reading the [Getting Started With Docker](https://docs.docker.com/engine/getstarted/) docs. +These [private image]((https://github.com/utPLSQL/docker-scripts) is a slimmed version of [the official Oracle database dockerfiles](https://github.com/oracle/docker-images/tree/master/OracleDatabase) . Due to licensing restrictions, the image cannot be public. -### Docker Build Notes - -* You need to comment out the VOLUME line. This step is required, because volumes are not saved when using `docker commit` command. -* When the build process is complete, you will run the container to install the database. Once everything is set up and you see the message "DATABASE IS READY!", you may change the password and stop the running container. After the container is stopped, you can safely commit the container. -* You can use the --squash experimental docker tag to reduce the image size. Example: -``` -docker build --force-rm --no-cache --squash -t oracle/db-prebuilt . -``` - -Travis will use your Docker Hub credentials to pull the private images, and the following secure environment variables must be defined. - -| Variable | Description | -|------------------------------------------|-----------------------------------------------------------------------------------------------| -| **DOCKER_USER**
**DOCKER_PASSWORD** | _Your Docker Hub website credentials. They will be used to pull the private database images._ | - -### SQLCL - -Our build configuration uses SQLCL to run the scripts, and you need to configure a few additional secure environment variables. After the first build, the downloaded file will be cached. +You can build your own and use it locally, or push to a private docker repository. +The build steps are simple if you already have some experience using Docker. You can find detailed information about how to build your own image with a running database in: [example of creating an image with pre-built DB](https://github.com/oracle/docker-images/blob/master/OracleDatabase/samples/prebuiltdb/README.md) -| Variable | Description | -|----------------------------------------------|-------------------------------------------------------------------------| -| **ORACLE_OTN_USER
ORACLE_OTN_PASSWORD** | _Your Oracle website credentials. They will be used to download SQLCL._ | +> If you are new to Docker, you can start by reading the [Getting Started With Docker](https://docs.docker.com/get-started/) docs. ## New to GIT From 39d36dc1134e598d71114e056cfb0dcff0241012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 16:55:04 +0200 Subject: [PATCH 044/144] Update of sonar-project.properties --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index d088e9ccb..f23e8cf71 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,6 +1,6 @@ # must be unique in a given SonarQube instance sonar.organization=utplsql -sonar.projectKey=utPLSQL +sonar.projectKey=utPLSQL_utPLSQL # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=utPLSQL sonar.projectVersion=v3.1.14-develop From ead391da8d88628b47cbbedef268e67d4ed6c111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 17:08:29 +0200 Subject: [PATCH 045/144] Cleanup of build process --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0be56e66d..92dd64549 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,17 +31,14 @@ jobs: db_version_name: '19se' oracle-sid: 'ORCLCDB' oracle-version: "utplsqlv3/oracledb:19c-se2-small" - oracle-base: '/opt/oracle' - id: 2 db_version_name: '21XE' oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" - oracle-base: '/opt/oracle' - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" - oracle-base: '/opt/oracle' services: html_checker: From e07c6199109faaa3db0071adb3b3621497e9ba89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 17:56:18 +0200 Subject: [PATCH 046/144] Testing sonar scanner updates --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 92dd64549..f4c9da997 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -182,7 +182,7 @@ jobs: with: args: > -Dsonar.buildString=${{ format( '{0}.{1}', env.UTPLSQL_BUILD_VERSION, matrix.id ) }} - -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//oracle:1521/{0}', env.ORACLE_SID ) }} + -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//localhost:1521/{0}', env.ORACLE_SID ) }} -Dsonar.plsql.jdbc.driver.path=${{ format( '{0}/ojdbc8.jar', env.OJDBC_HOME ) }} publish: From 3e3c5603d4e080a704beec7ad9927f76ca8672c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 18:47:53 +0200 Subject: [PATCH 047/144] Attempting to fix 19c install issues --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f4c9da997..1eed2f9b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,7 +97,8 @@ jobs: - name: Install utPLSQL id: install-utplsql - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh +# run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/install.sh - name: Check code style if: ${{ matrix.id == 1 }} From 229d07242da8d6d479ec403f55afc5c846e25e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:04:12 +0200 Subject: [PATCH 048/144] Change of strategy for installation and execution inside the pipeline. --- .github/workflows/build.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1eed2f9b8..afe3df27b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,39 +97,38 @@ jobs: - name: Install utPLSQL id: install-utplsql -# run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/install.sh - name: Check code style if: ${{ matrix.id == 1 }} id: check-coding-style - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint "$SQLCLI" ${DOCKER_ENV} ${ORACLE_VERSION} $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash "$SQLCLI" $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql - name: Validate utPLSQL uninstall if: ${{ matrix.id == 1 }} id: validate-uninstall - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/uninstall_validate_utplsql.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL if: ${{ matrix.id == 1 }} id: reinstall-utplsql - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh - name: Create test users id: create-test-users - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/create_test_users.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/create_test_users.sh - name: Install utPLSQL release id: install-utplsql-release - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install_utplsql_release.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install_utplsql_release.sh - name: Run Examples id: run-examples - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/run_examples.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/run_examples.sh - name: Install tests id: install-tests - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} test/install_tests.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle test/install_tests.sh - name: Run Tests id: run-tests From 60dff1d596ba3d2700cc0b38b5a7f30bd2aec5ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:19:21 +0200 Subject: [PATCH 049/144] Fixing the utplsql_style_check code --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index afe3df27b..f08ce33cd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -102,7 +102,7 @@ jobs: - name: Check code style if: ${{ matrix.id == 1 }} id: check-coding-style - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash "$SQLCLI" $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql - name: Validate utPLSQL uninstall if: ${{ matrix.id == 1 }} From e97b917bf30c722d69014a87fe94d80685687d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:41:53 +0200 Subject: [PATCH 050/144] Adding debug information to test runner --- .github/workflows/build.yml | 6 +++--- test/run_tests.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f08ce33cd..60c83779c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,17 +97,17 @@ jobs: - name: Install utPLSQL id: install-utplsql - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/install.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh - name: Check code style if: ${{ matrix.id == 1 }} id: check-coding-style - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql - name: Validate utPLSQL uninstall if: ${{ matrix.id == 1 }} id: validate-uninstall - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/uninstall_validate_utplsql.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL if: ${{ matrix.id == 1 }} diff --git a/test/run_tests.sh b/test/run_tests.sh index 118bab920..4213b463f 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,7 +4,7 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@${CONNECTION_STR} \ +time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@${CONNECTION_STR} -d -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ -test_path=test -c \ From 5fb2c098538a3049ee7d29df99704e799dca2cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:49:31 +0200 Subject: [PATCH 051/144] Remove profiler run around examples --- examples/RunAllExamples.sql | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/examples/RunAllExamples.sql b/examples/RunAllExamples.sql index faa3388cf..f5f42b7f3 100644 --- a/examples/RunAllExamples.sql +++ b/examples/RunAllExamples.sql @@ -3,22 +3,8 @@ set echo on set feedback on set linesize 1000 -declare - l_run_number binary_integer; -begin - dbms_profiler.start_profiler( run_number => l_run_number); -end; -/ - -- Examples for users @@RunUserExamples.sql -- Framework developer examples @@RunDeveloperExamples.sql - -declare - l_return_code binary_integer; -begin - l_return_code := dbms_profiler.stop_profiler(); -end; -/ From 2e22a4b0551e2a95e591743b03a0edbeb44b327c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:57:12 +0200 Subject: [PATCH 052/144] Switch to utPLSQL-cli version 3.1.9 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 60c83779c..38478a425 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,7 +93,7 @@ jobs: - name: Install utPLSQL-cli id: install-utplsql-cli - run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli + run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/3.1.9/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli - name: Install utPLSQL id: install-utplsql From 6adb4294ce32d6fe0e71cd0e774bf2a36ee02bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 20:47:23 +0200 Subject: [PATCH 053/144] Testing other 23-free images --- .github/workflows/build.yml | 12 ++++++++++-- test/run_tests.sh | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38478a425..2cc3da4e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,9 +36,17 @@ jobs: oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" - id: 3 - db_version_name: '23free' + db_version_name: '23-slim' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" + - id: 4 + db_version_name: '23.26.0-slim' + oracle-sid: 'FREEPDB1' + oracle-version: "gvenzl/oracle-free:23.26.0-slim" + - id: 5 + db_version_name: '23-regular' + oracle-sid: 'FREEPDB1' + oracle-version: "gvenzl/oracle-free:23" services: html_checker: @@ -132,7 +140,7 @@ jobs: - name: Run Tests id: run-tests - run: bash test/run_tests.sh + run: test/run_tests.sh #Start Needed to diagnose occasional failures of DB on test runs - name: Prepare diagnostic directory diff --git a/test/run_tests.sh b/test/run_tests.sh index 4213b463f..d1127f87d 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,7 +4,7 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@${CONNECTION_STR} -d -D \ +time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -d -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ -test_path=test -c \ From 71f4911ed3920bff2b6b01b9be6caaf2dfea8219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 21:24:52 +0200 Subject: [PATCH 054/144] Fixing 19c build issues. --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cc3da4e0..aae9159bd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,7 @@ jobs: CONNECTION_STR: ${{ format( '127.0.0.1:1521/{0}', matrix.oracle-sid ) }} ORACLE_PASSWORD: oracle DOCKER_VOLUME: ${{matrix.docker-volume}} + JAVA_TOOL_OPTIONS: '-Doracle:net:disableOob=true' # needed as a workaround for 19c docker connectivity issues. See: https://github.com/gvenzl/oci-oracle-xe/issues/43 strategy: fail-fast: false matrix: From 9278f67f006bd5ab265aa9a5986246b16c24198c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 23:22:17 +0200 Subject: [PATCH 055/144] Fixing 19c build issues. Changed the way docker image is created. See commit: https://github.com/utPLSQL/docker-scripts/commit/0f1b3a4f3e71cdb417b219c3782adf01c4c11744#diff-6d4effe667dc45652da52fb0e218549914006349f7be3da5ab7dc774fbfa53deR85 And issue: https://github.com/gvenzl/oci-oracle-xe/issues/43 --- .github/workflows/build.yml | 1 - test/run_tests.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aae9159bd..2cc3da4e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,6 @@ jobs: CONNECTION_STR: ${{ format( '127.0.0.1:1521/{0}', matrix.oracle-sid ) }} ORACLE_PASSWORD: oracle DOCKER_VOLUME: ${{matrix.docker-volume}} - JAVA_TOOL_OPTIONS: '-Doracle:net:disableOob=true' # needed as a workaround for 19c docker connectivity issues. See: https://github.com/gvenzl/oci-oracle-xe/issues/43 strategy: fail-fast: false matrix: diff --git a/test/run_tests.sh b/test/run_tests.sh index d1127f87d..9f69bd1a1 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,7 +4,7 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -d -D \ +time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ -test_path=test -c \ From 223f2f73739765f3af75306ed9759b9512bebd7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 23:33:11 +0200 Subject: [PATCH 056/144] Update of pipeline to use 23.26.0 DB version as 23.26.1 was causing problems --- .github/workflows/build.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cc3da4e0..b10f4ef8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,17 +36,9 @@ jobs: oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" - id: 3 - db_version_name: '23-slim' - oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23-slim" - - id: 4 - db_version_name: '23.26.0-slim' + db_version_name: '23-free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23.26.0-slim" - - id: 5 - db_version_name: '23-regular' - oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23" services: html_checker: @@ -182,7 +174,7 @@ jobs: - name: SonarCloud Scan id: sonar - if: ${{ always() && matrix.db_version_name == '21XE' }} + if: ${{ always() && matrix.db_version_name == '23-free' }} uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any From 668c2985421fdcd3dda37bfb910c0f3116f52f04 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 21:39:02 +0000 Subject: [PATCH 057/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index fab85b21d..60233a917 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4206 +4252 diff --git a/docs/about/authors.md b/docs/about/authors.md index 499398993..7790ca3a0 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 03cc286eb..cf433448e 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 5579a943b..259cb7b0f 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 6d68864bd..b7231e190 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index b277c9d16..d02272506 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 45fca1871..7200bfaa9 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 31a91cac2..d733b0142 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 6becefc5c..2883542fa 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c9015b438..6ca83be3f 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 824aaecd5..121785710 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 54c204d58..5ed52b617 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1ff54a7d6..a288d34eb 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 9d8167739..3c0b564a7 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 24159fede..a27038eac 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 24d1065fe..ea200df89 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 375a05125..34bc2b71d 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 6fdaa6a48..a3c319315 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 0e1e0a851..19fb3d0f3 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4206-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4252-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 780d4b17b8c029de7df4e33e8dda7003afb68eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:06:23 +0200 Subject: [PATCH 058/144] Adding parameter to allow running a manual build for a Pull Request --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b10f4ef8f..bfda01497 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,10 @@ on: branches: [ develop ] workflow_dispatch: + inputs: + pr_number: + description: Pull request number + required: false concurrency: ${{github.ref}} defaults: From 825a6fdb44225680e88d2f4a5cf96f366fbab742 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 22:12:20 +0000 Subject: [PATCH 059/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 60233a917..d3acd1135 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4252 +4253 diff --git a/docs/about/authors.md b/docs/about/authors.md index 7790ca3a0..e9031c587 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index cf433448e..151ffbc09 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 259cb7b0f..9ab358e7e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index b7231e190..9172ffd73 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index d02272506..d5970b658 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 7200bfaa9..8529cc58b 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index d733b0142..f6b43f37b 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 2883542fa..a690b5627 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 6ca83be3f..bce23f6fb 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 121785710..a3cbb9c56 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5ed52b617..03f17b058 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index a288d34eb..183b51a43 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 3c0b564a7..8d464cf21 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index a27038eac..45f2b8ca2 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index ea200df89..1739a7c5b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 34bc2b71d..ed1226190 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index a3c319315..011271ef3 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 19fb3d0f3..d8048e58e 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4252-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4253-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From f27c37c2ef135c5d87744a240c0f87951c3a2005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:36:13 +0200 Subject: [PATCH 060/144] Do not push into branch if the build is on a pull request --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfda01497..04856a894 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -224,6 +224,7 @@ jobs: - name: Push version update to repository id: push-version-number-update + if: ${{ github.event_name != 'pull_request' }} run: | git add sonar-project.properties VERSION BUILD_NO source/* docs/* git commit -m 'Updated project version after build [skip ci]' From 10b589f3df406a2445768310d245372ad749a964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:37:23 +0200 Subject: [PATCH 061/144] Do not push into branch if the build is on a pull request --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04856a894..1fccaf331 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: inputs: pr_number: - description: Pull request number + description: Pull request number (optional) required: false concurrency: ${{github.ref}} From af0ec153e10108641c7124d9b50246a037a0ccc1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 22:49:35 +0000 Subject: [PATCH 062/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index d3acd1135..842b1acc0 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4253 +4258 diff --git a/docs/about/authors.md b/docs/about/authors.md index e9031c587..7f5301bac 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 151ffbc09..b3022f494 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 9ab358e7e..2865e3dd7 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 9172ffd73..813a9b339 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index d5970b658..f0c219240 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 8529cc58b..80fc2f91f 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index f6b43f37b..7651f9e18 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index a690b5627..755ff6c3a 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index bce23f6fb..f4931f432 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index a3cbb9c56..287b078ac 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 03f17b058..5ae611b7d 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 183b51a43..6fd19df5c 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 8d464cf21..7c1d7f9d2 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 45f2b8ca2..9b13c95d0 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 1739a7c5b..41ff8ad29 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index ed1226190..56c8bc387 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 011271ef3..f33d02059 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index d8048e58e..278834177 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4253-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4258-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 25dd48ba22151523c1d461e200cdacbf9cf9de46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:56:51 +0200 Subject: [PATCH 063/144] Reverting unneeded changes for PR builds --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1fccaf331..b10f4ef8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,10 +6,6 @@ on: branches: [ develop ] workflow_dispatch: - inputs: - pr_number: - description: Pull request number (optional) - required: false concurrency: ${{github.ref}} defaults: @@ -224,7 +220,6 @@ jobs: - name: Push version update to repository id: push-version-number-update - if: ${{ github.event_name != 'pull_request' }} run: | git add sonar-project.properties VERSION BUILD_NO source/* docs/* git commit -m 'Updated project version after build [skip ci]' From efc5ba87b75e541c41ce500f29e281d7d7aac39a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 23:07:11 +0000 Subject: [PATCH 064/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 842b1acc0..63ac185e9 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4258 +4259 diff --git a/docs/about/authors.md b/docs/about/authors.md index 7f5301bac..c82fedcbf 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index b3022f494..64a1c0b7f 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 2865e3dd7..05c3e91ef 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 813a9b339..5054f4209 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index f0c219240..a3d635866 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 80fc2f91f..eea340c51 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7651f9e18..cde703327 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 755ff6c3a..3eed598cf 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index f4931f432..aee30ae0e 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 287b078ac..4ece3de5e 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5ae611b7d..eb8148c22 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 6fd19df5c..d9ba7dba1 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 7c1d7f9d2..6ce52c108 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 9b13c95d0..2bb819610 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 41ff8ad29..0f4ed8d0c 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 56c8bc387..369a4b83e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f33d02059..e9bc089a3 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 278834177..c4a4738d4 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4258-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4259-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e10f48b99e7a2268bcc135041ef5182ac3a3b1bc Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:18:48 +0000 Subject: [PATCH 065/144] faststart --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d9a20634c..41ccf2942 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,11 +36,11 @@ jobs: - id: 2 db_version_name: '21XE' oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:21-slim" + oracle-version: "gvenzl/oracle-xe:21-slim-faststart" - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23-slim" + oracle-version: "gvenzl/oracle-free:23-slim-faststart" env: ORACLE_PASSWORD: oracle credentials: From 5862a5f613c6d64dda1c6b719fd5d989df972e97 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:24:51 +0000 Subject: [PATCH 066/144] update --- .github/workflows/build.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 41ccf2942..d1af0637c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,6 @@ jobs: db_version_name: '19se' oracle-sid: 'ORCLCDB' oracle-version: "utplsqlv3/oracledb:19c-se2-small" - oracle-base: '/opt/oracle' - id: 2 db_version_name: '21XE' oracle-sid: 'XE' @@ -41,20 +40,23 @@ jobs: db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim-faststart" + services: + html_checker: + image: ghcr.io/validator/validator:latest + options: >- + -p 8888:8888 + oracle: + image: ${{matrix.oracle-version}} env: ORACLE_PASSWORD: oracle credentials: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASSWORD }} - volumes: - - ${{github.workspace}}:/utPLSQL ports: - 1521:1521 options: >- - --name oracle --health-interval 10s --health-timeout 5s --health-retries 10 + --name oracle --health-cmd healthcheck.sh steps: From 8c6fe6adea87b753a31230c163478c609473ded6 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:25:45 +0000 Subject: [PATCH 067/144] upoate --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d1af0637c..2155b15d6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,6 +50,10 @@ jobs: env: ORACLE_PASSWORD: oracle credentials: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASSWORD }} + volumes: + - ${{github.workspace}}:/utPLSQL ports: - 1521:1521 options: >- From 7ea7198cd21944c56bde8ff2f478bd26acdf5f87 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:26:13 +0000 Subject: [PATCH 068/144] Correct blanks --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2155b15d6..d0a0cb51f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,7 +53,7 @@ jobs: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} volumes: - - ${{github.workspace}}:/utPLSQL + - ${{github.workspace}}:/utPLSQL ports: - 1521:1521 options: >- From 62889256165a233e6025c627daf25b6a56fdad53 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:28:36 +0000 Subject: [PATCH 069/144] Update --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0a0cb51f..874628682 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -175,7 +175,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@master with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml @@ -290,7 +290,7 @@ jobs: timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@v1.3.0 + uses: Gamesight/slack-workflow-status@master with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} From f1585ae6cd721e2907c4cdf7402d51bc3b2192c8 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:42:52 +0000 Subject: [PATCH 070/144] Fixing duration --- source/core/types/ut_reporter_base.tpb | 45 +++++++++++++------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/source/core/types/ut_reporter_base.tpb b/source/core/types/ut_reporter_base.tpb index 3f8984331..432bbc7d8 100644 --- a/source/core/types/ut_reporter_base.tpb +++ b/source/core/types/ut_reporter_base.tpb @@ -165,52 +165,53 @@ create or replace type body ut_reporter_base is end; overriding member procedure on_event( self in out nocopy ut_reporter_base, a_event_name varchar2, a_event_item ut_event_item) is + l_event_item ut_event_item := a_event_item; -- ADD THIS LINE begin case a_event_name when ut_event_manager.gc_initialize - then self.on_initialize(treat(a_event_item as ut_run)); + then self.on_initialize(treat(l_event_item as ut_run)); when ut_event_manager.gc_before_run - then self.before_calling_run(treat(a_event_item as ut_run)); + then self.before_calling_run(treat(l_event_item as ut_run)); when ut_event_manager.gc_before_suite - then self.before_calling_suite(treat(a_event_item as ut_logical_suite)); + then self.before_calling_suite(treat(l_event_item as ut_logical_suite)); when ut_event_manager.gc_before_before_all - then self.before_calling_before_all(treat(a_event_item as ut_executable)); + then self.before_calling_before_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_before_each - then self.before_calling_before_each(treat(a_event_item as ut_executable)); + then self.before_calling_before_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_test - then self.before_calling_test(treat(a_event_item as ut_test)); + then self.before_calling_test(treat(l_event_item as ut_test)); when ut_event_manager.gc_before_before_test - then self.before_calling_before_test(treat(a_event_item as ut_executable)); + then self.before_calling_before_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_test_execute - then self.before_calling_test_execute(treat(a_event_item as ut_executable)); + then self.before_calling_test_execute(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_after_test - then self.before_calling_after_test(treat(a_event_item as ut_executable)); + then self.before_calling_after_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_after_each - then self.before_calling_after_each(treat(a_event_item as ut_executable)); + then self.before_calling_after_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_after_all - then self.before_calling_after_all(treat(a_event_item as ut_executable)); + then self.before_calling_after_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_run - then self.after_calling_run(treat(a_event_item as ut_run)); + then self.after_calling_run(treat(l_event_item as ut_run)); when ut_event_manager.gc_after_suite - then self.after_calling_suite(treat(a_event_item as ut_logical_suite)); + then self.after_calling_suite(treat(l_event_item as ut_logical_suite)); when ut_event_manager.gc_after_before_all - then self.after_calling_before_all(treat(a_event_item as ut_executable)); + then self.after_calling_before_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_before_each - then self.after_calling_before_each(treat(a_event_item as ut_executable)); + then self.after_calling_before_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_test - then self.after_calling_test(treat(a_event_item as ut_test)); + then self.after_calling_test(treat(l_event_item as ut_test)); when ut_event_manager.gc_after_before_test - then self.after_calling_before_test(treat(a_event_item as ut_executable)); + then self.after_calling_before_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_test_execute - then self.after_calling_test_execute(treat(a_event_item as ut_executable)); + then self.after_calling_test_execute(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_after_test - then self.after_calling_after_test(treat(a_event_item as ut_executable)); + then self.after_calling_after_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_after_each - then self.after_calling_after_each(treat(a_event_item as ut_executable)); + then self.after_calling_after_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_after_all - then self.after_calling_after_all(treat(a_event_item as ut_executable)); + then self.after_calling_after_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_finalize - then self.on_finalize(treat(a_event_item as ut_run)); + then self.on_finalize(treat(l_event_item as ut_run)); else null; end case; end; From 5400c7caadac1656613f61a861ffcf429e3aa67c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:44:29 +0000 Subject: [PATCH 071/144] Correct wrong vrsion --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 874628682..1c38a2ec0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -175,7 +175,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@master + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml From fdf4abaef4a02148e9ce8044185a66e0d2cd2f1a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:59:04 +0000 Subject: [PATCH 072/144] revert --- .github/workflows/build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c38a2ec0..5d4c44108 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim-faststart" - id: 3 - db_version_name: '23free' + db_version_name: '23-free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim-faststart" services: @@ -116,17 +116,17 @@ jobs: run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh - name: Check code style - if: ${{ matrix.db_version_name == '21XE' }} + if: ${{ matrix.id == 1 }} id: check-coding-style run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql - name: Validate utPLSQL uninstall - if: ${{ matrix.db_version_name == '21XE' }} + if: ${{ matrix.id == 1 }} id: validate-uninstall run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL - if: ${{ matrix.db_version_name == '21XE' }} + if: ${{ matrix.id == 1 }} id: reinstall-utplsql run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh @@ -190,15 +190,15 @@ jobs: - name: SonarCloud Scan id: sonar - if: ${{ always() && matrix.db_version_name == '21XE' }} - uses: SonarSource/sonarcloud-github-action@v5.0.0 + if: ${{ always() && matrix.db_version_name == '23-free' }} + uses: SonarSource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: args: > -Dsonar.buildString=${{ format( '{0}.{1}', env.UTPLSQL_BUILD_VERSION, matrix.id ) }} - -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//oracle:1521/{0}', env.ORACLE_SID ) }} + -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//localhost:1521/{0}', env.ORACLE_SID ) }} -Dsonar.plsql.jdbc.driver.path=${{ format( '{0}/ojdbc8.jar', env.OJDBC_HOME ) }} publish: From 83b486ad76231c73a2b734ac72b316f73266b19c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 00:00:07 +0000 Subject: [PATCH 073/144] update task --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d4c44108..796017d5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -191,7 +191,7 @@ jobs: - name: SonarCloud Scan id: sonar if: ${{ always() && matrix.db_version_name == '23-free' }} - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 40cbed5a40b6a88b86acb3777b02715e9426f9f1 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 00:01:24 +0000 Subject: [PATCH 074/144] Update release ver --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 738f4960a..fe8f028c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,7 +79,7 @@ jobs: timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@v1.3.0 + uses: Gamesight/slack-workflow-status@master with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} From a7b4d84d470bda2382e9079b498786e7170bf1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 12:50:39 +0200 Subject: [PATCH 075/144] Update source/core/types/ut_reporter_base.tpb --- source/core/types/ut_reporter_base.tpb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/core/types/ut_reporter_base.tpb b/source/core/types/ut_reporter_base.tpb index 432bbc7d8..017dc8971 100644 --- a/source/core/types/ut_reporter_base.tpb +++ b/source/core/types/ut_reporter_base.tpb @@ -165,7 +165,8 @@ create or replace type body ut_reporter_base is end; overriding member procedure on_event( self in out nocopy ut_reporter_base, a_event_name varchar2, a_event_item ut_event_item) is - l_event_item ut_event_item := a_event_item; -- ADD THIS LINE + /* Resolves issue with ORA-21779 being thrown see issue: 1309 -> ( https://github.com/utPLSQL/utPLSQL/issues/1309#issuecomment-4020289898 ) */ + l_event_item ut_event_item := a_event_item; begin case a_event_name when ut_event_manager.gc_initialize From a5ef47631e34fa1d3271a8bbf6bf3e12328bf94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 13:26:52 +0200 Subject: [PATCH 076/144] CONTRIBUTING.md Documentation update --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 744495e76..3cac5c86f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,7 +40,7 @@ Changes are welcome from all members of the Community. # Configuring local environment Your local environment can be of any flavor (Unix/Linux/Windows/Mac). -At minimum you need to have Oracle database 11.2 XE accessible for the project and SYS account access to install and develop utPLSQL. +At minimum, you need to have Oracle database 19c accessible for the project and SYS account access to install and develop utPLSQL. We use four different database accounts (users) for development process. * `ut3` - holds latest released version of utPLSQL. This schema holds the testing framework used for self-testing of utPLSQL development. From 1c85f36ec610d3ab133b0be3b83a872aa186c7c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Mar 2026 11:33:36 +0000 Subject: [PATCH 077/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 63ac185e9..6a22fb16a 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4259 +4280 diff --git a/docs/about/authors.md b/docs/about/authors.md index c82fedcbf..1b31a03bc 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 64a1c0b7f..757e370e8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 05c3e91ef..265e594b1 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 5054f4209..dac308a65 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index a3d635866..8c88a4d15 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index eea340c51..9b1d31d05 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index cde703327..7c500b509 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 3eed598cf..5a7b71af3 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index aee30ae0e..6bb0738b7 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 4ece3de5e..43b61dc73 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index eb8148c22..5bf9787b1 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index d9ba7dba1..febe7f0c4 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 6ce52c108..766b54b0b 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 2bb819610..77fead32d 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 0f4ed8d0c..839908ca4 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 369a4b83e..fec85d57e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index e9bc089a3..645f8549f 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index c4a4738d4..7b14f44ae 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4259-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4280-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ea7bfd07b85ac57b41a57a79e8adef3c7a7d32e6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Mar 2026 11:43:23 +0000 Subject: [PATCH 078/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 6a22fb16a..0c1460d8f 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4280 +4281 diff --git a/docs/about/authors.md b/docs/about/authors.md index 1b31a03bc..de163c0cf 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 757e370e8..18a13cd81 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 265e594b1..382b0e1c5 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index dac308a65..4a88483a5 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8c88a4d15..30ad6eaff 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 9b1d31d05..d8ddad0c5 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7c500b509..3d32b9de6 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 5a7b71af3..d5412673e 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 6bb0738b7..b6b66830d 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 43b61dc73..0ea567077 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5bf9787b1..3c49f0cb5 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index febe7f0c4..2c86f390e 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 766b54b0b..876a73cf5 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 77fead32d..49c608edf 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 839908ca4..6f8339a52 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index fec85d57e..e9b646142 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 645f8549f..110be8f01 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 7b14f44ae..939384a85 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4280-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4281-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 7e2b8fb4f83cf26b815e207edf7cad12403f8e8c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 22:19:01 +0000 Subject: [PATCH 079/144] Removing the uncessary setup --- .github/workflows/release.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fe8f028c3..ab043b6eb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,12 +36,6 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" - - name: Setup Python for docs - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' - - name: Build and publish documentation run: | pip install mkdocs From 38e02ab70b05a8e67510dfe5366b6962766005c5 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 22:47:53 +0000 Subject: [PATCH 080/144] Testing something --- .../core/annotations/ut_annotation_parser.pkb | 80 ++++++++++++++----- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 10bb76b3c..0816b0652 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -136,9 +136,17 @@ create or replace package body ut_annotation_parser as l_comment_pos binary_integer; l_comment_line binary_integer; l_comment_replacer varchar2(50); - l_source clob := a_source; + l_comment_text varchar2(32767); + l_comment_match varchar2(32767); + l_result clob; + l_copy_pos binary_integer := 1; + l_next_newline binary_integer := 0; + l_source_length binary_integer; begin l_comment_pos := 1; + l_comment_line := 1; + l_source_length := coalesce(dbms_lob.getlength(a_source), 0); + l_next_newline := dbms_lob.instr(a_source, chr(10), 1, 1); loop l_comment_pos := regexp_instr(srcstr => a_source @@ -151,30 +159,64 @@ create or replace package body ut_annotation_parser as -- position index is shifted by 1 because gc_annot_comment_pattern contains ^ as first sign -- but after instr index already points to the char on that line - l_comment_pos := l_comment_pos-1; - l_comment_line := length(substr(a_source,1,l_comment_pos))-length(replace(substr(a_source,1,l_comment_pos),chr(10)))+1; - l_comments(l_comment_line) := trim(regexp_substr(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,occurrence => 1 - ,position => l_comment_pos - ,modifier => 'm' - ,subexpression => 2)); + l_comment_pos := greatest(l_comment_pos - 1, 1); + while l_next_newline > 0 and l_next_newline < l_comment_pos loop + l_comment_line := l_comment_line + 1; + l_next_newline := dbms_lob.instr(a_source, chr(10), l_next_newline + 1, 1); + end loop; + + l_comment_text := trim(regexp_substr(srcstr => a_source + ,pattern => gc_annot_comment_pattern + ,occurrence => 1 + ,position => l_comment_pos + ,modifier => 'm' + ,subexpression => 2)); + l_comment_match := regexp_substr(srcstr => a_source + ,pattern => gc_annot_comment_pattern + ,occurrence => 1 + ,position => l_comment_pos + ,modifier => 'm'); + l_comments(l_comment_line) := l_comment_text; l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', l_comment_line); - l_source := regexp_replace(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,replacestr => l_comment_replacer - ,position => l_comment_pos - ,occurrence => 1 - ,modifier => 'm'); - dbms_lob.freetemporary(a_source); - a_source := l_source; - dbms_lob.freetemporary(l_source); - l_comment_pos := l_comment_pos + length(l_comment_replacer); + if l_result is null then + dbms_lob.createtemporary(l_result, true); + end if; + + if l_comment_pos > l_copy_pos then + dbms_lob.copy( + dest_lob => l_result, + src_lob => a_source, + amount => l_comment_pos - l_copy_pos, + dest_offset => dbms_lob.getlength(l_result) + 1, + src_offset => l_copy_pos + ); + end if; + + ut_utils.append_to_clob(l_result, l_comment_replacer); + + l_copy_pos := l_comment_pos + length(l_comment_match); + l_comment_pos := l_copy_pos; end loop; + if l_result is not null then + if l_copy_pos <= l_source_length then + dbms_lob.copy( + dest_lob => l_result, + src_lob => a_source, + amount => l_source_length - l_copy_pos + 1, + dest_offset => dbms_lob.getlength(l_result) + 1, + src_offset => l_copy_pos + ); + end if; + if dbms_lob.istemporary(a_source) = 1 then + dbms_lob.freetemporary(a_source); + end if; + a_source := l_result; + end if; + ut_utils.debug_log(a_source); return l_comments; end extract_and_replace_comments; From 461ad5dc46fb8a8f0e8619b9db15b39618c90335 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 22:53:29 +0000 Subject: [PATCH 081/144] Another test --- source/core/annotations/ut_annotation_parser.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 0816b0652..08b051b14 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -160,7 +160,7 @@ create or replace package body ut_annotation_parser as -- position index is shifted by 1 because gc_annot_comment_pattern contains ^ as first sign -- but after instr index already points to the char on that line l_comment_pos := greatest(l_comment_pos - 1, 1); - while l_next_newline > 0 and l_next_newline < l_comment_pos loop + while l_next_newline > 0 and l_next_newline <= l_comment_pos loop l_comment_line := l_comment_line + 1; l_next_newline := dbms_lob.instr(a_source, chr(10), l_next_newline + 1, 1); end loop; From 44f5495bec78d91cb3ab947f6f71e741978ffedf Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 22:57:50 +0000 Subject: [PATCH 082/144] Test --- source/core/annotations/ut_annotation_parser.pkb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 08b051b14..e0cd25712 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -140,13 +140,10 @@ create or replace package body ut_annotation_parser as l_comment_match varchar2(32767); l_result clob; l_copy_pos binary_integer := 1; - l_next_newline binary_integer := 0; l_source_length binary_integer; begin l_comment_pos := 1; - l_comment_line := 1; l_source_length := coalesce(dbms_lob.getlength(a_source), 0); - l_next_newline := dbms_lob.instr(a_source, chr(10), 1, 1); loop l_comment_pos := regexp_instr(srcstr => a_source @@ -159,11 +156,10 @@ create or replace package body ut_annotation_parser as -- position index is shifted by 1 because gc_annot_comment_pattern contains ^ as first sign -- but after instr index already points to the char on that line - l_comment_pos := greatest(l_comment_pos - 1, 1); - while l_next_newline > 0 and l_next_newline <= l_comment_pos loop - l_comment_line := l_comment_line + 1; - l_next_newline := dbms_lob.instr(a_source, chr(10), l_next_newline + 1, 1); - end loop; + l_comment_pos := l_comment_pos - 1; + l_comment_line := length(substr(a_source,1,l_comment_pos)) + - length(replace(substr(a_source,1,l_comment_pos),chr(10))) + + 1; l_comment_text := trim(regexp_substr(srcstr => a_source ,pattern => gc_annot_comment_pattern From b5f2dc78a4dae632af850c6a0027ddc2bd800fb4 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:02:05 +0000 Subject: [PATCH 083/144] Thats funny:) --- source/core/annotations/ut_annotation_parser.pkb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index e0cd25712..2de9120f0 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -134,10 +134,10 @@ create or replace package body ut_annotation_parser as function extract_and_replace_comments(a_source in out nocopy clob) return tt_comment_list is l_comments tt_comment_list; l_comment_pos binary_integer; + l_comment_end_pos binary_integer; l_comment_line binary_integer; l_comment_replacer varchar2(50); l_comment_text varchar2(32767); - l_comment_match varchar2(32767); l_result clob; l_copy_pos binary_integer := 1; l_source_length binary_integer; @@ -167,11 +167,12 @@ create or replace package body ut_annotation_parser as ,position => l_comment_pos ,modifier => 'm' ,subexpression => 2)); - l_comment_match := regexp_substr(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,occurrence => 1 - ,position => l_comment_pos - ,modifier => 'm'); + l_comment_end_pos := regexp_instr(srcstr => a_source + ,pattern => gc_annot_comment_pattern + ,occurrence => 1 + ,return_option => 1 + ,position => l_comment_pos + ,modifier => 'm'); l_comments(l_comment_line) := l_comment_text; l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', l_comment_line); @@ -192,7 +193,7 @@ create or replace package body ut_annotation_parser as ut_utils.append_to_clob(l_result, l_comment_replacer); - l_copy_pos := l_comment_pos + length(l_comment_match); + l_copy_pos := l_comment_end_pos; l_comment_pos := l_copy_pos; end loop; From 0dd7dba66794cd8b18d83d0a3bcac20836fa95de Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:05:56 +0000 Subject: [PATCH 084/144] that is rubbish --- source/core/annotations/ut_annotation_parser.pkb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 2de9120f0..2aaa82a19 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -167,12 +167,7 @@ create or replace package body ut_annotation_parser as ,position => l_comment_pos ,modifier => 'm' ,subexpression => 2)); - l_comment_end_pos := regexp_instr(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,occurrence => 1 - ,return_option => 1 - ,position => l_comment_pos - ,modifier => 'm'); + l_comment_end_pos := regexp_instr(a_source, gc_annot_comment_pattern, l_comment_pos, 1, 1, 'm'); l_comments(l_comment_line) := l_comment_text; l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', l_comment_line); From 4ea0fcb8278353fb3992c3bff6835940b634a927 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:09:29 +0000 Subject: [PATCH 085/144] revert test --- .../core/annotations/ut_annotation_parser.pkb | 66 +++++-------------- 1 file changed, 17 insertions(+), 49 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 2aaa82a19..3ec54c5c0 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -134,16 +134,11 @@ create or replace package body ut_annotation_parser as function extract_and_replace_comments(a_source in out nocopy clob) return tt_comment_list is l_comments tt_comment_list; l_comment_pos binary_integer; - l_comment_end_pos binary_integer; l_comment_line binary_integer; l_comment_replacer varchar2(50); - l_comment_text varchar2(32767); - l_result clob; - l_copy_pos binary_integer := 1; - l_source_length binary_integer; + l_source clob := a_source; begin l_comment_pos := 1; - l_source_length := coalesce(dbms_lob.getlength(a_source), 0); loop l_comment_pos := regexp_instr(srcstr => a_source @@ -160,55 +155,28 @@ create or replace package body ut_annotation_parser as l_comment_line := length(substr(a_source,1,l_comment_pos)) - length(replace(substr(a_source,1,l_comment_pos),chr(10))) + 1; - - l_comment_text := trim(regexp_substr(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,occurrence => 1 - ,position => l_comment_pos - ,modifier => 'm' - ,subexpression => 2)); - l_comment_end_pos := regexp_instr(a_source, gc_annot_comment_pattern, l_comment_pos, 1, 1, 'm'); - l_comments(l_comment_line) := l_comment_text; + l_comments(l_comment_line) := trim(regexp_substr(srcstr => a_source + ,pattern => gc_annot_comment_pattern + ,occurrence => 1 + ,position => l_comment_pos + ,modifier => 'm' + ,subexpression => 2)); l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', l_comment_line); - if l_result is null then - dbms_lob.createtemporary(l_result, true); - end if; - - if l_comment_pos > l_copy_pos then - dbms_lob.copy( - dest_lob => l_result, - src_lob => a_source, - amount => l_comment_pos - l_copy_pos, - dest_offset => dbms_lob.getlength(l_result) + 1, - src_offset => l_copy_pos - ); - end if; - - ut_utils.append_to_clob(l_result, l_comment_replacer); - - l_copy_pos := l_comment_end_pos; - l_comment_pos := l_copy_pos; + l_source := regexp_replace(srcstr => a_source + ,pattern => gc_annot_comment_pattern + ,replacestr => l_comment_replacer + ,position => l_comment_pos + ,occurrence => 1 + ,modifier => 'm'); + dbms_lob.freetemporary(a_source); + a_source := l_source; + dbms_lob.freetemporary(l_source); + l_comment_pos := l_comment_pos + length(l_comment_replacer); end loop; - if l_result is not null then - if l_copy_pos <= l_source_length then - dbms_lob.copy( - dest_lob => l_result, - src_lob => a_source, - amount => l_source_length - l_copy_pos + 1, - dest_offset => dbms_lob.getlength(l_result) + 1, - src_offset => l_copy_pos - ); - end if; - if dbms_lob.istemporary(a_source) = 1 then - dbms_lob.freetemporary(a_source); - end if; - a_source := l_result; - end if; - ut_utils.debug_log(a_source); return l_comments; end extract_and_replace_comments; From 17604d8cb39aaec8d120974a98769d94d04eb074 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:23:59 +0000 Subject: [PATCH 086/144] Small tweaks --- .../core/annotations/ut_annotation_parser.pkb | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 3ec54c5c0..cbb577e1a 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -74,15 +74,12 @@ create or replace package body ut_annotation_parser as l_loop_index binary_integer := 1; l_annotation_index binary_integer; begin - -- loop while there are unprocessed comment blocks - while 0 != nvl(regexp_instr(srcstr => a_source - ,pattern => gc_comment_replacer_regex_ptrn - ,occurrence => l_loop_index - ,subexpression => 1) - ,0) loop + -- loop while there are unprocessed comment blocks + loop -- define index of the comment block and get it's content from cache l_annotation_index := regexp_substr( a_source ,gc_comment_replacer_regex_ptrn ,1 ,l_loop_index ,subexpression => 1); + exit when l_annotation_index is null; add_annotation( a_annotations, l_annotation_index, a_comments( l_annotation_index ), a_subobject_name ); l_loop_index := l_loop_index + 1; end loop; @@ -98,20 +95,13 @@ create or replace package body ut_annotation_parser as -- loop through procedures and functions of the package and get all the comment blocks just before it's declaration l_annot_proc_ind := 1; loop - --find annotated procedure index - l_annot_proc_ind := regexp_instr(srcstr => a_source - ,pattern => gc_annotation_block_pattern - ,occurrence => 1 - ,modifier => 'i' - ,position => l_annot_proc_ind); - exit when l_annot_proc_ind = 0; - --get the annotations with procedure name l_annot_proc_block := regexp_substr(srcstr => a_source ,pattern => gc_annotation_block_pattern ,position => l_annot_proc_ind ,occurrence => 1 ,modifier => 'i'); + exit when l_annot_proc_block is null; --extract the annotations l_proc_comments := trim(regexp_substr(srcstr => l_annot_proc_block From 5869f32585995336e1792180ec545c8a72fe28f0 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:26:56 +0000 Subject: [PATCH 087/144] one at the time --- source/core/annotations/ut_annotation_parser.pkb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index cbb577e1a..4f5833ff3 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -95,13 +95,21 @@ create or replace package body ut_annotation_parser as -- loop through procedures and functions of the package and get all the comment blocks just before it's declaration l_annot_proc_ind := 1; loop + --find annotated procedure index + l_annot_proc_ind := regexp_instr(srcstr => a_source + ,pattern => gc_annotation_block_pattern + ,occurrence => 1 + ,modifier => 'i' + ,position => l_annot_proc_ind); + exit when l_annot_proc_ind = 0; + --get the annotations with procedure name l_annot_proc_block := regexp_substr(srcstr => a_source ,pattern => gc_annotation_block_pattern ,position => l_annot_proc_ind ,occurrence => 1 ,modifier => 'i'); - exit when l_annot_proc_block is null; + --extract the annotations l_proc_comments := trim(regexp_substr(srcstr => l_annot_proc_block From 3f8d2cf6012decdc999b29e6a7319ead46f55f04 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:38:51 +0000 Subject: [PATCH 088/144] Move out outside --- source/core/annotations/ut_annotation_parser.pkb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 4f5833ff3..c10f42679 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -168,13 +168,14 @@ create or replace package body ut_annotation_parser as ,position => l_comment_pos ,occurrence => 1 ,modifier => 'm'); - dbms_lob.freetemporary(a_source); + --dbms_lob.freetemporary(a_source); a_source := l_source; - dbms_lob.freetemporary(l_source); + --dbms_lob.freetemporary(l_source); l_comment_pos := l_comment_pos + length(l_comment_replacer); end loop; - + dbms_lob.freetemporary(l_source); + dbms_lob.freetemporary(a_source); ut_utils.debug_log(a_source); return l_comments; end extract_and_replace_comments; From 37fae24df5988c122f3e61e3b15e1333e139727a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:41:55 +0000 Subject: [PATCH 089/144] fix invalid locator --- source/core/annotations/ut_annotation_parser.pkb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index c10f42679..3524b9669 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -137,6 +137,8 @@ create or replace package body ut_annotation_parser as l_source clob := a_source; begin l_comment_pos := 1; + dbms_lob.createtemporary(l_source, true); + dbms_lob.createtemporary(a_source, true); loop l_comment_pos := regexp_instr(srcstr => a_source From 518995584dccb4f269d6170224dd2d38dcbb7f11 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 23:44:18 +0000 Subject: [PATCH 090/144] revert --- source/core/annotations/ut_annotation_parser.pkb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 3524b9669..4f5833ff3 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -137,8 +137,6 @@ create or replace package body ut_annotation_parser as l_source clob := a_source; begin l_comment_pos := 1; - dbms_lob.createtemporary(l_source, true); - dbms_lob.createtemporary(a_source, true); loop l_comment_pos := regexp_instr(srcstr => a_source @@ -170,14 +168,13 @@ create or replace package body ut_annotation_parser as ,position => l_comment_pos ,occurrence => 1 ,modifier => 'm'); - --dbms_lob.freetemporary(a_source); + dbms_lob.freetemporary(a_source); a_source := l_source; - --dbms_lob.freetemporary(l_source); + dbms_lob.freetemporary(l_source); l_comment_pos := l_comment_pos + length(l_comment_replacer); end loop; - dbms_lob.freetemporary(l_source); - dbms_lob.freetemporary(a_source); + ut_utils.debug_log(a_source); return l_comments; end extract_and_replace_comments; From 9ac4a7ed0269773f02b96bc5d5333f9a5a4bf7ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 10 Mar 2026 06:28:04 +0000 Subject: [PATCH 091/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 0c1460d8f..fda0cb436 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4281 +4298 diff --git a/docs/about/authors.md b/docs/about/authors.md index de163c0cf..3c0117b09 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 18a13cd81..1e030f3f5 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 382b0e1c5..26c89912d 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 4a88483a5..058b84479 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 30ad6eaff..53f4c94aa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index d8ddad0c5..5de9fb7fb 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 3d32b9de6..0c7c469ee 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index d5412673e..bd09e2d83 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index b6b66830d..0ea6a1208 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 0ea567077..e4143411e 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 3c49f0cb5..bf9f29504 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 2c86f390e..c710607bc 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 876a73cf5..423eccea4 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 49c608edf..bef1e2156 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 6f8339a52..f86bce299 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index e9b646142..750497394 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 110be8f01..9effdcdbc 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 939384a85..a0d1e612c 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4281-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4298-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 5a217746ef9109cd96185310f92ee8ca6b01e32a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sat, 14 Mar 2026 01:27:26 +0000 Subject: [PATCH 092/144] Changing a code to validate by lines instead of clobs for performance. --- .../core/annotations/ut_annotation_parser.pkb | 153 ++++++++++++++- .../core/annotations/ut_annotation_parser.pks | 2 + source/core/ut_utils.pkb | 176 ++++++++++++++++++ source/core/ut_utils.pks | 3 + 4 files changed, 330 insertions(+), 4 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 4f5833ff3..e3f8e8493 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -129,6 +129,78 @@ create or replace package body ut_annotation_parser as end loop; end add_procedure_annotations; + procedure add_procedure_annotations( + a_annotations in out nocopy ut_annotations, + a_source in dbms_preprocessor.source_lines_t, + a_comments in out nocopy tt_comment_list + ) is + l_proc_comments varchar2(32767); + l_proc_name varchar2(250); + l_line varchar2(32767); + l_in_comment_block boolean := false; + l_i binary_integer; + begin + l_i := 1; + while l_i <= a_source.count loop + l_line := a_source(l_i); + + -- ----------------------------------------------------------------- + -- Comment placeholder line: start/continue accumulating a block + -- ----------------------------------------------------------------- + if instr(l_line, '{COMMENT#') > 0 then + if l_in_comment_block then + l_proc_comments := l_proc_comments || l_line || chr(10); + else + l_in_comment_block := true; + l_proc_comments := l_line || chr(10); + end if; + l_i := l_i + 1; + + -- ----------------------------------------------------------------- + -- Whitespace-only line: allowed between comment block and proc decl + -- ----------------------------------------------------------------- + elsif l_in_comment_block and trim(replace(l_line, chr(9))) is null then + l_i := l_i + 1; + + -- ----------------------------------------------------------------- + -- procedure/function declaration following a comment block + -- ----------------------------------------------------------------- + elsif l_in_comment_block + and regexp_like(l_line, '^\s*(procedure|function)\s+', 'i') + then + -- extract just the identifier name (subexpression 2) + l_proc_name := trim(regexp_substr(l_line + ,pattern => '^\s*(procedure|function)\s+('||gc_regexp_identifier||')' + ,modifier => 'i' + ,subexpression => 2)); + + -- pass accumulated comment placeholders + proc name to add_annotations + add_annotations(a_annotations, l_proc_comments, a_comments, l_proc_name); + + -- reset comment block state + l_in_comment_block := false; + l_proc_comments := null; + + -- advance past proc header to the terminating ';' + -- the header may span multiple lines e.g. with multi-line parameter lists + while l_i <= a_source.count loop + exit when instr(a_source(l_i), ';') > 0; + l_i := l_i + 1; + end loop; + l_i := l_i + 1; -- step past the ';' line itself + + -- ----------------------------------------------------------------- + -- Any other line: reset comment block accumulator + -- ----------------------------------------------------------------- + else + l_in_comment_block := false; + l_proc_comments := null; + l_i := l_i + 1; + end if; + + end loop; + end add_procedure_annotations; + function extract_and_replace_comments(a_source in out nocopy clob) return tt_comment_list is l_comments tt_comment_list; l_comment_pos binary_integer; @@ -175,13 +247,87 @@ create or replace package body ut_annotation_parser as end loop; - ut_utils.debug_log(a_source); + return l_comments; + end extract_and_replace_comments; + + function extract_and_replace_comments( + a_source in out nocopy dbms_preprocessor.source_lines_t + ) return tt_comment_list is + l_comments tt_comment_list; + l_line varchar2(32767); + l_comment_pos binary_integer; + l_comment_replacer varchar2(50); + begin + for i in 1 .. a_source.count loop + l_line := a_source(i); + + -- fast path: skip lines that can't possibly match + -- must contain '--' and '%' to be an annotation comment + if instr(l_line, '--') = 0 or instr(l_line, gc_annotation_qualifier) = 0 then + continue; + end if; + + -- find '--' on the line + l_comment_pos := instr(l_line, '--'); + + -- verify everything before '--' is only spaces/tabs (matches ^ *( |\t)*--) + if trim(replace(substr(l_line, 1, l_comment_pos - 1), chr(9))) is not null then + continue; + end if; + + -- skip '--' and any spaces after it, then check for annotation qualifier '%' + l_comment_pos := l_comment_pos + 2; + -- skip optional spaces between -- and % + while l_comment_pos <= length(l_line) + and substr(l_line, l_comment_pos, 1) = ' ' + loop + l_comment_pos := l_comment_pos + 1; + end loop; + + -- must start with annotation qualifier at this position + if substr(l_line, l_comment_pos, 1) != gc_annotation_qualifier then + continue; + end if; + + -- extract annotation text (from % to end of line, trimmed) + l_comments(i) := trim(substr(l_line, l_comment_pos)); + + -- replace line with placeholder, preserving line number in token + l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', i); + a_source(i) := l_comment_replacer; + + end loop; + return l_comments; end extract_and_replace_comments; ------------------------------------------------------------ --public definitions ------------------------------------------------------------ + function parse_object_annotations(a_source dbms_preprocessor.source_lines_t) return ut_annotations is + l_source dbms_preprocessor.source_lines_t := a_source; + l_comments tt_comment_list; + l_annotations ut_annotations := ut_annotations(); + l_result ut_annotations; + l_comment_index positive; + begin + l_source := ut_utils.replace_multiline_comments(l_source); + l_comments := extract_and_replace_comments(l_source); + add_procedure_annotations(l_annotations, l_source, l_comments); + delete_processed_comments(l_comments, l_annotations); + + --at this point, only the comments not related to procedures are left, so we process them all as top-level + l_comment_index := l_comments.first; + while l_comment_index is not null loop + add_annotation( l_annotations, l_comment_index, l_comments( l_comment_index ) ); + l_comment_index := l_comments.next(l_comment_index); + end loop; + + select /*+ no_parallel */ value(x) bulk collect into l_result from table(l_annotations) x order by x.position; + + return l_result; + + end parse_object_annotations; function parse_object_annotations(a_source clob) return ut_annotations is l_source clob := a_source; @@ -217,7 +363,7 @@ create or replace package body ut_annotation_parser as function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t, a_object_type varchar2) return ut_annotations is l_processed_lines dbms_preprocessor.source_lines_t; - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_annotations ut_annotations := ut_annotations(); ex_package_is_wrapped exception; pragma exception_init(ex_package_is_wrapped, -24241); @@ -235,11 +381,10 @@ create or replace package body ut_annotation_parser as end if; --convert to clob for i in 1..l_processed_lines.count loop - ut_utils.append_to_clob(l_source, replace(l_processed_lines(i), chr(13)||chr(10), chr(10))); + l_source(i) := replace(l_processed_lines(i), chr(13)||chr(10), chr(10)); end loop; --parse annotations l_annotations := parse_object_annotations(l_source); - dbms_lob.freetemporary(l_source); exception when ex_package_is_wrapped or source_text_is_empty then null; diff --git a/source/core/annotations/ut_annotation_parser.pks b/source/core/annotations/ut_annotation_parser.pks index 2f474c883..5a041ccb4 100644 --- a/source/core/annotations/ut_annotation_parser.pks +++ b/source/core/annotations/ut_annotation_parser.pks @@ -40,5 +40,7 @@ create or replace package ut_annotation_parser authid current_user as */ function parse_object_annotations(a_source clob) return ut_annotations; + function parse_object_annotations(a_source dbms_preprocessor.source_lines_t) return ut_annotations; + end; / diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 81d47221b..a5f69a54e 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -658,6 +658,182 @@ create or replace package body ut_utils is return l_result; end; + function replace_multiline_comments(a_source dbms_preprocessor.source_lines_t) + return dbms_preprocessor.source_lines_t + is + l_result dbms_preprocessor.source_lines_t; + l_line varchar2(32767); + l_remaining varchar2(32767); + l_in_ml_comment boolean := false; + l_ml_end binary_integer; + l_ml_start binary_integer; + l_comment_start binary_integer; + l_text_start binary_integer; + l_eq_text_start binary_integer; + l_eq_end_char varchar2(1 char); + l_pos binary_integer; + l_end binary_integer; + l_token_count binary_integer; + l_has_ml_comment boolean := false; + begin + + -- Guard: empty source + if a_source.count = 0 then + return a_source; + end if; + + -- Fast pre-scan: check if any /* exists at all if not, nothing to do — return source as-is + for i in 1 .. a_source.count loop + if instr(a_source(i), '/*') > 0 then + l_has_ml_comment := true; + exit prescan; + end if; + end loop prescan; + + if not l_has_ml_comment then + return a_source; + end if; + + <> + for i in 1 .. a_source.count loop + l_line := a_source(i); + -- Fast path: currently inside a multi-line comment + if l_in_ml_comment then + l_ml_end := instr(l_line, '*/'); + if l_ml_end > 0 then + l_in_ml_comment := false; + l_line := substr(l_line, l_ml_end + 2); + -- fall through to normal scan of remainder + else + l_result(i) := ''; + continue process_lines; + end if; + end if; + + -- Fast path: no special tokens on this line at all + if instr(l_line, '/') = 0 + and instr(l_line, '-') = 0 + and instr(l_line, '''') = 0 + then + l_result(i) := l_line; + continue process_lines; + end if; + + -- Normal scan: consume one token at a time, advance l_remaining + l_remaining := l_line; + l_line := null; + + <> + loop + exit when l_remaining is null or l_remaining = ''; + + l_ml_start := instr(l_remaining, '/*'); + l_comment_start := instr(l_remaining, '--'); + l_text_start := instr(l_remaining, ''''); + -- only search for q' if ' was found — q' always contains ' + l_eq_text_start := case when l_text_start > 0 + then instr(l_remaining, 'q''') + else 0 + end; + + -- count how many tokens are present + l_token_count := sign(l_ml_start) + sign(l_comment_start) + + sign(l_text_start) + sign(l_eq_text_start); + + -- no special tokens left — consume remainder and stop + if l_token_count = 0 then + l_line := l_line || l_remaining; + exit scan_line; + end if; + + -- only one token present — skip LEAST, use GREATEST to find it + if l_token_count = 1 then + l_pos := greatest(l_ml_start, l_comment_start, l_text_start, l_eq_text_start); + else + l_pos := least( + case when l_ml_start > 0 then l_ml_start else 32767 end, + case when l_comment_start > 0 then l_comment_start else 32767 end, + case when l_text_start > 0 then l_text_start else 32767 end, + case when l_eq_text_start > 0 then l_eq_text_start else 32767 end + ); + end if; + + -- q-quoted string: checked before plain quote because q' contains ' and would be misidentified + if l_pos = l_eq_text_start + and (l_ml_start = 0 or l_eq_text_start < l_ml_start) + and (l_comment_start = 0 or l_eq_text_start < l_comment_start) + and (l_text_start = 0 or l_eq_text_start < l_text_start) + then + l_eq_end_char := translate( + substr(l_remaining, l_eq_text_start + 2, 1), + '[{(<', ']})>' + ); + l_end := instr(l_remaining, l_eq_end_char || '''', l_eq_text_start + 3); + if l_end > 0 then + l_line := l_line || substr(l_remaining, 1, l_end + 1); + l_remaining := substr(l_remaining, l_end + 2); + else + l_line := l_line || l_remaining; + exit scan_line; + end if; + + -- Multi-line comment: skip it, continue scanning remainder of line after comment end + elsif l_pos = l_ml_start + and (l_comment_start = 0 or l_ml_start < l_comment_start) + and (l_text_start = 0 or l_ml_start < l_text_start) + and (l_eq_text_start = 0 or l_ml_start < l_eq_text_start) + then + l_line := l_line || substr(l_remaining, 1, l_ml_start - 1); + l_ml_end := instr(l_remaining, '*/', l_ml_start + 2); + if l_ml_end > 0 then + l_remaining := substr(l_remaining, l_ml_end + 2); + else + l_in_ml_comment := true; + exit scan_line; + end if; + + -- Single-line comment: keep it, stop scanning this line + elsif l_pos = l_comment_start + and (l_ml_start = 0 or l_comment_start < l_ml_start) + and (l_text_start = 0 or l_comment_start < l_text_start) + and (l_eq_text_start = 0 or l_comment_start < l_eq_text_start) + then + l_line := l_line || l_remaining; + exit scan_line; + + -- Regular string literal: keep it, continue scanning remainder of line after closing quote + else + -- scan forward continuously to handle '' escaped quotes + l_end := l_text_start + 1; + loop + l_end := instr(l_remaining, '''', l_end); + exit when l_end = 0; + if substr(l_remaining, l_end, 2) = '''''' then + l_end := l_end + 2; -- skip escaped quote, keep scanning + else + exit; -- found real closing quote + end if; + end loop; + + if l_end > 0 then + l_line := l_line || substr(l_remaining, 1, l_end); + l_remaining := substr(l_remaining, l_end + 1); + else + l_line := l_line || l_remaining; + exit scan_line; + end if; + end if; + + end loop scan_line; + + l_result(i) := l_line; + + end loop process_lines; + + return l_result; + end replace_multiline_comments; + + function replace_multiline_comments(a_source clob) return clob is l_result clob; l_ml_comment_start binary_integer := 1; diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 939384a85..49ea0615f 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -405,6 +405,9 @@ create or replace package ut_utils authid definer is /** * Replaces multi-line comments in given source-code with empty lines */ + function replace_multiline_comments(a_source dbms_preprocessor.source_lines_t) + return dbms_preprocessor.source_lines_t; + function replace_multiline_comments(a_source clob) return clob; /** From 39f5d6474ac57706171cdc395aa0215555962555 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sat, 14 Mar 2026 01:33:05 +0000 Subject: [PATCH 093/144] Fixing loop syntax --- source/core/ut_utils.pkb | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index a5f69a54e..ca7a5e412 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -683,6 +683,7 @@ create or replace package body ut_utils is end if; -- Fast pre-scan: check if any /* exists at all if not, nothing to do — return source as-is + <> for i in 1 .. a_source.count loop if instr(a_source(i), '/*') > 0 then l_has_ml_comment := true; @@ -697,20 +698,21 @@ create or replace package body ut_utils is <> for i in 1 .. a_source.count loop l_line := a_source(i); - -- Fast path: currently inside a multi-line comment + + -- Fast path: currently inside a multi-line comment, look only for closing */ if l_in_ml_comment then l_ml_end := instr(l_line, '*/'); if l_ml_end > 0 then l_in_ml_comment := false; l_line := substr(l_line, l_ml_end + 2); - -- fall through to normal scan of remainder + -- fall through to normal scan of remainder of line, in case there are more /* comments on the same line else l_result(i) := ''; continue process_lines; end if; end if; - -- Fast path: no special tokens on this line at all + -- Fast path: no special tokens on this line at all, just copy it to result and move on if instr(l_line, '/') = 0 and instr(l_line, '-') = 0 and instr(l_line, '''') = 0 @@ -719,7 +721,7 @@ create or replace package body ut_utils is continue process_lines; end if; - -- Normal scan: consume one token at a time, advance l_remaining + -- Normal scan: consume one token at a time, advance l_remaining until end of line l_remaining := l_line; l_line := null; @@ -730,23 +732,23 @@ create or replace package body ut_utils is l_ml_start := instr(l_remaining, '/*'); l_comment_start := instr(l_remaining, '--'); l_text_start := instr(l_remaining, ''''); - -- only search for q' if ' was found — q' always contains ' + -- only search for q' if ' was found — q' always contains ' and would be misidentified otherwise l_eq_text_start := case when l_text_start > 0 then instr(l_remaining, 'q''') else 0 end; - -- count how many tokens are present + -- count how many tokens are present to decide if we can skip LEAST/GREATEST and just use the one that is present l_token_count := sign(l_ml_start) + sign(l_comment_start) + sign(l_text_start) + sign(l_eq_text_start); - -- no special tokens left — consume remainder and stop + -- no special tokens left — consume remainder and stop scanning this line if l_token_count = 0 then l_line := l_line || l_remaining; exit scan_line; end if; - -- only one token present — skip LEAST, use GREATEST to find it + -- only one token present — skip LEAST, use GREATEST to find it since 0 means not present and any positive value is a valid position if l_token_count = 1 then l_pos := greatest(l_ml_start, l_comment_start, l_text_start, l_eq_text_start); else @@ -777,7 +779,7 @@ create or replace package body ut_utils is exit scan_line; end if; - -- Multi-line comment: skip it, continue scanning remainder of line after comment end + -- Multi-line comment start: skip it, look for end of comment, continue scanning line after it elsif l_pos = l_ml_start and (l_comment_start = 0 or l_ml_start < l_comment_start) and (l_text_start = 0 or l_ml_start < l_text_start) @@ -792,7 +794,7 @@ create or replace package body ut_utils is exit scan_line; end if; - -- Single-line comment: keep it, stop scanning this line + -- Single-line comment: keep it, stop scanning this line since everything after -- is comment anyway elsif l_pos = l_comment_start and (l_ml_start = 0 or l_comment_start < l_ml_start) and (l_text_start = 0 or l_comment_start < l_text_start) @@ -801,7 +803,7 @@ create or replace package body ut_utils is l_line := l_line || l_remaining; exit scan_line; - -- Regular string literal: keep it, continue scanning remainder of line after closing quote + -- Regular string literal start: keep it, scan forward for closing quote, handle '' escaped quotes properly by skipping them and keep scanning else -- scan forward continuously to handle '' escaped quotes l_end := l_text_start + 1; @@ -833,7 +835,6 @@ create or replace package body ut_utils is return l_result; end replace_multiline_comments; - function replace_multiline_comments(a_source clob) return clob is l_result clob; l_ml_comment_start binary_integer := 1; @@ -1201,4 +1202,4 @@ create or replace package body ut_utils is end; end ut_utils; -/ +/ \ No newline at end of file From 393cfec4c19850833ef29a241f3f61246c1752f9 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:13:39 +0000 Subject: [PATCH 094/144] Update code --- source/core/annotations/ut_annotation_parser.pkb | 1 - 1 file changed, 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index e3f8e8493..6e790a861 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -379,7 +379,6 @@ create or replace package body ut_annotation_parser as else l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); end if; - --convert to clob for i in 1..l_processed_lines.count loop l_source(i) := replace(l_processed_lines(i), chr(13)||chr(10), chr(10)); end loop; From 8d794f013eb19c14aae121f1921794785864802c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:19:45 +0000 Subject: [PATCH 095/144] Update block --- source/core/annotations/ut_annotation_parser.pkb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 6e790a861..9dc0b6aef 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -143,20 +143,16 @@ create or replace package body ut_annotation_parser as l_i := 1; while l_i <= a_source.count loop l_line := a_source(l_i); - - -- ----------------------------------------------------------------- -- Comment placeholder line: start/continue accumulating a block - -- ----------------------------------------------------------------- - if instr(l_line, '{COMMENT#') > 0 then + if instr(l_line, chr(123) ||'COMMENT#') > 0 then if l_in_comment_block then l_proc_comments := l_proc_comments || l_line || chr(10); else l_in_comment_block := true; - l_proc_comments := l_line || chr(10); + l_proc_comments := l_line || chr(10); end if; l_i := l_i + 1; - -- ----------------------------------------------------------------- -- Whitespace-only line: allowed between comment block and proc decl -- ----------------------------------------------------------------- elsif l_in_comment_block and trim(replace(l_line, chr(9))) is null then From a32e09da846cafb5c673d481594a18a60a60424c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:31:11 +0000 Subject: [PATCH 096/144] Small fixes --- source/core/annotations/ut_annotation_parser.pkb | 11 +---------- source/core/ut_utils.pkb | 10 ++++++---- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 9dc0b6aef..8df89be28 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -152,15 +152,10 @@ create or replace package body ut_annotation_parser as l_proc_comments := l_line || chr(10); end if; l_i := l_i + 1; - -- Whitespace-only line: allowed between comment block and proc decl - -- ----------------------------------------------------------------- elsif l_in_comment_block and trim(replace(l_line, chr(9))) is null then l_i := l_i + 1; - - -- ----------------------------------------------------------------- -- procedure/function declaration following a comment block - -- ----------------------------------------------------------------- elsif l_in_comment_block and regexp_like(l_line, '^\s*(procedure|function)\s+', 'i') then @@ -184,16 +179,12 @@ create or replace package body ut_annotation_parser as l_i := l_i + 1; end loop; l_i := l_i + 1; -- step past the ';' line itself - - -- ----------------------------------------------------------------- -- Any other line: reset comment block accumulator - -- ----------------------------------------------------------------- else l_in_comment_block := false; - l_proc_comments := null; + l_proc_comments := null; l_i := l_i + 1; end if; - end loop; end add_procedure_annotations; diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index ca7a5e412..3790af93e 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -675,6 +675,9 @@ create or replace package body ut_utils is l_end binary_integer; l_token_count binary_integer; l_has_ml_comment boolean := false; + + l_open_chars varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( + l_close_chars varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> begin -- Guard: empty source @@ -766,10 +769,9 @@ create or replace package body ut_utils is and (l_comment_start = 0 or l_eq_text_start < l_comment_start) and (l_text_start = 0 or l_eq_text_start < l_text_start) then - l_eq_end_char := translate( - substr(l_remaining, l_eq_text_start + 2, 1), - '[{(<', ']})>' - ); + + + l_eq_end_char := translate(substr(l_remaining, l_eq_text_start + 2, 1),l_open_chars,l_close_chars); l_end := instr(l_remaining, l_eq_end_char || '''', l_eq_text_start + 3); if l_end > 0 then l_line := l_line || substr(l_remaining, 1, l_end + 1); From b2e914f3dc783a794c05c24bf7ea50ee3824f97c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:34:53 +0000 Subject: [PATCH 097/144] Update comment --- source/core/ut_utils.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 3790af93e..4b341e1a1 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -895,7 +895,7 @@ create or replace package body ut_utils is and (l_escaped_text_start < l_comment_start or l_comment_start = 0) and (l_escaped_text_start < l_text_start or l_text_start = 0) then --translate char "[" from the start of quoted text "q'[someting]'" into "]" - l_escaped_text_end_char := translate( substr(a_source, l_escaped_text_start + 2, 1), '[{(<', ']})>'); + l_escaped_text_end_char := translate(substr(a_source, l_escaped_text_start + 2, 1),l_open_chars,l_close_chars); l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); if l_end > 0 then l_end := l_end + 2; From 66de806889fa5aae6308954cc8440036d75e13e6 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:43:13 +0000 Subject: [PATCH 098/144] Introduce global variable --- source/core/ut_utils.pkb | 61 +++++++++++++++------------------------- 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 4b341e1a1..b525ca7d8 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -23,7 +23,8 @@ create or replace package body ut_utils is gc_invalid_xml_char constant varchar2(50) := '[^_[:alnum:]\.-]'; gc_full_valid_xml_name constant varchar2(50) := '^([[:alpha:]])([_[:alnum:]\.-])*$'; gc_owner_hash constant integer(11) := dbms_utility.get_hash_value( ut_owner(), 0, power(2,31)-1); - + gc_open_chars constant varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( + gc_close_chars constant varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> function surround_with(a_value varchar2, a_quote_char varchar2) return varchar2 is begin @@ -674,10 +675,7 @@ create or replace package body ut_utils is l_pos binary_integer; l_end binary_integer; l_token_count binary_integer; - l_has_ml_comment boolean := false; - - l_open_chars varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( - l_close_chars varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> + l_has_ml_comment boolean := false; begin -- Guard: empty source @@ -686,19 +684,17 @@ create or replace package body ut_utils is end if; -- Fast pre-scan: check if any /* exists at all if not, nothing to do — return source as-is - <> for i in 1 .. a_source.count loop if instr(a_source(i), '/*') > 0 then l_has_ml_comment := true; - exit prescan; + exit; end if; - end loop prescan; + end loop; if not l_has_ml_comment then return a_source; end if; - <> for i in 1 .. a_source.count loop l_line := a_source(i); @@ -711,7 +707,7 @@ create or replace package body ut_utils is -- fall through to normal scan of remainder of line, in case there are more /* comments on the same line else l_result(i) := ''; - continue process_lines; + continue; end if; end if; @@ -721,7 +717,7 @@ create or replace package body ut_utils is and instr(l_line, '''') = 0 then l_result(i) := l_line; - continue process_lines; + continue; end if; -- Normal scan: consume one token at a time, advance l_remaining until end of line @@ -731,16 +727,11 @@ create or replace package body ut_utils is <> loop exit when l_remaining is null or l_remaining = ''; - l_ml_start := instr(l_remaining, '/*'); l_comment_start := instr(l_remaining, '--'); l_text_start := instr(l_remaining, ''''); -- only search for q' if ' was found — q' always contains ' and would be misidentified otherwise - l_eq_text_start := case when l_text_start > 0 - then instr(l_remaining, 'q''') - else 0 - end; - + l_eq_text_start := case when l_text_start > 0 then instr(l_remaining, 'q''') else 0 end; -- count how many tokens are present to decide if we can skip LEAST/GREATEST and just use the one that is present l_token_count := sign(l_ml_start) + sign(l_comment_start) + sign(l_text_start) + sign(l_eq_text_start); @@ -756,38 +747,35 @@ create or replace package body ut_utils is l_pos := greatest(l_ml_start, l_comment_start, l_text_start, l_eq_text_start); else l_pos := least( - case when l_ml_start > 0 then l_ml_start else 32767 end, + case when l_ml_start > 0 then l_ml_start else 32767 end, case when l_comment_start > 0 then l_comment_start else 32767 end, - case when l_text_start > 0 then l_text_start else 32767 end, + case when l_text_start > 0 then l_text_start else 32767 end, case when l_eq_text_start > 0 then l_eq_text_start else 32767 end ); end if; -- q-quoted string: checked before plain quote because q' contains ' and would be misidentified if l_pos = l_eq_text_start - and (l_ml_start = 0 or l_eq_text_start < l_ml_start) + and (l_ml_start = 0 or l_eq_text_start < l_ml_start) and (l_comment_start = 0 or l_eq_text_start < l_comment_start) - and (l_text_start = 0 or l_eq_text_start < l_text_start) + and (l_text_start = 0 or l_eq_text_start < l_text_start) then - - - l_eq_end_char := translate(substr(l_remaining, l_eq_text_start + 2, 1),l_open_chars,l_close_chars); + l_eq_end_char := translate(substr(l_remaining, l_eq_text_start + 2, 1),gc_open_chars,gc_close_chars); l_end := instr(l_remaining, l_eq_end_char || '''', l_eq_text_start + 3); if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end + 1); + l_line := l_line || substr(l_remaining, 1, l_end + 1); l_remaining := substr(l_remaining, l_end + 2); else l_line := l_line || l_remaining; exit scan_line; end if; - -- Multi-line comment start: skip it, look for end of comment, continue scanning line after it elsif l_pos = l_ml_start and (l_comment_start = 0 or l_ml_start < l_comment_start) - and (l_text_start = 0 or l_ml_start < l_text_start) + and (l_text_start = 0 or l_ml_start < l_text_start) and (l_eq_text_start = 0 or l_ml_start < l_eq_text_start) then - l_line := l_line || substr(l_remaining, 1, l_ml_start - 1); + l_line := l_line || substr(l_remaining, 1, l_ml_start - 1); l_ml_end := instr(l_remaining, '*/', l_ml_start + 2); if l_ml_end > 0 then l_remaining := substr(l_remaining, l_ml_end + 2); @@ -795,16 +783,14 @@ create or replace package body ut_utils is l_in_ml_comment := true; exit scan_line; end if; - -- Single-line comment: keep it, stop scanning this line since everything after -- is comment anyway elsif l_pos = l_comment_start - and (l_ml_start = 0 or l_comment_start < l_ml_start) - and (l_text_start = 0 or l_comment_start < l_text_start) + and (l_ml_start = 0 or l_comment_start < l_ml_start) + and (l_text_start = 0 or l_comment_start < l_text_start) and (l_eq_text_start = 0 or l_comment_start < l_eq_text_start) then l_line := l_line || l_remaining; exit scan_line; - -- Regular string literal start: keep it, scan forward for closing quote, handle '' escaped quotes properly by skipping them and keep scanning else -- scan forward continuously to handle '' escaped quotes @@ -820,20 +806,17 @@ create or replace package body ut_utils is end loop; if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end); + l_line := l_line || substr(l_remaining, 1, l_end); l_remaining := substr(l_remaining, l_end + 1); else l_line := l_line || l_remaining; exit scan_line; end if; - end if; + end if; end loop scan_line; - l_result(i) := l_line; - - end loop process_lines; - + end loop; return l_result; end replace_multiline_comments; @@ -895,7 +878,7 @@ create or replace package body ut_utils is and (l_escaped_text_start < l_comment_start or l_comment_start = 0) and (l_escaped_text_start < l_text_start or l_text_start = 0) then --translate char "[" from the start of quoted text "q'[someting]'" into "]" - l_escaped_text_end_char := translate(substr(a_source, l_escaped_text_start + 2, 1),l_open_chars,l_close_chars); + l_escaped_text_end_char := translate(substr(a_source, l_escaped_text_start + 2, 1),gc_open_chars,gc_close_chars); l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); if l_end > 0 then l_end := l_end + 2; From f82a3b556c2a5a64c196f0fb1a7b22b77999079b Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:50:31 +0000 Subject: [PATCH 099/144] Cleanup --- source/core/ut_utils.pkb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index b525ca7d8..ffce364ae 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -25,7 +25,8 @@ create or replace package body ut_utils is gc_owner_hash constant integer(11) := dbms_utility.get_hash_value( ut_owner(), 0, power(2,31)-1); gc_open_chars constant varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( gc_close_chars constant varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> - + gc_max_plsql_source_len constant integer := 32767; + function surround_with(a_value varchar2, a_quote_char varchar2) return varchar2 is begin return case when a_quote_char is not null then a_quote_char||a_value||a_quote_char else a_value end; @@ -677,8 +678,6 @@ create or replace package body ut_utils is l_token_count binary_integer; l_has_ml_comment boolean := false; begin - - -- Guard: empty source if a_source.count = 0 then return a_source; end if; @@ -747,10 +746,10 @@ create or replace package body ut_utils is l_pos := greatest(l_ml_start, l_comment_start, l_text_start, l_eq_text_start); else l_pos := least( - case when l_ml_start > 0 then l_ml_start else 32767 end, - case when l_comment_start > 0 then l_comment_start else 32767 end, - case when l_text_start > 0 then l_text_start else 32767 end, - case when l_eq_text_start > 0 then l_eq_text_start else 32767 end + case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, + case when l_comment_start > 0 then l_comment_start else gc_max_plsql_source_len end, + case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, + case when l_eq_text_start > 0 then l_eq_text_start else gc_max_plsql_source_len end ); end if; From 934df679122110a3bf23634d325065d585b1bf00 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 01:55:50 +0000 Subject: [PATCH 100/144] Optimization fiurther --- source/core/ut_utils.pkb | 101 +++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 56 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index ffce364ae..f62e10aa2 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -675,14 +675,13 @@ create or replace package body ut_utils is l_eq_end_char varchar2(1 char); l_pos binary_integer; l_end binary_integer; - l_token_count binary_integer; - l_has_ml_comment boolean := false; + l_has_ml_comment boolean := false; begin if a_source.count = 0 then return a_source; end if; - -- Fast pre-scan: check if any /* exists at all if not, nothing to do — return source as-is + -- Fast pre-scan to check for presence of multi-line comments; if none, return original source unmodified for i in 1 .. a_source.count loop if instr(a_source(i), '/*') > 0 then l_has_ml_comment := true; @@ -697,20 +696,20 @@ create or replace package body ut_utils is for i in 1 .. a_source.count loop l_line := a_source(i); - -- Fast path: currently inside a multi-line comment, look only for closing */ + -- Fast path: inside multi-line comment if l_in_ml_comment then l_ml_end := instr(l_line, '*/'); if l_ml_end > 0 then l_in_ml_comment := false; l_line := substr(l_line, l_ml_end + 2); - -- fall through to normal scan of remainder of line, in case there are more /* comments on the same line + -- fall through to normal scan else l_result(i) := ''; continue; end if; end if; - -- Fast path: no special tokens on this line at all, just copy it to result and move on + -- Fast path: no special tokens on this line if instr(l_line, '/') = 0 and instr(l_line, '-') = 0 and instr(l_line, '''') = 0 @@ -719,7 +718,7 @@ create or replace package body ut_utils is continue; end if; - -- Normal scan: consume one token at a time, advance l_remaining until end of line + -- Normal scan l_remaining := l_line; l_line := null; @@ -729,83 +728,71 @@ create or replace package body ut_utils is l_ml_start := instr(l_remaining, '/*'); l_comment_start := instr(l_remaining, '--'); l_text_start := instr(l_remaining, ''''); - -- only search for q' if ' was found — q' always contains ' and would be misidentified otherwise - l_eq_text_start := case when l_text_start > 0 then instr(l_remaining, 'q''') else 0 end; - -- count how many tokens are present to decide if we can skip LEAST/GREATEST and just use the one that is present - l_token_count := sign(l_ml_start) + sign(l_comment_start) - + sign(l_text_start) + sign(l_eq_text_start); - - -- no special tokens left — consume remainder and stop scanning this line - if l_token_count = 0 then + -- q' always puts ' at l_text_start; just check the char immediately before it + l_eq_text_start := case + when l_text_start > 1 and substr(l_remaining, l_text_start - 1, 1) = 'q' + then l_text_start - 1 + else 0 + end; + -- Sentinel gc_max_plsql_source_len means "not present"; 32767 is beyond any VARCHAR2 position + l_pos := least( + case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, + case when l_comment_start > 0 then l_comment_start else gc_max_plsql_source_len end, + case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, + case when l_eq_text_start > 0 then l_eq_text_start else gc_max_plsql_source_len end + ); + + if l_pos = gc_max_plsql_source_len then l_line := l_line || l_remaining; exit scan_line; end if; - -- only one token present — skip LEAST, use GREATEST to find it since 0 means not present and any positive value is a valid position - if l_token_count = 1 then - l_pos := greatest(l_ml_start, l_comment_start, l_text_start, l_eq_text_start); - else - l_pos := least( - case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, - case when l_comment_start > 0 then l_comment_start else gc_max_plsql_source_len end, - case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, - case when l_eq_text_start > 0 then l_eq_text_start else gc_max_plsql_source_len end - ); - end if; - - -- q-quoted string: checked before plain quote because q' contains ' and would be misidentified - if l_pos = l_eq_text_start - and (l_ml_start = 0 or l_eq_text_start < l_ml_start) - and (l_comment_start = 0 or l_eq_text_start < l_comment_start) - and (l_text_start = 0 or l_eq_text_start < l_text_start) - then - l_eq_end_char := translate(substr(l_remaining, l_eq_text_start + 2, 1),gc_open_chars,gc_close_chars); - l_end := instr(l_remaining, l_eq_end_char || '''', l_eq_text_start + 3); + l_line := l_line || substr(l_remaining, 1, l_pos - 1); + l_remaining := substr(l_remaining, l_pos); + -- l_remaining now starts exactly at the token; all branch offsets below are relative to 1 + if l_pos = l_eq_text_start then + -- q-quoted string: l_remaining starts at 'q', delimiter is at position 3 + l_eq_end_char := translate(substr(l_remaining, 3, 1), gc_open_chars, gc_close_chars); + l_end := instr(l_remaining, l_eq_end_char || '''', 4); if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end + 1); + l_line := l_line || substr(l_remaining, 1, l_end + 1); l_remaining := substr(l_remaining, l_end + 2); else l_line := l_line || l_remaining; exit scan_line; end if; - -- Multi-line comment start: skip it, look for end of comment, continue scanning line after it - elsif l_pos = l_ml_start - and (l_comment_start = 0 or l_ml_start < l_comment_start) - and (l_text_start = 0 or l_ml_start < l_text_start) - and (l_eq_text_start = 0 or l_ml_start < l_eq_text_start) - then - l_line := l_line || substr(l_remaining, 1, l_ml_start - 1); - l_ml_end := instr(l_remaining, '*/', l_ml_start + 2); + + elsif l_pos = l_ml_start then + -- Multi-line comment: l_remaining starts at '/*', so end search starts at 3 + l_ml_end := instr(l_remaining, '*/', 3); if l_ml_end > 0 then l_remaining := substr(l_remaining, l_ml_end + 2); else l_in_ml_comment := true; exit scan_line; end if; - -- Single-line comment: keep it, stop scanning this line since everything after -- is comment anyway - elsif l_pos = l_comment_start - and (l_ml_start = 0 or l_comment_start < l_ml_start) - and (l_text_start = 0 or l_comment_start < l_text_start) - and (l_eq_text_start = 0 or l_comment_start < l_eq_text_start) - then + + elsif l_pos = l_comment_start then + -- Single-line comment: everything from here is comment, keep and stop l_line := l_line || l_remaining; exit scan_line; - -- Regular string literal start: keep it, scan forward for closing quote, handle '' escaped quotes properly by skipping them and keep scanning + else - -- scan forward continuously to handle '' escaped quotes - l_end := l_text_start + 1; + -- Regular string literal: l_remaining starts at the opening quote + -- scan from position 2 to skip the opening quote + l_end := 2; loop l_end := instr(l_remaining, '''', l_end); exit when l_end = 0; if substr(l_remaining, l_end, 2) = '''''' then - l_end := l_end + 2; -- skip escaped quote, keep scanning + l_end := l_end + 2; -- skip escaped quote pair else - exit; -- found real closing quote + exit; -- real closing quote end if; end loop; if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end); + l_line := l_line || substr(l_remaining, 1, l_end); l_remaining := substr(l_remaining, l_end + 1); else l_line := l_line || l_remaining; @@ -814,8 +801,10 @@ create or replace package body ut_utils is end if; end loop scan_line; + l_result(i) := l_line; end loop; + return l_result; end replace_multiline_comments; From 65145c2381762d2f0acf0ffe3aab602b86273c31 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 02:02:44 +0000 Subject: [PATCH 101/144] Trim spaces --- source/core/ut_utils.pkb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index f62e10aa2..5501d6c9f 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -725,9 +725,9 @@ create or replace package body ut_utils is <> loop exit when l_remaining is null or l_remaining = ''; - l_ml_start := instr(l_remaining, '/*'); + l_ml_start := instr(l_remaining, '/*'); l_comment_start := instr(l_remaining, '--'); - l_text_start := instr(l_remaining, ''''); + l_text_start := instr(l_remaining, ''''); -- q' always puts ' at l_text_start; just check the char immediately before it l_eq_text_start := case when l_text_start > 1 and substr(l_remaining, l_text_start - 1, 1) = 'q' @@ -736,9 +736,9 @@ create or replace package body ut_utils is end; -- Sentinel gc_max_plsql_source_len means "not present"; 32767 is beyond any VARCHAR2 position l_pos := least( - case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, + case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, case when l_comment_start > 0 then l_comment_start else gc_max_plsql_source_len end, - case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, + case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, case when l_eq_text_start > 0 then l_eq_text_start else gc_max_plsql_source_len end ); @@ -747,7 +747,7 @@ create or replace package body ut_utils is exit scan_line; end if; - l_line := l_line || substr(l_remaining, 1, l_pos - 1); + l_line := l_line || substr(l_remaining, 1, l_pos - 1); l_remaining := substr(l_remaining, l_pos); -- l_remaining now starts exactly at the token; all branch offsets below are relative to 1 if l_pos = l_eq_text_start then @@ -755,7 +755,7 @@ create or replace package body ut_utils is l_eq_end_char := translate(substr(l_remaining, 3, 1), gc_open_chars, gc_close_chars); l_end := instr(l_remaining, l_eq_end_char || '''', 4); if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end + 1); + l_line := l_line || substr(l_remaining, 1, l_end + 1); l_remaining := substr(l_remaining, l_end + 2); else l_line := l_line || l_remaining; @@ -792,7 +792,7 @@ create or replace package body ut_utils is end loop; if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end); + l_line := l_line || substr(l_remaining, 1, l_end); l_remaining := substr(l_remaining, l_end + 1); else l_line := l_line || l_remaining; From 2c8811d6a429d10fc1b026ec73ca0e3da1f2d6da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 15 Mar 2026 12:55:59 +0200 Subject: [PATCH 102/144] Added tests to reproduce the issue. --- test/run_tests.sh | 2 ++ test/ut3_tester/core/test_suite_manager.pks | 2 +- test/ut3_tester_helper/run_helper.pkb | 11 +++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/test/run_tests.sh b/test/run_tests.sh index 9f69bd1a1..7d0431aec 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,6 +4,8 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" +export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 + time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ diff --git a/test/ut3_tester/core/test_suite_manager.pks b/test/ut3_tester/core/test_suite_manager.pks index ac7818f4f..44f102716 100644 --- a/test/ut3_tester/core/test_suite_manager.pks +++ b/test/ut3_tester/core/test_suite_manager.pks @@ -163,7 +163,7 @@ create or replace package test_suite_manager is --%context(get_schema_ut_packages) - --%test(returns list of all unit test packages in given schema) + --%test(returns list of all unit test packages in given schema excluding packages that are not suites) --%beforetest(create_ut3_suite) --%aftertest(drop_ut3_suite) procedure test_get_schema_ut_packages; diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 6289b1642..9d65d6667 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -855,12 +855,23 @@ create or replace package body run_helper is --%test procedure some_test; + end;]'; + execute immediate q'[ + create or replace package ut3_develop.package_that_is_not_a_test + as + --%parameter(a comment inside) + --%parameters( description ) + + --%test + procedure some_test; + end;]'; end; procedure drop_ut3_suite is pragma autonomous_transaction; begin + execute immediate q'[drop package ut3_develop.package_that_is_not_a_test]'; execute immediate q'[drop package ut3_develop.some_test_package]'; end; From f3c0d3f288404b952b8960e93b574342228de09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 15 Mar 2026 13:12:37 +0200 Subject: [PATCH 103/144] Fixed the problem where `suite_cache_package` and `suite_cache_schema` are getting populated even package is not a suite. --- source/core/ut_suite_cache_manager.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 6d621c339..e5fdae7ac 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -306,7 +306,7 @@ create or replace package body ut_suite_cache_manager is l_object_owner varchar2(250) := upper(a_object_owner); l_object_name varchar2(250) := upper(a_object_name); begin - if a_suite_items is not null and a_suite_items.count = 0 then + if a_suite_items is null or a_suite_items.count = 0 then delete from ut_suite_cache t where t.object_owner = l_object_owner From 810517930f5e7310ebc45a48cf23e0558da66e97 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 14:17:46 +0000 Subject: [PATCH 104/144] Added extra tests. Added example --- test/ut3_tester/core/annotations/test_annotation_parser.pks | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index a4fe3ed70..898bdc363 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -20,7 +20,7 @@ create or replace package test_annotation_parser is --%test(Ignores content of multi-line comments) procedure ignore_annotations_in_comments; - --%test(Ignores wrapped package and does not raise exception) + -- %test(ignore wrapped package source) procedure ignore_wrapped_package; --%test(Parses package level annotations with annotation params containing brackets) @@ -32,7 +32,7 @@ create or replace package test_annotation_parser is -- %test(Parses source-code with Windows-style newline) procedure test_windows_newline; - -- %test(Parses annotations with very long object names) + -- %test(parse annotations with very long procedure name) procedure test_annot_very_long_name; -- %test(Parses upper case annotations) From cc491cfb2e259d6c5160f986fa7f4812664c1db0 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 14:17:58 +0000 Subject: [PATCH 105/144] Enhance annotation parser with new tests and source line handling functions --- .../annotation_parser_test.sql | 298 +++++++++++++ .../create_test_packages.sql | 185 ++++++++ source/core/ut_utils.pkb | 6 +- .../annotations/test_annotation_parser.pkb | 404 +++++++++++++++++- .../annotations/test_annotation_parser.pks | 46 +- 5 files changed, 930 insertions(+), 9 deletions(-) create mode 100644 examples/annoation_parser_testing/annotation_parser_test.sql create mode 100644 examples/annoation_parser_testing/create_test_packages.sql diff --git a/examples/annoation_parser_testing/annotation_parser_test.sql b/examples/annoation_parser_testing/annotation_parser_test.sql new file mode 100644 index 000000000..d1ff43fcd --- /dev/null +++ b/examples/annoation_parser_testing/annotation_parser_test.sql @@ -0,0 +1,298 @@ +-- Annotation Manager Volume Benchmark +-- 1000 generated packages, cold cache per iteration + +set serveroutput on size unlimited +set timing off +set feedback off + +declare + c_packages constant pls_integer := 1000; + c_procs_per_pkg constant pls_integer := 20; + c_contexts_per_pkg constant pls_integer := 4; + c_pkg_prefix constant varchar2(20) := 'TST_GEN_PKG_'; + c_iterations constant pls_integer := 4; + c_perf_threshold constant number := 0.80; + + l_baseline_total_ms number := 0; + l_new_total_ms number := 0; + l_start timestamp; + l_elapsed interval day to second; + + -- Source holders + l_source_lines dbms_preprocessor.source_lines_t; + l_source_clob clob; + l_result ut_annotations; + + -- Correctness tracking + l_missing_from_cache pls_integer := 0; + l_count_mismatches pls_integer := 0; + l_mismatch_detail varchar2(32767); + + -- Cache check + l_cursor sys_refcursor; + l_annotated_obj ut_annotated_object; + l_name varchar2(128); + l_annotations ut_annotations; + l_cache_count pls_integer := 0; + + -- Per-package timing + l_pkg_baseline_ms number; + l_pkg_new_ms number; + l_pkg varchar2(30); + l_ratio number; + + -- Expected annotation count — mirrors generator logic exactly + function expected_annotation_count( + a_pkg_number pls_integer, + a_procs pls_integer, + a_contexts pls_integer + ) return pls_integer is + l_count pls_integer := 0; + begin + l_count := l_count + 2; -- %suite + %suitepath + l_count := l_count + 2; -- %beforeall + %afterall + l_count := l_count + 2; -- %beforeeach + %aftereach + + -- package level conditional + if mod(a_pkg_number, 3) = 0 then l_count := l_count + 1; end if; -- %displayname + if mod(a_pkg_number, 5) = 0 then l_count := l_count + 1; end if; -- %rollback + + -- contexts: each contributes %context + %endcontext + l_count := l_count + (a_contexts * 2); + + -- per procedure + for i in 1 .. a_procs loop + l_count := l_count + 1; -- %test + if mod(i, 3) = 0 then l_count := l_count + 1; end if; -- %tags + if mod(i, 6) = 0 then l_count := l_count + 1; end if; -- %throws + if mod(i, 8) = 0 then l_count := l_count + 1; end if; -- %disabled + if mod(i, 5) = 0 then l_count := l_count + 2; end if; -- %beforetest + %aftertest + end loop; + + return l_count; + end expected_annotation_count; + +begin + dbms_output.put_line('Packages : ' || c_packages); + dbms_output.put_line('Procs/pkg : ' || c_procs_per_pkg); + dbms_output.put_line('Contexts/pkg: ' || c_contexts_per_pkg); + dbms_output.put_line('Iterations : ' || c_iterations); + dbms_output.put_line('Started : ' || to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS.FF3')); + + -- Phase 1: Performance benchmark (cold cache per package per iteration) + dbms_output.put_line(chr(10) || '-- Phase 1: Performance --'); + dbms_output.put_line( + rpad('package', 20) || ' | ' || + lpad('baseline_ms', 11) || ' | ' || + lpad('new_ms', 6) || ' | ' || + lpad('ratio', 5) || ' | ' || + 'status' + ); + dbms_output.put_line(rpad('-', 70, '-')); + + for p in 1 .. c_packages loop + l_pkg := c_pkg_prefix || lpad(p, 4, '0'); + + -- load source once per package + l_source_lines := dbms_preprocessor.get_post_processed_source( + object_type => 'PACKAGE', + schema_name => user, + object_name => l_pkg + ); + + dbms_lob.createtemporary(l_source_clob, true); + for i in 1 .. l_source_lines.count loop + dbms_lob.writeappend(l_source_clob, length(l_source_lines(i)), l_source_lines(i)); + end loop; + + -- baseline: clob version + l_pkg_baseline_ms := 0; + for iter in 1 .. c_iterations loop + ut_annotation_manager.purge_cache(user, 'PACKAGE'); + l_start := systimestamp; + l_result := ut_annotation_parser.parse_object_annotations(l_source_clob); + l_elapsed := systimestamp - l_start; + l_pkg_baseline_ms := l_pkg_baseline_ms + + extract(second from l_elapsed) * 1000; + end loop; + l_pkg_baseline_ms := l_pkg_baseline_ms / c_iterations; + + -- new: source_lines_t version + l_pkg_new_ms := 0; + for iter in 1 .. c_iterations loop + ut_annotation_manager.purge_cache(user, 'PACKAGE'); + l_start := systimestamp; + l_result := ut_annotation_parser.parse_object_annotations(l_source_lines); + l_elapsed := systimestamp - l_start; + l_pkg_new_ms := l_pkg_new_ms + + extract(second from l_elapsed) * 1000; + end loop; + l_pkg_new_ms := l_pkg_new_ms / c_iterations; + + -- accumulate + l_baseline_total_ms := l_baseline_total_ms + l_pkg_baseline_ms; + l_new_total_ms := l_new_total_ms + l_pkg_new_ms; + + l_ratio := round(l_pkg_new_ms / nullif(l_pkg_baseline_ms, 0), 3); + + -- print every 100 packages to avoid flooding output + if mod(p, 100) = 0 or p = 1 then + dbms_output.put_line( + rpad(l_pkg, 20) || ' | ' || + lpad(round(l_pkg_baseline_ms, 3), 11) || ' | ' || + lpad(round(l_pkg_new_ms, 3), 6) || ' | ' || + lpad(l_ratio, 5) || ' | ' || + case when l_ratio <= c_perf_threshold + then 'PASS (' || round((1-l_ratio)*100,1) || '% faster)' + else 'SLOW (ratio=' || l_ratio || ')' + end + ); + end if; + + dbms_lob.freetemporary(l_source_clob); + end loop; + + -- ------------------------------------------------------------------------- + -- Phase 1 summary + -- ------------------------------------------------------------------------- + l_ratio := round(l_new_total_ms / nullif(l_baseline_total_ms, 0), 3); + + dbms_output.put_line(rpad('-', 70, '-')); + dbms_output.put_line('Baseline total ms : ' || round(l_baseline_total_ms, 3)); + dbms_output.put_line('New total ms : ' || round(l_new_total_ms, 3)); + dbms_output.put_line('Overall ratio : ' || l_ratio); + dbms_output.put_line('Improvement : ' || round((1 - l_ratio) * 100, 1) || '%'); + + -- Phase 2: Cache presence check + dbms_output.put_line(chr(10) || '-- Phase 2: Cache presence --'); + + ut_annotation_manager.purge_cache(user, 'PACKAGE'); + ut_annotation_manager.rebuild_annotation_cache(user, 'PACKAGE'); + + -- query cache tables directly to avoid validate_annotation_cache side effects + open l_cursor for + select ut_annotated_object( + i.object_owner, i.object_name, i.object_type, i.parse_time, + cast( + collect( + ut_annotation( + c.annotation_position, c.annotation_name, + c.annotation_text, c.subobject_name + ) order by c.annotation_position + ) as ut_annotations + ) + ) + from ut_annotation_cache_info i + join ut_annotation_cache c on i.cache_id = c.cache_id + where i.object_owner = user + and i.object_type = 'PACKAGE' + and i.object_name like c_pkg_prefix || '%' + group by i.object_owner, i.object_type, i.object_name, i.parse_time; + + loop + fetch l_cursor into l_annotated_obj; + exit when l_cursor%notfound; + l_cache_count := l_cache_count + 1; + end loop; + close l_cursor; + + dbms_output.put_line('Expected in cache : ' || c_packages); + dbms_output.put_line('Found in cache : ' || l_cache_count); + dbms_output.put_line('Cache check : ' || + case when l_cache_count = c_packages + then 'PASS — all ' || c_packages || ' packages found in cache' + else 'FAIL — missing ' || (c_packages - l_cache_count) || ' packages from cache' + end + ); + + -- Phase 3: Annotation count correctness + dbms_output.put_line(chr(10) || '-- Phase 3: Annotation count correctness --'); + + -- reopen same direct cache query for correctness check + open l_cursor for + select ut_annotated_object( + i.object_owner, i.object_name, i.object_type, i.parse_time, + cast( + collect( + ut_annotation( + c.annotation_position, c.annotation_name, + c.annotation_text, c.subobject_name + ) order by c.annotation_position + ) as ut_annotations + ) + ) + from ut_annotation_cache_info i + join ut_annotation_cache c on i.cache_id = c.cache_id + where i.object_owner = user + and i.object_type = 'PACKAGE' + and i.object_name like c_pkg_prefix || '%' + group by i.object_owner, i.object_type, i.object_name, i.parse_time; + + loop + fetch l_cursor into l_annotated_obj; + exit when l_cursor%notfound; + l_name := l_annotated_obj.object_name; + l_annotations := l_annotated_obj.annotations; + + declare + l_pkg_number pls_integer; + l_expected pls_integer; + begin + l_pkg_number := to_number(substr(l_name, length(c_pkg_prefix) + 1)); + l_expected := expected_annotation_count( + l_pkg_number, + c_procs_per_pkg, + c_contexts_per_pkg + ); + + if l_annotations.count != l_expected then + l_count_mismatches := l_count_mismatches + 1; + if l_count_mismatches <= 10 then + l_mismatch_detail := l_mismatch_detail || chr(10) || + ' ' || l_name || + ': expected=' || l_expected || + ' actual=' || l_annotations.count; + end if; + end if; + end; + end loop; + close l_cursor; + + dbms_output.put_line('Packages checked : ' || c_packages); + dbms_output.put_line('Count mismatches : ' || l_count_mismatches); + if l_count_mismatches > 0 then + dbms_output.put_line('Mismatch detail (first 10):' || l_mismatch_detail); + end if; + dbms_output.put_line('Count check : ' || + case when l_count_mismatches = 0 + then 'PASS — all annotation counts match expected' + else 'FAIL — ' || l_count_mismatches || ' packages have wrong annotation count' + end + ); + + dbms_output.put_line(chr(10) || '================================================='); + dbms_output.put_line('FINAL RESULTS'); + dbms_output.put_line('================================================='); + dbms_output.put_line('Performance : ' || + case when l_ratio <= c_perf_threshold then 'PASS' else 'FAIL' end); + dbms_output.put_line('Cache : ' || + case when l_cache_count = c_packages then 'PASS' else 'FAIL' end); + dbms_output.put_line('Counts : ' || + case when l_count_mismatches = 0 then 'PASS' else 'FAIL' end); + dbms_output.put_line('Overall : ' || + case when l_ratio <= c_perf_threshold + and l_cache_count = c_packages + and l_count_mismatches = 0 + then 'PASS' + else 'FAIL' + end + ); + dbms_output.put_line('Finished : ' || + to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS.FF3')); + dbms_output.put_line('================================================='); + + -- cleanup + ut_annotation_manager.purge_cache(user, 'PACKAGE'); + +end; +/ diff --git a/examples/annoation_parser_testing/create_test_packages.sql b/examples/annoation_parser_testing/create_test_packages.sql new file mode 100644 index 000000000..94a7f3de2 --- /dev/null +++ b/examples/annoation_parser_testing/create_test_packages.sql @@ -0,0 +1,185 @@ +declare + c_packages constant pls_integer := 1000; + c_procs_per_pkg constant pls_integer := 20; + + l_spec varchar2(32767); + l_body varchar2(32767); + l_pkg varchar2(30); + l_errors pls_integer := 0; + + procedure append_to_source(a_source in out nocopy varchar2, a_text varchar2) is + begin + a_source := a_source || a_text; + end; + + procedure append_line(a_source in out nocopy varchar2, a_text varchar2 default null) is + begin + a_source := a_source || a_text || chr(10); + end; + +begin + + for r in ( + select object_name + from user_objects + where object_name like 'TST_GEN_PKG_%' + and object_type = 'PACKAGE' + order by object_name + ) loop + begin + execute immediate 'drop package ' || r.object_name; + exception + when others then + dbms_output.put_line('ERROR dropping ' || r.object_name || ': ' || sqlerrm); + end; + end loop; + dbms_output.put_line('Existing packages dropped.'); + + for p in 1 .. c_packages loop + l_pkg := 'TST_GEN_PKG_' || lpad(p, 4, '0'); + l_spec := null; + l_body := null; + + -- Package spec + append_line(l_spec, 'create or replace package ' || l_pkg || ' as'); + append_line(l_spec); + append_line(l_spec, ' --%suite(Generated suite ' || p || ')'); + append_line(l_spec, ' --%suitepath(generated.vol_test)'); + + if mod(p, 3) = 0 then + append_line(l_spec, ' --%displayname(Suite display name for pkg ' || p || ')'); + end if; + if mod(p, 5) = 0 then + append_line(l_spec, ' --%rollback(manual)'); + end if; + + append_line(l_spec); + append_line(l_spec, ' --%beforeall'); + append_line(l_spec, ' procedure setup_suite;'); + append_line(l_spec); + append_line(l_spec, ' --%afterall'); + append_line(l_spec, ' procedure teardown_suite;'); + append_line(l_spec); + append_line(l_spec, ' --%beforeeach'); + append_line(l_spec, ' procedure setup_test;'); + append_line(l_spec); + append_line(l_spec, ' --%aftereach'); + append_line(l_spec, ' procedure teardown_test;'); + append_line(l_spec); + + for i in 1 .. c_procs_per_pkg loop + declare + l_proc varchar2(30) := 'test_proc_' || lpad(i, 3, '0'); + begin + if mod(i - 1, 5) = 0 then + append_line(l_spec, ' --%context(context_' || ceil(i/5) || ')'); + append_line(l_spec); + end if; + + if mod(i, 4) = 0 then + append_line(l_spec, ' /* multi-line comment for ' || l_proc || ' */'); + end if; + + append_line(l_spec, ' --%test(Test ' || i || ' in pkg ' || p || ')'); + + if mod(i, 3) = 0 then + append_line(l_spec, ' --%tags(tag_' || mod(i,5) || ',smoke)'); + end if; + if mod(i, 6) = 0 then + append_line(l_spec, ' --%throws(-20001)'); + end if; + if mod(i, 8) = 0 then + append_line(l_spec, ' --%disabled(generated disabled test ' || i || ')'); + end if; + if mod(i, 5) = 0 then + append_line(l_spec, ' --%beforetest(setup_test)'); + append_line(l_spec, ' --%aftertest(teardown_test)'); + end if; + + append_line(l_spec, ' -- regular comment'); + append_line(l_spec, ' procedure ' || l_proc || ';'); + append_line(l_spec); + + if mod(i, 5) = 0 then + append_line(l_spec, ' --%endcontext'); + append_line(l_spec); + end if; + end; + end loop; + + append_line(l_spec, 'end ' || l_pkg || ';'); + + -- ----------------------------------------------------------------------- + -- Package body + -- ----------------------------------------------------------------------- + append_line(l_body, 'create or replace package body ' || l_pkg || ' as'); + append_line(l_body); + + for stub in ( + select column_value as proc_name + from table(ut_varchar2_list( + 'setup_suite','teardown_suite', + 'setup_test','teardown_test' + )) + ) loop + append_line(l_body, ' procedure ' || stub.proc_name || ' is'); + append_line(l_body, ' begin'); + append_line(l_body, ' null;'); + append_line(l_body, ' end ' || stub.proc_name || ';'); + append_line(l_body); + end loop; + + for i in 1 .. c_procs_per_pkg loop + declare + l_proc varchar2(30) := 'test_proc_' || lpad(i, 3, '0'); + begin + append_line(l_body, ' procedure ' || l_proc || ' is'); + append_line(l_body, ' begin'); + if mod(i, 4) = 0 then + append_line(l_body, ' ut.expect(''/* not a comment */'').to_equal(''/* not a comment */'');'); + elsif mod(i, 4) = 1 then + append_line(l_body, ' ut.expect(' || i || ').to_be_greater_than(0);'); + elsif mod(i, 4) = 2 then + append_line(l_body, ' ut.expect(q''[-- not a comment]'').to_equal(q''[-- not a comment]'');'); + else + append_line(l_body, ' ut.expect(''test_' || i || ''').not_to_be_null();'); + end if; + append_line(l_body, ' end ' || l_proc || ';'); + append_line(l_body); + end; + end loop; + + append_line(l_body, 'end ' || l_pkg || ';'); + + -- Execute DDL — with error capture so one bad package doesn't stop all + begin + execute immediate l_spec; + execute immediate l_body; + exception + when others then + l_errors := l_errors + 1; + dbms_output.put_line('ERROR on ' || l_pkg || ': ' || sqlerrm); + end; + + if mod(p, 100) = 0 then + dbms_output.put_line('Created ' || p || ' packages...'); + end if; + + end loop; + + dbms_output.put_line('----------------------------------------'); + dbms_output.put_line('Done. packages=' || c_packages || + ' errors=' || l_errors); + + -- quick sanity check + declare + l_count pls_integer; + begin + select count(*) into l_count + from user_objects + where object_name like 'TST_GEN_PKG_%' + and object_type = 'PACKAGE'; + dbms_output.put_line('Packages in user_objects: ' || l_count); + end; +end; +/ diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 5501d6c9f..92c47c301 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -769,6 +769,10 @@ create or replace package body ut_utils is l_remaining := substr(l_remaining, l_ml_end + 2); else l_in_ml_comment := true; + -- preserve trailing newline if present — it belongs to this line, not the comment + if substr(l_remaining, -1) = chr(10) then + l_line := l_line || chr(10); + end if; exit scan_line; end if; @@ -1175,4 +1179,4 @@ create or replace package body ut_utils is end; end ut_utils; -/ \ No newline at end of file +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pkb b/test/ut3_tester/core/annotations/test_annotation_parser.pkb index bc789c377..34aa51383 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pkb @@ -1,5 +1,23 @@ create or replace package body test_annotation_parser is + function lines_to_str(a_lines dbms_preprocessor.source_lines_t) return varchar2 is + l_result varchar2(32767); + begin + for i in 1 .. a_lines.count loop + l_result := l_result || a_lines(i); + end loop; + return l_result; + end; + + function make_source(a_lines ut_varchar2_list) return dbms_preprocessor.source_lines_t is + l_result dbms_preprocessor.source_lines_t; + begin + for i in 1 .. a_lines.count loop + l_result(i) := a_lines(i); + end loop; + return l_result; + end; + procedure test_proc_comments is l_source clob; l_actual ut3_develop.ut_annotations; @@ -457,5 +475,389 @@ END;'; end; + ------------------------------------------------------------ + -- source_lines_t overload equivalents of existing tests + ------------------------------------------------------------ + + procedure test_proc_comments_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' -- %ann1(Name of suite)' || chr(10), + ' -- wrong line' || chr(10), + ' -- %ann2(some_value)' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation(2,'suite',null, null), + ut3_develop.ut_annotation(3,'displayname','Name of suite',null), + ut3_develop.ut_annotation(4,'suitepath','all.globaltests',null), + ut3_develop.ut_annotation(6,'ann1','Name of suite',null), + ut3_develop.ut_annotation(8,'ann2','some_value','foo') + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure include_floating_annotations_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' -- %ann1(Name of suite)' || chr(10), + ' -- %ann2(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure foo;' || chr(10), + '' || chr(10), + ' -- %ann3(Name of suite)' || chr(10), + ' -- %ann4(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure bar;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3_develop.ut_annotation( 6, 'ann1', 'Name of suite', null ), + ut3_develop.ut_annotation( 7, 'ann2', 'all.globaltests', null ), + ut3_develop.ut_annotation( 9, 'test', null, 'foo'), + ut3_develop.ut_annotation( 12, 'ann3', 'Name of suite', null ), + ut3_develop.ut_annotation( 13, 'ann4', 'all.globaltests', null ), + ut3_develop.ut_annotation( 15, 'test', null, 'bar') + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure ignore_annotations_in_comments_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' /*' || chr(10), + ' Some comment' || chr(10), + ' -- inlined' || chr(10), + ' -- %ignored' || chr(10), + ' */' || chr(10), + ' -- %suite' || chr(10), + ' --%displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 7, 'suite', null, null ), + ut3_develop.ut_annotation( 8, 'displayname', 'Name of suite', null ), + ut3_develop.ut_annotation( 9, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure no_procedure_annotation_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + ------------------------------------------------------------ + -- replace_multiline_comments coverage tests + ------------------------------------------------------------ + + procedure test_rmc_empty_source is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result.count).to_equal(0); + end; + + procedure test_rmc_no_ml_comment_marker is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'procedure foo is' || chr(10), + 'begin' || chr(10), + ' null;' || chr(10), + 'end;' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(lines_to_str(l_result)).to_equal(lines_to_str(l_input)); + end; + + procedure test_rmc_line_inside_ml_comment is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'x := 1; /* start' || chr(10), + 'this whole line is comment' || chr(10), + 'end comment */ x := 2;' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('x := 1; ' || chr(10)); + ut.expect(l_result(2)).to_equal(''); + ut.expect(l_result(3)).to_equal(' x := 2;' || chr(10)); + end; + + procedure test_rmc_ml_comment_closed_midline is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + '/* open' || chr(10), + 'still inside' || chr(10), + '*/ code /* remove this too */ kept' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(2)).to_equal(''); + ut.expect(l_result(3)).to_equal(' code kept' || chr(10)); + end; + + procedure test_rmc_fast_path_no_tokens is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + -- line 2 has none of / - ' so hits fast path B; line 1 needed to pass pre-scan + l_input := make_source(ut_varchar2_list( + '/* comment */' || chr(10), + 'begin' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(2)).to_equal('begin' || chr(10)); + end; + + procedure test_rmc_ml_comment_single_line is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'x := /* inline comment */ 42;' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('x := 42;' || chr(10)); + end; + + procedure test_rmc_single_line_comment_preserved is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + '/* marker */' || chr(10), + ' -- %test annotation' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(2)).to_equal(' -- %test annotation' || chr(10)); + end; + + procedure test_rmc_string_literal_protects_markers is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'v := ''val /* not a comment */ here'';' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('v := ''val /* not a comment */ here'';' || chr(10)); + end; + + procedure test_rmc_string_literal_escaped_quotes is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'v := ''it''''s a /* test */'';' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('v := ''it''''s a /* test */'';' || chr(10)); + end; + + procedure test_rmc_q_quoted_string_literal is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'v := q''[/* not a comment */]'';' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('v := q''[/* not a comment */]'';' || chr(10)); + end; + + procedure test_rmc_unclosed_string_literal is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'v := ''hello /* inside unclosed' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('v := ''hello /* inside unclosed' || chr(10)); + end; + + procedure test_rmc_unclosed_q_string is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + c_line constant varchar2(100) := q'(v := q'[/* unclosed q-string)' || chr(10); + begin + --Arrange + l_input := make_source(ut_varchar2_list(c_line)); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal(c_line); + end; + + procedure test_rmc_multiple_ml_comments_one_line is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'a /* one */ := /* two */ 1;' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('a := 1;' || chr(10)); + end; + + procedure test_rmc_comment_after_string_with_slash is + l_input dbms_preprocessor.source_lines_t; + l_result dbms_preprocessor.source_lines_t; + begin + --Arrange + l_input := make_source(ut_varchar2_list( + 'v := ''a/b''; -- this is /* not */ a ml comment' || chr(10) + )); + + --Act + l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); + + --Assert + ut.expect(l_result(1)).to_equal('v := ''a/b''; -- this is /* not */ a ml comment' || chr(10)); + end; + end test_annotation_parser; -/ +/ \ No newline at end of file diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index 898bdc363..439974769 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -19,24 +19,56 @@ create or replace package test_annotation_parser is procedure complex_text; --%test(Ignores content of multi-line comments) procedure ignore_annotations_in_comments; - -- %test(ignore wrapped package source) procedure ignore_wrapped_package; - --%test(Parses package level annotations with annotation params containing brackets) procedure brackets_in_desc; - --%test(Parses annotation text even with spaces before brackets) procedure test_space_before_annot_params; - -- %test(Parses source-code with Windows-style newline) procedure test_windows_newline; - -- %test(parse annotations with very long procedure name) procedure test_annot_very_long_name; - -- %test(Parses upper case annotations) procedure test_upper_annot; + --%test(Treats procedure level annotations as package level using source lines overload) + procedure test_proc_comments_lines; + --%test(Includes floating annotations between procedures using source lines overload) + procedure include_floating_annotations_lines; + --%test(Ignores content of multi-line comments using source lines overload) + procedure ignore_annotations_in_comments_lines; + --%test(Parses package annotations without any procedure annotations using source lines overload) + procedure no_procedure_annotation_lines; + + -- %test(empty source returns immediately without processing) + procedure test_rmc_empty_source; + -- %test(source with no multiline comment markers returned unchanged) + procedure test_rmc_no_ml_comment_marker; + -- %test(line entirely inside multiline comment is blanked) + procedure test_rmc_line_inside_ml_comment; + -- %test(closing delimiter mid-line falls through to scan remainder) + procedure test_rmc_ml_comment_closed_midline; + -- %test(fast path line with no slash dash or quote copied unchanged) + procedure test_rmc_fast_path_no_tokens; + -- %test(single-line block comment removed on same line) + procedure test_rmc_ml_comment_single_line; + -- %test(single-line comment preserved intact) + procedure test_rmc_single_line_comment_preserved; + -- %test(string literal containing comment markers not stripped) + procedure test_rmc_string_literal_protects_markers; + -- %test(string literal with escaped quotes handled correctly) + procedure test_rmc_string_literal_escaped_quotes; + -- %test(q-quoted string literal protects interior comment markers) + procedure test_rmc_q_quoted_string_literal; + -- %test(unclosed string literal copies remainder and exits scan) + procedure test_rmc_unclosed_string_literal; + -- %test(unclosed q-quoted string copies remainder and exits scan) + procedure test_rmc_unclosed_q_string; + -- %test(multiple block comments on single line all removed) + procedure test_rmc_multiple_ml_comments_one_line; + -- %test(comment markers after string with slash handled correctly) + procedure test_rmc_comment_after_string_with_slash; + end test_annotation_parser; -/ +/ \ No newline at end of file From 6717ad3d645498481c117c97097f406acd5032ca Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 14:46:40 +0000 Subject: [PATCH 106/144] Add tests for Windows-style newlines and long procedure names in annotation parser --- .../annotations/test_annotation_parser.pkb | 60 +++++++++++++++++++ .../annotations/test_annotation_parser.pks | 5 ++ 2 files changed, 65 insertions(+) diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pkb b/test/ut3_tester/core/annotations/test_annotation_parser.pkb index 34aa51383..2ec0b2551 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pkb @@ -859,5 +859,65 @@ END;'; ut.expect(l_result(1)).to_equal('v := ''a/b''; -- this is /* not */ a ml comment' || chr(10)); end; +procedure test_windows_newline_lines + as + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(13) || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_annot_very_long_name_lines + as + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + l_source := make_source(ut_varchar2_list( + 'PACKAGE very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_did_it AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3_develop.ut_annotation( 6, 'test', null, 'very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it' ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + end test_annotation_parser; / \ No newline at end of file diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index 439974769..7b995b438 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -69,6 +69,11 @@ create or replace package test_annotation_parser is procedure test_rmc_multiple_ml_comments_one_line; -- %test(comment markers after string with slash handled correctly) procedure test_rmc_comment_after_string_with_slash; + --%test(Parses source-code with Windows-style newline using source lines overload) + procedure test_windows_newline_lines; + --%test(parse annotations with very long procedure name using source lines overload) + procedure test_annot_very_long_name_lines; + end test_annotation_parser; / \ No newline at end of file From 6c513bea386d9880250938818fc2fd3c8beae3d4 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 15:41:05 +0000 Subject: [PATCH 107/144] Fix regex extraction for procedure/function names and ensure ordered results in annotation processing --- source/core/annotations/ut_annotation_parser.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 8df89be28..cca422ec0 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -160,7 +160,7 @@ create or replace package body ut_annotation_parser as and regexp_like(l_line, '^\s*(procedure|function)\s+', 'i') then -- extract just the identifier name (subexpression 2) - l_proc_name := trim(regexp_substr(l_line + l_proc_name := trim(regexp_substr(srcstr =>l_line ,pattern => '^\s*(procedure|function)\s+('||gc_regexp_identifier||')' ,modifier => 'i' ,subexpression => 2)); @@ -310,7 +310,7 @@ create or replace package body ut_annotation_parser as l_comment_index := l_comments.next(l_comment_index); end loop; - select /*+ no_parallel */ value(x) bulk collect into l_result from table(l_annotations) x order by x.position; + select /*+ no_parallel */ value(x) bulk collect into l_result from table(l_annotations) x order by x.position asc; return l_result; From b389671cc77cf46004bffd6ad450f129e7a08f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 15 Mar 2026 20:53:43 +0200 Subject: [PATCH 108/144] Implementing github discussions --- .github/DISCUSSION_TEMPLATE/README.md | 150 ++++++++++++++++++ .github/DISCUSSION_TEMPLATE/announcements.yml | 54 +++++++ .github/DISCUSSION_TEMPLATE/architecture.yml | 100 ++++++++++++ .github/DISCUSSION_TEMPLATE/contributors.yml | 56 +++++++ .github/DISCUSSION_TEMPLATE/general.yml | 28 ++++ .github/DISCUSSION_TEMPLATE/q-a.yml | 87 ++++++++++ .../DISCUSSION_TEMPLATE/release-planning.yml | 90 +++++++++++ .github/DISCUSSION_TEMPLATE/rfcs-design.yml | 88 ++++++++++ .github/DISCUSSION_TEMPLATE/show-and-tell.yml | 79 +++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 2 +- docs/about/authors.md | 2 +- docs/about/project-details.md | 2 +- mkdocs.yml | 6 +- mkdocs_offline.yml | 4 +- readme.md | 7 +- 15 files changed, 742 insertions(+), 13 deletions(-) create mode 100644 .github/DISCUSSION_TEMPLATE/README.md create mode 100644 .github/DISCUSSION_TEMPLATE/announcements.yml create mode 100644 .github/DISCUSSION_TEMPLATE/architecture.yml create mode 100644 .github/DISCUSSION_TEMPLATE/contributors.yml create mode 100644 .github/DISCUSSION_TEMPLATE/general.yml create mode 100644 .github/DISCUSSION_TEMPLATE/q-a.yml create mode 100644 .github/DISCUSSION_TEMPLATE/release-planning.yml create mode 100644 .github/DISCUSSION_TEMPLATE/rfcs-design.yml create mode 100644 .github/DISCUSSION_TEMPLATE/show-and-tell.yml diff --git a/.github/DISCUSSION_TEMPLATE/README.md b/.github/DISCUSSION_TEMPLATE/README.md new file mode 100644 index 000000000..f6c0905f4 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/README.md @@ -0,0 +1,150 @@ +# GitHub Discussions — setup guide for utPLSQL/utPLSQL + +This folder contains the discussion category form templates that power structured +GitHub Discussions for the utPLSQL project. + +--- + +## File → category mapping + + + +| File | Category name to create in GitHub | Format | Who can post | +|------------------------|-----------------------------------|-----------------------|--------------------------------| +| `announcements.yml` | 📢 Announcements | Announcement | Maintainers only | +| `rfcs-design.yml` | 💡 RFCs & Design | Open-ended discussion | Everyone | +| `architecture.yml` | 🏗 Architecture | Open-ended discussion | Everyone | +| `release-planning.yml` | 🗓 Release Planning | Open-ended discussion | Maintainers only (recommended) | +| `q-a.yml` | ❓ Q&A | Question / Answer | Everyone | +| `show-and-tell.yml` | 🔬 Show & Tell | Open-ended discussion | Everyone | +| `contributors.yml` | 🤝 Contributors | Open-ended discussion | Everyone | +| `general.yml` | 💬 General | Open-ended discussion | Everyone | + +> **Polls** are a built-in GitHub Discussions type and do not support YAML templates. +> Create a 🗳 Polls category manually (type: Poll) — no template file needed. + +--- + +## Step-by-step setup + +### 1. Enable Discussions +Go to **Settings → Features** and check **Discussions**. + +### 2. Create the categories +Go to **Discussions → Categories → ✏️ Edit categories** (gear icon). + +Create each category listed in the table above. +**Order matters** — drag to set the display order shown below: + +1. 📢 Announcements +2. 💡 RFCs & Design +3. 🏗 Architecture +4. 🗓 Release Planning +5. ❓ Q&A +6. 🔬 Show & Tell +7. 🤝 Contributors +8. 🗳 Polls +9. 💬 General + +### 3. Commit the templates +Copy all `.yml` files from this folder into `.github/DISCUSSION_TEMPLATE/` in +the **default branch** (usually `develop` for utPLSQL). + +``` +.github/ +└── DISCUSSION_TEMPLATE/ + ├── announcements.yml + ├── rfcs-design.yml + ├── architecture.yml + ├── release-planning.yml + ├── q-a.yml + ├── show-and-tell.yml + ├── contributors.yml + └── general.yml +``` + +### 4. Configure category permissions + +| Category | Setting | +|------------------|--------------------------------------------------| +| Announcements | Set to **Maintainers only** in category settings | +| Release Planning | Recommended: **Maintainers only** | +| All others | Open to all | + +### 5. Create the welcome pinned post + +Create a first discussion in **Announcements** titled +**"Welcome to utPLSQL Discussions — how to use this space"** + +Suggested body: + +```markdown +## Welcome 👋 + +This is the place for design discussions, feature proposals, and community +conversation around utPLSQL. + +### Where to post + +| I want to… | Use | +|---|---| +| Propose a new feature or behaviour change | 💡 RFCs & Design | +| Discuss internal architecture | 🏗 Architecture | +| Ask a usage / how-to question | ❓ Q&A | +| Share a CI pipeline, integration, or tip | 🔬 Show & Tell | +| Ask about contributing / development setup | 🤝 Contributors | +| Vote on priorities | 🗳 Polls | +| Anything else | 💬 General | + +### Discussions vs Issues + +**Discussions** are for ideas that are still open, need input, or require consensus. +**Issues** are for well-scoped work that someone can pick up and implement. + +A maintainer will convert a Discussion to an Issue once scope is agreed. + +### Real-time chat + +For quick questions: [utPLSQL Slack](https://utplsql.slack.com) +For decisions that need a permanent record: post here. +``` + +Pin this post from the discussion's `…` menu → **Pin discussion**. + +### 6. Update the README + +Add a Discussions badge to the project README: + +```markdown +[![GitHub Discussions](https://img.shields.io/github/discussions/utPLSQL/utPLSQL)](https://github.com/utPLSQL/utPLSQL/discussions) +``` + +And add a short paragraph in the "Community" or "Contributing" section pointing +to Discussions as the place for design proposals. + +--- + +## Operating guidelines + +### Discussion → Issue conversion rule + +| Category | Convert when… | +|---------------|----------------------------------------------------------------------| +| RFCs & Design | Consensus reached, scope is defined | +| Architecture | Breaking change formally agreed by maintainers | +| Q&A | A confirmed bug surfaces in the thread | +| Contributors | A gap in docs or tooling is identified that can be filed as an issue | + +Use the **"Create issue from discussion"** button (available in the discussion's sidebar). + +### Housekeeping + +- Lock **Announcements** threads after 30 days. +- Close **Polls** after 14 days; post a summary comment with the result before closing. +- Label cross-references: apply the same labels used on issues + (`enhancement`, `breaking-change`, `coverage`, `oracle-version`, etc.) + to discussions for consistent search. diff --git a/.github/DISCUSSION_TEMPLATE/announcements.yml b/.github/DISCUSSION_TEMPLATE/announcements.yml new file mode 100644 index 000000000..262746e11 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/announcements.yml @@ -0,0 +1,54 @@ +title: "[Announcement] " +labels: ["announcement"] +body: + - type: markdown + attributes: + value: | + > **Maintainers only.** This category is restricted to project maintainers. + > Announcements are pinned and locked after 30 days. + + - type: dropdown + id: announcement_type + attributes: + label: Announcement type + options: + - New release + - Release candidate / pre-release + - Roadmap update + - Deprecation notice + - Security advisory + - Community / governance update + - Other + validations: + required: true + + - type: input + id: version + attributes: + label: Version (if applicable) + placeholder: "e.g. 3.2.0" + validations: + required: false + + - type: textarea + id: body + attributes: + label: Announcement body + description: | + Write the full announcement here. + For releases, include: highlights, breaking changes, upgrade notes, and a link to the full changelog. + validations: + required: true + + - type: textarea + id: links + attributes: + label: Key links + description: Release tag, changelog, migration guide, Docker image, CLI download, etc. + placeholder: | + - Release: https://github.com/utPLSQL/utPLSQL/releases/tag/v… + - Changelog: … + - Docker: … + - CLI: … + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/architecture.yml b/.github/DISCUSSION_TEMPLATE/architecture.yml new file mode 100644 index 000000000..f3df8e29c --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/architecture.yml @@ -0,0 +1,100 @@ +title: "[Architecture] " +labels: ["architecture", "design"] +body: + - type: markdown + attributes: + value: | + ## Architecture discussion + Use this template for internal design decisions: changes to the suite-loading mechanism, + the coverage engine, DDL trigger behaviour, reporter infrastructure, or any + cross-cutting concern that affects the internals of utPLSQL. + + This category is primarily for **contributors and maintainers**. + If you want to propose a user-facing feature, use **RFCs & Design** instead. + + - type: input + id: title_short + attributes: + label: Component / area + description: Which internal component or subsystem does this discussion concern? + placeholder: "e.g. Suite loader, Coverage engine, Annotation parser, Event system" + validations: + required: true + + - type: textarea + id: context + attributes: + label: Context and current design + description: Briefly describe how the relevant part works today. + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem or design question + description: What specific decision needs to be made, or what limitation needs to be addressed? + validations: + required: true + + - type: textarea + id: options + attributes: + label: Options under consideration + description: | + List the design options you are weighing. For each option describe: + - How it works + - Pros + - Cons + - Impact on Oracle compatibility + placeholder: | + **Option A — …** + How: … + Pros: … + Cons: … + + **Option B — …** + How: … + Pros: … + Cons: … + validations: + required: true + + - type: textarea + id: preferred + attributes: + label: Preferred direction (if any) + description: If you already lean toward one option, say so and why. Leave blank if genuinely open. + validations: + required: false + + - type: dropdown + id: breaking + attributes: + label: Does this introduce a breaking change? + options: + - "No" + - "Yes — public API change (ut_runner, ut packages, annotations)" + - "Yes — output/reporter format change" + - "Yes — internal package change (no public API impact)" + - "Unsure" + validations: + required: true + + - type: textarea + id: migration + attributes: + label: Migration / compatibility notes + description: If breaking, describe the migration path for users and downstream integrations. + validations: + required: false + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have reviewed the existing architecture docs and source + required: true + - label: Relevant unit / integration tests have been considered + required: false diff --git a/.github/DISCUSSION_TEMPLATE/contributors.yml b/.github/DISCUSSION_TEMPLATE/contributors.yml new file mode 100644 index 000000000..6325961de --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/contributors.yml @@ -0,0 +1,56 @@ +title: "[Contributors] " +labels: ["contributors"] +body: + - type: markdown + attributes: + value: | + ## Contributors + Questions about **contributing to utPLSQL** — development environment setup, + the test suite, pull request process, coding conventions, or anything else + that helps you get your first (or next) contribution merged. + + **Useful links before posting:** + - [CONTRIBUTING.md](../../blob/develop/CONTRIBUTING.md) + - [Development environment setup](../../blob/develop/docs/development/developer-guide.md) + - [Open issues labelled `good first issue`](../../issues?q=is%3Aopen+label%3A%22good+first+issue%22) + + - type: dropdown + id: topic + attributes: + label: Topic + options: + - Dev environment / Docker setup + - Running the test suite locally + - Understanding the codebase + - PR review process + - Coding conventions / style + - Good first issue — looking for guidance + - Release process + - Documentation contribution + - Other + validations: + required: true + + - type: textarea + id: question + attributes: + label: Question or request + description: What do you need help with? + validations: + required: true + + - type: textarea + id: context + attributes: + label: What you have tried + description: Steps already taken, error messages, links to relevant code, etc. + validations: + required: false + + - type: input + id: os + attributes: + label: Host OS / environment + placeholder: "e.g. macOS 14, Windows 11, Ubuntu 22.04, Docker on Linux" + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml new file mode 100644 index 000000000..0e3b8d100 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -0,0 +1,28 @@ +title: "" +labels: ["general"] +body: + - type: markdown + attributes: + value: | + ## General discussion + For open-ended conversations that don't fit another category: + project direction, community topics, suggestions, or anything else. + + If your post turns out to be a feature proposal, a maintainer may move it to + **RFCs & Design**. If it is a question about using utPLSQL, consider posting + in **Q&A** instead so a helpful answer can be marked. + + - type: textarea + id: body + attributes: + label: What's on your mind? + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Background, links, related issues or discussions. + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/q-a.yml b/.github/DISCUSSION_TEMPLATE/q-a.yml new file mode 100644 index 000000000..e4ff1d452 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/q-a.yml @@ -0,0 +1,87 @@ +title: "[Q&A] " +labels: ["question"] +body: + - type: markdown + attributes: + value: | + ## Question & Answer + Ask anything about **using** utPLSQL — installation, writing tests, CI integration, + reporters, annotations, code coverage, etc. + + **Tips for a fast answer:** + - Include your utPLSQL version and Oracle version. + - Paste a minimal reproducer (test package + expected vs actual output). + - Check the [documentation](https://utplsql.github.io/utPLSQL/) and + [closed Q&A discussions](../../discussions/categories/q-a?discussions_q=is%3Aclosed) first. + + > If this turns out to be a **bug**, a maintainer will convert this discussion into an Issue. + + - type: input + id: utplsql_version + attributes: + label: utPLSQL version + placeholder: "e.g. 3.1.13" + validations: + required: true + + - type: dropdown + id: oracle_version + attributes: + label: Oracle version + options: + - Oracle 11g + - Oracle 12c + - Oracle 18c + - Oracle 19c + - Oracle 21c + - Oracle 23c / 23ai + - Other / unsure + validations: + required: true + + - type: textarea + id: question + attributes: + label: Question + description: Describe what you are trying to do and what you have tried so far. + validations: + required: true + + - type: textarea + id: reproducer + attributes: + label: Minimal reproducer + description: | + Paste a minimal test package and/or the relevant ut_runner call. + Include the full error message or unexpected output if applicable. + render: sql + validations: + required: false + + - type: textarea + id: expected + attributes: + label: Expected behaviour + validations: + required: false + + - type: textarea + id: actual + attributes: + label: Actual behaviour / error + validations: + required: false + + - type: dropdown + id: install_method + attributes: + label: Installation method + options: + - utPLSQL-cli + - SQL*Plus script + - Docker / utPLSQL-docker + - Liquibase / Flyway + - Other + - N/A + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/release-planning.yml b/.github/DISCUSSION_TEMPLATE/release-planning.yml new file mode 100644 index 000000000..5663d7613 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/release-planning.yml @@ -0,0 +1,90 @@ +title: "[Release] v" +labels: ["release-planning"] +body: + - type: markdown + attributes: + value: | + ## Release planning discussion + Use this template to discuss the scope of an upcoming release: + what goes in, what gets deferred, and what the acceptance criteria are. + + **Maintainers:** pin this discussion and link it from the corresponding GitHub Milestone. + + - type: input + id: version + attributes: + label: Target version + placeholder: "e.g. 3.2.0" + validations: + required: true + + - type: dropdown + id: release_type + attributes: + label: Release type + options: + - Major (breaking changes) + - Minor (new features, backward-compatible) + - Patch (bug fixes only) + validations: + required: true + + - type: textarea + id: goals + attributes: + label: Release goals + description: What are the 2–4 key things this release should achieve? + placeholder: | + 1. + 2. + 3. + validations: + required: true + + - type: textarea + id: scope_in + attributes: + label: In scope (proposed issues / PRs) + description: | + Link the GitHub Issues and PRs targeted for this release. + Use the format: `- [ ] #123 — short description` + placeholder: | + - [ ] #123 — ... + - [ ] #456 — ... + validations: + required: false + + - type: textarea + id: scope_out + attributes: + label: Out of scope / explicitly deferred + description: Issues that were considered but will not be included — and why. + validations: + required: false + + - type: input + id: target_date + attributes: + label: Target release date (approximate) + placeholder: "e.g. 2025-Q2" + validations: + required: false + + - type: textarea + id: oracle_matrix + attributes: + label: Oracle version test matrix + description: Which Oracle versions must pass CI before this release ships? + placeholder: | + - [ ] Oracle 19c + - [ ] Oracle 21c + - [ ] Oracle 23ai + validations: + required: false + + - type: textarea + id: notes + attributes: + label: Additional notes + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/rfcs-design.yml b/.github/DISCUSSION_TEMPLATE/rfcs-design.yml new file mode 100644 index 000000000..32c0a33c7 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/rfcs-design.yml @@ -0,0 +1,88 @@ +title: "[RFC] " +labels: ["rfc", "design"] +body: + - type: markdown + attributes: + value: | + ## Request for Comments — design proposal + Use this template to propose a new feature, a change to existing behaviour, or a significant refactoring. + Once there is consensus and a clear scope, a maintainer will convert this discussion into one or more GitHub Issues. + + **Before posting:** search existing RFCs and open issues to avoid duplicates. + + - type: input + id: summary + attributes: + label: Summary + description: One sentence — what are you proposing? + placeholder: "Add support for ..." + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem / motivation + description: What problem does this solve? Who is affected and how often? + placeholder: | + Currently, when ... it is not possible to ... + This forces users to ... + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Describe the solution in as much detail as you have. Pseudo-code, SQL, or PL/SQL snippets are welcome. + placeholder: | + ```sql + -- example of the proposed API + ``` + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: What other approaches did you look at? Why did you rule them out? + validations: + required: false + + - type: textarea + id: breaking + attributes: + label: Breaking-change impact + description: | + Does this change affect existing annotations, package APIs, or test output formats? + List affected public symbols (ut_runner, ut, annotations, reporters …). + validations: + required: false + + - type: dropdown + id: oracle_versions + attributes: + label: Oracle version relevance + description: Which Oracle versions does this apply to? + multiple: true + options: + - All supported versions + - Oracle 11g + - Oracle 12c + - Oracle 18c + - Oracle 19c + - Oracle 21c + - Oracle 23c / 23ai + validations: + required: true + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have searched existing discussions and issues for duplicates + required: true + - label: I am willing to help implement or review this feature + required: false diff --git a/.github/DISCUSSION_TEMPLATE/show-and-tell.yml b/.github/DISCUSSION_TEMPLATE/show-and-tell.yml new file mode 100644 index 000000000..4443c5de6 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/show-and-tell.yml @@ -0,0 +1,79 @@ +title: "[Show & Tell] " +labels: ["show-and-tell"] +body: + - type: markdown + attributes: + value: | + ## Show & Tell + Share how you are using utPLSQL in the wild — CI pipelines, IDE integrations, + custom reporters, coverage setups, framework wrappers, or anything else the + community might learn from. + + Posts here are a great source of real-world examples for the documentation. + + - type: input + id: title_short + attributes: + label: What are you sharing? + placeholder: "e.g. utPLSQL + GitHub Actions CI pipeline for Oracle 23ai" + validations: + required: true + + - type: dropdown + id: category + attributes: + label: Category + multiple: true + options: + - CI/CD integration + - IDE / SQL client integration + - Custom reporter + - Code coverage setup + - Framework wrapper / helper library + - Docker / containerised testing + - Annotation patterns + - Performance / large test suite + - Other + validations: + required: true + + - type: textarea + id: description + attributes: + label: Description + description: Describe what you built or configured and why it might be useful to others. + validations: + required: true + + - type: textarea + id: snippet + attributes: + label: Code or configuration snippet + description: Paste the most relevant excerpt. Link to a repo or Gist if you have one. + render: yaml + validations: + required: false + + - type: input + id: utplsql_version + attributes: + label: utPLSQL version used + placeholder: "e.g. 3.1.13" + validations: + required: false + + - type: input + id: oracle_version + attributes: + label: Oracle version + placeholder: "e.g. Oracle 19c" + validations: + required: false + + - type: textarea + id: links + attributes: + label: Links + description: Repository, blog post, documentation page, etc. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 681bc7f3a..f0335781e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -23,4 +23,4 @@ Add any other context or screenshots about the feature request here. > Please do not create issues for generic SQL or PL/SQL questions. There are other forums and communities to help you with those. See [ASKTom](https://asktom.oracle.com) for example. **Want to discuss** -If you want to discuss your issue, join [our SLACK chat](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww). +If you want to discuss a problem, please go to [utPLSQL discussions](https://github.com/utPLSQL/utPLSQL/discussions) diff --git a/docs/about/authors.md b/docs/about/authors.md index 3c0117b09..f752302de 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -20,7 +20,7 @@ Many thanks to all the [contributors](https://github.com/utPLSQL/utPLSQL/graphs/ ### Special thanks to prior major contributors -- Steven Feuerstein - Original Author +- Steven Feuerstein - Original Author of utPLSQL v1 and v2 - Chris Rimmer - Patrick Barel - Paul Walker diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 26c89912d..976f8bc99 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -4,7 +4,7 @@ [![chat](http://img.shields.io/badge/GitHub_Project-Active-blue.svg)](https://github.com/utPLSQL/utPLSQL) [![license](http://img.shields.io/badge/license-apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0) -[![chat](http://img.shields.io/badge/chat-slack-blue.svg)](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) +[![GitHub Discussions](https://img.shields.io/github/discussions/utPLSQL/utPLSQL)](https://github.com/utPLSQL/utPLSQL/discussions) [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) diff --git a/mkdocs.yml b/mkdocs.yml index 713722620..49356fd4e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,7 +8,7 @@ edit_uri: "" site_url: http://utPLSQL.org/ site_name: utPLSQL-framework site_description: utPLSQL Ultimate Testing Framework for Oracle PL/SQL & SQL -copyright: Copyright © 2016 - 2022 utPLSQL Team +copyright: Copyright © 2016 - 2026 utPLSQL Team repo_url: https://github.com/utPLSQL/utPLSQL extra_css: - stylesheets/extra.css @@ -44,8 +44,8 @@ extra: social: - icon: fontawesome/brands/twitter link: https://twitter.com/utPLSQL - - icon: fontawesome/brands/slack - link: https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww + - icon: fontawesome/regular/comment + link: https://github.com/utPLSQL/utPLSQL/discussions - icon: fontawesome/brands/github link: https://github.com/utPLSQL - icon: fontawesome/solid/envelope diff --git a/mkdocs_offline.yml b/mkdocs_offline.yml index 31c90615e..9f0ef57af 100644 --- a/mkdocs_offline.yml +++ b/mkdocs_offline.yml @@ -44,8 +44,8 @@ extra: social: - icon: fontawesome/brands/twitter link: https://twitter.com/utPLSQL - - icon: fontawesome/brands/slack - link: https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww + - icon: fontawesome/regular/comment + link: https://github.com/utPLSQL/utPLSQL/discussions - icon: fontawesome/brands/github link: https://github.com/utPLSQL - icon: fontawesome/solid/envelope diff --git a/readme.md b/readme.md index 3c2d7fb3a..a8523b4d7 100644 --- a/readme.md +++ b/readme.md @@ -5,7 +5,7 @@ [![license](https://img.shields.io/github/license/utPLSQL/utPLSQL.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![latest-release](https://img.shields.io/github/release/utPLSQL/utPLSQL.svg)](https://github.com/utPLSQL/utPLSQL/releases) [![Download statistics](https://img.shields.io/github/downloads/utPLSQL/utPLSQL/total.svg)](http://gra.caldis.me/?url=https://github.com/utPLSQL/utPLSQL) -[![chat](http://img.shields.io/badge/slack-team--chat-blue.svg)](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) +[![GitHub Discussions](https://img.shields.io/github/discussions/utPLSQL/utPLSQL)](https://github.com/utPLSQL/utPLSQL/discussions) [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) [![build](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml/badge.svg)](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml) @@ -161,8 +161,7 @@ Finished in .036027 seconds We welcome new developers to join our community and contribute to the utPLSQL project. If you are interested in helping please read our [guide to contributing](CONTRIBUTING.md) The best place to start is to read the documentation and get familiar with the existing code base. -A [slack chat](https://utplsql.slack.com/) is the place to go if you want to talk with team members. -To sign up to the chat use [this link](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww). +[Github discussions](https://github.com/utPLSQL/utPLSQL/discussions) is the place to go if you want to talk with team members. ---------- @@ -183,8 +182,6 @@ __Project Directories__ ---------- -If you have a great feature in mind, that you would like to see in utPLSQL v3 please create an [issue on GitHub](https://github.com/utPLSQL/utPLSQL/issues) or discuss it with us in the [slack chat rooms](https://utplsql.slack.com/). Use [invite link](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) to join the chat. - # Version 2 to Version 3 Comparison From 46f3d127a32e66026de41326199f178e5f9a270a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 15 Mar 2026 21:20:02 +0000 Subject: [PATCH 109/144] Update tests --- .../core/annotations/ut_annotation_parser.pkb | 13 +- source/core/ut_utils.pkb | 4 +- .../annotations/test_annotation_parser.pkb | 145 ++++++++++++++++++ .../annotations/test_annotation_parser.pks | 11 +- 4 files changed, 164 insertions(+), 9 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index cca422ec0..8bb9b1b5e 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -72,16 +72,17 @@ create or replace package body ut_annotation_parser as a_subobject_name varchar2 := null ) is l_loop_index binary_integer := 1; - l_annotation_index binary_integer; + l_annotation_index binary_integer := 1; begin -- loop while there are unprocessed comment blocks - loop + while l_annotation_index is not null loop -- define index of the comment block and get it's content from cache l_annotation_index := regexp_substr( a_source ,gc_comment_replacer_regex_ptrn ,1 ,l_loop_index ,subexpression => 1); - exit when l_annotation_index is null; - add_annotation( a_annotations, l_annotation_index, a_comments( l_annotation_index ), a_subobject_name ); - l_loop_index := l_loop_index + 1; + if l_annotation_index is not null then + add_annotation( a_annotations, l_annotation_index, a_comments( l_annotation_index ), a_subobject_name ); + l_loop_index := l_loop_index + 1; + end if; end loop; end add_annotations; @@ -343,7 +344,7 @@ create or replace package body ut_annotation_parser as dbms_lob.freetemporary(l_source); - select /*+ no_parallel */ value(x) bulk collect into l_result from table(l_annotations) x order by x.position; + select /*+ no_parallel */ value(x) bulk collect into l_result from table(l_annotations) x order by x.position asc; return l_result; end parse_object_annotations; diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 92c47c301..e43dc5644 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -23,8 +23,8 @@ create or replace package body ut_utils is gc_invalid_xml_char constant varchar2(50) := '[^_[:alnum:]\.-]'; gc_full_valid_xml_name constant varchar2(50) := '^([[:alpha:]])([_[:alnum:]\.-])*$'; gc_owner_hash constant integer(11) := dbms_utility.get_hash_value( ut_owner(), 0, power(2,31)-1); - gc_open_chars constant varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( - gc_close_chars constant varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> + gc_open_chars constant varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( this has very specific purpose to not confuse lexer in IDE + gc_close_chars constant varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> this has very specific purpose to not confuse lexer in IDE gc_max_plsql_source_len constant integer := 32767; function surround_with(a_value varchar2, a_quote_char varchar2) return varchar2 is diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pkb b/test/ut3_tester/core/annotations/test_annotation_parser.pkb index 2ec0b2551..5613896cc 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pkb @@ -919,5 +919,150 @@ procedure test_windows_newline_lines ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); end; + procedure test_multiline_proc_header_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + -- procedure header spans multiple lines before terminating ; + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure foo(' || chr(10), + ' a_param1 varchar2' || chr(10), + ' ,a_param2 number default null' || chr(10), + ' );' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 4, 'test', null, 'foo' ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_non_comment_line_resets_block_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + -- a non-comment non-proc line between annotation and procedure breaks the association + -- %test becomes a floating top-level annotation with no subobject + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' pragma serially_reusable;' || chr(10), -- resets accumulator + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + -- %test is NOT associated with foo — accumulator was reset by pragma line + -- it surfaces as a top-level annotation with no subobject_name + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 4, 'test', null, null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_annotation_not_at_line_start_ignored_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + -- % appears in line but comment is not at start of line — should be ignored + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' x := ''value%with%percent'';' || chr(10), -- % present but -- not at line start + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_space_between_dashes_and_qualifier_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + -- spaces between -- and % are skipped and annotation is still recognised + -- annotations are not adjacent to a procedure so they are top-level + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), -- multiple spaces between -- and % + ' -- %displayname(my suite)' || chr(10), + '' || chr(10), -- blank line breaks association with foo + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 3, 'displayname', 'my suite', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_percent_not_after_dashes_ignored_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + -- -- present and % present on line but % is not immediately after -- + -- e.g. a regular comment that happens to mention 100% + l_source := make_source(ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- coverage is 100% on this module' || chr(10), -- % after text, not annotation + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + end test_annotation_parser; / \ No newline at end of file diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index 7b995b438..92860769c 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -73,7 +73,16 @@ create or replace package test_annotation_parser is procedure test_windows_newline_lines; --%test(parse annotations with very long procedure name using source lines overload) procedure test_annot_very_long_name_lines; - + --%test(Procedure header spanning multiple lines is handled correctly) + procedure test_multiline_proc_header_lines; + --%test(Non-comment line between annotation and procedure resets association) + procedure test_non_comment_line_resets_block_lines; + --%test(Comment with non-whitespace before dashes is not treated as annotation) + procedure test_annotation_not_at_line_start_ignored_lines; + --%test(Spaces between dashes and annotation qualifier are skipped correctly) + procedure test_space_between_dashes_and_qualifier_lines; + --%test(Percent sign not immediately after dashes is not treated as annotation) + procedure test_percent_not_after_dashes_ignored_lines; end test_annotation_parser; / \ No newline at end of file From 707fadd55cc93b475efaf30ebc00382d4468b20c Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 16 Mar 2026 10:49:55 +0100 Subject: [PATCH 110/144] Added empty lines at the end --- source/reporters/ut_tap_reporter.tpb | 2 +- source/reporters/ut_tap_reporter.tps | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 5a75fcac8..ff095a369 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -121,4 +121,4 @@ create or replace type body ut_tap_reporter is self.lvl := 0; end; end; -/ \ No newline at end of file +/ diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index e38d809f9..bed809059 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -15,4 +15,4 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( ) not final -/ \ No newline at end of file +/ From e539ed0981c204580f596985b16ad097a3894451 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 11:00:19 +0000 Subject: [PATCH 111/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index fda0cb436..22543040d 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4298 +4339 diff --git a/docs/about/authors.md b/docs/about/authors.md index f752302de..4f1e4c0b7 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 1e030f3f5..717cc388a 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 976f8bc99..b69bf3235 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 058b84479..9383d5c01 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 53f4c94aa..b5b393656 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 5de9fb7fb..fdfe3c26b 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 0c7c469ee..4b5be5595 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index bd09e2d83..1688ea95e 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 0ea6a1208..10a75ebed 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e4143411e..078973d65 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index bf9f29504..2bbcbcf12 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index c710607bc..5488dc66f 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 423eccea4..3416f60bc 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index bef1e2156..4c9bef2ef 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index f86bce299..6d2e166e9 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 750497394..6f216032d 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 9effdcdbc..a4449fa26 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a0d1e612c..2e220f148 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4298-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4339-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 93e3b1ad4754a894f04be1a43346973df142a586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 16 Mar 2026 13:03:42 +0200 Subject: [PATCH 112/144] Removing the uncessary setup of Python --- .github/workflows/build.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 796017d5c..be6e18ca2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -247,12 +247,6 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" - - name: Setup Python for docs - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' - - name: Build and publish documentation run: | pip install mkdocs From 0dda69a2de27e183d935245385dc434425467937 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 11:27:46 +0000 Subject: [PATCH 113/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 22543040d..f60afa776 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4339 +4340 diff --git a/docs/about/authors.md b/docs/about/authors.md index 4f1e4c0b7..a996db919 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 717cc388a..cc562f01d 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index b69bf3235..2631bae92 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 9383d5c01..670377f05 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index b5b393656..616eeeb8f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index fdfe3c26b..e2e9cf4c3 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 4b5be5595..9e240b337 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 1688ea95e..054875070 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 10a75ebed..c6c6a94c8 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 078973d65..b5b119fba 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 2bbcbcf12..b723bb29b 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 5488dc66f..253d6aec2 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 3416f60bc..ac2064011 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 4c9bef2ef..66dca6bf3 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 6d2e166e9..79e9d8fa7 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 6f216032d..3fc402e56 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index a4449fa26..1a5c9ed05 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 2e220f148..22d43aece 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4339-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4340-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e1d039dffadb69bdf3f4d87670e8a43e789f9508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 16 Mar 2026 14:24:32 +0200 Subject: [PATCH 114/144] Update of documentation to remove references to SLACK. --- docs/about/support.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/about/support.md b/docs/about/support.md index 670377f05..e628c86a7 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -2,5 +2,6 @@ # How to get support -- Feel free to post questions, bugs or issues in the [issues area of GitHub](https://github.com/utPLSQL/utPLSQL/issues) -- [Join](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) developers team on [utPLSQL Slack](https://utplsql.slack.com/) +- Look into [utPLSQL github discussions](https://github.com/utPLSQL/utPLSQL/discussions) to find support, ask questions and share ideas +- If needed open a new [issue on github](https://github.com/utPLSQL/utPLSQL/issues) for bugs or feature requests + From adeedf1091ea24010640103714d267a422f0c2ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 12:30:47 +0000 Subject: [PATCH 115/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index f60afa776..cbc92e381 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4340 +4341 diff --git a/docs/about/authors.md b/docs/about/authors.md index a996db919..45d729d3d 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index cc562f01d..37c7ed3b8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 2631bae92..9765acd75 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e628c86a7..feb3051b4 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 616eeeb8f..ebe93b0fe 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index e2e9cf4c3..caefa6622 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 9e240b337..b56c3622e 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 054875070..3ea8a286b 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c6c6a94c8..18583b6b0 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index b5b119fba..cecb2bdfd 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index b723bb29b..3e5cd70c2 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 253d6aec2..15ec2b881 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index ac2064011..9da2da1c8 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 66dca6bf3..829f8bcac 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 79e9d8fa7..f46556c22 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3fc402e56..bb39a331c 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 1a5c9ed05..68bcab1f4 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 22d43aece..32555e6aa 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4340-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4341-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 92336cb3ca454b43fba3512e2b6c92d58b7212b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 16 Mar 2026 18:19:48 +0200 Subject: [PATCH 116/144] Update badge --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index a8523b4d7..1ca252558 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) [![build](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml/badge.svg)](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml) -[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL) +[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL_utPLSQL) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=coverage)](https://sonarcloud.io/summary/new_code?id=utPLSQL_utPLSQL) ---------- From c36fbb31401bb7678f7a0477b31c30035c278b50 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 16:26:31 +0000 Subject: [PATCH 117/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index cbc92e381..2bfcb2370 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4341 +4342 diff --git a/docs/about/authors.md b/docs/about/authors.md index 45d729d3d..2c2abf826 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 37c7ed3b8..0485779e5 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 9765acd75..81e4f976e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index feb3051b4..4ac661e10 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index ebe93b0fe..459bc9535 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index caefa6622..c0cbffb0e 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index b56c3622e..3dc42e429 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 3ea8a286b..45be3be59 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 18583b6b0..adf36baa6 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index cecb2bdfd..e042d61ed 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 3e5cd70c2..0ea5e2e73 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 15ec2b881..cd4feb46a 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 9da2da1c8..6724ac6ab 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 829f8bcac..0cdc2d7fa 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index f46556c22..fe9143fe7 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index bb39a331c..28e02d5b8 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 68bcab1f4..818a592bc 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 32555e6aa..9615c7b4d 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4341-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4342-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 81e1752350f06f46f21aa24be867e36b7e6a1466 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 16 Mar 2026 22:12:00 +0000 Subject: [PATCH 118/144] Refactor annotation parser tests and utility functions - Removed unused test procedures from test_annotation_parser package. - Updated replace_multiline_comments procedure in test_ut_utils to use dbms_preprocessor.source_lines_t for actual and expected results. - Added lines_to_str and make_source functions in main_helper to facilitate conversion between source lines and string formats. --- .../annotations/test_annotation_parser.pkb | 678 +++++++----------- .../annotations/test_annotation_parser.pks | 13 - test/ut3_tester/core/test_ut_utils.pkb | 29 +- test/ut3_tester_helper/main_helper.pkb | 18 + test/ut3_tester_helper/main_helper.pks | 4 + 5 files changed, 296 insertions(+), 446 deletions(-) diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pkb b/test/ut3_tester/core/annotations/test_annotation_parser.pkb index 5613896cc..beb526863 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pkb @@ -1,45 +1,28 @@ create or replace package body test_annotation_parser is - function lines_to_str(a_lines dbms_preprocessor.source_lines_t) return varchar2 is - l_result varchar2(32767); - begin - for i in 1 .. a_lines.count loop - l_result := l_result || a_lines(i); - end loop; - return l_result; - end; - - function make_source(a_lines ut_varchar2_list) return dbms_preprocessor.source_lines_t is - l_result dbms_preprocessor.source_lines_t; - begin - for i in 1 .. a_lines.count loop - l_result(i) := a_lines(i); - end loop; - return l_result; - end; - procedure test_proc_comments is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; - begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - -- %ann1(Name of suite) - -- wrong line - -- %ann2(some_value) - procedure foo; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' -- %ann1(Name of suite)' || chr(10), + ' -- wrong line' || chr(10), + ' -- %ann2(some_value)' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert - l_expected := ut3_develop.ut_annotations( ut3_develop.ut_annotation(2,'suite',null, null), ut3_develop.ut_annotation(3,'displayname','Name of suite',null), @@ -52,30 +35,33 @@ create or replace package body test_annotation_parser is end; procedure include_floating_annotations is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - -- %ann1(Name of suite) - -- %ann2(all.globaltests) - - --%test - procedure foo; - - -- %ann3(Name of suite) - -- %ann4(all.globaltests) - - --%test - procedure bar; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' -- %ann1(Name of suite)' || chr(10), + ' -- %ann2(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure foo;' || chr(10), + '' || chr(10), + ' -- %ann3(Name of suite)' || chr(10), + ' -- %ann4(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure bar;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -95,40 +81,41 @@ create or replace package body test_annotation_parser is end; procedure parse_complex_with_functions is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - --%test - procedure foo; - - - --%beforeeach - procedure foo2; - - --test comment - -- wrong comment - - - /* - describtion of the procedure - */ - --%beforeeach(key=testval) - PROCEDURE foo3(a_value number default null); - - --%all - function foo4(a_val number default null - , a_par varchar2 default := ''asdf''); - END;'; + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure foo;' || chr(10), + '' || chr(10), + '' || chr(10), + ' --%beforeeach' || chr(10), + ' procedure foo2;' || chr(10), + '' || chr(10), + ' --test comment' || chr(10), + ' -- wrong comment' || chr(10), + '' || chr(10), + '' || chr(10), + '/*' || chr(10), + ' describtion of the procedure' || chr(10), + ' */' || chr(10), + ' --%beforeeach(key=testval)' || chr(10), + ' PROCEDURE foo3(a_value number default null);' || chr(10), + '' || chr(10), + ' --%all' || chr(10), + ' function foo4(a_val number default null' || chr(10), + ' , a_par varchar2 default := ''asdf'');' || chr(10), + 'END;')); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -146,21 +133,24 @@ create or replace package body test_annotation_parser is end; procedure no_procedure_annotation is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -174,21 +164,24 @@ create or replace package body test_annotation_parser is end; procedure parse_accessible_by is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt accessible by (foo) AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt accessible by (foo) AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -202,24 +195,27 @@ create or replace package body test_annotation_parser is end; procedure complex_package_declaration is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt - ACCESSIBLE BY (calling_proc) - authid current_user - AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt' || chr(10), + ' ACCESSIBLE BY (calling_proc)' || chr(10), + ' authid current_user' || chr(10), + ' AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -233,21 +229,24 @@ create or replace package body test_annotation_parser is end; procedure complex_text is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - -- %suite - --%displayname(name = Name of suite) - -- %suitepath(key=all.globaltests,key2=foo,"--%some text") - - procedure foo; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' --%displayname(name = Name of suite)' || chr(10), + ' -- %suitepath(key=all.globaltests,key2=foo,"--%some text")' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -261,26 +260,29 @@ create or replace package body test_annotation_parser is end; procedure ignore_annotations_in_comments is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - /* - Some comment - -- inlined - -- %ignored - */ - -- %suite - --%displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' /*' || chr(10), + ' Some comment' || chr(10), + ' -- inlined' || chr(10), + ' -- %ignored' || chr(10), + ' */' || chr(10), + ' -- %suite' || chr(10), + ' --%displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -329,17 +331,19 @@ v58yvbLAXLi9gYHwoIvAgccti+Cmpg0DKLY= end; procedure brackets_in_desc is - - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - -- %suite(Name of suite (including some brackets) and some more text) -END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite(Name of suite (including some brackets) and some more text)' || chr(10), + 'END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -350,24 +354,27 @@ END;'; end; procedure test_space_before_annot_params is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - /* - Some comment - -- inlined - */ - -- %suite - -- %suitepath (all.globaltests) - - procedure foo; -END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' /*' || chr(10), + ' Some comment' || chr(10), + ' -- inlined' || chr(10), + ' */' || chr(10), + ' -- %suite' || chr(10), + ' -- %suitepath (all.globaltests)'|| chr(10), + '' || chr(10), + ' procedure foo;' || chr(10), + 'END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -380,18 +387,21 @@ END;'; procedure test_windows_newline as - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite)' || chr(13) || chr(10) - || ' -- %suitepath(all.globaltests) - END;'; + --Arrange + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(13) || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + ' END;' || chr(10) + )); --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); --Assert l_expected := ut3_develop.ut_annotations( @@ -405,97 +415,20 @@ END;'; procedure test_annot_very_long_name as - l_source clob; - l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; - begin - l_source := 'PACKAGE very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_did_it AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - --%test - procedure very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it; - END;'; - - --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation( 2, 'suite', null, null ), - ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3_develop.ut_annotation( 6, 'test', null, 'very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it' ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure test_upper_annot is - l_source clob; + l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; - begin - l_source := 'PACKAGE test_tt AS - -- %SUITE - -- %DISPLAYNAME(Name of suite) - -- %SUITEPATH(all.globaltests) - - -- %ANN1(Name of suite) - -- %ANN2(all.globaltests) - - --%TEST - procedure foo; - - -- %ANN3(Name of suite) - -- %ANN4(all.globaltests) - - --%TEST - procedure bar; - END;'; - - --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation( 2, 'suite', null, null ), - ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3_develop.ut_annotation( 6, 'ann1', 'Name of suite', null ), - ut3_develop.ut_annotation( 7, 'ann2', 'all.globaltests', null ), - ut3_develop.ut_annotation( 9, 'test', null, 'foo'), - ut3_develop.ut_annotation( 12, 'ann3', 'Name of suite', null ), - ut3_develop.ut_annotation( 13, 'ann4', 'all.globaltests', null ), - ut3_develop.ut_annotation( 15, 'test', null, 'bar') - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - ------------------------------------------------------------ - -- source_lines_t overload equivalents of existing tests - ------------------------------------------------------------ - - procedure test_proc_comments_lines is - l_source dbms_preprocessor.source_lines_t; - l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; begin --Arrange - l_source := make_source(ut_varchar2_list( - 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), - ' -- %displayname(Name of suite)' || chr(10), - ' -- %suitepath(all.globaltests)' || chr(10), - '' || chr(10), - ' -- %ann1(Name of suite)' || chr(10), - ' -- wrong line' || chr(10), - ' -- %ann2(some_value)' || chr(10), - ' procedure foo;' || chr(10), - ' END;' || chr(10) + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_did_it AS' || chr(10), + ' -- %suite' || chr(10), + ' -- %displayname(Name of suite)' || chr(10), + ' -- %suitepath(all.globaltests)' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' procedure very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it;' || chr(10), + ' END;' || chr(10) )); --Act @@ -503,38 +436,37 @@ END;'; --Assert l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation(2,'suite',null, null), - ut3_develop.ut_annotation(3,'displayname','Name of suite',null), - ut3_develop.ut_annotation(4,'suitepath','all.globaltests',null), - ut3_develop.ut_annotation(6,'ann1','Name of suite',null), - ut3_develop.ut_annotation(8,'ann2','some_value','foo') + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3_develop.ut_annotation( 6, 'test', null, 'very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it' ) ); ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); end; - procedure include_floating_annotations_lines is + procedure test_upper_annot is l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; begin --Arrange - l_source := make_source(ut_varchar2_list( + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), - ' -- %displayname(Name of suite)' || chr(10), - ' -- %suitepath(all.globaltests)' || chr(10), + ' -- %SUITE' || chr(10), + ' -- %DISPLAYNAME(Name of suite)' || chr(10), + ' -- %SUITEPATH(all.globaltests)' || chr(10), '' || chr(10), - ' -- %ann1(Name of suite)' || chr(10), - ' -- %ann2(all.globaltests)' || chr(10), + ' -- %ANN1(Name of suite)' || chr(10), + ' -- %ANN2(all.globaltests)' || chr(10), '' || chr(10), - ' --%test' || chr(10), + ' --%TEST' || chr(10), ' procedure foo;' || chr(10), '' || chr(10), - ' -- %ann3(Name of suite)' || chr(10), - ' -- %ann4(all.globaltests)' || chr(10), + ' -- %ANN3(Name of suite)' || chr(10), + ' -- %ANN4(all.globaltests)' || chr(10), '' || chr(10), - ' --%test' || chr(10), + ' --%TEST' || chr(10), ' procedure bar;' || chr(10), ' END;' || chr(10) )); @@ -553,72 +485,7 @@ END;'; ut3_develop.ut_annotation( 12, 'ann3', 'Name of suite', null ), ut3_develop.ut_annotation( 13, 'ann4', 'all.globaltests', null ), ut3_develop.ut_annotation( 15, 'test', null, 'bar') - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure ignore_annotations_in_comments_lines is - l_source dbms_preprocessor.source_lines_t; - l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; - begin - --Arrange - l_source := make_source(ut_varchar2_list( - 'PACKAGE test_tt AS' || chr(10), - ' /*' || chr(10), - ' Some comment' || chr(10), - ' -- inlined' || chr(10), - ' -- %ignored' || chr(10), - ' */' || chr(10), - ' -- %suite' || chr(10), - ' --%displayname(Name of suite)' || chr(10), - ' -- %suitepath(all.globaltests)' || chr(10), - '' || chr(10), - ' procedure foo;' || chr(10), - ' END;' || chr(10) - )); - - --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); - - --Assert - l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation( 7, 'suite', null, null ), - ut3_develop.ut_annotation( 8, 'displayname', 'Name of suite', null ), - ut3_develop.ut_annotation( 9, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure no_procedure_annotation_lines is - l_source dbms_preprocessor.source_lines_t; - l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; - begin - --Arrange - l_source := make_source(ut_varchar2_list( - 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), - ' -- %displayname(Name of suite)' || chr(10), - ' -- %suitepath(all.globaltests)' || chr(10), - '' || chr(10), - ' procedure foo;' || chr(10), - ' END;' || chr(10) - )); - - --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); - - --Assert - l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation( 2, 'suite', null, null ), - ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) - ); + ); ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); @@ -644,7 +511,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'procedure foo is' || chr(10), 'begin' || chr(10), ' null;' || chr(10), @@ -655,7 +522,7 @@ END;'; l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); --Assert - ut.expect(lines_to_str(l_result)).to_equal(lines_to_str(l_input)); + ut.expect(ut3_tester_helper.main_helper.lines_to_str(l_result)).to_equal(ut3_tester_helper.main_helper.lines_to_str(l_input)); end; procedure test_rmc_line_inside_ml_comment is @@ -663,7 +530,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'x := 1; /* start' || chr(10), 'this whole line is comment' || chr(10), 'end comment */ x := 2;' || chr(10) @@ -683,7 +550,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( '/* open' || chr(10), 'still inside' || chr(10), '*/ code /* remove this too */ kept' || chr(10) @@ -703,7 +570,7 @@ END;'; begin --Arrange -- line 2 has none of / - ' so hits fast path B; line 1 needed to pass pre-scan - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( '/* comment */' || chr(10), 'begin' || chr(10) )); @@ -720,7 +587,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'x := /* inline comment */ 42;' || chr(10) )); @@ -736,7 +603,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( '/* marker */' || chr(10), ' -- %test annotation' || chr(10) )); @@ -753,7 +620,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'v := ''val /* not a comment */ here'';' || chr(10) )); @@ -769,7 +636,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'v := ''it''''s a /* test */'';' || chr(10) )); @@ -785,7 +652,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'v := q''[/* not a comment */]'';' || chr(10) )); @@ -801,7 +668,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'v := ''hello /* inside unclosed' || chr(10) )); @@ -818,7 +685,7 @@ END;'; c_line constant varchar2(100) := q'(v := q'[/* unclosed q-string)' || chr(10); begin --Arrange - l_input := make_source(ut_varchar2_list(c_line)); + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list(c_line)); --Act l_result := ut3_develop.ut_utils.replace_multiline_comments(l_input); @@ -832,7 +699,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'a /* one */ := /* two */ 1;' || chr(10) )); @@ -848,7 +715,7 @@ END;'; l_result dbms_preprocessor.source_lines_t; begin --Arrange - l_input := make_source(ut_varchar2_list( + l_input := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'v := ''a/b''; -- this is /* not */ a ml comment' || chr(10) )); @@ -859,66 +726,6 @@ END;'; ut.expect(l_result(1)).to_equal('v := ''a/b''; -- this is /* not */ a ml comment' || chr(10)); end; -procedure test_windows_newline_lines - as - l_source dbms_preprocessor.source_lines_t; - l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; - begin - --Arrange - l_source := make_source(ut_varchar2_list( - 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), - ' -- %displayname(Name of suite)' || chr(13) || chr(10), - ' -- %suitepath(all.globaltests)' || chr(10), - ' END;' || chr(10) - )); - - --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); - - --Assert - l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation( 2, 'suite', null, null ), - ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure test_annot_very_long_name_lines - as - l_source dbms_preprocessor.source_lines_t; - l_actual ut3_develop.ut_annotations; - l_expected ut3_develop.ut_annotations; - begin - --Arrange - l_source := make_source(ut_varchar2_list( - 'PACKAGE very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_did_it AS' || chr(10), - ' -- %suite' || chr(10), - ' -- %displayname(Name of suite)' || chr(10), - ' -- %suitepath(all.globaltests)' || chr(10), - '' || chr(10), - ' --%test' || chr(10), - ' procedure very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it;' || chr(10), - ' END;' || chr(10) - )); - - --Act - l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); - - --Assert - l_expected := ut3_develop.ut_annotations( - ut3_develop.ut_annotation( 2, 'suite', null, null ), - ut3_develop.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3_develop.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3_develop.ut_annotation( 6, 'test', null, 'very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it' ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - procedure test_multiline_proc_header_lines is l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; @@ -926,7 +733,7 @@ procedure test_windows_newline_lines begin --Arrange -- procedure header spans multiple lines before terminating ; - l_source := make_source(ut_varchar2_list( + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'PACKAGE test_tt AS' || chr(10), ' -- %suite' || chr(10), '' || chr(10), @@ -958,12 +765,12 @@ procedure test_windows_newline_lines --Arrange -- a non-comment non-proc line between annotation and procedure breaks the association -- %test becomes a floating top-level annotation with no subobject - l_source := make_source(ut_varchar2_list( + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'PACKAGE test_tt AS' || chr(10), ' -- %suite' || chr(10), '' || chr(10), ' --%test' || chr(10), - ' pragma serially_reusable;' || chr(10), -- resets accumulator + ' pragma serially_reusable;' || chr(10), ' procedure foo;' || chr(10), ' END;' || chr(10) )); @@ -988,13 +795,13 @@ procedure test_windows_newline_lines l_expected ut3_develop.ut_annotations; begin --Arrange - -- % appears in line but comment is not at start of line — should be ignored - l_source := make_source(ut_varchar2_list( - 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), - ' x := ''value%with%percent'';' || chr(10), -- % present but -- not at line start - ' procedure foo;' || chr(10), - ' END;' || chr(10) + -- code before -- means it is not at start of line and must be ignored + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' x := 1; -- %not_an_annotation' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) )); --Act @@ -1008,7 +815,36 @@ procedure test_windows_newline_lines ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); end; - procedure test_space_between_dashes_and_qualifier_lines is + procedure test_whitespace_line_between_comment_and_proc_lines is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3_develop.ut_annotations; + l_expected ut3_develop.ut_annotations; + begin + --Arrange + -- space-only line between annotation comment and procedure declaration is tolerated + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + '' || chr(10), + ' --%test' || chr(10), + ' ' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) + )); + + --Act + l_actual := ut3_develop.ut_annotation_parser.parse_object_annotations(l_source, 'PACKAGE'); + + --Assert + l_expected := ut3_develop.ut_annotations( + ut3_develop.ut_annotation( 2, 'suite', null, null ), + ut3_develop.ut_annotation( 4, 'test', null, 'foo' ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_space_between_dashes_and_qualifier_lines is l_source dbms_preprocessor.source_lines_t; l_actual ut3_develop.ut_annotations; l_expected ut3_develop.ut_annotations; @@ -1016,11 +852,11 @@ procedure test_windows_newline_lines --Arrange -- spaces between -- and % are skipped and annotation is still recognised -- annotations are not adjacent to a procedure so they are top-level - l_source := make_source(ut_varchar2_list( + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), -- multiple spaces between -- and % + ' -- %suite' || chr(10), ' -- %displayname(my suite)' || chr(10), - '' || chr(10), -- blank line breaks association with foo + '' || chr(10), ' procedure foo;' || chr(10), ' END;' || chr(10) )); @@ -1045,12 +881,12 @@ procedure test_windows_newline_lines --Arrange -- -- present and % present on line but % is not immediately after -- -- e.g. a regular comment that happens to mention 100% - l_source := make_source(ut_varchar2_list( - 'PACKAGE test_tt AS' || chr(10), - ' -- %suite' || chr(10), - ' -- coverage is 100% on this module' || chr(10), -- % after text, not annotation - ' procedure foo;' || chr(10), - ' END;' || chr(10) + l_source := ut3_tester_helper.main_helper.make_source(ut3_develop.ut_varchar2_list( + 'PACKAGE test_tt AS' || chr(10), + ' -- %suite' || chr(10), + ' -- coverage is 100% on this module' || chr(10), + ' procedure foo;' || chr(10), + ' END;' || chr(10) )); --Act diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index 92860769c..c61c14d3a 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -32,15 +32,6 @@ create or replace package test_annotation_parser is -- %test(Parses upper case annotations) procedure test_upper_annot; - --%test(Treats procedure level annotations as package level using source lines overload) - procedure test_proc_comments_lines; - --%test(Includes floating annotations between procedures using source lines overload) - procedure include_floating_annotations_lines; - --%test(Ignores content of multi-line comments using source lines overload) - procedure ignore_annotations_in_comments_lines; - --%test(Parses package annotations without any procedure annotations using source lines overload) - procedure no_procedure_annotation_lines; - -- %test(empty source returns immediately without processing) procedure test_rmc_empty_source; -- %test(source with no multiline comment markers returned unchanged) @@ -69,10 +60,6 @@ create or replace package test_annotation_parser is procedure test_rmc_multiple_ml_comments_one_line; -- %test(comment markers after string with slash handled correctly) procedure test_rmc_comment_after_string_with_slash; - --%test(Parses source-code with Windows-style newline using source lines overload) - procedure test_windows_newline_lines; - --%test(parse annotations with very long procedure name using source lines overload) - procedure test_annot_very_long_name_lines; --%test(Procedure header spanning multiple lines is handled correctly) procedure test_multiline_proc_header_lines; --%test(Non-comment line between annotation and procedure resets association) diff --git a/test/ut3_tester/core/test_ut_utils.pkb b/test/ut3_tester/core/test_ut_utils.pkb index 433987c01..4dc10492b 100644 --- a/test/ut3_tester/core/test_ut_utils.pkb +++ b/test/ut3_tester/core/test_ut_utils.pkb @@ -375,8 +375,8 @@ end;'; procedure replace_multiline_comments is l_source clob; - l_actual clob; - l_expected clob; + l_actual dbms_preprocessor.source_lines_t; + l_expected dbms_preprocessor.source_lines_t; begin --Arrange l_source := q'[ @@ -390,11 +390,11 @@ create or replace package dummy as gv_text2 varchar2(200) := '/* multi-line comment in a multi-line string*/'; - -- ignored start of multi-line comment with multi-byte text � /* - -- ignored end of multi-line comment with multi-byte text � */ + -- ignored start of multi-line comment with multi-byte text ☺ /* + -- ignored end of multi-line comment with multi-byte text ☺ */ /* multi-line comment with - multi-byte characters ��� + multi-byte characters ☺☺☺ in it */ gv_text3 varchar2(200) := 'some text'; /* multiline comment*/ --followed by single-line comment /* multi-line comment in one line*/ @@ -403,7 +403,14 @@ create or replace package dummy as string*/}'; end; ]'; - l_expected := q'[ + + --Act + l_actual := ut3_develop.ut_utils.replace_multiline_comments( + ut3_tester_helper.main_helper.make_source( ut3_develop.ut_utils.clob_to_table(l_source) ) + ); + + --Assert + l_expected := ut3_tester_helper.main_helper.make_source( ut3_develop.ut_utils.clob_to_table( q'[ create or replace package dummy as -- single line comment with disabled /* multi-line comment */ @@ -414,8 +421,8 @@ create or replace package dummy as gv_text2 varchar2(200) := '/* multi-line comment in a multi-line string*/'; - -- ignored start of multi-line comment with multi-byte text � /* - -- ignored end of multi-line comment with multi-byte text � */ + -- ignored start of multi-line comment with multi-byte text ☺ /* + -- ignored end of multi-line comment with multi-byte text ☺ */ ]'||q'[ @@ -426,11 +433,9 @@ create or replace package dummy as in escaped q'multi-line string*/}'; end; -]'; +]' ) ); --Act - l_actual := ut3_develop.ut_utils.replace_multiline_comments(l_source); - --Assert - ut.expect(l_actual).to_equal(l_expected); + ut.expect(ut3_tester_helper.main_helper.lines_to_str(l_actual)).to_equal(ut3_tester_helper.main_helper.lines_to_str(l_expected)); end; procedure int_conv_ds_sec is diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index f1dadec66..f60ce796c 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -155,6 +155,24 @@ create or replace package body main_helper is begin ut3_develop.ut_session_context.clear_all_context; end; + + function lines_to_str(a_lines dbms_preprocessor.source_lines_t) return varchar2 is + l_result varchar2(32767); + begin + for i in 1 .. a_lines.count loop + l_result := l_result || a_lines(i); + end loop; + return l_result; + end; + + function make_source(a_lines ut3_develop.ut_varchar2_list) return dbms_preprocessor.source_lines_t is + l_result dbms_preprocessor.source_lines_t; + begin + for i in 1 .. a_lines.count loop + l_result(i) := a_lines(i); + end loop; + return l_result; + end; end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index 7decad88d..71575e145 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -47,5 +47,9 @@ create or replace package main_helper is procedure clear_ut_run_context; + function lines_to_str(a_lines dbms_preprocessor.source_lines_t) return varchar2; + + function make_source(a_lines ut3_develop.ut_varchar2_list) return dbms_preprocessor.source_lines_t; + end; / From fecbcc11649fd20fd04c6977b3c68dc6f6bbd64e Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 16 Mar 2026 22:25:09 +0000 Subject: [PATCH 119/144] Remove redundant parse_object_annotations function overloads and update documentation --- .../core/annotations/ut_annotation_parser.pkb | 124 ------------------ .../core/annotations/ut_annotation_parser.pks | 13 -- 2 files changed, 137 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 8bb9b1b5e..6fcd7a5bf 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -87,49 +87,6 @@ create or replace package body ut_annotation_parser as end add_annotations; - procedure add_procedure_annotations(a_annotations in out nocopy ut_annotations, a_source clob, a_comments in out nocopy tt_comment_list) is - l_proc_comments varchar2(32767); - l_proc_name varchar2(250); - l_annot_proc_ind number; - l_annot_proc_block varchar2(32767); - begin - -- loop through procedures and functions of the package and get all the comment blocks just before it's declaration - l_annot_proc_ind := 1; - loop - --find annotated procedure index - l_annot_proc_ind := regexp_instr(srcstr => a_source - ,pattern => gc_annotation_block_pattern - ,occurrence => 1 - ,modifier => 'i' - ,position => l_annot_proc_ind); - exit when l_annot_proc_ind = 0; - - --get the annotations with procedure name - l_annot_proc_block := regexp_substr(srcstr => a_source - ,pattern => gc_annotation_block_pattern - ,position => l_annot_proc_ind - ,occurrence => 1 - ,modifier => 'i'); - - - --extract the annotations - l_proc_comments := trim(regexp_substr(srcstr => l_annot_proc_block - ,pattern => gc_annotation_block_pattern - ,modifier => 'i' - ,subexpression => 1)); - --extract the procedure name - l_proc_name := trim(regexp_substr(srcstr => l_annot_proc_block - ,pattern => gc_annotation_block_pattern - ,modifier => 'i' - ,subexpression => 5)); - - -- parse the comment block for the syntactically correct annotations and store them as an array - add_annotations(a_annotations, l_proc_comments, a_comments, l_proc_name); - - l_annot_proc_ind := instr(a_source, ';', l_annot_proc_ind + length(l_annot_proc_block) ); - end loop; - end add_procedure_annotations; - procedure add_procedure_annotations( a_annotations in out nocopy ut_annotations, a_source in dbms_preprocessor.source_lines_t, @@ -189,55 +146,6 @@ create or replace package body ut_annotation_parser as end loop; end add_procedure_annotations; - function extract_and_replace_comments(a_source in out nocopy clob) return tt_comment_list is - l_comments tt_comment_list; - l_comment_pos binary_integer; - l_comment_line binary_integer; - l_comment_replacer varchar2(50); - l_source clob := a_source; - begin - l_comment_pos := 1; - loop - - l_comment_pos := regexp_instr(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,occurrence => 1 - ,modifier => 'm' - ,position => l_comment_pos); - - exit when l_comment_pos = 0; - - -- position index is shifted by 1 because gc_annot_comment_pattern contains ^ as first sign - -- but after instr index already points to the char on that line - l_comment_pos := l_comment_pos - 1; - l_comment_line := length(substr(a_source,1,l_comment_pos)) - - length(replace(substr(a_source,1,l_comment_pos),chr(10))) - + 1; - l_comments(l_comment_line) := trim(regexp_substr(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,occurrence => 1 - ,position => l_comment_pos - ,modifier => 'm' - ,subexpression => 2)); - - l_comment_replacer := replace(gc_comment_replacer_patter, '%N%', l_comment_line); - - l_source := regexp_replace(srcstr => a_source - ,pattern => gc_annot_comment_pattern - ,replacestr => l_comment_replacer - ,position => l_comment_pos - ,occurrence => 1 - ,modifier => 'm'); - dbms_lob.freetemporary(a_source); - a_source := l_source; - dbms_lob.freetemporary(l_source); - l_comment_pos := l_comment_pos + length(l_comment_replacer); - - end loop; - - return l_comments; - end extract_and_replace_comments; - function extract_and_replace_comments( a_source in out nocopy dbms_preprocessor.source_lines_t ) return tt_comment_list is @@ -317,38 +225,6 @@ create or replace package body ut_annotation_parser as end parse_object_annotations; - function parse_object_annotations(a_source clob) return ut_annotations is - l_source clob := a_source; - l_comments tt_comment_list; - l_annotations ut_annotations := ut_annotations(); - l_result ut_annotations; - l_comment_index positive; - begin - - l_source := ut_utils.replace_multiline_comments(l_source); - - -- replace all single line comments with {COMMENT#12} element and store it's content for easier processing - -- this call modifies l_source - l_comments := extract_and_replace_comments(l_source); - - add_procedure_annotations(l_annotations, l_source, l_comments); - - delete_processed_comments(l_comments, l_annotations); - - --at this point, only the comments not related to procedures are left, so we process them all as top-level - l_comment_index := l_comments.first; - while l_comment_index is not null loop - add_annotation( l_annotations, l_comment_index, l_comments( l_comment_index ) ); - l_comment_index := l_comments.next(l_comment_index); - end loop; - - dbms_lob.freetemporary(l_source); - - select /*+ no_parallel */ value(x) bulk collect into l_result from table(l_annotations) x order by x.position asc; - - return l_result; - end parse_object_annotations; - function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t, a_object_type varchar2) return ut_annotations is l_processed_lines dbms_preprocessor.source_lines_t; l_source dbms_preprocessor.source_lines_t; diff --git a/source/core/annotations/ut_annotation_parser.pks b/source/core/annotations/ut_annotation_parser.pks index 5a041ccb4..8182acbc7 100644 --- a/source/core/annotations/ut_annotation_parser.pks +++ b/source/core/annotations/ut_annotation_parser.pks @@ -29,18 +29,5 @@ create or replace package ut_annotation_parser authid current_user as */ function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t, a_object_type varchar2) return ut_annotations; - - /** - * - * @private - * Parses source code and converts it to annotations - * - * @param a_source_lines ordered lines of source code to be parsed - * @return array containing annotations - */ - function parse_object_annotations(a_source clob) return ut_annotations; - - function parse_object_annotations(a_source dbms_preprocessor.source_lines_t) return ut_annotations; - end; / From 2547b4010eddb17eebb0a3f77a2eed74587c329e Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Tue, 17 Mar 2026 00:04:45 +0000 Subject: [PATCH 120/144] Update code to avoid --- source/core/annotations/ut_annotation_manager.pkb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 65f7b3e40..05301ea94 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -241,12 +241,12 @@ create or replace package body ut_annotation_manager as l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); -- replace comment lines that contain "-- create or replace" l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modifier => 'mi'); - -- remove the "create [or replace] [[non]editionable] " so that we have only "type|package" for parsing + -- remove the "create [or replace] [[non]editionable] " so that we have only "type|package|procedure|function" for parsing -- needed for dbms_preprocessor - l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); + l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type|procedure|function).*)', '\5', 1, 1, 'ni'); -- remove "OWNER." from create or replace statement. -- Owner is not supported along with AUTHID - see issue https://github.com/utPLSQL/utPLSQL/issues/1088 - l_sql_clob := regexp_replace(l_sql_clob, '^(package|type)\s+("?[[:alpha:]][[:alnum:]$#_]*"?\.)(.*)', '\1 \3', 1, 1, 'ni'); + l_sql_clob := regexp_replace(l_sql_clob, '^(package|type|procedure|function)\s+("?[[:alpha:]][[:alnum:]$#_]*"?\.)(.*)', '\1 \3', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for From 7ddbacc4b02faadb614e2855758724d47f99dc75 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 17 Mar 2026 11:34:59 +0100 Subject: [PATCH 121/144] Added tests for contexts and suites --- test/ut3_user/reporters/test_tap_reporter.pkb | 34 +++++++++++++++++-- test/ut3_user/reporters/test_tap_reporter.pks | 8 ++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 87ec1dd9d..ed10a5aaf 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -159,7 +159,7 @@ create or replace package body test_tap_reporter as end escape_multiple_characters_test_name; - procedure special_characters_in_deisabled_reason as + procedure special_characters_in_disabled_reason as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin @@ -170,7 +170,7 @@ create or replace package body test_tap_reporter as from table(ut3_develop.ut.run('test_tap_escaping.not_skipping_escapes',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); - end special_characters_in_deisabled_reason; + end special_characters_in_disabled_reason; procedure special_characters_in_comment as @@ -187,6 +187,36 @@ create or replace package body test_tap_reporter as end special_characters_in_comment; + procedure context_as_commented_subtests as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%# Subtest: A suite for testing different outcomes from reporters%# Subtest: A description of some context%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + + end context_as_commented_subtests; + + + procedure suitepath_as_chopped_subtests as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[.*# Subtest: org.*1\s{5}# Subtest: utplsql.*1\s{9}# Subtest: tests.*1\s{13}# Subtest: helpers.*1\s{17}# Subtest: A suite for testing different outcomes from reporters.*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n'); + + end suitepath_as_chopped_subtests; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index aef27fa0a..d24c76e32 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -31,11 +31,17 @@ create or replace package test_tap_reporter as procedure escape_multiple_characters_test_name; --%test(Disabled Test with special characters in disable reason) - procedure special_characters_in_deisabled_reason; + procedure special_characters_in_disabled_reason; --%test(Don't escape special characters in comment) procedure special_characters_in_comment; + --%test(Include context as commented subtests) + procedure context_as_commented_subtests; + + --%test(Suitepath as chopped subtests) + procedure suitepath_as_chopped_subtests; + --%afterall procedure drop_help_tests; From 3d38fbe72cf28bd2b8af08bd8fb4e2d3b92122b4 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 17 Mar 2026 11:50:51 +0100 Subject: [PATCH 122/144] Added TAP subtests to documentation --- docs/images/tap_reporter_suitepath.png | Bin 0 -> 43331 bytes docs/userguide/reporters.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 docs/images/tap_reporter_suitepath.png diff --git a/docs/images/tap_reporter_suitepath.png b/docs/images/tap_reporter_suitepath.png new file mode 100644 index 0000000000000000000000000000000000000000..488c7cfbf9486c2e641177c61ad6480e8546af4f GIT binary patch literal 43331 zcmdqJby$?`+W)K4NQZQ%bayC?fPkbR9nxJ=qkzQFpnxEq(jX}@G$6a~vEO49tC8_jTX*b$-t8`8_8}>!~s>HYN6*J9ltZRTQ4x zxpS`w`E8Afj(nxt7($O69(pMnddYj(Sa{jHy3p&|JKNk*u&3u2rPui3K`+23AVSa2 zFCiouEQ2Pp<*@tPq1X~OnBdM zHEkB#8bj90$89=y?VphpL@LmGMLuSDBqw2?V9mf_YzrTCxfhmVLf_#QEPK8&T>bfY zNO08Ya^rlcvTtk44p-s!%isgyuTi4I{K@SPU;d|&K6FHFBF4^NUJCux>1`hoNH01v zGIGm9;$^SywiK<-9*A%`$!i{(4y8|N7p5swbCgS;-g+Q)cEnyMQ~O{7Y#QcNzX4CD z28O+4%>|#L6Yli{L8nT@>M(X54ELr7_2*=cRl0nIZ~0x{Il+CRX!=d2z{tJVE(w4B zj4HO}+UL=usRw~)^9CxPGo@XUG|3hbCvJXKAL0P87hcd9ZbCxBF^Ulib#6&Sw83~g zk(%k23nF4*Bgva4_**6SCE&zWVOh*R(yZ@4NXP^`%ydwJf>4au*Sig(*INp z45Ne;4soKb~s8&yTTDPLwkV}iEvsmOtY`Wfo3Qu^4 z?PlJIAa7ncT-PvINvyWh_VZok~|o7%%w4F^m3g710ihU*mRs4O0N)IG8QXT?*RiM-=CKQyq^MtQu!%4Bd-QDk}ZvTj7P^KhjB^XN1@ zrSYyO=tbPg6JH)IzB~yl3fr5Pg207X#VXImZg-qmS85;w6yNIf#G8Gb{7Dq@wwd=i zoJr&0{w~r*{0hUz(rlVPtic6i^mtJ(xs_nKP&$OGS4`KzcdkwvAUTemL4Vb^!{8W~ zv-LJkRH3WEmo2zaY~C>}EitNTuJ(bT>4%t9xD4GZ!ftohK+jE>qY5AT!0h>Hi{Eio z6=YEQZlq=tsRqpq5cu$F&$oxk4Uw95)OGB)w~k*uLLFWy`c|wlRpG7I4w1XNT z&?Q1q1*7Vho2G^|q|fE=D+n1RHrr4E75sDt&n+kR1W=Wgx**m}lul^ZHN`JTA0Ibu zS;=t4!U$LF@Z*5h*vYQsMvC>1h~q7p0hhEg#u;Whq&`m0pMlqg+Ci0Tl?)`S!*7O$ zzYg#jYw4u{V?n98_J)3$url_=)Su-mc^vlx6#UNbJKaO!$z&=~#-{*2Ri3ecYrd+c zN(bi1(E9ou5#^@PjU&%B&v8QW{VeswKrqxe*Z#Q(UgXNlh3u%n(S`3tg&~tc4f6q? z28^Up%$zGi9ICp;jyPt2zQER^Q`HrYZbSfYmPJ>KR@TMFTZtLt_B#O+G-SmR4Wb?9 z2TCVf%<2?+Es33|#tlA32NRPzpT@sH?lVK(8hGFaZ{8{1C-hRLMrSz-%ii~X^h!b> z;rl?J&TEtSsU@NoC@~yuMS@7cEymD<>Q?AY2K81_ZKx6ac)hpf`5DMfSD{qNbaB)| zdb_~^Iuu7>{&^-l8(R0e_zq7E#k#UO?G*AGIuj;5pFRy*h^OmZWzrKyGD=O6BYnC%(?PRrH+TAlN71)_@;CoxiAo>2_MRrP~V^NDvwv3O1>0|gc zR%{lt(9CL=>4x-Dr?wur9z~JF8!eH6I4|rOG7h0Tz3d_Gch+eAN%`wdgd<0+-`vh@ z-rK!%lDP=lEwr0;j4iXYcEOhzbFexJi7IJ0NcGeTLC>M>i<_iA*^#(oLPgiVkN8^h zsYzni)143e8qU8&;7^Zs8SZvMA&jH_>iF<5{y9%~E^FhXu8H{E;pO?0EAE`xZL#{pY{0J$pLVjdj7m5NG6lKsxs0{j~Ig}d%MTG{5O$l{3x2{@E0*s)s8*2B?$QtGJa_o*!-fMeD6EtO))>* z_P$8@(@+ZB9gjxM+rU3Vd$}k|rJY%WBM3hfPdY9eJK*uXzWs|=h4`j!djYA%^*m!g z5s6Ui;F8Sksh9*@tg_u6cpME~=Z}#hRb`?;&FI$wf4J>wu1E7d0JayZoBmNd$wUvhrsI)!UgG(8%80j{h^o{7;ng z|Chhh&oqut+DIk!d57oOAMBnHB<+F5ns@OYuAt)pb`@LUXOb7!8LAf(OH1E}ww4=^ zSSFbrKox&}QhFZzWRb});K;4+-IC+EoXOr9GGIq;y*ozN(GbkD(Zzfsh}VIRywf|` zzYY-$R@xge_2AIOW=xU0R33v)~%*S*{2Zb=$JFC=+Ek>R?w#7a;Jym%|i+2SRXO4sLyRMqXaf~&xU#pmih=>V@H&F81h|oT9^1WQOC7EM> z320q7>7PxMCfs%r7DYx3UI-`Me*q z#+Abek^zY;gx3Uc4`V_&Y>&u#j)tbOn?o+2Rama^7ekQ-EX!|^tV9njmP&m6ekT| z@JSgj2hXcV2-ADxf0V+E=Eroo(z5*5N>)YW*}F1OK13%cS~SR&sr2@NG4j+5o3_m2 zwz5Ba&tjihX*P3w@uJ2MJhIqciNAxQz=x}llRc1|A`{J{55)cqF2n(4UZ!>M$plWhCivp1vYYIaG(mm#!W zCf&zwE6Eys-O}lpk?Bla4skYw->v6{FJ8XxT#4NpQ%w{2*`vYAPg)fv9M`T#Z!;!` zx+vq`xKIM2c5s`esr< zL-(XMu~ixab|s>ma4$`9rSz*s+>-If1#%p8!pYs@dL~t+&4@yw&DvcYhrKCdX!Sxo z!|B4zf!;iY&GJ0l7|BO(Fu#t#DPaVXK1AV5%UCAY-{nkl}%a3^oa9Ix^lKE5L#WNQ0(&&0xK5z)*J#wd0-+i0ET%sK>ze^!OS0 z(@e>&e=pL@X@7!JwB8}6c1^w*qw%MMVcQMi?&e)Z!gImtv(c>R&`WfMJ}>!_RGemQ z)T_Acuqap;y<|w`;yquPV^&t&xYw!7d6m{7j8EQ|`Y3TpnO)ZxD2bZ)B#*9sIFu#~ zWH5Wka+S&=XRR>AZTB#4G+$M@r~X(`+vh>)((H@zZ`G?Ug##yaui4;N5~i(HD0Q_Q z1h;q4;E43Ya@70}X5v8XUEx8vjqspLlG6vnGcd~m^%z-vdmx!q-4hZhIMTI!378+} zD5m&c$a{=BERF)`&fDKTVHEx`^Z0Q1OOnK@fuiasvMcFJ4#uE2z!>keMuGbdnQl(1 z*A$LlmLe>8HG1s`YoOc5het!!x}7n@$F}*;*9fE}Y*3}@t=OM{BYPi;3ok^Qr?pxN zc11kxcxTE=sP8P6o((KC+n1>@@?SpFTvWD4MZ9Lk)D2u^k!;yrzOb`(N|z;Lh{E#w zvEIoyH$0$b96rbCc)h9AhZGJ%coB!up3f&p7WqW5#%|j6ZpkJ*^LQsu1wn20sxU3a zttT-4^;2>Y3!zHzq0I90bWbC{TTc0+e_$mv!@)x7%O)L3PKTAQp&NEy*>@xS3a9Yb zU1Hh$?soI_dPDjr&iuxj|F`23GGrb-UI@;2_XXo&mduBYnqFhuH-umBcbNSdR=Wni zGyD=2vidGExM!;+aBYRke}k5o3A&ClL*uW68sf>kX^_AAI~>bxdvKVI1FM6a6RohY zDVNt>vTx6Uhx(sMC}+Y^eW}=foTcIyvju(MEIv|9dq;`}yx^y#?tB*hm_G_Y#b7`G z^;$L7>Y$^{6*A0*k@L1Zb86&rx@F-HJI`APZpIv&^NGakWNcIVVI_? zYST`let3NI4>(84^o!0^kn8*Z0iBuK&DU+40;&4EGWygg->mjt@1 z9?cabZYbgL0L=3xX_8QXU-^~}$iRF?v{mVjv#>Y`)+lRk_RakU>xGd3S(ZJ*8)ql- zGv^B$oAezY-pO?rgvYMg1c?_dLL!SU`}N~cbc;t|6#v6T}}FZ4mFmS(I+8 zFjzwH&X(&nF1C>(YCf|dib!LFbC^rFGKAGzSSAQcMsn@bIdI72rkTy9Zsv}e-b3Ko ztdd09((aEo8pI9%iPeUpDKkxtyZ!sHJfWX{0Pgo`Y{iza$|P`Rb^OQ@XuS!fuMfuY z&G^MlFkJE*0+Ny(H!Ey`;Rkl44=?t1928WiMyApiiI}ng)Wg9~yFem_9~qjE(ohpP zfWq|BiIb~-n0@BFw}%Wuu+E#$$VB0ZI7T^3zl)I3q_e8$9I#Le=vbIY z$yd=OV*$mfsHi_uPs5KndqPrB+41phhPHKb51je$x)P@9=kAYfq|qSLFcalPN09AD z|CP?-@Z9&WXyCAABJ26Za))Wp8^EO(CuJ|9c^O9bggfD2D0_^96Y{v8ElZ~)3`><=T^f}(6etNX`uOt)v>rh-8czWKA`gZ)x zyG?bzh-?e|TYOp_{8#v7!u_6bvL}Sswlzd^3|*dCXb2qr#LDyJN$Y(RSM100ny+{kWWV~8DC4E()wNRVaZrX?`MuaPE2YT3QzaKD z81x3SG?)D1g4i-Jm<*D=qT7i` zzjp6U&+7gwSbE}ifOlutZoOJZS1PZxTK`pyEf5|K821s_O?; zxW4xL0a@M1AH3jh3FRDO*`%^FM|)+R8gu`jQTa;p?yd+9>F+-|qp^O;NcJB5m$3<+!>6N!Wuc2&bnTZNXiO(Vm`mr z!-NJ(8bzNj=hj3zL*I0L{3wxql}fl+Bgsg!a9!7@Q9+qse(~L2SWefV`{#PRxhy_A zuqnHy0dV$$dPtOBpomJY&3Yh~@w@L0v-&O>`W&Ix`h%w952F0`Zm6xy%J&2x6Bg>~ zNivaVRl$s&{6YipYRQX#ToJgS``&9Y3RYwSkz+V7sD zj^ec?@C9OC`C@e**0H3u1=7Wd%PvAfMWnxUe$KhG>KoHra#ysg_<)Sdu&JJPcDgn- zMc%>t{vL@l&QCCYkP)roQ3@B~9@oGqd&s^93ZGY)p|7z}VBBs;JZD4xtags>FuT+| z`B+=H`9*>xAD_$vZZ6R3^;^fpAa&2BVCP4vmC!M*T` z+A7aLsUy$tmMgHPL2;R#5lT9!AJ)(^jaxvM7BkLneDI-Y2jo0<*0UgQ8ItNojfVE1 zE|MnFLjEd0U=T7O&2_K#3x@2>CGEm-J*e^HDw2k_jF^!D{Mh6pPvo)eBjg5+yva$2 z)GNEzH=6du{MCv2(jH6&nvj4ZQjq@)Ad=lwzYXJ{Kv-4 zTvZvn1y`ZHy@k7X^^6bZ9L*SpS#xt={6SKc!U9`d=_Idd@ugx9MUAU1yeWt54F8b8 z@*D|6x5X*`O5~cMeY&0<`rkyZvHHl)KcVpVIFn||sFBQLFMWH0Q|5fq7|Q=QF=~ts ztN3WNmmn^8^aiUfo#N^8Nr$mX?%bKV>3D=8p!G~i)uUkOxY4uybg$u7OFO|}{Do1< zw`*xY^PgYS+vEQI8VPK*s+;sN*}r(no{m21g3quGr^+1MOStFKanNttv*QX11%W<< z$u2G74#(^{mwnA`I&N+}^wX^J-!JZw4rye=S5}*A^Wh~~KyHwEoKc-8QbNO#DcTI| z!(w-+NE8%qnMj_i<+Jm@mW+N0dYiZBE%-3=@ev5^T=P%%`KI;h+riQC8(r-Xv(%^E zA2X-@8+~=9h_fyQyF}rng2|kUTJKlrrYN+Zp*QTy-kTzLLpUlMXDiFLYDUF1La-=v zsJOV_hEo;TK>9%b{^nUlZIZhb2c9-ufI}dO|6Eqqyo%yr{}?qXT%n6ywHP{+0z+BO zYM@rM1SFX$Gc&W&vkqY>1+ZX0GcX_N8fLFm9fAKHeb~EdX*PB%3~x>ucO}+LuZ1C# zDEKnMI2A)X2m9wK^b@Sj)W(~JFV^8?z~fi#P@TaGFM1@i82QC+i`)Hc&1dHT?V91H zp%}ICj550O%z78Od3}t5&Tbg8HP^Hy$K**|y zc!{Je>AK8ZIJ-b#lMt?!e29;sqTNJ+(w2w-p{Q|+WgjP%_U_c(ZaSLi0LU?4&@0+q zk2_z$gz+7)Z1Zn7Z6!h?%2hor-%pDO3SjRxYhlUd%I-hh9zGcy)GqwutD96{0)r32 zPhG0M1jQlKj}iv{w5$k*0<`q><3y&7J=|3b%+dkH6v^WYw=iBRft0{VWW8XeAOnR+8)OPpkPBQ=&a;`Dhy>?NaBJhL+dkf6o%YSGAq|HxD*N z&_nN*I>_ep{wc2DXgF<}woT!+z{sD0f^f|W=SHL+ZSp$8S-A)p=H|@u=`8!7c2zG( zS}c`2SDT)euCDKc+T)SQ5q?`1hOTbc~x7&kIzJ6wyG z!XqE^ghm#N`1xn)QS9YqnHT#QcAcv^n6I*&#L`uP zc1fXl&}M%pJdR+;B|3aGk>!N`mH}2Ya z`^tqX+^unM?X9tE+c3)eiC-Sl*!+B}M_Hwhs7Md^btk{?t%|;_!!Vkx2>-{z?SBmo ze-Gmlh5t4T^Sr|ur}-Cx##pa8-xLc|sbGplpRA0sN3ig3-D0cDox?1GxdL-x=7D%h zPR?(cg9knIPoDTaR`Iv>*{6G{?%Wn7PC`0$Bd9H&>65Up_1n3js!^c#GQ*w23hdeT z*@WXdQL5TwMYE}2KdAN5m)tb|vvg!YRD5(g@P8hKz0g$0#>Ti3Z{z-$UjJ{x`8}im z@EDS7KT!lg+fMp4=%>ENYXKR#mu5-VcmJ@|PzF^m>4gg?+T!a~2whi@FMe;%^3r#n z17wQ2v6lAJ-&g}rvFo$y78@djd#>SlSu-jC6+lH59z+$a{9)tE(tYpddEfJkk>-k` zoa2j`!4e<*a$4!`cSP7DBQcd!ZPA@v zoEI?pZ>0=jwCwgX#-gDYu|SbqDZ^YP9sP@6l67xom1(EvsB{Eb5h6^U<2D|=al5^) z2xC4MIadYY!#6JuQCZL5t*&pPd^)viT9Cr^^fB6T?O2J(d4%?sN+-d-;Zd1Nr>~g- z)00x4%IO~|fH6^V8HX3R7yWRf)Pvzs8$DQPwvbzcO=?_;g0a7CqP z*zoTa44!g_PhogH5LJG=?fbga1pVjh9t8%|sOSFIuAjTy(RW2iH-VQUz+FLrQrTi` z366b)xvZ<*B~>OQHFz@i%yG28siSQ+FFem#5a74qaWMFix5g5n*9J*7>XVg1?ppJ` z=B4uUiKiEVMl5}@0H*PxkuH6&-cVkzE}oj!rJqU{wRBys0Z-fm^@Sz7@u>!j<`V+L(VJs}^JNOQ9Br_I@wj z8@9|K{?}Dsgu?~ywPGI*pP;e7ljA=)Wb3(r@$~U_+g$r>o)N{|6*y}{@NA?8`lutc>kJSVpNM!l>5*;{;?Pe|DddcDK8e$bTkb6r(1zy#UsyN45-(t$OQ`uF zAE+;Lr?D5OyT_uvdZWO6%pi~P)$9^59T;LJY7S`D<0`b;gk$%hqjkSlFGtM)Y~jz@fJbTFfDJwsX-MErSG96j=B_a*5)gdTD{(-#JQ&E+eoL zZ`K10H!*eBls%?`xuJF(57afK-6xy)IPjp$%pBi*N;Y(zWcg5O?qx(mh&v}05oL=` zAU^4-=Xc-gN1p8FZxK(b*JZEP!oH>FhgO)&p1muxREdL_E6H%t+z^`I!G@m3(;+vT zdSIvSOX`WHL|^qDY4_X%gE+|QR}+SSiw=WNJz@PCY1d-{)=m62-1fG+*RQfJ2nS6q zwxstM7KNqoF=XaY1sC(9UYCf6#BCTpxT~776azpf$61b~%?x{(|8&usNarx!5VB>A z_Ur+-!gm^X@^`bu!R<45*S8H};OB-x-+`QpIu&g3ntF=bzdcTuui&8iy5RY}%GDF~;p^w9v@HWtwVm!)j+N}fP!BEjpq1HCaC-}qxw;p^-Dl(a3qZ+R=3N3nD^&~PXDR0;L7WL zJXQUk3q6T`bs6WI7j^r6^g97J$UTV%PxgJ48n#@BI{QPuXe&MD(%giG-M3~LJbZm|aYudv3@r2`+=T560Xm(A9JY}#ILLe4IbvC72CkbjDag?#wto3^fb)$=pnvgba@ z)`LB@2%a~ak?npb>n$q`r9O(+qH7thjcX+k%BO_I&&Y-!Z>8mupL%DvDp9@Z|VjMsGbo#3#v{Q#aZ8#p>m+o?IF{`G-Z*&u7rI{U{`jRyt+tw*d zlxmnLVrA?h)5<3rdF?ADuBTr=&6%Qp{y~~SDC2dn=tLlj&$fH)Mwbibe{Mh3e%t_9 zlX=2)fg$ubXYD@k+}t|)Y7#qya)sA)4No0gVwT8xUEcHoA=ddLC2H)<0@cgBQ!H~-30qw&r{O z*~aUrzMW+E8nbQ`*XoHMTfs~bzyYe>EMTfmJYCjwpbo__4We?D5x>K2 z4K4Q>XIc7U?uoZhXf#T}@)^;KEl`5Sj>~Nln zB3Q1ltOSAujI#tn9`RC;vY*J=hhUwspM*lm!+dq@De6Z7jeEaAjk~; zU!kXk8Oo)Qe$xQTbFb5$EZhLCV2U$sUU35V{Qdq8DiUj!;=F?xPtUn{Gd!iyYr1}> z^VpshNp#Cc_yB9f5$BUhPC+~a*dfI7riw)QPAu&)nbce%&eyf(;G;`u9-wjrJS79F ze6e?2bq+Ig@s~yTpM&5RCHTch+aIZ2^?wmr4U)+0NC{(-hHz#V=NkyW;NE&~rY=tE z&9rtG(3tw;k=~nHzMx(PJ0i0*YN`1;rQ@S}B$rBgLBteuiUtiFEcU&I(t=o2ES#m~ z2CK2+t&%R$l}bl-sntcZhXdp0pCu&1Wy8v(;gwB4v&)Xpm1RKyFDZmq4Y~R@R}zAo zTr^iSFa6?CrQf~efM1HtN8M=Ps{M*BGI8*q4!g9S-)&E|S*?@CaLeh-uaU;@CiG!U*FtwqS z@*G^goOLrZh)IFr*hAsmh3+aVb!B4a8rgtON_E7w?|{Bz-^R248E4?VP$)YdnL(F7 zyCC#t&qz&e|dDAQfI*qH^IX2!uJBW-?1ar9*%Z?80&JZfMV;x9bv#={!G4p=-~YtAV-Z+YJvy-&sEYD_uU1Xp%5= z8pW$D2h>Kqx9lqOr=%NRCtscI7r5@~ z)h=5|=N%OMa{+M_)K9f?`UwtktUeB);7=QWUdOa^cv<%(1^`zo(8zpSu?561+X^$W zeAOcPp5|ZZU7J4jy8n0Sc1^WdHP2G=KOlFlb+P~9S9kQW1RpNAIqvuz+`J+#U8JN$ zAkp8qrkR<;+!&6Qx;{yp?H7ujP_qy7y#0uh8jtTgVrF|CVDb^% zcN$+6eQb>B+aQa$XolU$>|Y4`Kn`EI#1)4R_GfRz^5pM5#vdgK6g~~IcHkxifMHE9 z?d~pLc(9eOUuDycz{u5VPCqxRw4K|WZ~^cI+ar5*06_T&7La8!betBPdUMn8MFN!S z6PQuq)?Fyu{!e+q^~C-f?4f)NxUeml)b!_0a@kp-nk2~J9x^Z{|JE06&2j!gUu?aY z|LYte&uexGH1ID9ool>q?qnH1FOJE6B>_{^e>&>jsDRXfT%)sFM}3cyQWwgrk}#_P zQdTfu9k5gZo-222o}U)aO8Dm_fWX7tSmBDMt1`%zx_sn~L^-Zeh6uw{1=-XU5=k|N zK8gG21;st$Hd(v)f<2QWt#;5Ut1o9SekVT8AuPLiwBO~>p>)1XYjw7Y2zapZXk*RV zI;|paEeq+y$5%+Lb{h+h69bGez5XL_SWAfiTi)=xgmMxDP{oMPzUl*o1G|Dg36t76 zJ~*?ckyke-KD;37oFs^RB%3HN>M93!CpDVl*_9AOg)RjNi=r}!J(54e?mrXJ)>sU2 z{(v&pw`GcWktsW~IWu)35#YA``)>H;A_E$g4c?QI8691R$YT*gGZNYySb}-Ihv=Z4 z@tzYFFSBe(`f>rm$V6Sxn}-5CnMPf>Y#0*)R0yALZKGk^;Yf%7sig z|4lAL=C(Q6fXsz7`JVd-!YR!8{FwZ`h>Bt)+>=$+-`eqsUF-kZI`A=#X9r6byz~0V zs~o=1RW7qNT{h3+u3mUi@A|gLW=@RWRLtpGFmeAC)qI_9!k1C+E6_a5SGc`WMPCpv zHQfTIE;7Nqw`QD?BwJ*Pb3RqC#9J=$m%FaGzUpu0I;T6SPub$>pt?{EPbsW|@GE3h zUVO-C=}<2-z|GZ>Y;&~Yc&87t*}6HiwE@|$jm-{-AB|>^PD5sQ5wMf0(y==gACz9BMzJAbgNXO z#fe&n{I=x+Ob(Nu$+fQT+QNTq2q*l_!>8>zZ1rC%)_z@+QkpdQpmfeBxagsNj0?#0 z404s4E~>8D`bjLyZm;dtyhS6O{LjX!)iR-l4;WiFHpAdBG)890YsVA$-C0#~p8&S< zjQZgU#}l4dw)uJ&JQjK!VzYQ}FKqOD!q|Cq`KP1qjvR&U@aRUA#=i5lW?HbCi`jdN z(qty<&|N=oWqF!6gRq^;Lo43LUkP)p`pI8pr-!WdWqyA+bbr9N@$Rs8q&Ro+*IF+$ z+2l3LKogm-yyuY7SlG<fG>+M(B$UmEs-4tsBcq~{OKd)P5A92M4A(#*>e8EM_73=NHOB5 z_4%lbVE)pl?!iu*ycOZXJjz>fac`MZUZy51Uj>PVbNko~BVncIhq)8kvzAwV|EhGZ zaGLwCjD(PD3YKI~Y?Y}Izd5mgG7@r`btpnu`JL&CEY3d~9CY31UAf$3gJgeYu_Ky# z0C$mMGC2eHUPy2>DD@vk(&6{RnNea`laIlDU%&>h5+MO!6|SE%S}XP-n>+Flv>FnO zm6^Q2+Rs|C=w9z>WnJPCuT+dEL;@R0KEP29dd$rFqtCrx>u*d?eXZ{|h(Yf4bz8_< z{Ndg<;UZclQ|nXo2{mZ;4$N!~Qk+W*;K>4?LP5*@#l}^xr@LUI*X2_8yDYErG+tw| zB1E=)XQas|#R*C!uYL0oxJMW5FDfUGL0Pbt;J~Q!;$L2X^v&kdfj-ITIFJe32nnJE_VY9-d-9qZd>>TA>$ zz+!}#_PVQ6i!AH>Q0kFe_Ml+0qT+wGL23q;3Kup|KFpf^$|=GWxP_{|Z9}AKONDF< zvD}_%(Y$s%Y=vew#gAjc?`jZ~Ty&}V_{_Df#@a=vgohfQwm=-{`|C=9H)iK~j19u` zqDG-+Lp-K0UYvl}FDMr*bjMM9F0)iRoewrar$m55y2s!8UCl@K8`P-4YCoEAtS4@o zF;&$&n0WESzq%-y&I=5gK3@n%335AekPhZ}e|8#&*lnx4b{U4DnZY4so3#*~6VVtA zxw;GhwRnj0H(xN*+VbNIkZ44XfGfr`e7#Kn3ywW$8J-l#&9r3uJd4XdYwGB}|Ct#W zGSN2Ecy(qL1w95mc3U%#31XmKc54l;?Em=oQ?*!?MI``H32*Qg4|b7h=S@|UZV#UY z?ewPt*ND)9veH8I;g%j!R?x5K#o_+2FIzKg22iv0;~hL?*FZW#6(6blMdp`&N{boc z?321DVKEyv))d@-?f23?jz>mM?F97mZ`nPsc~Qt>A2O#Ot5=HZTSC6KPdUVvm^8Vq zj2{py)Bf{qt&8JXsoHl6$4e*x$|XJ&|4wnZkTTe@2{2` zuT^V;?HE?HoPHEdtDE5mPKKH2f|S#LC;~iqp%1qc{wnDw3)Q(Sko?tM7)`CF_5IHV z9WQrs_1h|l3fb?`FZQ9ygpkIUg45f&J{?X`fn?n8MjWw_LYz=bB7}(CcwO>&GG+hD z8v}4(h9=&l`_CoIGLI{K8-H2oYQ^4bURh!Ge}4%NGabfZbM;3yJAHQw;N#tvFPAk9 z$Y&ORwsE;24)*u`qsspT+3jR|JCDf7N(udcn$ho>{pUv2Mx;jp(j3>qcX|xv>ye3h zIq%#%$?Ma_p=yVjK8X{W75qRN8`M#TP<>m`U~*d$K??B~eFl7j&DdmW$)RJOyD;)u ze)1U#7CX|6gF{E~imx%!$eDLl@Ni2i7`t!j2bwB%m91KT2q^gVkNhO#9Zkm_sb7*3 zG6hym{cUM5L|Pi^fVZ`gaKrY2vmbq!_{Va=wicOpY(j^N9@m>Vm7VHzwLluS9GEo& zupEIj*Wb-Q1I-NhL8`wkpSa|5`yI*g!l0bfV#)Ih`y{$9V-EHKc86+N#@iC?o6dJ$ z%19Fgg!Rw98BKE!O$yUsnFJ%*@Rs2TzL&*Q&;}uvJ5bl{=nG?4g_Sqrerl)_I=foJ zhY08^f zC3zj@lECiX_sH&L*D73xBmf(Z26ap&;oXC}4~Z=S!W+XHN|jC7Oz#>s0|_Db&Ml)U zfephqtImU+yq@hnK$xBj)C_Mo#v*@TVJ0P5Yto8+IV0xsv%%V<_xackZ>>N~MNH(<8@DZ+M{v3i=9%utp^Do2X5%OO5RGLylke#8nol4YfBAV5N_}o=+9rjp zs&r%_vIQo<5<)0@;NCjPOKdz{*^|!wT&11b@1le6R=`vDMG>}UN+@s9!N&g6pG!hp({4QhK z--{hTO5FZSp0oHFmF~uhopmj;Eii zW1h1G7!i*y)m0rkY} zzpsK^9VDd9^E|9nN<9#<1M}m*>Xl3|@UB#~Zz;Km+WzUOuTB$GGlgn2T*GxQk88%1 z*5PkGGNorD=)_KQ>4r>lAEsiu3vJ0!xGhT;fL4Wy>@vnuP=W%!;E zOkPkTt-1g&yc9{2WSNK@ww(N2)?Fleng+iq({$lnljj2&4 zCd)MgeFqi%jYbdcDDyAqy<*o2G=dcA$7<^bmavM=|7t}ZNOQqFO=1uQJ^~*m^VOJ< zTMx&k=gi7*(nUr#qj4)<{{wsCiZ(5RxHw7~b2#F#%W>juMe}s-SAEXfHL_vhI*?as zl2r$aJw?_<(ie6{MT668Xu{*^fYT`^7aN(42cvV24su9CLE`=Lv?Mrtr`?7@T;9Ea z;ab4+;UmQag@n>?OX2&n;PCgX>nBwiM=_657XosFR7o40zsjxJe|Yxa+F}MTI~i03 zt&Usg>{7%~4)&Q^8pgUJ* z@$x;2L%7Y<2sI~!$HWiwMTtG}R`|Iuzw^9Mt0W5{G#2Ok-k0fYu)++-)AeK?@vf); z)Rpmv1JR30hEnuX+2OV$C}+0uzET|Bn}928iz}e~cV;ZqfBu*dc;hlX%ili>q<(eu z64@E@?BVK?yRnyWQgK_DaBtkpIP?s?o3-xjNUxaxIdIp*(Q$$?v30eY_|ZPt-me3a z1fF{f=M^|?I%v2={Y&d&%DnBnoomarX!ppYRPDsXm}bP~-GJfOfNZt|A!ee!`PbKz zEo~n`&U3OWQ2Rmc0@Z|@zX??eH5gIti1CC1c-3bE0sp%s`zb;+P!Zfe9r(S*xkhC z2IMbnHfjk^Ed&oYZ-?bZg^md`-pLXX^zg0fYi<5IKzjGA2X6dZQU}5|ojVqJQ<>Vv zhbi9p&&zrzk&rtnyEiovO%pe^xCbvu$Rg9w*Ek}-Eusk%`K`})t@C7c#3S$_^MY@OSH0;cxdtX`WLp_b7K~>imAm8Hr57EGjd7Qu&OBQ|CdHl~? zS*%e&Xj}Z6$aQ?0ILwo4?nTH3Oew$koYraCjA5A^#cd(zJl}hoOC7f96o@#cRdM#u z$@dj`hOgh`gh2he6`uml=sq3@b^?D`5A62MAd1Vvs;PF(j&S}tyfxKIP1Ug3x$)GE z5aK%+gr5_Ai4n*LQ@crOPRG|Ms{@%Ura!gt{lzTm4LRzt=$cbhe?&2?i4TSRCc724&l%w*U2 zPd#xGn^DKQG%<~B77H3B3(TmeFS&&^qVF9bTvz+ zWO_;s(0oXd4dA;Ec9x9UXpHaRjy+>!F$qJ=_Zx5yJ_y{NMO--vH9M2I*tcR(oqvHt zI`pplsP=l*G-EqoXBg)sz9g7G-wl-sx@MH=BNKlJ%GLFDk2A@nn=4+1sXeA~U%;I* z6od&{*Qr19IwZR=FO1piUdTV%gbqx-kdk>p1KKdzhjee`0ZwB9-CoSL9?`5>*qA{kI4ZLW=RgA-q{RfvVTL`k-;=hUD@}EoknjAnWK0>7Ti;AA;ICxuG$rFU22w7LnhTT9!w4LYwkeX-t`thwW zyD~BoxI@7Eg>hG>v^Qesj_=UlPc^ff#;A1$?>;o>W$j0PSPoqZ9vqYJk#0qg5&ui5 z*t?&{?PF!^>Y5dwzT5w;vFLKxEhu<3FG#**OE#fdjDo_ptYo&>60(mn#=`Z28W1N2 zpNH+2ErEpZ2h_$fuvSOS0z_We5*tAGpNHVXYlxl<-u3g+WxA0HlJSWKfph~%ITq8u z`ML+c*ag?zA9i?LUjzh;7?yHZ8yG})*o9fTm6sz9wbx4nfYJT^g>eWL84wMu(fa1K z_)Z?5`wxXMv(1RM`^(*D9;YE$U zHq3`^q%cssW@t|coUh&b6e&zWNSmKnP`>00z- zK*dTuRKdj(nFG1&OM(!XU_Y7IFkn2t)q4u<{H)&B8(f&;^@}(4aBKsqUnqa zcWYko^$zCoMlK88spsiM)4gA7GRW;hJ&(`rA;QE>|3Kaq9P**;{-U1?At8td=%w;l zB>{^C&Gr!eN7M>E%9Ci0r7E#VQTo5?>(Uk{+JQzSyf=IMeWWqJ{{QOjEu*Sh-}Y@3 z5CjD2ZjkP7k(3lkMY>C*L1IZa2&fyszs#j#Fckm>_s)fP}WKHGMZ7gkMKoN!gQMt!OdUm%;Wa2rVAcd@GeETN{FS zu=^}I06@S`O*)(E++ZmTD#-g}Rh$SU-fkY@Oo_S-M4DtqCkXum8&EuD@03AV+pyi^->I~8pHi(oxjhrqb7Oi zJFM-AlHHol-9`g;S7#579frZYkSsSciUph^tZ>rsTg2#t9k>$157H!I%i7i}1x2DO zK)B&((T{|L3C!J?5005gNFiEM`r?%sS#Nj{?7*WpYQQPoB62pl?#Uv&YI1i$FLXI~ z8KjgvtBr?ivW$o2BbhKiLn`4CC{Jd(qc^?$(}J*nlJ`~O?KJ;o@_w}_$e()MBx~7` z)UTQoJ4NDl{IJ!8 z=tB4C#g-*8qDGB*#*bJ2?=_nD&(#YqG2wu9(2p-x@foL>d&vw#4CAIRGGYt)ZH@js(g z|NURvqy8-v20(Y-0SYO<4~12zvBhA-HwCPO7{zRdcSgL?3H5XO5*MrBwxLg4LiyKx zc#!^|{sL_S8T;$s=fn0$-gMpg|F7wJ5a*juH2hKIL}H1@m`}Ml-c&7nmR8&;T>mP= za$XOOoRfaNXuasRI&O7Ak)T~%QH=xr{%_~QhBwi*-~c_*@{Mi0zCvsQSpwky$BYep zhwwdAphl5nZiuxmhx7<3@AGel$#qiyfK1lI z&2le(X`}}&=qXB*YZM#kK!zwSQXF*I(s(uXdw%KNE3?O0>Rs#8gKViO*CVOwwDYd@ zLLtNjs>?-?;_oU(?DHSNA$jPFyipr#eI0w#jJFwN*p=ZWq8~Djo%e&a@??NnkJRLk zbk)S>uc-f+)Xr*vPa|BT&vC73uDIw5Qrm+ve2J2iaL^!nSwCQe&>{hV5R)!I`UB*~ zJ66mAEho#z!3tUm`Fwt-Tka3N*Gem9`n9>ZeGbpHr{vldKl##E5OI&w<3yP&W`>=l6h)8}#|!$7$}x6KZb`MwOdJWy>1>=FJt_u9FwtnhU$WOI zNr={{hRh0*e#1!F6xf6y(g0??>8;zS^s8g4JEp~Qc?l6cyJy6=aZhj4xUHpk)kbL4TJ>_+w;+4tg zj(JG&S7Do;qRZ)d_huuJ*X+phv!H#mJSYsG_bsI-ykU-6B#vs#4dnzkqffW%xg{@XgAFYfY)+MggHA zSc@!*Z)#4$ftW22upI`JcJWOx-dT6DF)LImkNg=Qi?{@bba`~ntb;L7O59^=4s@%P zyG#n!6T=6g))4$sZPTOt!3P6mtp$bfEg$B^D#9DJwu!qMRSE~DE(WLOBhf{Fgz@|5 zpO%^(@K<9hAN9OE$$HPLc+FZoT%rDj63t`wz;x$!7YM=H5kQ^PeR))(RswHTG*YeC zh9eYK#Q}K~1Ju(=UB{n1illDcn_qWyjZ@{WdQQQu)*!?OFT*|}Jn#{gr!reCu)aJY z6;J#&A^lKN3;_6Eist4SzbG5IO==yBA(2DBvk-OPZgeU5k%(B%G(Yut5FQRZnFxTF zwk5fPM}~pVvC!?1AD+-|nf9RDth*__i1%IL*tFn#wrN5$dnDh$cIMZtzO|ZS2q)D- z{z=_)X7n0Q@s22v8W@>k3=T?ydtjsDY~;*Yi5~yZIo_?n!WMb#xGgS*llQ82*e2;q zxtmVD4>hOl%eA9)RT@2-!u?Z}T47RJ=gvyILpM2I7O`6%J*HznN0n3K5U8<$;7(n553}(sVBhnCe#_dB-e=`40?m$28zT9# z57azox5!Vf*0A(N9&ilUSE4m&#|CvLGaT$4JG&UOXXrLBxD<9X z+8~m|vtLd4mWX^Yvb(qfeB3*O=+V24F4Q)=qbY$oRPbf@IPi3jqWMSs*^t+H0K|cdm{x5`|?sr$wcP#yX_)pPm z=l zywWgN)LiJfmRub7jZKBS;;ysBP#rQyC$|nBFtB>o0p6kFy;JeK+3Dfl<0I>Od#QcX z1>z1TjNwh|X@Bfw^pTG=w=S+T?tMGLT+)B?>nPRTH19zZ%XQGrMG_tP9WiHFczAq? zJQ+|-9T`Q%t&0cG1snd~Sc^)KcRm(zVpYxA3=U*zCjX=(DIv-J{a8M`>p>jxJmy&p zD=FUkOIm3yPd;Rxl#gmOrgTUsB`Lg*9$n8YJ~$X5yLJ3K_g~N{-yN6JM%>@~{{|ph z+0n292182%-No-ovG(zT4sRJi)?V`7Q>}ELMa82k*_^1Lt19|x(3;GtO$btcsYq>4 zMxq!bDy#E$<{4h%#RT)doe-EJ#*yF{k)-EIe8ngL_ItXW7fwz%#E+!>rBTLzy6@UBo2cTyzHB|!=wQ{MNgv{09eo76oC=? z)4ZjqPF9c>$<@dBehD6@d381-O7829n<-`O5K3bOD3L68^jnvj?xp2wgt$ZXTIYsp z=jC)ZyeD?ZoI5CYP7~a_KI9^{uz^3`J-$I5i#F4EAoSkQ4N}MGR=Um_J1Km%loLag zsrpf$>J7vdXTl0Ul4iw3w-6TwZn9D{(vToF{lQdNUi$tTkoviDH(tI0iKx?OBsX4n zoL83gP5bVCDW?vuc{bMN8X)3|u~WPg*Uj2N=m{3GN2^3ijuv6t3?Lzp6A z!)DB3_Xmv_TfC%dKeFair^SPjKpVl%BbkTzJv`Q;sIjxDM@iC4B!SHX_vhxL>vme` zXfV;2F#t|vQTMxNM?dbnl+dnOi$hYs@f|`}i6O^8TWk>1gN4{U`+=hT8yO$VxmC}E zf7!w+pfBlrdr26!`HcVc>PY$aUX~EfCr}?vkuoF|5j~TV;;QfLT{I}wDl*Nz;Zg=m29abLpT1$ehs{JW1s_|SyPaWx%Yj1BdA8aOr zRC|;xPdKl~DTJu+TT2UQ_$qjM&K%k5s^1ZZ%6-%>#;A#Y*eG-`)l#mL!kL!UA+db{ zwE4&trUk_+=bzW!v`4h0DCx}Mc(q8X)2ikPyNat1^_w^CF6WtX74cc*XKY?AEUB+w zcBe?r^s9T3hT6jEcsZ~6FT9=`w@yM%D;i5ZMb??HXfwvYYKHh@CjX$n^;+JrswwxW z%ZYyG^`cmV2XNvKa3`kXb~*lbXRFP%GFg)e;cMo7 zcPc%GJ$Xf5t~gUD*ZXWV(B@?ml(V}=*}z!nh2IM?UZydNjQzQzv@o#D4t!{?cMmO` z-t=I~>+ql+A>%E|`+$`L*PBj>_;34Mlh`sacafOJ;d0y%K7KHG`+R#y_B^86idZdM z1|9oTMX`WDL1~t_ZBvBZHHy3JK_#4v{C9nrrSA2amlpnzBEB9}tWaLZ9L)sWhqiAl zpA#=*IhHl_LsoTIP8;=xo|n*`IuZyEd5Di`itfckvo+h#C{S<)!!UmS5GHYbBY-(s zzk-7cLG{Vtaf`YcLFnkoo@96!gjQBF{QV}#b5bVzaTvfHYB8Tx&?XnsB3@@tdRNPM zHS#C*pFnn(zU?(({?u%`^Q;a-#Of&QA&sNI`gkr=rHQD9oKDeo*1EaLYv&sk2;Te%_0=H&n|}7kEQw zP^^obSCS?=6PzG0^5zr4u6acwfX`2zjxo9j@}6p}!#lkrSfv!0e7?$NqPOC!1$6;$ z7n9T`n_1WC&o>I8M@(FxR&EZrfR}MA>NpP<) zhq}$mii@8BuR`5?rr)6RONdjxTf};6C_2f4?^)ZOA*%EPH9|}78yV~Rn%RjM6U3zw z>Xa@cvKq>3LqNfU>RIF#g3ZQuKb442smi_QN^qHb{`e?BfDph2y7B)5hCcpSR{3fd zg^RTXPz?Z6H}dHw_(bEHp{d}gF#NM*1A^06JT67SO+IOEsfqSWjaNu60+h8;!K}_SO6?)90X6G zfQI5c^f{+M+puQ-(W=Cd1Ki_coz0^l-4U}nN@wZO;1^sB+r1rvM1y$u0t5DHzb+&L z6!;RnX*&58p7&Tx&>H6mB?ka6v3H!h3qM-f*quTztQH z^iONXE3-EaXWoBk)~#)4>iWomxbAu&nh2&KYB{2yndf<73UD!_hc6hPC7z#@a)>l+D z)Y1Jk+xwD`o58({6qXoK%P%HyG-I_KsVqt6P9D z9YL#f)7*_Z8)Z4JlnkNWM)~X>m3_Flfd$>p&S%}@*%wiP0rr8wqr{H&o1a)bzx{8K zEJTBzR`Yo}?lcPNVU_LEEVaupiiB?P4J4chHcZD$=n1yMFOEIeS5w}gET0}*7!u-s zL=k|p9e3-#+wQ!oXoJ=@d0;SE^OZBX#|x+Pyx@8xw&hivWVd zdv>R<21?(4i@qqV!S3C??y#n-nGY9-wDw8=&A6)z_yHQfalHS>9Ee0(6QU@gt8pZSyDzvKu8*3jY3NTu+r8@8fs9J5@ z-!D9(xm&S9{cuSQr-3Cv!ldu6U4SYv!J$hcb$SXZfs?o7E2V6UcFj1O*$mLwk^l* zCEzIa4)FVY;CgJ{k7v~6Z|;@yCqd7mMMUGlgX7y@q{SnLKZhCSWp(4{>OaMRyr?O2 z0|&8}ZO9{0a`(jPRQo#u+7~SVB*DDd5l`5I_MxWZbez*fy@*L}`gPzEY~K%H+xEA9 z1=_)gk%(&l<>UK%jGs@WmJ%3M{EkuQ+rN@=aza%y`I|Mwz~kKViHZ1g&0nbZ>z3cC zcjgk@Ixd$cV;{8mXLQwa6j>urI7P658HM}9;=PNwf9G-Y;8U33)N1(Pmzam*;!nTK z68c~NpAW~sT*mkOoKaSWkwU32DxjhXfiux1=HJ;Z!k}AR4Yg2Lgxrb2>yq;Rb&3a4 zEu#o;t)aZ)k9^Cq0Yh$;kPGj_PthipkBW0ocf|lVcmOanUz|$ADG5OmHEX^)^!BZ) zII9dhN8^q}2@Q{=a}4ed2eMw&yAe&RykX9?l3=U-oya2ntc2G-p^@0CYS%%6i^3wY zbN*YekdWAebYDUOX77mGAODXo`W=r&D33n=WePv`$0>Z;tIN@-nD5c3=MPiMf0iXl zQ#cPJ59ppu)`*qR#}CvD9MkcVjNyoalR++otcRcHrE{~E6EPeGHssfWQRT5!u;1w) zc5^SOaFOPEE-uCWNNt@8{c5W@mHz!G0=m7)f3-45N81(}Nm5dxA80>E;ND;o5_*xIOkv`r zGPky9Dk}L*ogDlc4C8yB_L?vR4zS1&0~VQpvOYYv21$wvTl@({8PPx|nh>`$;gFC? zZ>LvtwSP6<4rV6bsn`#uTEo(+&S`N97Kz=q~LUDFFPW{mqB?2)< z4IPFn9lat{uCe{q`D?+MU{tB&AjMP-s#q2(q5Jp7=ANQiGW4cN^{`kf_21b0<8rE5lK5 zu#Vhxb0IVI9pA~~QtAqAQoV70ZN>n;z|S{{MpC3-HF>x#iv{jH9pQ$VwVwOP`Je{d zqNOpy?P}6`J7S#K{Rf(Q(|f|`-4X_@)ENynR%ZX{{w^lR^qV8yMBJw+c*?OO$gKT@ zU&x#4^K(;acB$$p2Q5I1?&> zoQd{OE5`|xx90GaCQPy7e&T!1U+sE9gN+27W839|BG3MPDUbd#eE93Zo$gj)E+*jP zkO&TpkH}vloFome?js!@9nkB~z%q_v(?WKe7kz!cT7nn#=alEXM=n)dpRUdJn8Bc#@GWKMm2>oOmr^J3m`5xN1WewW;Lds2kiB_6<5iu?}}8vDjPm|Ak+oU zzCQ1Iip_c0;dV#Q$QB^qw?_qjTuKef$u>?s-T~X_*xGSvrW;zJ#}+#mJ$z}}z`q8f z;}OjN7g+}qU}CWSs6{L01 z>HoYgzr;y}UaDP+4RtrU#=btiBy!*pg8wF%r)J^?vf!gEr+X1KD_T{h$y0q0PC%*l zqGBa6sCoZTN1qoMJAL-9djaG#{vXUK!9k`HNZ`{70;T(0V-!51!MZGSR@%XnLG%*O z$Gl%MsMR@FUqi#EaIVnE9pFq!=hk3)Rp|XL6QX4f1yDR@jEi~4UjV95^Q7~e9;3=$ zny#Tux~}Ywsq112&5o9KS#}>rXj{Xen4X2H!VGr_=s`N6$29^_YOl=T{pgVz*>w>h z3nB3(3n3^LE)I!@_tl;U?o} zfkm#Q{r%0f*#>py0l@aEg~}eVL}gOE1@zancTj%RJ{O*NI&0OYz|>MlI@!>Nzu|ko zy$`80oG5_s%zPtL)riu?6&0mDmQvbgEcuRVQ&gueZ+R$V>LS|jJ{}#I0$x$AoSH^R`NqW$Xub}3lfe1mTHpI}_XLkmC3L#gNYN(c zIWtJG&Bmn1(k78VYo~mmKZo=1iTel5?t%z(l6L+Six+?@c-LHbKlc^c;yvtGConOw zSJf2p5UTs>p~Qz&_6${?fx$>aO01~sLCJk*ct(dOi{^l!y4&bNpuC&Rmdwv-04FIJ z|12onME4~hQc41G044MU#v-f?s=`)WhD|9o7N(E{+3KQKDiVR0H35Z>V;4_~t$<+t z#yQ~F&>^hD;mNv(z~HwUwY-=#$JRs9Z04rDwd$_Wd*9{NeA5o3cX3?NtK-Kc%IfEK z#R(T5G=Nt7vaFo)2R?U~0oDIK4D<*1+R*^?oF%N5AuEeaqKd6GIH!)Q$(`%dWJUUX zmVfL)li;#)Yb}lsJM*Djqt1!y)MxdY#$2`QGKhAdC|&>zkuNc1F39O-Vu;rKZdSYXY~LH&%qf09Shpc%`>{;uHEsrTq(cdgrus zL>DNx8dX&pUGGxKe-y{_+X7tj4S1jcH+^Hp5BZ-RwqRFZciQy27X75dWqW`2&h!L0~Lywx5# zQt+nDfVkrpP|!2lJ=n2iDeh@xb4@>R@VVZP6x?*RA6?o)Ed95GRw8UEd9R-%&}5-Y zBhc?AZ;jCb<;??INQn{jS?LERsfY#oBZ99g_(J@q_2y(;=I3>2qMk@dJgH>8mY!-6 zUYpvUt}y{ENU%Vu+!xX3JBDu|Fm)xH{Yy}6zmkpBFVv2W<8${FL{ND)BGkj_dcj(l-+J<= zg_9%dZyI0m>|=@{wCPeI>ayZN4U`fZ1CtTqIYY}9Zj)J>1D2FPs8ZWgmg{^ZJbHTu zhq@YW1QQP!>01hb-S9TxLmC8pNL)HZ&@Kebh@nlg39VPK0?eVej>#V{5eG18`5jIu zir&4Avf+})Fh}$VOMd6hXXbTuL%QaQ`%2Y)1eC@@(&FmO4X1aL-8U8Rj*r~&@M{n@ z8Cz{!Adj-0&aT+eg|h%>b0Baw6QPhZb@jaoCsLAR_wgrBqriQjp7)MQb-l3)w2^h( z5isyyuDX;qsxc1%i3C2Ha zYr3f9m1yGno-Ug?vTNMdp}0&`n7U}@G1-xgJnG6!5BVsd(@Y47q*{E}?=9zPqyG_QGGjtxShMS=NuSj~n;i7dAW=@$0kJX;3#adEsJl zYJH)wN$l&Jch7i=0R=n zE0P#4?cJ(7piJ&WN^YqNVM|pWt>6be6|Mn*@CZ?HlY2KY4Da0ad?1eZ&0*>i>T|#D zPq!=a_pLv(`FF#7jDQBZK%jw+H8aPr|1)Ww2gyAw_@M6UStqw6NyjmrGrSvNR)%<3 z`DjhsqC`9^K@?;srOTlLnEL1olq1^~p+_;V@^BZDhvK~wf5z!YT{)KnE?R&;b$IR0 zDj$gHyZ=j@x>$q;WA^eTMac;{)fj2&$ZQ1htPx9dQUk_A`ykOg=^BzctuDU$%qukY zP0sj421{vMK?iYPm%m_*N`BDeL>&qWVxYEdNlu0}_V{H=TCH~BnvPnbTj&!xZ|mQU zb<>aMz`y3l`u$Rl(=|@^H+nP7UKJ(gr;fVg9rUP#;G};{5GG~ml#_g!`Rws`5r%^N z8g->8{HqL?i!})d+$wUb0pi}MmVNJ+J*iPodfa2cCW~X5z>EjJo@i75J=;6Xm zm4)@&E97j{;eJW4KIpdY&{Cm#kXVNn)G>Cn1N^W;F)-&Uckuw$e9{+eaOvO$8~neo zEe9-|$xyx6xjlofo$%-W;9S%mYcxZYX2x=Cu&# z9SJ!CV*k8Vh?Dk)9Kgmc8URM3ZK3W*dc4#XM8JRS@Xg-Y{QyvW7}$cY6FTA4Vx6*T z2dFpgkf%lZFo;^%Ba^tUn~nAMW4dy$iIzL+ovO}|)J-<~=}r1gDy4GCC34A&E^g-r z;}-oxZtf_@*@|FwIvL(_E37F`6E@;dmOiKtdDP$7($f=@^tRkQz1v==bzbq&rz#kW zi#Iv>J0i!pmaQd8Nqi(8Ew+w&4Po~mfli+^`r{Z_jF4;C7?DJSux{+1b#qcCx17N% zI?{<1I5XKC?$6o^f^xaR9%cDDU=QGKZOWT}z#k!NTbNc+yuNR%$X-!})`kQkU<)eg$eW-a$# zfYF0%v^*z2|160+bYB_Q?wBlDBi%YEnx}n1!8&u?(!I7wb!Oq+RGxcT@fox}SKEQd zeWGA*wTvJkjJO&WM{T_MX(h3fb6%=fnjO0%5YickY%1nKe0C6MlThf%mIa(QX` z*Oxhw3qL$sZRNT1+r>V56u?Z2zNz^&2q+!W9e5s!JQmDkPCLTA>tD)*P}6pd!Em4+ z@A&3bn@;|whI&!RO_uql9Mb5pk`zhdV5Jpx=fz5M6z3ECMr=3W+!_h)K%-9T&9$B? zWO{YdS(7&5Qo0P==$Gi<>ho?da+_4|Mbw-ELvYFxjuQ$!nap&PDA=#Rzhnv44ri&{M ziR{Lqnl_!)uw6=fH5cNiaL3yA0pFONV^j?kxAUVEu*W01Gmf|=lrMhz5q6@qqZ`N{ zz@9u12rPSBjb2?}x;oVhe!8!!Oaw=LodGtVlE(<0nCHD!HoIxAT@7|T;DlJ8cj=S5 zhYqFF2}wM)u=HO_iX|i{%qB=Qf(G=OkvnIGO%j{t4%PW5`yO={Ne19^V|2gF-1dkZ z+OXb@!0sWXoYj0Z)U@->KTi$#=bwEF_)_G=^s!W1=H;Dwhr!qP-22=T=u1%mDnMgv zBF=d~v@?J71CL*me}%hSWImRrh%4#jBDa+EvA)|@6Sp**&62KQzXzbuA82!iX8|9O zo(&v1hOFUkSn5PI9)(@(7m9)Xf??I(;qk{{yfD|q7ZD_w$gH8 zXo1Mr<{cgVPsp9K<kR3y&^4F7*PL}t?<9?0m-PrBe2PFJt3Fj79kn%3I&4a` zwmuM-P1TXRdd?%6H3TvN`W&hcC?Y3LQQ?^|o)6_pc!z-Gp%+bqXdRFmJ|4nQuj(;W zWViDtDfGTva9x=; zo#bHm(a)=DIgQ7%xk8|am+4O_S5$moH6sTJQ0#Ee4 z-4b2Rh1*3oyW<1<5HSg;CvZoYK{LLb2|ZtY`>7vwYz?###6)viqqSF)U3tE^>MuLE zv)b|!sJmD3Hz1(;+ODXg67jo&fg$G2;CH*Lf+MAOdJ8OxZn7|zoWK5fSarkdA-(kY zqO)oQ5SmO|NspFWP2zk<YK+bG-89bECd4+hM$tfU#e7Wl=xi{4;%D#rkNIh+%_Sc;eI2 znh@YeC?&S8otR5{p`=wJ4&!MI`BU$~8Ig5ZwD)CVcuz*IlAt@yignIjs!67bE^yTF zSViY6AuJ3K!cWGGNLBl)!ub*)IEzfcZK3M8ud3@4*anaL9n&XpydPQ#Df+4MO`!#& z5VmQ8zK!MG5U1 z`W%+=iT;o@Za|EdpTyfy>Dr5PkDD&H(Dp(eU(4-@r&S#nfDW9=Yi!+>mzU$X+&Z~X z)tu+S95&gV8j}OIF%>ELI2=;+OarCb9oaZX_#AURlF_SJZJCJq_)ha-WTHsU$e=m9 zeEgf4A@zo8+ko?n6zeF@$1r=OLz1NE5fIp;ZxeL3KZ|tHU}U27?P62a=uE-;@mWvu zCx*jDu0XR>)*F?JRbIH-&R04`MDU?<%%V|gC0kB{2HEf*KNXTOrm~E{#pv!>dwV#I zdyB@yDkk2->=pY;vfNg}qHP|5jG~b<)F36rTT5Ax!vCza99c~_+`dCUQHCuAFX<;$ zNZ6g;G&~psTvKL@2GPi;A*_5OxFWXk7BTN6!!}{uP&-3519gYb)n%ocG;*vuO`n^e zq{KAVgg(|mm_LH0q~Smq=t3>)KD?^4@F*-?!0<~=M1J+mkMeM?y31F!vq=Z^yFj6b8fvfdip1;XTR*{c9~wkQGTAW zut1m_JnQ5EleQ`yVyf=-a(6+u!>Mw5(24WJpU!~*eU^~epH_zr47O@KIw=zY11@Hp zZt$1(Ow(?DX`ncDeA*~5=)*{KxJ!RoXCtI&hcfhk-&>XJ_AwYorWwgX>h z=M>-$HE7ULucEQyV{wOke7qo2XXlHJ?( zjh-zYA0MXp-gV$;uD@~_Yb|qaSAm{jav!*$cuO9NZ{Uhh4z}mIMLY@#cUAdOjDef> zQN!Pbq3{j1$gfVQPRv9k#n$w6#ERnyiql}8jfiow_a46T)M0fFrPgX#Sed4MJ9$S; z8PtQ=u;9U2X$bmZM~$1)93`>+VN6~azS!YkKQ>7A<@8{WQ*cn#(By1#* z8)>VrzQ@}m0k^}|UObMcHxCqaLPAC?wtiG&$m+Wd0`G+w%-hGXxa$^|ZU|Yn4U|IVcNZzB*sg?E3F6(V#CI|K%<5_sra2k0V(Uh9u5%_t(eh>mnp3ZQ9({D8 z1i(Lo;hz;Ru9zThp8yEWT?mi}a>7FWn8D3b>y+X~6mWJ!=&-OOA z=hauoAhB4(lY|x)QC6~o zPPDVaH$seC_8dH+@AI$#=m4tytgj7e2y$E0b4g}qwWa_6tjYse9KHEXE#?i0s93!z zXtlTc<|^E*L{VmIU75p}o%8wTrv6BgnX{7&#R#Edamr7=_)OhD*YPx(ALzCB;i@-h~*#5pjSLFmJ@jQCUoLkV|dcquNZL@*|CH89sR5N^=`UF>d9md z@C%G%Arx_QDDxLf-G7&0xlP&}9hUbUTq2+^-H5cLrqoXN!x9lw<0XZ?{EMok9~5GU zthY7TgkE_G6xIUoGWOTjKR$I6&c>KctU)(ZHqm3Kn5o0%*NfJec2Xr>5GW@7ld7=+h%5WL^4Do{*EfjOYvn?2 zP!f&4w60s+Y-^eLP2FY-vp7sq(6iLLp4vd!R`kF1axErPV#vZKy=;{nau0yWhe~-P%8JAyzVk-zn=O+AkD2Sz+r|$zCg_ z+79m?4KdV;Bk-n$IxZ{7EVWWGucf*&NdL zZRJ79PNt6lrQK}R0sA`?8&H`sk2tY;bg&hvPSu|H4%O)KJ+$8lJ(@t9E=LXCKFP|? zd-60fK)MvzF|It3Gmx5KLqBZvt=HiT^QUq0U7Lp0d5?h!>>4(tK0nv9L$_?~bGU26 zRpC=AdK%{PkzvBKD#Om5w}qMBgTAPcK2_4ko;0v>M&NB=`U1E2qQi4g=5Ved*X)yY z{N~%iF`r7lC~Oo}Y{!wb{?V#6AFHAKfpjIk%w&8UKGKob=}GIl?885{Y@L6m>frHk zpbNco6URd+_Bf4poDy;y253>n|MF^SZt!PUBv8=P@8^iPD(sFaKxxp;0~R51O&2LB z&2Gq0rTfS_c*zxs6Jt2Zi$d6gV>GGIfG`>!;7S)jvdi8a({+0-?-FKYB2%`vw~*{! z_a%9po_^gzQlv2~-bb(0slMXDDDxDo>>`N>!tY&?_+x;u(|meR0zF>ho05i2V(q(< z2I)PGbR?49f+XXSGyTNTpv>IKLG5|q__XSwMW~?&9Gr852;gEe&?-pdm3fY>*!f_xz$w+2l{Y3q;2R9`pO$ra=J7q5OAqgyM$%i3M*7x| z$ff-{hkcV6q$3+1??C*X;n%V9z_+n7cH5AkHFqpEYF&!5WUaD*U-Dk4#+yjk{j2n; zxZ_~NoXeCmFr}Wsi}t8KEizwr8NEmag^*rWKz?hvT9Lo#>-_(rBKm*lFf5-waia#d zfu-8EY&~gXd5dDy+0BXjqN0-MSv{o2tU$3P&Hp4#oCILQ z0x_R{ukFadEW(1nHmXF#oa58~(5~{yPbYVa1v1dRh{AkF9nHh25;Kfwl56GI`ehA2_IB5hneS z9wM*Lz9LF&EjHNIaI_p1&Su?oZH{~0TZv6_ZNwf%>U}eS_$1p@pR3#a9S8m*P;A~3 zSa9E?!$~EQG|eRs*oKUkS3ByXbaHq^s`>4;Yd-g0D5LYB#i)=<&M(GtIX22Wv-#92 zEhFC{rDq#6YuvV)Ivz5aY$ppU9`7Wt;Siexv(`0+PL&qvdoMKRnW1l zGLEzs)$a0tF?;j|9%O*TM(XJ8kx;NA*nWGy3cLjxVe}jUHka~M`+L60)E`;Ox_|_ zO!oFB**jJf@FYwrW%-RJ66ur8{LCr`qNxhs*{jYTriehQV#+rNrI7`%QI ztE5{pguTQ`Ds!YKeeBEpj~%p!RCbYqNT0Gz=T}Gb#_cNezMASxh=8yiUGP+9#)sy{ zFB&_A&6?DQ7FVmw;#QV|sVcdCJ%J6biBL$0zq9_bGtLOb|I^Yq-fZsVj|31r{z65u z(097G_iEG{p}(HkNb=gK*^%xkx(y3_w}Eyu9wtEm@nvyyTP&F~-RNiGoRi!jXy9q< zhvxgg0KDZbox|F{C4V@|FoD!f{pEZx#ch|bGZdN9JImK2-_^e6c!o}3$JY4+=952o+7J(Orm`IpwtGX?S>4X=6_u>j^K4f6f;zO7F@Z>` z^dVrn;E%!xG4`0JrOz8=JdN&W)PcL(bML=#2y1DWVltYE7|55NvaY>P$78ymB;+ov zo$#8GKJpj($7M!&n~sl*l*~3lo;n+{&V_p({q7gDnIv`4LGFdx4A=2|(WMz}09J!@ zok=6>O&JYE#lROBcmMw<826fT50i5AwsX!bv)s9x07^dE>}y9&w*BDvJQ)lEFM!^8 z`yo*xyq;xi1$1ApveuD{4^OCNBHWYM+a_MgOD+F8Y0be6kJA34i_0m`Q(S|EK6u_V zZn;FQgS*OIE@xOFm95B;yd>?f!r(#YFs)M5fO&dgfI18f*d+S`DNQY)e(|BC?^{lT zE0*`V=qd21U*qc^Q;bFtQVO;qAHVi>xcce_cigppN1JT=Uku6IoI_bNgQ{)T-}jt4 zuzp-sYmrSJHGHopm!yAJ+K0_C(4{=e8h3P7>aEn(;d zqbl8rb|Hbm`^+s;aJ>qYq;+B=+V8R+1SUEzOqVrZ*!`o!E@aUH1tf`znT5{=TCn#*a3f^xmZCEKfL=v|cyv@8zQ4O_MY=ri0b|}kb#vcO0|$E1f8hirqtDqt zRFn|oJ3QiT`S@1}21SMRSIz6%pEa+h`0SRwsfln(iF~U z_BdB$^2qe}z^Zt30Jd@u>A!*1hkt`rvf2&JU65WehToZ)THGF>C2TuRKPuiEg4d}u zy9?M?E5`lxSmc{bBM8?2N|F?lJ_1g&@%6-~&Kw?(Ca*Y6LfI?g#1SAMfkPa9b%$D; zqnge(Lw(WF*V69@46ZhD;!BN;ba@FQ(#w;l=Hm!-;Usn4kxjaXZq5&HCWgGte3VRv zx4rQU{bc}c1Y9l}xjCzTTT{sOpu;rGMcWdCDhZ+PS?bsD$6%M&g$E;Vnq2rq4)_7P zTw5%InqmKLdr8>l=5FhdUHNPQ)Wp86SqNq_CnGnvvlJNyM!5r983rbZOzsK{trsgi z%v;2IESP5$i2vo^zOx|F8kKnw$Ol=_J6;!irg(VOu>q=tZ(LnMAQ zZh5wnqiP#6=CL}060VvUr#aZm0eu6S8!J~_SoyrsHh^OXw$dpAS8TMMc^dIKHFLOB z@iFX%t+YBdI~k5MG1zS`L{u+2wF`6A5b_Ek8#@{q4q^@;4Qwxy;(r3=j6Tm_sm&#Y zd8TMl{!&NXf6>GQZLXzV%61(TZM3zcI_$7EgYw44l7OjXqjHg{BNxP;;Qv_D{a$iW z^}g!zn$_GeAxk@y`BB2lxTkg_Gs^6R8HW(8={f3P_C-L5?Y8B`SmUA0Z$g9v1Cy$- z%8*K2XgkK%Iv_A;{COk4&ssRbKT-Qdlrd>E0G|t-%4Jt98ns$0d^&1SH`#yH-RgNz zU$l#0vX}_sqn2`XW33@^r{_6ejTIbF7%C|S^UqdtoAeU4w^FaSmM{r$RJ^6BCTqqL!DR9WC9B%p1&q|hk5{(e}652fOXHgP|8ppOPO2%SFu@FSfl7@4#uZHXv z&g{_>&vqJ{wwL4W5BN*~=gehd1BCz%&haY8_*~ zHs$UaS~N{b+4eY>CpnhpXgJh*vCC3MZ=oF@r3@-3^CvD6*c*K?i5m~G)%IZGTk!Ga zd-{~J*ZANAs3hAB=2?0lzZ{KUp}PsY({$@=J8|`ja6xhr=(N*r&+h2%hRI@>aJ1`V z?KmM3eg>0x=c76ow?6d;I>@T$Pe~p+sFxg^QGhC+xV$>|5M3FRx(ZX0 z)RlbKiXV1{0f=4CRoHdsshq**ZFNSnjbLdn(3V<)AyeCp$RU zJQ{u@_wy&&f%Ws6oJ!jn(rdkgTXJf^S9yPbf1fy#OKniKBGn-^_H1=yy|YK;oLefl zh8=gZpC5b$hBps&eDqnxiEYOeY2j7?{r=IY%kt|}j=fssWGoonAff{Gi_c3i0?iee zdvJP4Ft^ct=wM(ZZl=P(V2Q?D{a^phX`#3l1BxOYR^Ss019MkGK|JS Date: Tue, 17 Mar 2026 11:58:37 +0100 Subject: [PATCH 123/144] Added test for including context when it only contains skipped tests --- test/ut3_user/reporters/test_tap_reporter.pkb | 28 +++++++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 ++ 2 files changed, 31 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index ed10a5aaf..786c53ee0 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -20,6 +20,14 @@ create or replace package body test_tap_reporter as --%test(Escaped Comments) procedure escaped_comments; + + --%context(Some context) + + --%test(Another disabled test) + --%disabled + procedure another_disabled_test; + + --%endcontext end test_tap_escaping; ]'; @@ -42,6 +50,11 @@ create or replace package body test_tap_reporter as dbms_output.put_line('This \ and # should not be escaped, and this not as well!!!'); ut.expect(1).to_equal(1); end escaped_comments; + + procedure another_disabled_test as + begin + ut.expect(10).to_equal(1); + end; end test_tap_escaping; ]'; @@ -217,6 +230,21 @@ create or replace package body test_tap_reporter as end suitepath_as_chopped_subtests; + procedure include_context_with_skipped_tests as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%# Subtest: Some context%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.another_disabled_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + + end include_context_with_skipped_tests; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index d24c76e32..27f9651bc 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -42,6 +42,9 @@ create or replace package test_tap_reporter as --%test(Suitepath as chopped subtests) procedure suitepath_as_chopped_subtests; + --%test(Include context with only skipped tests in output) + procedure include_context_with_skipped_tests; + --%afterall procedure drop_help_tests; From 40eb166c1a228b7d2ced30a471c8dd41335b8cb7 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Tue, 17 Mar 2026 22:14:55 +0000 Subject: [PATCH 124/144] Enhance annotation processing by improving SQL text handling and adding header stripping functionality --- .../annotations/ut_annotation_manager.pkb | 24 ++-- source/core/ut_utils.pkb | 132 +++++++----------- source/core/ut_utils.pks | 11 +- 3 files changed, 71 insertions(+), 96 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 05301ea94..0688f24b1 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -231,23 +231,25 @@ create or replace package body ut_annotation_manager as function get_source_from_sql_text(a_object_name varchar2, a_sql_text ora_name_list_t, a_parts binary_integer) return sys_refcursor is l_sql_clob clob; - l_sql_lines ut_varchar2_rows := ut_varchar2_rows(); + l_sql_lines dbms_preprocessor.source_lines_t := dbms_preprocessor.source_lines_t(); + l_sql_lines_clob ut_varchar2_list := ut_varchar2_list(); l_result sys_refcursor; + l_replaced boolean := false; begin if a_parts > 0 then for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, a_sql_text(i)); end loop; - l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); - -- replace comment lines that contain "-- create or replace" - l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modifier => 'mi'); - -- remove the "create [or replace] [[non]editionable] " so that we have only "type|package|procedure|function" for parsing - -- needed for dbms_preprocessor - l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type|procedure|function).*)', '\5', 1, 1, 'ni'); - -- remove "OWNER." from create or replace statement. - -- Owner is not supported along with AUTHID - see issue https://github.com/utPLSQL/utPLSQL/issues/1088 - l_sql_clob := regexp_replace(l_sql_clob, '^(package|type|procedure|function)\s+("?[[:alpha:]][[:alnum:]$#_]*"?\.)(.*)', '\1 \3', 1, 1, 'ni'); - l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); + + l_sql_lines_clob := ut_utils.clob_to_table(l_sql_clob); + for i in 1..l_sql_lines_clob.count loop + l_sql_lines(i) := l_sql_lines_clob(i); + end loop; + + -- replace multiline comments that contain "-- create or replace" with single line comment to avoid parsing issues with dbms_preprocessor + l_sql_lines := ut_utils.replace_multiline_comments(l_sql_lines); + -- strip CREATE header (possibly split across lines) while preserving line numbers + l_sql_lines := ut_utils.strip_create_header_lines(l_sql_lines); end if; open l_result for select /*+ no_parallel */ a_object_name as name, column_value||chr(10) as text from table(l_sql_lines); diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index e43dc5644..c81d86883 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -812,94 +812,62 @@ create or replace package body ut_utils is return l_result; end replace_multiline_comments; - function replace_multiline_comments(a_source clob) return clob is - l_result clob; - l_ml_comment_start binary_integer := 1; - l_comment_start binary_integer := 1; - l_text_start binary_integer := 1; - l_escaped_text_start binary_integer := 1; - l_escaped_text_end_char varchar2(1 char); - l_end binary_integer := 1; - l_ml_comment clob; - l_newlines_count binary_integer; - l_offset binary_integer := 1; - l_length binary_integer := coalesce(dbms_lob.getlength(a_source), 0); - begin - l_ml_comment_start := instr(a_source,'/*'); - l_comment_start := instr(a_source,'--'); - l_text_start := instr(a_source,''''); - l_escaped_text_start := instr(a_source,q'[q']'); - while l_offset > 0 and l_ml_comment_start > 0 loop - - if l_ml_comment_start > 0 and (l_ml_comment_start < l_comment_start or l_comment_start = 0) - and (l_ml_comment_start < l_text_start or l_text_start = 0)and (l_ml_comment_start < l_escaped_text_start or l_escaped_text_start = 0) - then - l_end := instr(a_source,'*/',l_ml_comment_start+2); - append_to_clob(l_result, dbms_lob.substr(a_source, l_ml_comment_start-l_offset, l_offset)); - if l_end > 0 then - l_ml_comment := substr(a_source, l_ml_comment_start, l_end-l_ml_comment_start); - l_newlines_count := length( l_ml_comment ) - length( translate( l_ml_comment, 'a'||chr(10), 'a') ); - if l_newlines_count > 0 then - append_to_clob(l_result, lpad( chr(10), l_newlines_count, chr(10) ) ); - end if; - l_end := l_end + 2; - end if; - else + function strip_create_header_lines(a_source dbms_preprocessor.source_lines_t) + return dbms_preprocessor.source_lines_t + is + l_result dbms_preprocessor.source_lines_t := a_source; + l_rebased dbms_preprocessor.source_lines_t; + l_create_line pls_integer; + l_header_line pls_integer; + l_header_pos pls_integer := 0; + begin + if l_result.count = 0 then + return l_result; + end if; - if l_comment_start > 0 and (l_comment_start < l_ml_comment_start or l_ml_comment_start = 0) - and (l_comment_start < l_text_start or l_text_start = 0) and (l_comment_start < l_escaped_text_start or l_escaped_text_start = 0) - then - l_end := instr(a_source,chr(10),l_comment_start+2); - if l_end > 0 then - l_end := l_end + 1; - end if; - elsif l_text_start > 0 and (l_text_start < l_ml_comment_start or l_ml_comment_start = 0) - and (l_text_start < l_comment_start or l_comment_start = 0) and (l_text_start < l_escaped_text_start or l_escaped_text_start = 0) - then - l_end := instr(a_source,q'[']',l_text_start+1); - - --skip double quotes while searching for end of quoted text - while l_end > 0 and l_end = instr(a_source,q'['']',l_text_start+1) loop - l_end := instr(a_source,q'[']',l_end+1); - end loop; - if l_end > 0 then - l_end := l_end + 1; - end if; + -- remove comment lines that contain "-- create or replace" and find first CREATE + for i in 1..l_result.count loop + l_result(i) := regexp_replace(l_result(i), '^.*[-]{2,}\s*create(\s+or\s+replace).*$', null, 1, 1, 'i'); + if l_create_line is null and regexp_like(l_result(i), '(^|[[:space:]])create([[:space:]]|$)', 'i') then + l_create_line := i; + end if; + end loop; - elsif l_escaped_text_start > 0 and (l_escaped_text_start < l_ml_comment_start or l_ml_comment_start = 0) - and (l_escaped_text_start < l_comment_start or l_comment_start = 0) and (l_escaped_text_start < l_text_start or l_text_start = 0) - then - --translate char "[" from the start of quoted text "q'[someting]'" into "]" - l_escaped_text_end_char := translate(substr(a_source, l_escaped_text_start + 2, 1),gc_open_chars,gc_close_chars); - l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); - if l_end > 0 then - l_end := l_end + 2; - end if; + -- find first occurrence of object keyword after CREATE (may be on later line) + if l_create_line is not null then + for i in l_create_line..l_result.count loop + l_header_pos := regexp_instr( + l_result(i), + '(^|[[:space:]])(package|type|procedure|function)([[:space:]]|$)', + 1, 1, 0, 'i', 2 + ); + if l_header_pos > 0 then + l_header_line := i; + exit; end if; + end loop; - if l_end = 0 then - append_to_clob(l_result, substr(a_source, l_offset, l_length-l_offset)); - else - append_to_clob(l_result, substr(a_source, l_offset, l_end-l_offset)); - end if; - end if; - l_offset := l_end; - if l_offset >= l_ml_comment_start then - l_ml_comment_start := instr(a_source,'/*',l_offset); - end if; - if l_offset >= l_comment_start then - l_comment_start := instr(a_source,'--',l_offset); - end if; - if l_offset >= l_text_start then - l_text_start := instr(a_source,'''',l_offset); - end if; - if l_offset >= l_escaped_text_start then - l_escaped_text_start := instr(a_source,q'[q']',l_offset); + if l_header_line is not null then + -- keep from keyword onward on the header line + l_result(l_header_line) := substr(l_result(l_header_line), l_header_pos); + -- remove "OWNER." from create or replace statement. + -- Owner is not supported along with AUTHID - see issue https://github.com/utPLSQL/utPLSQL/issues/1088 + l_result(l_header_line) := regexp_replace( + l_result(l_header_line), + '^(package|type|procedure|function)\s+("?[[:alpha:]][[:alnum:]$#_]*"?\.)(.*)', + '\1 \3', 1, 1, 'ni' + ); + + -- rebase so header line becomes line 1 (matches preprocessor expectations) + for i in l_header_line .. l_result.count loop + l_rebased(i - l_header_line + 1) := l_result(i); + end loop; + return l_rebased; end if; - end loop; - append_to_clob(l_result, substr(a_source, l_end)); + end if; + return l_result; - end; + end strip_create_header_lines; function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info is l_for_reporters ut_reporters_info := a_for_reporters; diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index b0edc47f0..43b28e6eb 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -406,9 +406,14 @@ create or replace package ut_utils authid definer is * Replaces multi-line comments in given source-code with empty lines */ function replace_multiline_comments(a_source dbms_preprocessor.source_lines_t) - return dbms_preprocessor.source_lines_t; - - function replace_multiline_comments(a_source clob) return clob; + return dbms_preprocessor.source_lines_t; + + /** + * Strips the CREATE header (possibly split across lines) so source starts at + * package/type/procedure/function keyword, preserving line numbers. + */ + function strip_create_header_lines(a_source dbms_preprocessor.source_lines_t) + return dbms_preprocessor.source_lines_t; /** * Returns list of sub-type reporters for given list of super-type reporters From 1cdeb9c666ba412cebdc5b9e8baa9be41dc63de3 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Wed, 18 Mar 2026 21:44:45 +0000 Subject: [PATCH 125/144] Refactor annotation processing and enhance line scanning functionality in ut_utils --- .../annotations/ut_annotation_manager.pkb | 54 +++-- source/core/ut_utils.pkb | 210 ++++++++++-------- 2 files changed, 147 insertions(+), 117 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 0688f24b1..117a28729 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -143,31 +143,41 @@ create or replace package body ut_annotation_manager as l_parse_time date := sysdate; pragma autonomous_transaction; begin - loop - fetch a_sources_cursor bulk collect into l_names, l_lines limit c_lines_fetch_limit; - for i in 1 .. l_names.count loop - if l_names(i) != l_name then - l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type); - ut_annotation_cache_manager.update_cache( - ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations) - ); - l_object_lines.delete; - end if; + begin + loop + fetch a_sources_cursor bulk collect into l_names, l_lines limit c_lines_fetch_limit; + for i in 1 .. l_names.count loop + if l_names(i) != l_name then + l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type); + ut_annotation_cache_manager.update_cache( + ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations) + ); + l_object_lines.delete; + end if; + + l_name := l_names(i); + l_object_lines(l_object_lines.count+1) := l_lines(i); + end loop; + exit when a_sources_cursor%notfound; - l_name := l_names(i); - l_object_lines(l_object_lines.count+1) := l_lines(i); end loop; - exit when a_sources_cursor%notfound; - - end loop; - if a_sources_cursor%rowcount > 0 then - l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type); - ut_annotation_cache_manager.update_cache( - ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations) - ); - l_object_lines.delete; + if a_sources_cursor%rowcount > 0 then + l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type); + ut_annotation_cache_manager.update_cache( + ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations) + ); + l_object_lines.delete; + end if; + exception + when others then + if a_sources_cursor%isopen then + close a_sources_cursor; + end if; + raise; + end; + if a_sources_cursor%isopen then + close a_sources_cursor; end if; - close a_sources_cursor; end; diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index c81d86883..ccde8f966 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -23,8 +23,8 @@ create or replace package body ut_utils is gc_invalid_xml_char constant varchar2(50) := '[^_[:alnum:]\.-]'; gc_full_valid_xml_name constant varchar2(50) := '^([[:alpha:]])([_[:alnum:]\.-])*$'; gc_owner_hash constant integer(11) := dbms_utility.get_hash_value( ut_owner(), 0, power(2,31)-1); - gc_open_chars constant varchar2(4):= chr(91) || chr(123) || chr(40) || chr(60); -- [{( this has very specific purpose to not confuse lexer in IDE - gc_close_chars constant varchar2(4):= chr(93) || chr(125) || chr(41) || chr(62); -- ]})> this has very specific purpose to not confuse lexer in IDE + gc_open_chars constant varchar2(4):= '[{(<'; + gc_close_chars constant varchar2(4):= ']})>'; gc_max_plsql_source_len constant integer := 32767; function surround_with(a_value varchar2, a_quote_char varchar2) return varchar2 is @@ -660,6 +660,115 @@ create or replace package body ut_utils is return l_result; end; + function scan_line(a_line in varchar2, a_in_ml_comment in out boolean) return varchar2 is + -- Normal scan + l_remaining varchar2(32767) := a_line; + l_line varchar2(32767); + l_ml_start binary_integer; + l_comment_start binary_integer; + l_text_start binary_integer; + l_eq_text_start binary_integer; + l_eq_end_char varchar2(1 char); + l_pos binary_integer; + l_end binary_integer; + l_ml_end binary_integer; + begin + if a_in_ml_comment then + l_ml_end := instr(l_remaining, '*/'); + if l_ml_end > 0 then + a_in_ml_comment := false; + l_remaining := substr(l_remaining, l_ml_end + 2); + else + return null; + end if; + end if; + + loop + exit when l_remaining is null; + l_ml_start := instr(l_remaining, '/*'); + l_comment_start := instr(l_remaining, '--'); + l_text_start := instr(l_remaining, ''''); + -- q' always puts ' at l_text_start; just check the char immediately before it + l_eq_text_start := case + when l_text_start > 1 and substr(l_remaining, l_text_start - 1, 1) = 'q' + then l_text_start - 1 + else 0 + end; + -- Sentinel gc_max_plsql_source_len means "not present"; 32767 is beyond any VARCHAR2 position + l_pos := least( + case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, + case when l_comment_start > 0 then l_comment_start else gc_max_plsql_source_len end, + case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, + case when l_eq_text_start > 0 then l_eq_text_start else gc_max_plsql_source_len end + ); + + if l_pos = gc_max_plsql_source_len then + l_line := l_line || l_remaining; + exit; + end if; + + l_line := l_line || substr(l_remaining, 1, l_pos - 1); + l_remaining := substr(l_remaining, l_pos); + -- l_remaining now starts exactly at the token; all branch offsets below are relative to 1 + if l_pos = l_eq_text_start then + -- q-quoted string: l_remaining starts at 'q', delimiter is at position 3 + l_eq_end_char := translate(substr(l_remaining, 3, 1), gc_open_chars, gc_close_chars); + l_end := instr(l_remaining, l_eq_end_char || '''', 4); + if l_end > 0 then + l_line := l_line || substr(l_remaining, 1, l_end + 1); + l_remaining := substr(l_remaining, l_end + 2); + else + l_line := l_line || l_remaining; + exit; + end if; + + elsif l_pos = l_ml_start then + -- Multi-line comment: l_remaining starts at '/*', so end search starts at 3 + l_ml_end := instr(l_remaining, '*/', 3); + if l_ml_end > 0 then + l_remaining := substr(l_remaining, l_ml_end + 2); + else + a_in_ml_comment := true; + -- preserve trailing newline if present — it belongs to this line, not the comment + if substr(l_remaining, -1) = chr(10) then + l_line := l_line || chr(10); + end if; + return l_line; + end if; + + elsif l_pos = l_comment_start then + -- Single-line comment: everything from here is comment, keep and stop + l_line := l_line || l_remaining; + return l_line; + + else + -- Regular string literal: l_remaining starts at the opening quote + -- scan from position 2 to skip the opening quote + l_end := 2; + loop + l_end := instr(l_remaining, '''', l_end); + exit when l_end = 0; + if substr(l_remaining, l_end, 2) = '''''' then + l_end := l_end + 2; -- skip escaped quote pair + else + exit; -- real closing quote + end if; + end loop; + + if l_end > 0 then + l_line := l_line || substr(l_remaining, 1, l_end); + l_remaining := substr(l_remaining, l_end + 1); + else + l_line := l_line || l_remaining; + exit; + end if; + + end if; + end loop; + + return l_line; + end; + function replace_multiline_comments(a_source dbms_preprocessor.source_lines_t) return dbms_preprocessor.source_lines_t is @@ -668,13 +777,6 @@ create or replace package body ut_utils is l_remaining varchar2(32767); l_in_ml_comment boolean := false; l_ml_end binary_integer; - l_ml_start binary_integer; - l_comment_start binary_integer; - l_text_start binary_integer; - l_eq_text_start binary_integer; - l_eq_end_char varchar2(1 char); - l_pos binary_integer; - l_end binary_integer; l_has_ml_comment boolean := false; begin if a_source.count = 0 then @@ -720,92 +822,10 @@ create or replace package body ut_utils is -- Normal scan l_remaining := l_line; - l_line := null; - - <> - loop - exit when l_remaining is null or l_remaining = ''; - l_ml_start := instr(l_remaining, '/*'); - l_comment_start := instr(l_remaining, '--'); - l_text_start := instr(l_remaining, ''''); - -- q' always puts ' at l_text_start; just check the char immediately before it - l_eq_text_start := case - when l_text_start > 1 and substr(l_remaining, l_text_start - 1, 1) = 'q' - then l_text_start - 1 - else 0 - end; - -- Sentinel gc_max_plsql_source_len means "not present"; 32767 is beyond any VARCHAR2 position - l_pos := least( - case when l_ml_start > 0 then l_ml_start else gc_max_plsql_source_len end, - case when l_comment_start > 0 then l_comment_start else gc_max_plsql_source_len end, - case when l_text_start > 0 then l_text_start else gc_max_plsql_source_len end, - case when l_eq_text_start > 0 then l_eq_text_start else gc_max_plsql_source_len end - ); - - if l_pos = gc_max_plsql_source_len then - l_line := l_line || l_remaining; - exit scan_line; - end if; - - l_line := l_line || substr(l_remaining, 1, l_pos - 1); - l_remaining := substr(l_remaining, l_pos); - -- l_remaining now starts exactly at the token; all branch offsets below are relative to 1 - if l_pos = l_eq_text_start then - -- q-quoted string: l_remaining starts at 'q', delimiter is at position 3 - l_eq_end_char := translate(substr(l_remaining, 3, 1), gc_open_chars, gc_close_chars); - l_end := instr(l_remaining, l_eq_end_char || '''', 4); - if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end + 1); - l_remaining := substr(l_remaining, l_end + 2); - else - l_line := l_line || l_remaining; - exit scan_line; - end if; - - elsif l_pos = l_ml_start then - -- Multi-line comment: l_remaining starts at '/*', so end search starts at 3 - l_ml_end := instr(l_remaining, '*/', 3); - if l_ml_end > 0 then - l_remaining := substr(l_remaining, l_ml_end + 2); - else - l_in_ml_comment := true; - -- preserve trailing newline if present — it belongs to this line, not the comment - if substr(l_remaining, -1) = chr(10) then - l_line := l_line || chr(10); - end if; - exit scan_line; - end if; - - elsif l_pos = l_comment_start then - -- Single-line comment: everything from here is comment, keep and stop - l_line := l_line || l_remaining; - exit scan_line; - - else - -- Regular string literal: l_remaining starts at the opening quote - -- scan from position 2 to skip the opening quote - l_end := 2; - loop - l_end := instr(l_remaining, '''', l_end); - exit when l_end = 0; - if substr(l_remaining, l_end, 2) = '''''' then - l_end := l_end + 2; -- skip escaped quote pair - else - exit; -- real closing quote - end if; - end loop; - - if l_end > 0 then - l_line := l_line || substr(l_remaining, 1, l_end); - l_remaining := substr(l_remaining, l_end + 1); - else - l_line := l_line || l_remaining; - exit scan_line; - end if; - - end if; - end loop scan_line; - + l_line := scan_line(l_remaining, l_in_ml_comment); + if l_line is null then + l_line := ''; + end if; l_result(i) := l_line; end loop; From c4d0ab07e7440dc7cc50d3d2a1dbcdb88f4ae17b Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Wed, 18 Mar 2026 21:57:39 +0000 Subject: [PATCH 126/144] Remove redundant exception handling in build_annot_cache_for_sources procedure --- source/core/annotations/ut_annotation_manager.pkb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 117a28729..5b4ee09c2 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -168,12 +168,6 @@ create or replace package body ut_annotation_manager as ); l_object_lines.delete; end if; - exception - when others then - if a_sources_cursor%isopen then - close a_sources_cursor; - end if; - raise; end; if a_sources_cursor%isopen then close a_sources_cursor; From aa3bfe7e54c814915a550dfd54cc2d552083ee65 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Wed, 18 Mar 2026 22:14:45 +0000 Subject: [PATCH 127/144] Refactor annotation patterns in ut_annotation_parser and remove unused constants --- source/core/annotations/ut_annotation_manager.pkb | 2 -- source/core/annotations/ut_annotation_parser.pkb | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 5b4ee09c2..6767411f1 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -174,7 +174,6 @@ create or replace package body ut_annotation_manager as end if; end; - procedure validate_annotation_cache( a_object_owner varchar2, a_object_type varchar2, @@ -238,7 +237,6 @@ create or replace package body ut_annotation_manager as l_sql_lines dbms_preprocessor.source_lines_t := dbms_preprocessor.source_lines_t(); l_sql_lines_clob ut_varchar2_list := ut_varchar2_list(); l_result sys_refcursor; - l_replaced boolean := false; begin if a_parts > 0 then for i in 1..a_parts loop diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 6fcd7a5bf..d356a1ebf 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -22,12 +22,10 @@ create or replace package body ut_annotation_parser as type tt_comment_list is table of varchar2(32767) index by binary_integer; gc_annotation_qualifier constant varchar2(1) := '%'; - gc_annot_comment_pattern constant varchar2(30) := '^( |'||chr(09)||')*-- *('||gc_annotation_qualifier||'.*?)$'; -- chr(09) is a tab character gc_comment_replacer_patter constant varchar2(50) := '{COMMENT#%N%}'; gc_comment_replacer_regex_ptrn constant varchar2(25) := '{COMMENT#(\d+)}'; gc_regexp_identifier constant varchar2(50) := '[[:alpha:]][[:alnum:]$#_]*'; - gc_annotation_block_pattern constant varchar2(200) := '(({COMMENT#.+}'||chr(10)||')+)( |'||chr(09)||')*(procedure|function)\s+(' || - gc_regexp_identifier || ')'; + gc_annotation_pattern constant varchar2(50) := gc_annotation_qualifier || gc_regexp_identifier || '[ '||chr(9)||']*(\(.*?\)\s*?$)?'; From d9a068b7a3a08987e82566c07f84aa479fa47785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 09:29:48 +0300 Subject: [PATCH 128/144] Update of version number of utPLSQL to 3.2.01 This version drops support for Oracle versions older than Oracle 19c. --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5fcdcb942..48e1527d1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.14-develop +v3.2.01-develop From 3724a364a543a33a10dc9614f3c0b3cc105dae0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 10:06:13 +0300 Subject: [PATCH 129/144] Fixing uninstall script. Added missing removal of UT_TAP_REPORTER. --- source/uninstall_objects.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index dde9a824f..df8b51d35 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -273,6 +273,8 @@ drop type ut_stack force; drop sequence ut_savepoint_seq; +drop type ut_tap_reporter force; + drop type ut_documentation_reporter force; drop type ut_debug_reporter force; From c6ca071005684549b715ae7b481ae0df68cfc745 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 08:12:28 +0100 Subject: [PATCH 130/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- sonar-project.properties | 2 +- source/core/ut_utils.pks | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 2bfcb2370..4b0190a75 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4342 +4361 diff --git a/docs/about/authors.md b/docs/about/authors.md index 2c2abf826..b2ee45733 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 0485779e5..4f97da2a1 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 81e4f976e..3833254af 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 4ac661e10..3f6297dc5 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 459bc9535..667092b1c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index c0cbffb0e..420aa96ce 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 3dc42e429..8f3f03beb 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 45be3be59..16f6e1471 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index adf36baa6..68ddee6c9 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e042d61ed..96cb4b0be 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 0ea5e2e73..b1baa871b 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index cd4feb46a..025046ebc 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 6724ac6ab..e5d3b8129 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 0cdc2d7fa..fca25c6ee 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index b417ba25c..7ef328f3e 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 28e02d5b8..aa190fb2f 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 818a592bc..2ef1a898b 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) # Upgrading from version 2 diff --git a/sonar-project.properties b/sonar-project.properties index f23e8cf71..24e77c11f 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=utplsql sonar.projectKey=utPLSQL_utPLSQL # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=utPLSQL -sonar.projectVersion=v3.1.14-develop +sonar.projectVersion=v3.2.01-develop # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # Since SonarQube 4.2, this property is optional if sonar.modules is set. diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 9615c7b4d..27ad1823b 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4342-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4361-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 06cdd33004d9450eb288a4d4a84f66d48542401f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 11:37:31 +0300 Subject: [PATCH 131/144] Update of Copyright banner Added copyright banner to files that were missing the banner. Set 2026 in Copyright banner --- source/api/ut.pkb | 2 +- source/api/ut.pks | 2 +- source/api/ut_runner.pkb | 2 +- source/api/ut_runner.pks | 2 +- source/api/ut_suite_item_info.tpb | 2 +- source/api/ut_suite_item_info.tps | 2 +- source/api/ut_suite_items_info.tps | 2 +- source/check_object_grants.sql | 17 ++++++++++++++ source/check_sys_grants.sql | 17 ++++++++++++++ .../core/annotations/ut_annotated_object.tps | 2 +- .../core/annotations/ut_annotated_objects.tps | 2 +- source/core/annotations/ut_annotation.tps | 2 +- .../core/annotations/ut_annotation_cache.sql | 2 +- .../annotations/ut_annotation_cache_info.sql | 2 +- .../ut_annotation_cache_manager.pkb | 2 +- .../ut_annotation_cache_manager.pks | 2 +- .../ut_annotation_cache_schema.sql | 2 +- .../annotations/ut_annotation_cache_seq.sql | 2 +- .../annotations/ut_annotation_manager.pkb | 2 +- .../annotations/ut_annotation_manager.pks | 2 +- .../ut_annotation_obj_cache_info.tps | 2 +- .../ut_annotation_objs_cache_info.tps | 2 +- .../core/annotations/ut_annotation_parser.pkb | 2 +- .../core/annotations/ut_annotation_parser.pks | 2 +- source/core/annotations/ut_annotations.tps | 2 +- .../ut_trigger_annotation_parsing.trg | 16 +++++++++++++ source/core/annotations/ut_trigger_check.pkb | 2 +- source/core/annotations/ut_trigger_check.pks | 2 +- source/core/coverage/ut_coverage.pkb | 2 +- source/core/coverage/ut_coverage.pks | 2 +- source/core/coverage/ut_coverage_block.pkb | 2 +- source/core/coverage/ut_coverage_block.pks | 2 +- source/core/coverage/ut_coverage_helper.pkb | 2 +- source/core/coverage/ut_coverage_helper.pks | 2 +- .../coverage/ut_coverage_helper_block.pkb | 2 +- .../coverage/ut_coverage_helper_block.pks | 2 +- .../coverage/ut_coverage_helper_profiler.pkb | 2 +- .../coverage/ut_coverage_helper_profiler.pks | 2 +- source/core/coverage/ut_coverage_profiler.pkb | 2 +- source/core/coverage/ut_coverage_profiler.pks | 2 +- .../coverage/ut_coverage_reporter_base.tpb | 2 +- .../coverage/ut_coverage_reporter_base.tps | 2 +- .../core/coverage/ut_coverage_sources_tmp.sql | 2 +- source/core/events/ut_event_item.tps | 2 +- source/core/events/ut_event_listener.tps | 2 +- source/core/events/ut_event_manager.pkb | 2 +- source/core/events/ut_event_manager.pks | 2 +- .../output_buffers/ut_output_buffer_base.tpb | 2 +- .../output_buffers/ut_output_buffer_base.tps | 2 +- .../ut_output_buffer_info_tmp.sql | 2 +- .../output_buffers/ut_output_buffer_tmp.sql | 2 +- .../output_buffers/ut_output_bulk_buffer.tpb | 2 +- .../output_buffers/ut_output_bulk_buffer.tps | 2 +- .../ut_output_clob_buffer_tmp.sql | 2 +- .../ut_output_clob_table_buffer.tpb | 2 +- .../ut_output_clob_table_buffer.tps | 2 +- .../output_buffers/ut_output_data_row.tps | 2 +- .../output_buffers/ut_output_data_rows.tps | 2 +- .../output_buffers/ut_output_table_buffer.tpb | 2 +- .../output_buffers/ut_output_table_buffer.tps | 2 +- .../session_context/ut_session_context.pkb | 2 +- .../session_context/ut_session_context.pks | 2 +- .../core/session_context/ut_session_info.tpb | 2 +- .../core/session_context/ut_session_info.tps | 2 +- .../core/types/ut_console_reporter_base.tpb | 2 +- .../core/types/ut_console_reporter_base.tps | 2 +- source/core/types/ut_coverage_options.tpb | 2 +- source/core/types/ut_coverage_options.tps | 2 +- source/core/types/ut_executable.tpb | 2 +- source/core/types/ut_executable.tps | 2 +- source/core/types/ut_executable_test.tpb | 2 +- source/core/types/ut_executable_test.tps | 2 +- source/core/types/ut_executables.tps | 2 +- source/core/types/ut_expectation_result.tpb | 2 +- source/core/types/ut_expectation_result.tps | 2 +- source/core/types/ut_expectation_results.tps | 2 +- source/core/types/ut_file_mapping.tpb | 2 +- source/core/types/ut_file_mapping.tps | 2 +- source/core/types/ut_file_mappings.tps | 2 +- source/core/types/ut_integer_list.tps | 2 +- source/core/types/ut_key_value_pair.tps | 2 +- source/core/types/ut_key_value_pairs.tps | 2 +- source/core/types/ut_logical_suite.tpb | 2 +- source/core/types/ut_logical_suite.tps | 2 +- source/core/types/ut_object_name.tpb | 2 +- source/core/types/ut_object_name.tps | 2 +- source/core/types/ut_object_names.tps | 2 +- source/core/types/ut_output_reporter_base.tpb | 2 +- source/core/types/ut_output_reporter_base.tps | 2 +- source/core/types/ut_path_item.tpb | 2 +- source/core/types/ut_path_item.tps | 2 +- source/core/types/ut_path_items.tps | 2 +- source/core/types/ut_reporter_base.tpb | 2 +- source/core/types/ut_reporter_base.tps | 2 +- source/core/types/ut_reporter_info.tps | 2 +- source/core/types/ut_reporters.tps | 2 +- source/core/types/ut_reporters_info.tps | 2 +- source/core/types/ut_results_counter.tpb | 2 +- source/core/types/ut_results_counter.tps | 2 +- source/core/types/ut_run.tpb | 2 +- source/core/types/ut_run.tps | 2 +- source/core/types/ut_run_info.tpb | 2 +- source/core/types/ut_run_info.tps | 2 +- source/core/types/ut_stack.tpb | 2 +- source/core/types/ut_stack.tps | 2 +- source/core/types/ut_suite.tpb | 2 +- source/core/types/ut_suite.tps | 2 +- source/core/types/ut_suite_cache_row.tps | 2 +- source/core/types/ut_suite_cache_rows.tps | 2 +- source/core/types/ut_suite_context.tpb | 2 +- source/core/types/ut_suite_context.tps | 2 +- source/core/types/ut_suite_item.tpb | 2 +- source/core/types/ut_suite_item.tps | 2 +- source/core/types/ut_suite_items.tps | 2 +- source/core/types/ut_test.tpb | 2 +- source/core/types/ut_test.tps | 2 +- source/core/types/ut_varchar2_list.tps | 2 +- source/core/types/ut_varchar2_rows.tps | 2 +- source/core/ut_dbms_output_cache.sql | 23 ++++++++++--------- source/core/ut_expectation_processor.pkb | 2 +- source/core/ut_expectation_processor.pks | 2 +- source/core/ut_file_mapper.pkb | 2 +- source/core/ut_file_mapper.pks | 2 +- source/core/ut_metadata.pkb | 2 +- source/core/ut_metadata.pks | 2 +- source/core/ut_savepoint_seq.sql | 2 +- source/core/ut_suite_builder.pkb | 2 +- source/core/ut_suite_builder.pks | 2 +- source/core/ut_suite_cache.sql | 2 +- source/core/ut_suite_cache_manager.pkb | 2 +- source/core/ut_suite_cache_manager.pks | 2 +- source/core/ut_suite_cache_package.sql | 2 +- source/core/ut_suite_cache_schema.sql | 2 +- source/core/ut_suite_cache_seq.sql | 2 +- source/core/ut_suite_manager.pkb | 2 +- source/core/ut_suite_manager.pks | 2 +- source/core/ut_suite_tag_filter.pkb | 2 +- source/core/ut_suite_tag_filter.pks | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- source/create_grants.sql | 2 +- source/create_synonyms.sql | 2 +- .../create_synonyms_and_grants_for_public.sql | 2 +- source/create_user_grants.sql | 2 +- source/create_user_synonyms.sql | 2 +- source/create_utplsql_owner.sql | 2 +- source/define_ut3_owner_param.sql | 2 +- .../data_values/ut_compound_data_diff_tmp.sql | 2 +- .../data_values/ut_compound_data_helper.pkb | 2 +- .../data_values/ut_compound_data_helper.pks | 2 +- .../data_values/ut_compound_data_tmp.sql | 2 +- .../data_values/ut_compound_data_value.tpb | 2 +- .../data_values/ut_compound_data_value.tps | 2 +- .../data_values/ut_cursor_column.tpb | 18 ++++++++++++++- .../data_values/ut_cursor_column.tps | 2 +- .../data_values/ut_cursor_column_tab.tps | 2 +- .../data_values/ut_cursor_details.tpb | 17 ++++++++++++++ .../data_values/ut_cursor_details.tps | 2 +- .../data_values/ut_data_value.tpb | 2 +- .../data_values/ut_data_value.tps | 2 +- .../data_values/ut_data_value_anydata.tpb | 2 +- .../data_values/ut_data_value_anydata.tps | 2 +- .../data_values/ut_data_value_blob.tpb | 2 +- .../data_values/ut_data_value_blob.tps | 2 +- .../data_values/ut_data_value_boolean.tpb | 2 +- .../data_values/ut_data_value_boolean.tps | 2 +- .../data_values/ut_data_value_clob.tpb | 2 +- .../data_values/ut_data_value_clob.tps | 2 +- .../data_values/ut_data_value_date.tpb | 2 +- .../data_values/ut_data_value_date.tps | 2 +- .../data_values/ut_data_value_dsinterval.tpb | 2 +- .../data_values/ut_data_value_dsinterval.tps | 2 +- .../data_values/ut_data_value_json.tpb | 2 +- .../data_values/ut_data_value_json.tps | 2 +- .../data_values/ut_data_value_number.tpb | 2 +- .../data_values/ut_data_value_number.tps | 2 +- .../data_values/ut_data_value_refcursor.tpb | 2 +- .../data_values/ut_data_value_refcursor.tps | 2 +- .../data_values/ut_data_value_timestamp.tpb | 2 +- .../data_values/ut_data_value_timestamp.tps | 2 +- .../ut_data_value_timestamp_ltz.tpb | 2 +- .../ut_data_value_timestamp_ltz.tps | 2 +- .../ut_data_value_timestamp_tz.tpb | 2 +- .../ut_data_value_timestamp_tz.tps | 2 +- .../data_values/ut_data_value_varchar2.tpb | 2 +- .../data_values/ut_data_value_varchar2.tps | 2 +- .../data_values/ut_data_value_xmltype.tpb | 2 +- .../data_values/ut_data_value_xmltype.tps | 2 +- .../data_values/ut_data_value_yminterval.tpb | 2 +- .../data_values/ut_data_value_yminterval.tps | 2 +- .../data_values/ut_json_data_diff_tmp.sql | 2 +- .../expectations/data_values/ut_json_leaf.tpb | 18 ++++++++++++++- .../expectations/data_values/ut_json_leaf.tps | 2 +- .../data_values/ut_json_leaf_tab.tps | 2 +- .../data_values/ut_json_tree_details.tpb | 16 +++++++++++++ .../data_values/ut_json_tree_details.tps | 2 +- .../data_values/ut_key_anyval_pair.tps | 2 +- .../data_values/ut_key_anyval_pairs.tps | 2 +- .../data_values/ut_key_anyvalues.tpb | 2 +- .../data_values/ut_key_anyvalues.tps | 2 +- .../expectations/matchers/ut_be_between.tpb | 2 +- .../expectations/matchers/ut_be_between.tps | 2 +- source/expectations/matchers/ut_be_empty.tpb | 2 +- source/expectations/matchers/ut_be_empty.tps | 2 +- source/expectations/matchers/ut_be_false.tpb | 2 +- source/expectations/matchers/ut_be_false.tps | 2 +- .../matchers/ut_be_greater_or_equal.tpb | 2 +- .../matchers/ut_be_greater_or_equal.tps | 2 +- .../matchers/ut_be_greater_than.tpb | 2 +- .../matchers/ut_be_greater_than.tps | 2 +- .../matchers/ut_be_less_or_equal.tpb | 2 +- .../matchers/ut_be_less_or_equal.tps | 2 +- .../expectations/matchers/ut_be_less_than.tpb | 2 +- .../expectations/matchers/ut_be_less_than.tps | 2 +- source/expectations/matchers/ut_be_like.tpb | 2 +- source/expectations/matchers/ut_be_like.tps | 2 +- .../expectations/matchers/ut_be_not_null.tpb | 2 +- .../expectations/matchers/ut_be_not_null.tps | 2 +- source/expectations/matchers/ut_be_null.tpb | 2 +- source/expectations/matchers/ut_be_null.tps | 2 +- source/expectations/matchers/ut_be_true.tpb | 2 +- source/expectations/matchers/ut_be_true.tps | 2 +- source/expectations/matchers/ut_be_within.tpb | 2 +- source/expectations/matchers/ut_be_within.tps | 2 +- .../matchers/ut_be_within_helper.pkb | 2 +- .../matchers/ut_be_within_helper.pks | 2 +- .../matchers/ut_be_within_pct.tpb | 2 +- .../matchers/ut_be_within_pct.tps | 3 +-- .../matchers/ut_comparison_matcher.tpb | 2 +- .../matchers/ut_comparison_matcher.tps | 2 +- source/expectations/matchers/ut_contain.tpb | 2 +- source/expectations/matchers/ut_contain.tps | 2 +- source/expectations/matchers/ut_equal.tpb | 2 +- source/expectations/matchers/ut_equal.tps | 2 +- .../expectations/matchers/ut_have_count.tpb | 2 +- .../expectations/matchers/ut_have_count.tps | 2 +- source/expectations/matchers/ut_match.tpb | 2 +- source/expectations/matchers/ut_match.tps | 2 +- source/expectations/matchers/ut_matcher.tpb | 2 +- source/expectations/matchers/ut_matcher.tps | 2 +- .../expectations/matchers/ut_matcher_base.tps | 17 ++++++++++++++ .../matchers/ut_matcher_options.tpb | 2 +- .../matchers/ut_matcher_options.tps | 2 +- .../matchers/ut_matcher_options_items.tpb | 2 +- .../matchers/ut_matcher_options_items.tps | 2 +- source/expectations/ut_expectation.tpb | 2 +- source/expectations/ut_expectation.tps | 2 +- source/expectations/ut_expectation_base.tpb | 3 ++- source/expectations/ut_expectation_base.tps | 3 ++- .../expectations/ut_expectation_compound.tpb | 2 +- .../expectations/ut_expectation_compound.tps | 2 +- source/expectations/ut_expectation_json.tpb | 2 +- source/expectations/ut_expectation_json.tps | 2 +- source/install.sql | 2 +- source/install_above_12_1.sql | 17 ++++++++++++++ source/install_component.sql | 2 +- source/install_ddl_trigger.sql | 2 +- source/install_headless.sql | 2 +- source/install_headless_with_trigger.sql | 2 +- source/reporters/ut_ansiconsole_helper.pkb | 2 +- source/reporters/ut_ansiconsole_helper.pks | 2 +- .../ut_coverage_cobertura_reporter.tpb | 2 +- .../ut_coverage_cobertura_reporter.tps | 2 +- .../reporters/ut_coverage_html_reporter.tpb | 2 +- .../reporters/ut_coverage_html_reporter.tps | 2 +- .../ut_coverage_report_html_helper.pkb | 2 +- .../ut_coverage_report_html_helper.pks | 2 +- .../reporters/ut_coverage_sonar_reporter.tpb | 2 +- .../reporters/ut_coverage_sonar_reporter.tps | 2 +- source/reporters/ut_coveralls_reporter.tpb | 2 +- source/reporters/ut_coveralls_reporter.tps | 2 +- source/reporters/ut_debug_reporter.tpb | 2 +- source/reporters/ut_debug_reporter.tps | 2 +- .../reporters/ut_documentation_reporter.tpb | 2 +- .../reporters/ut_documentation_reporter.tps | 2 +- source/reporters/ut_junit_reporter.tpb | 2 +- source/reporters/ut_junit_reporter.tps | 2 +- source/reporters/ut_realtime_reporter.tpb | 2 +- source/reporters/ut_realtime_reporter.tps | 2 +- source/reporters/ut_sonar_test_reporter.tpb | 2 +- source/reporters/ut_sonar_test_reporter.tps | 2 +- source/reporters/ut_tap_reporter.tpb | 17 +++++++++++++- source/reporters/ut_tap_reporter.tps | 16 +++++++++++++ source/reporters/ut_teamcity_reporter.tpb | 2 +- source/reporters/ut_teamcity_reporter.tps | 2 +- .../reporters/ut_teamcity_reporter_helper.pkb | 2 +- .../reporters/ut_teamcity_reporter_helper.pks | 2 +- source/reporters/ut_tfs_junit_reporter.tpb | 2 +- source/reporters/ut_tfs_junit_reporter.tps | 2 +- source/reporters/ut_xunit_reporter.tpb | 2 +- source/reporters/ut_xunit_reporter.tps | 2 +- source/set_install_params.sql | 2 +- source/uninstall.sql | 2 +- source/uninstall_all.sql | 2 +- source/uninstall_coverage_tables.sql | 17 ++++++++++++++ source/uninstall_objects.sql | 17 ++++++++++++++ source/uninstall_synonyms.sql | 17 ++++++++++++++ 297 files changed, 530 insertions(+), 297 deletions(-) diff --git a/source/api/ut.pkb b/source/api/ut.pkb index cff35b771..d61de040a 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -2,7 +2,7 @@ create or replace package body ut is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/api/ut.pks b/source/api/ut.pks index f72c82a0c..6fd98dd9f 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -2,7 +2,7 @@ create or replace package ut authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 3ec2a5393..755683cc9 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -2,7 +2,7 @@ create or replace package body ut_runner is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/api/ut_runner.pks b/source/api/ut_runner.pks index 85eff1c93..2c6bba888 100644 --- a/source/api/ut_runner.pks +++ b/source/api/ut_runner.pks @@ -2,7 +2,7 @@ create or replace package ut_runner authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/api/ut_suite_item_info.tpb b/source/api/ut_suite_item_info.tpb index 3315f7a16..727707ae9 100644 --- a/source/api/ut_suite_item_info.tpb +++ b/source/api/ut_suite_item_info.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite_item_info is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/api/ut_suite_item_info.tps b/source/api/ut_suite_item_info.tps index 2c92f261d..f632b2f52 100644 --- a/source/api/ut_suite_item_info.tps +++ b/source/api/ut_suite_item_info.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_item_info as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/api/ut_suite_items_info.tps b/source/api/ut_suite_items_info.tps index 208098f9d..e47b350e5 100644 --- a/source/api/ut_suite_items_info.tps +++ b/source/api/ut_suite_items_info.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_items_info as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/check_object_grants.sql b/source/check_object_grants.sql index 5f560e6b1..0e7a9b4c9 100644 --- a/source/check_object_grants.sql +++ b/source/check_object_grants.sql @@ -1,3 +1,20 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. +*/ + declare $if dbms_db_version.version >= 18 $then c_expected_grants constant dbmsoutput_linesarray := dbmsoutput_linesarray('DBMS_CRYPTO'); diff --git a/source/check_sys_grants.sql b/source/check_sys_grants.sql index 79b657328..f81157183 100644 --- a/source/check_sys_grants.sql +++ b/source/check_sys_grants.sql @@ -1,3 +1,20 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. +*/ + define expected_grants = "&1" declare c_expected_grants constant dbmsoutput_linesarray := dbmsoutput_linesarray( &expected_grants ); diff --git a/source/core/annotations/ut_annotated_object.tps b/source/core/annotations/ut_annotated_object.tps index 3fda363fe..21f6ab330 100644 --- a/source/core/annotations/ut_annotated_object.tps +++ b/source/core/annotations/ut_annotated_object.tps @@ -1,7 +1,7 @@ create type ut_annotated_object as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotated_objects.tps b/source/core/annotations/ut_annotated_objects.tps index c67c1bd53..63679b699 100644 --- a/source/core/annotations/ut_annotated_objects.tps +++ b/source/core/annotations/ut_annotated_objects.tps @@ -1,7 +1,7 @@ create type ut_annotated_objects as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation.tps b/source/core/annotations/ut_annotation.tps index 3d0311571..18747516a 100644 --- a/source/core/annotations/ut_annotation.tps +++ b/source/core/annotations/ut_annotation.tps @@ -1,7 +1,7 @@ create type ut_annotation as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_cache.sql b/source/core/annotations/ut_annotation_cache.sql index 67149ce60..7d69b1db6 100644 --- a/source/core/annotations/ut_annotation_cache.sql +++ b/source/core/annotations/ut_annotation_cache.sql @@ -1,7 +1,7 @@ create table ut_annotation_cache ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/annotations/ut_annotation_cache_info.sql b/source/core/annotations/ut_annotation_cache_info.sql index 167973a04..6248f4fbc 100644 --- a/source/core/annotations/ut_annotation_cache_info.sql +++ b/source/core/annotations/ut_annotation_cache_info.sql @@ -1,7 +1,7 @@ create table ut_annotation_cache_info ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/annotations/ut_annotation_cache_manager.pkb b/source/core/annotations/ut_annotation_cache_manager.pkb index e1131b3bd..52184e17d 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pkb +++ b/source/core/annotations/ut_annotation_cache_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_annotation_cache_manager as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_cache_manager.pks b/source/core/annotations/ut_annotation_cache_manager.pks index 1e9734934..55d109f91 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pks +++ b/source/core/annotations/ut_annotation_cache_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_annotation_cache_manager authid definer as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_cache_schema.sql b/source/core/annotations/ut_annotation_cache_schema.sql index 8889b9abf..b8ebaa40b 100644 --- a/source/core/annotations/ut_annotation_cache_schema.sql +++ b/source/core/annotations/ut_annotation_cache_schema.sql @@ -1,7 +1,7 @@ create table ut_annotation_cache_schema ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/annotations/ut_annotation_cache_seq.sql b/source/core/annotations/ut_annotation_cache_seq.sql index b371b382b..f0f1f17d7 100644 --- a/source/core/annotations/ut_annotation_cache_seq.sql +++ b/source/core/annotations/ut_annotation_cache_seq.sql @@ -1,7 +1,7 @@ create sequence ut_annotation_cache_seq /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 65f7b3e40..6d986473b 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_annotation_manager as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_manager.pks b/source/core/annotations/ut_annotation_manager.pks index 20fcd810f..637577d59 100644 --- a/source/core/annotations/ut_annotation_manager.pks +++ b/source/core/annotations/ut_annotation_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_annotation_manager authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_obj_cache_info.tps b/source/core/annotations/ut_annotation_obj_cache_info.tps index 1db3fd190..f7bdfa9a8 100644 --- a/source/core/annotations/ut_annotation_obj_cache_info.tps +++ b/source/core/annotations/ut_annotation_obj_cache_info.tps @@ -1,7 +1,7 @@ create type ut_annotation_obj_cache_info as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_objs_cache_info.tps b/source/core/annotations/ut_annotation_objs_cache_info.tps index fc96e7d25..eb69f41e9 100644 --- a/source/core/annotations/ut_annotation_objs_cache_info.tps +++ b/source/core/annotations/ut_annotation_objs_cache_info.tps @@ -1,7 +1,7 @@ create type ut_annotation_objs_cache_info as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 10bb76b3c..1176ffb6c 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -1,7 +1,7 @@ create or replace package body ut_annotation_parser as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotation_parser.pks b/source/core/annotations/ut_annotation_parser.pks index 2f474c883..91f1b7b47 100644 --- a/source/core/annotations/ut_annotation_parser.pks +++ b/source/core/annotations/ut_annotation_parser.pks @@ -1,7 +1,7 @@ create or replace package ut_annotation_parser authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_annotations.tps b/source/core/annotations/ut_annotations.tps index a6579d236..7669f008b 100644 --- a/source/core/annotations/ut_annotations.tps +++ b/source/core/annotations/ut_annotations.tps @@ -1,7 +1,7 @@ create type ut_annotations /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg index 437b7742d..75caea5e8 100644 --- a/source/core/annotations/ut_trigger_annotation_parsing.trg +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -2,6 +2,22 @@ create or replace trigger ut_trigger_annotation_parsing after create or alter or drop on database begin + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ if (ora_dict_obj_owner = UPPER('&&UT3_OWNER') and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' and ora_dict_obj_type = 'SYNONYM') diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index 34e43ba46..d533044bb 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -1,7 +1,7 @@ create or replace package body ut_trigger_check is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/annotations/ut_trigger_check.pks b/source/core/annotations/ut_trigger_check.pks index cee0b06fd..8c095c71a 100644 --- a/source/core/annotations/ut_trigger_check.pks +++ b/source/core/annotations/ut_trigger_check.pks @@ -1,7 +1,7 @@ create or replace package ut_trigger_check authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index 7eb5a34c2..e8e6ed529 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage.pks b/source/core/coverage/ut_coverage.pks index 21f3b1f9e..6bcde8e64 100644 --- a/source/core/coverage/ut_coverage.pks +++ b/source/core/coverage/ut_coverage.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_block.pkb b/source/core/coverage/ut_coverage_block.pkb index a906b81a3..2d7e8bdac 100644 --- a/source/core/coverage/ut_coverage_block.pkb +++ b/source/core/coverage/ut_coverage_block.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_block is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_block.pks b/source/core/coverage/ut_coverage_block.pks index 01caca035..1bd9c2d39 100644 --- a/source/core/coverage/ut_coverage_block.pks +++ b/source/core/coverage/ut_coverage_block.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_block authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_helper.pkb b/source/core/coverage/ut_coverage_helper.pkb index e249b3381..16e0bf7a1 100644 --- a/source/core/coverage/ut_coverage_helper.pkb +++ b/source/core/coverage/ut_coverage_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_helper.pks b/source/core/coverage/ut_coverage_helper.pks index cd6ed9ec7..da4cba087 100644 --- a/source/core/coverage/ut_coverage_helper.pks +++ b/source/core/coverage/ut_coverage_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_helper authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_helper_block.pkb b/source/core/coverage/ut_coverage_helper_block.pkb index fb4d4812e..0cf009a10 100644 --- a/source/core/coverage/ut_coverage_helper_block.pkb +++ b/source/core/coverage/ut_coverage_helper_block.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_helper_block is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_helper_block.pks b/source/core/coverage/ut_coverage_helper_block.pks index a147d9f4f..3ee1f266c 100644 --- a/source/core/coverage/ut_coverage_helper_block.pks +++ b/source/core/coverage/ut_coverage_helper_block.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_helper_block authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_helper_profiler.pkb b/source/core/coverage/ut_coverage_helper_profiler.pkb index f29291efb..7f6e6e51d 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pkb +++ b/source/core/coverage/ut_coverage_helper_profiler.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_helper_profiler is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_helper_profiler.pks b/source/core/coverage/ut_coverage_helper_profiler.pks index 0c54a83bf..2e56d10f7 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pks +++ b/source/core/coverage/ut_coverage_helper_profiler.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_helper_profiler authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_profiler.pkb b/source/core/coverage/ut_coverage_profiler.pkb index 663ceab7f..1dc40bcbc 100644 --- a/source/core/coverage/ut_coverage_profiler.pkb +++ b/source/core/coverage/ut_coverage_profiler.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_profiler is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_profiler.pks b/source/core/coverage/ut_coverage_profiler.pks index 9ce9a27f0..16145c34a 100644 --- a/source/core/coverage/ut_coverage_profiler.pks +++ b/source/core/coverage/ut_coverage_profiler.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_profiler authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_reporter_base.tpb b/source/core/coverage/ut_coverage_reporter_base.tpb index da2bd27ad..f28226428 100644 --- a/source/core/coverage/ut_coverage_reporter_base.tpb +++ b/source/core/coverage/ut_coverage_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_reporter_base.tps b/source/core/coverage/ut_coverage_reporter_base.tps index 305c5d757..b917ea707 100644 --- a/source/core/coverage/ut_coverage_reporter_base.tps +++ b/source/core/coverage/ut_coverage_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_reporter_base under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/coverage/ut_coverage_sources_tmp.sql b/source/core/coverage/ut_coverage_sources_tmp.sql index c091d5955..35eb05510 100644 --- a/source/core/coverage/ut_coverage_sources_tmp.sql +++ b/source/core/coverage/ut_coverage_sources_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_coverage_sources_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/events/ut_event_item.tps b/source/core/events/ut_event_item.tps index c0ea653ea..bb4556e03 100644 --- a/source/core/events/ut_event_item.tps +++ b/source/core/events/ut_event_item.tps @@ -1,7 +1,7 @@ create or replace type ut_event_item authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/events/ut_event_listener.tps b/source/core/events/ut_event_listener.tps index bbcdbf218..ee34bb009 100644 --- a/source/core/events/ut_event_listener.tps +++ b/source/core/events/ut_event_listener.tps @@ -1,7 +1,7 @@ create or replace type ut_event_listener authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/events/ut_event_manager.pkb b/source/core/events/ut_event_manager.pkb index f51019421..0b80b5a98 100644 --- a/source/core/events/ut_event_manager.pkb +++ b/source/core/events/ut_event_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_event_manager as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/events/ut_event_manager.pks b/source/core/events/ut_event_manager.pks index 03b18b728..9cea89898 100644 --- a/source/core/events/ut_event_manager.pks +++ b/source/core/events/ut_event_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_event_manager authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_buffer_base.tpb b/source/core/output_buffers/ut_output_buffer_base.tpb index 20cec335e..f92827d28 100644 --- a/source/core/output_buffers/ut_output_buffer_base.tpb +++ b/source/core/output_buffers/ut_output_buffer_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_buffer_base is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_buffer_base.tps b/source/core/output_buffers/ut_output_buffer_base.tps index f2d9ec686..9615cdc5e 100644 --- a/source/core/output_buffers/ut_output_buffer_base.tps +++ b/source/core/output_buffers/ut_output_buffer_base.tps @@ -1,7 +1,7 @@ create or replace type ut_output_buffer_base force authid definer as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_buffer_info_tmp.sql b/source/core/output_buffers/ut_output_buffer_info_tmp.sql index af730d394..2aba5a55c 100644 --- a/source/core/output_buffers/ut_output_buffer_info_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_info_tmp.sql @@ -1,7 +1,7 @@ create table ut_output_buffer_info_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/output_buffers/ut_output_buffer_tmp.sql b/source/core/output_buffers/ut_output_buffer_tmp.sql index 1ab19e534..68b738d3f 100644 --- a/source/core/output_buffers/ut_output_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_tmp.sql @@ -1,7 +1,7 @@ create table ut_output_buffer_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/output_buffers/ut_output_bulk_buffer.tpb b/source/core/output_buffers/ut_output_bulk_buffer.tpb index cfc173e95..bc0ec6128 100644 --- a/source/core/output_buffers/ut_output_bulk_buffer.tpb +++ b/source/core/output_buffers/ut_output_bulk_buffer.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_bulk_buffer is /* utPLSQL - Version 3 - Copyright 2016 - 2023 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_bulk_buffer.tps b/source/core/output_buffers/ut_output_bulk_buffer.tps index d74d4ee14..31d7271fa 100644 --- a/source/core/output_buffers/ut_output_bulk_buffer.tps +++ b/source/core/output_buffers/ut_output_bulk_buffer.tps @@ -1,7 +1,7 @@ create or replace type ut_output_bulk_buffer under ut_output_buffer_base ( /* utPLSQL - Version 3 - Copyright 2016 - 2023 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql index 9ff9f7413..fa61191ce 100644 --- a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql @@ -6,7 +6,7 @@ begin v_table_sql := 'create table ut_output_clob_buffer_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tpb b/source/core/output_buffers/ut_output_clob_table_buffer.tpb index 3d49ab08d..8f1cd3187 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_clob_table_buffer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tps b/source/core/output_buffers/ut_output_clob_table_buffer.tps index 191e64c01..2cfb2538b 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tps +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tps @@ -1,7 +1,7 @@ create or replace type ut_output_clob_table_buffer under ut_output_buffer_base ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_data_row.tps b/source/core/output_buffers/ut_output_data_row.tps index c5dd95e98..ecfde404a 100644 --- a/source/core/output_buffers/ut_output_data_row.tps +++ b/source/core/output_buffers/ut_output_data_row.tps @@ -1,7 +1,7 @@ create or replace type ut_output_data_row as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_data_rows.tps b/source/core/output_buffers/ut_output_data_rows.tps index 097e9beff..c505e2fbf 100644 --- a/source/core/output_buffers/ut_output_data_rows.tps +++ b/source/core/output_buffers/ut_output_data_rows.tps @@ -1,7 +1,7 @@ create or replace type ut_output_data_rows as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index e8e2442a7..5fbd39907 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_table_buffer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/output_buffers/ut_output_table_buffer.tps b/source/core/output_buffers/ut_output_table_buffer.tps index 154ce4de6..6c75421db 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tps +++ b/source/core/output_buffers/ut_output_table_buffer.tps @@ -1,7 +1,7 @@ create or replace type ut_output_table_buffer under ut_output_buffer_base ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/session_context/ut_session_context.pkb b/source/core/session_context/ut_session_context.pkb index a97505e9c..2443a350a 100644 --- a/source/core/session_context/ut_session_context.pkb +++ b/source/core/session_context/ut_session_context.pkb @@ -1,7 +1,7 @@ create or replace package body ut_session_context as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/session_context/ut_session_context.pks b/source/core/session_context/ut_session_context.pks index 63da3399e..8df2decee 100644 --- a/source/core/session_context/ut_session_context.pks +++ b/source/core/session_context/ut_session_context.pks @@ -1,7 +1,7 @@ create or replace package ut_session_context as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/session_context/ut_session_info.tpb b/source/core/session_context/ut_session_info.tpb index 7d469651a..d9d576fb9 100644 --- a/source/core/session_context/ut_session_info.tpb +++ b/source/core/session_context/ut_session_info.tpb @@ -1,7 +1,7 @@ create or replace type body ut_session_info as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/session_context/ut_session_info.tps b/source/core/session_context/ut_session_info.tps index 17e596d88..aeb3361c3 100644 --- a/source/core/session_context/ut_session_info.tps +++ b/source/core/session_context/ut_session_info.tps @@ -1,7 +1,7 @@ create or replace type ut_session_info under ut_event_listener ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_console_reporter_base.tpb b/source/core/types/ut_console_reporter_base.tpb index 909e9355a..282a52a9a 100644 --- a/source/core/types/ut_console_reporter_base.tpb +++ b/source/core/types/ut_console_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_console_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_console_reporter_base.tps b/source/core/types/ut_console_reporter_base.tps index a2c4b6b8c..077af7e37 100644 --- a/source/core/types/ut_console_reporter_base.tps +++ b/source/core/types/ut_console_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_console_reporter_base under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_coverage_options.tpb b/source/core/types/ut_coverage_options.tpb index a091802af..6c81af773 100644 --- a/source/core/types/ut_coverage_options.tpb +++ b/source/core/types/ut_coverage_options.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_options as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_coverage_options.tps b/source/core/types/ut_coverage_options.tps index a8e3d5129..3813232df 100644 --- a/source/core/types/ut_coverage_options.tps +++ b/source/core/types/ut_coverage_options.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_options force as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_executable.tpb b/source/core/types/ut_executable.tpb index d2ce9b79d..c78cf4d77 100644 --- a/source/core/types/ut_executable.tpb +++ b/source/core/types/ut_executable.tpb @@ -1,7 +1,7 @@ create or replace type body ut_executable is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_executable.tps b/source/core/types/ut_executable.tps index aaa5a3a72..7d04c4e41 100644 --- a/source/core/types/ut_executable.tps +++ b/source/core/types/ut_executable.tps @@ -1,7 +1,7 @@ create or replace type ut_executable under ut_event_item( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_executable_test.tpb b/source/core/types/ut_executable_test.tpb index fa5872e04..e816a1b1b 100644 --- a/source/core/types/ut_executable_test.tpb +++ b/source/core/types/ut_executable_test.tpb @@ -1,7 +1,7 @@ create or replace type body ut_executable_test as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_executable_test.tps b/source/core/types/ut_executable_test.tps index 42b6080df..76f2d1c7d 100644 --- a/source/core/types/ut_executable_test.tps +++ b/source/core/types/ut_executable_test.tps @@ -1,7 +1,7 @@ create or replace type ut_executable_test authid current_user under ut_executable ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_executables.tps b/source/core/types/ut_executables.tps index d6d52b3d2..f5fbbdfad 100644 --- a/source/core/types/ut_executables.tps +++ b/source/core/types/ut_executables.tps @@ -1,7 +1,7 @@ create or replace type ut_executables as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_expectation_result.tpb b/source/core/types/ut_expectation_result.tpb index 0b3adf983..cf445b705 100644 --- a/source/core/types/ut_expectation_result.tpb +++ b/source/core/types/ut_expectation_result.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_result is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_expectation_result.tps b/source/core/types/ut_expectation_result.tps index d4b4c7548..5a430fe64 100644 --- a/source/core/types/ut_expectation_result.tps +++ b/source/core/types/ut_expectation_result.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_result under ut_event_item( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_expectation_results.tps b/source/core/types/ut_expectation_results.tps index e5e4c6223..50cc046ec 100644 --- a/source/core/types/ut_expectation_results.tps +++ b/source/core/types/ut_expectation_results.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_results as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_file_mapping.tpb b/source/core/types/ut_file_mapping.tpb index dab1e35c5..5b7133c56 100644 --- a/source/core/types/ut_file_mapping.tpb +++ b/source/core/types/ut_file_mapping.tpb @@ -1,7 +1,7 @@ create or replace type body ut_file_mapping as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_file_mapping.tps b/source/core/types/ut_file_mapping.tps index 941d95283..8fed2df00 100644 --- a/source/core/types/ut_file_mapping.tps +++ b/source/core/types/ut_file_mapping.tps @@ -1,7 +1,7 @@ create or replace type ut_file_mapping as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_file_mappings.tps b/source/core/types/ut_file_mappings.tps index 240fb8dd7..0e1653969 100644 --- a/source/core/types/ut_file_mappings.tps +++ b/source/core/types/ut_file_mappings.tps @@ -1,7 +1,7 @@ create or replace type ut_file_mappings as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_integer_list.tps b/source/core/types/ut_integer_list.tps index ec9a2a78f..00bce87c4 100644 --- a/source/core/types/ut_integer_list.tps +++ b/source/core/types/ut_integer_list.tps @@ -1,7 +1,7 @@ create or replace type ut_integer_list as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_key_value_pair.tps b/source/core/types/ut_key_value_pair.tps index 5a337e608..38dee5a7d 100644 --- a/source/core/types/ut_key_value_pair.tps +++ b/source/core/types/ut_key_value_pair.tps @@ -1,7 +1,7 @@ create or replace type ut_key_value_pair force as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_key_value_pairs.tps b/source/core/types/ut_key_value_pairs.tps index 24bdded36..327986e19 100644 --- a/source/core/types/ut_key_value_pairs.tps +++ b/source/core/types/ut_key_value_pairs.tps @@ -1,7 +1,7 @@ create or replace type ut_key_value_pairs as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_logical_suite.tpb b/source/core/types/ut_logical_suite.tpb index 036d40d51..ea9b42857 100644 --- a/source/core/types/ut_logical_suite.tpb +++ b/source/core/types/ut_logical_suite.tpb @@ -1,7 +1,7 @@ create or replace type body ut_logical_suite as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_logical_suite.tps b/source/core/types/ut_logical_suite.tps index c4f2f699b..ab2271e32 100644 --- a/source/core/types/ut_logical_suite.tps +++ b/source/core/types/ut_logical_suite.tps @@ -1,7 +1,7 @@ create or replace type ut_logical_suite force under ut_suite_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_object_name.tpb b/source/core/types/ut_object_name.tpb index 76acc15bf..e39231b0f 100644 --- a/source/core/types/ut_object_name.tpb +++ b/source/core/types/ut_object_name.tpb @@ -1,7 +1,7 @@ create or replace type body ut_object_name as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_object_name.tps b/source/core/types/ut_object_name.tps index 5f8f724c4..dc4fe2bca 100644 --- a/source/core/types/ut_object_name.tps +++ b/source/core/types/ut_object_name.tps @@ -1,7 +1,7 @@ create or replace type ut_object_name as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_object_names.tps b/source/core/types/ut_object_names.tps index 03830be17..2b42cce21 100644 --- a/source/core/types/ut_object_names.tps +++ b/source/core/types/ut_object_names.tps @@ -1,7 +1,7 @@ create or replace type ut_object_names as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_output_reporter_base.tpb b/source/core/types/ut_output_reporter_base.tpb index 48970be5a..fec4ebfab 100644 --- a/source/core/types/ut_output_reporter_base.tpb +++ b/source/core/types/ut_output_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_output_reporter_base.tps b/source/core/types/ut_output_reporter_base.tps index 21eed9957..f5827a97d 100644 --- a/source/core/types/ut_output_reporter_base.tps +++ b/source/core/types/ut_output_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_output_reporter_base under ut_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_path_item.tpb b/source/core/types/ut_path_item.tpb index 6cdb2b8ad..685178987 100644 --- a/source/core/types/ut_path_item.tpb +++ b/source/core/types/ut_path_item.tpb @@ -1,7 +1,7 @@ create or replace type body ut_path_item as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_path_item.tps b/source/core/types/ut_path_item.tps index c8ec81be5..5946cacbf 100644 --- a/source/core/types/ut_path_item.tps +++ b/source/core/types/ut_path_item.tps @@ -1,7 +1,7 @@ create or replace type ut_path_item as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_path_items.tps b/source/core/types/ut_path_items.tps index 0c87cf28c..7ae04e0b9 100644 --- a/source/core/types/ut_path_items.tps +++ b/source/core/types/ut_path_items.tps @@ -1,7 +1,7 @@ create or replace type ut_path_items as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_reporter_base.tpb b/source/core/types/ut_reporter_base.tpb index 017dc8971..445d9d351 100644 --- a/source/core/types/ut_reporter_base.tpb +++ b/source/core/types/ut_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_reporter_base.tps b/source/core/types/ut_reporter_base.tps index de157136e..9df353060 100644 --- a/source/core/types/ut_reporter_base.tps +++ b/source/core/types/ut_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_reporter_base under ut_event_listener ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_reporter_info.tps b/source/core/types/ut_reporter_info.tps index f09c42e07..3491f7679 100644 --- a/source/core/types/ut_reporter_info.tps +++ b/source/core/types/ut_reporter_info.tps @@ -1,7 +1,7 @@ create or replace type ut_reporter_info as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_reporters.tps b/source/core/types/ut_reporters.tps index a2802bb26..ab6439dce 100644 --- a/source/core/types/ut_reporters.tps +++ b/source/core/types/ut_reporters.tps @@ -1,7 +1,7 @@ create or replace type ut_reporters as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_reporters_info.tps b/source/core/types/ut_reporters_info.tps index 82c264f36..3639f4c2c 100644 --- a/source/core/types/ut_reporters_info.tps +++ b/source/core/types/ut_reporters_info.tps @@ -1,7 +1,7 @@ create or replace type ut_reporters_info as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_results_counter.tpb b/source/core/types/ut_results_counter.tpb index 811389e0e..87fd83cf9 100644 --- a/source/core/types/ut_results_counter.tpb +++ b/source/core/types/ut_results_counter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_results_counter as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_results_counter.tps b/source/core/types/ut_results_counter.tps index 913ae0967..62b3d9ffd 100644 --- a/source/core/types/ut_results_counter.tps +++ b/source/core/types/ut_results_counter.tps @@ -1,7 +1,7 @@ create or replace type ut_results_counter as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index 660c88791..0956be32d 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -1,7 +1,7 @@ create or replace type body ut_run as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index 1878a2d46..ef3631082 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -1,7 +1,7 @@ create or replace type ut_run under ut_suite_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_run_info.tpb b/source/core/types/ut_run_info.tpb index 6edc0f109..1370de3cc 100644 --- a/source/core/types/ut_run_info.tpb +++ b/source/core/types/ut_run_info.tpb @@ -1,7 +1,7 @@ create or replace type body ut_run_info as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_run_info.tps b/source/core/types/ut_run_info.tps index 4a3da691f..df82c380d 100644 --- a/source/core/types/ut_run_info.tps +++ b/source/core/types/ut_run_info.tps @@ -1,7 +1,7 @@ create or replace type ut_run_info under ut_event_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_stack.tpb b/source/core/types/ut_stack.tpb index b5f4e8747..da0c371a6 100644 --- a/source/core/types/ut_stack.tpb +++ b/source/core/types/ut_stack.tpb @@ -1,7 +1,7 @@ create or replace type body ut_stack as /* utPLSQL - Version 3 - Copyright 2016 - 2023 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_stack.tps b/source/core/types/ut_stack.tps index 23112fdde..5a5f90263 100644 --- a/source/core/types/ut_stack.tps +++ b/source/core/types/ut_stack.tps @@ -3,7 +3,7 @@ create or replace type ut_stack as object ( tokens ut_varchar2_list, /* utPLSQL - Version 3 - Copyright 2016 - 2023 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite.tpb b/source/core/types/ut_suite.tpb index e3a4687d8..9558565ed 100644 --- a/source/core/types/ut_suite.tpb +++ b/source/core/types/ut_suite.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index ff7f3e171..199e05ea4 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -1,7 +1,7 @@ create or replace type ut_suite under ut_logical_suite ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_cache_row.tps b/source/core/types/ut_suite_cache_row.tps index c147a8757..f294b3697 100644 --- a/source/core/types/ut_suite_cache_row.tps +++ b/source/core/types/ut_suite_cache_row.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_cache_row as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_cache_rows.tps b/source/core/types/ut_suite_cache_rows.tps index 9b6919df5..c69c8672f 100644 --- a/source/core/types/ut_suite_cache_rows.tps +++ b/source/core/types/ut_suite_cache_rows.tps @@ -1,7 +1,7 @@ create type ut_suite_cache_rows as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_context.tpb b/source/core/types/ut_suite_context.tpb index be92e6fc9..52e57924a 100644 --- a/source/core/types/ut_suite_context.tpb +++ b/source/core/types/ut_suite_context.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite_context as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_context.tps b/source/core/types/ut_suite_context.tps index 5e3d20f87..51d318235 100644 --- a/source/core/types/ut_suite_context.tps +++ b/source/core/types/ut_suite_context.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_context under ut_suite ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_item.tpb b/source/core/types/ut_suite_item.tpb index 648f10dd1..965d2416e 100644 --- a/source/core/types/ut_suite_item.tpb +++ b/source/core/types/ut_suite_item.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite_item as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_item.tps b/source/core/types/ut_suite_item.tps index 8184f2a63..8ba3c6183 100644 --- a/source/core/types/ut_suite_item.tps +++ b/source/core/types/ut_suite_item.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_item force under ut_event_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_suite_items.tps b/source/core/types/ut_suite_items.tps index 615283446..ee3466c5d 100644 --- a/source/core/types/ut_suite_items.tps +++ b/source/core/types/ut_suite_items.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_items as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index 946f8990d..21ca44713 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -1,7 +1,7 @@ create or replace type body ut_test as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index dbba64961..215e3e9d6 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -1,7 +1,7 @@ create or replace type ut_test force under ut_suite_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_varchar2_list.tps b/source/core/types/ut_varchar2_list.tps index f0b5df509..95a5545a8 100644 --- a/source/core/types/ut_varchar2_list.tps +++ b/source/core/types/ut_varchar2_list.tps @@ -1,7 +1,7 @@ create or replace type ut_varchar2_list as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/types/ut_varchar2_rows.tps b/source/core/types/ut_varchar2_rows.tps index e7fa29c29..c6f05df86 100644 --- a/source/core/types/ut_varchar2_rows.tps +++ b/source/core/types/ut_varchar2_rows.tps @@ -1,7 +1,7 @@ create or replace type ut_varchar2_rows as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_dbms_output_cache.sql b/source/core/ut_dbms_output_cache.sql index e61b403c8..802f30942 100644 --- a/source/core/ut_dbms_output_cache.sql +++ b/source/core/ut_dbms_output_cache.sql @@ -1,15 +1,16 @@ /* -utPLSQL - Version 3 -Copyright 2016 - 2021 utPLSQL Project -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. + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. */ /* * This table is not a global temporary table as it needs to allow cross-session data exchange diff --git a/source/core/ut_expectation_processor.pkb b/source/core/ut_expectation_processor.pkb index c165a9ee5..654a838ca 100644 --- a/source/core/ut_expectation_processor.pkb +++ b/source/core/ut_expectation_processor.pkb @@ -1,7 +1,7 @@ create or replace package body ut_expectation_processor as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_expectation_processor.pks b/source/core/ut_expectation_processor.pks index dd9187526..1837188eb 100644 --- a/source/core/ut_expectation_processor.pks +++ b/source/core/ut_expectation_processor.pks @@ -1,7 +1,7 @@ create or replace package ut_expectation_processor authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_file_mapper.pkb b/source/core/ut_file_mapper.pkb index 425360533..077319d76 100644 --- a/source/core/ut_file_mapper.pkb +++ b/source/core/ut_file_mapper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_file_mapper is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_file_mapper.pks b/source/core/ut_file_mapper.pks index adc4c983f..71e045d7e 100644 --- a/source/core/ut_file_mapper.pks +++ b/source/core/ut_file_mapper.pks @@ -1,7 +1,7 @@ create or replace package ut_file_mapper authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index 360b7b97d..aec9a3c8d 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -1,7 +1,7 @@ create or replace package body ut_metadata as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_metadata.pks b/source/core/ut_metadata.pks index 27bfa5d30..31cf4889b 100644 --- a/source/core/ut_metadata.pks +++ b/source/core/ut_metadata.pks @@ -1,7 +1,7 @@ create or replace package ut_metadata authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_savepoint_seq.sql b/source/core/ut_savepoint_seq.sql index 5b0cda35e..2026ab0e3 100644 --- a/source/core/ut_savepoint_seq.sql +++ b/source/core/ut_savepoint_seq.sql @@ -1,7 +1,7 @@ create sequence ut_savepoint_seq /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index ebb113370..2ebdb980c 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_builder is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_builder.pks b/source/core/ut_suite_builder.pks index 352601a6d..7e43a720e 100644 --- a/source/core/ut_suite_builder.pks +++ b/source/core/ut_suite_builder.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_builder authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_cache.sql b/source/core/ut_suite_cache.sql index 182caabd0..1d7389e9f 100644 --- a/source/core/ut_suite_cache.sql +++ b/source/core/ut_suite_cache.sql @@ -1,7 +1,7 @@ create table ut_suite_cache /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index e5fdae7ac..fb7c2c888 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_cache_manager is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_cache_manager.pks b/source/core/ut_suite_cache_manager.pks index 81b1e0136..bd236678d 100644 --- a/source/core/ut_suite_cache_manager.pks +++ b/source/core/ut_suite_cache_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_cache_manager authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_cache_package.sql b/source/core/ut_suite_cache_package.sql index 7a146ff83..40b7b8dec 100644 --- a/source/core/ut_suite_cache_package.sql +++ b/source/core/ut_suite_cache_package.sql @@ -1,7 +1,7 @@ create table ut_suite_cache_package ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/ut_suite_cache_schema.sql b/source/core/ut_suite_cache_schema.sql index 636816e65..cace332e3 100644 --- a/source/core/ut_suite_cache_schema.sql +++ b/source/core/ut_suite_cache_schema.sql @@ -1,7 +1,7 @@ create table ut_suite_cache_schema ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/ut_suite_cache_seq.sql b/source/core/ut_suite_cache_seq.sql index e1e560286..020c25c4d 100644 --- a/source/core/ut_suite_cache_seq.sql +++ b/source/core/ut_suite_cache_seq.sql @@ -1,7 +1,7 @@ create sequence ut_suite_cache_seq /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index c418de638..ad7f27f59 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_manager is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index 07539139a..8ac7cc8ad 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_manager authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_tag_filter.pkb b/source/core/ut_suite_tag_filter.pkb index 2d9436301..353793bc5 100644 --- a/source/core/ut_suite_tag_filter.pkb +++ b/source/core/ut_suite_tag_filter.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_tag_filter is /* utPLSQL - Version 3 - Copyright 2016 - 2023 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_suite_tag_filter.pks b/source/core/ut_suite_tag_filter.pks index e824ae275..0493bd194 100644 --- a/source/core/ut_suite_tag_filter.pks +++ b/source/core/ut_suite_tag_filter.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_tag_filter authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2023 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 81d47221b..6582aec3d 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -1,7 +1,7 @@ create or replace package body ut_utils is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 27ad1823b..470fcd275 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -1,7 +1,7 @@ create or replace package ut_utils authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/create_grants.sql b/source/create_grants.sql index 2cdea9970..0656ec82f 100644 --- a/source/create_grants.sql +++ b/source/create_grants.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/create_synonyms.sql b/source/create_synonyms.sql index d839e11b7..3cc642921 100644 --- a/source/create_synonyms.sql +++ b/source/create_synonyms.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 050162d72..25f14217e 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index 83e594884..c1b81efa4 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/create_user_synonyms.sql b/source/create_user_synonyms.sql index a1e7a6acc..7b0e49553 100644 --- a/source/create_user_synonyms.sql +++ b/source/create_user_synonyms.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/create_utplsql_owner.sql b/source/create_utplsql_owner.sql index d7e4f3040..a5b70ffda 100644 --- a/source/create_utplsql_owner.sql +++ b/source/create_utplsql_owner.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/define_ut3_owner_param.sql b/source/define_ut3_owner_param.sql index 259b49712..192e810b7 100644 --- a/source/define_ut3_owner_param.sql +++ b/source/define_ut3_owner_param.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_compound_data_diff_tmp.sql b/source/expectations/data_values/ut_compound_data_diff_tmp.sql index c10e8d2e8..edd27f766 100644 --- a/source/expectations/data_values/ut_compound_data_diff_tmp.sql +++ b/source/expectations/data_values/ut_compound_data_diff_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_compound_data_diff_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 875ec760a..42feb2a47 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_compound_data_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_compound_data_helper.pks b/source/expectations/data_values/ut_compound_data_helper.pks index 451cd9bac..dd2e2ec3d 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pks +++ b/source/expectations/data_values/ut_compound_data_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_compound_data_helper authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_compound_data_tmp.sql b/source/expectations/data_values/ut_compound_data_tmp.sql index 1bfa77fca..01cedd97b 100644 --- a/source/expectations/data_values/ut_compound_data_tmp.sql +++ b/source/expectations/data_values/ut_compound_data_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_compound_data_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/expectations/data_values/ut_compound_data_value.tpb b/source/expectations/data_values/ut_compound_data_value.tpb index 2c52ff8fa..5fd3154b1 100644 --- a/source/expectations/data_values/ut_compound_data_value.tpb +++ b/source/expectations/data_values/ut_compound_data_value.tpb @@ -1,7 +1,7 @@ create or replace type body ut_compound_data_value as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_compound_data_value.tps b/source/expectations/data_values/ut_compound_data_value.tps index c14dadceb..ca2206e2a 100644 --- a/source/expectations/data_values/ut_compound_data_value.tps +++ b/source/expectations/data_values/ut_compound_data_value.tps @@ -1,7 +1,7 @@ create or replace type ut_compound_data_value force under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_cursor_column.tpb b/source/expectations/data_values/ut_cursor_column.tpb index a9fb6b0f4..13fbb86b7 100644 --- a/source/expectations/data_values/ut_cursor_column.tpb +++ b/source/expectations/data_values/ut_cursor_column.tpb @@ -1,5 +1,21 @@ create or replace type body ut_cursor_column as - + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ + member procedure init( self in out nocopy ut_cursor_column, a_col_name varchar2, a_col_schema_name varchar2, diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index 77bf78f01..98ca78b6e 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -1,7 +1,7 @@ create or replace type ut_cursor_column authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_cursor_column_tab.tps b/source/expectations/data_values/ut_cursor_column_tab.tps index 106023d96..258624691 100644 --- a/source/expectations/data_values/ut_cursor_column_tab.tps +++ b/source/expectations/data_values/ut_cursor_column_tab.tps @@ -1,7 +1,7 @@ create or replace type ut_cursor_column_tab as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index b823ff944..cce0751d1 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -1,4 +1,21 @@ create or replace type body ut_cursor_details as + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ + member function equals( a_other ut_cursor_details, a_match_options ut_matcher_options ) return boolean is l_diffs integer; diff --git a/source/expectations/data_values/ut_cursor_details.tps b/source/expectations/data_values/ut_cursor_details.tps index e7f9405eb..981fda8e5 100644 --- a/source/expectations/data_values/ut_cursor_details.tps +++ b/source/expectations/data_values/ut_cursor_details.tps @@ -1,7 +1,7 @@ create or replace type ut_cursor_details authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value.tpb b/source/expectations/data_values/ut_data_value.tpb index 6b1763dd0..6eb352b77 100644 --- a/source/expectations/data_values/ut_data_value.tpb +++ b/source/expectations/data_values/ut_data_value.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value.tps b/source/expectations/data_values/ut_data_value.tps index beda3d911..91a07e463 100644 --- a/source/expectations/data_values/ut_data_value.tps +++ b/source/expectations/data_values/ut_data_value.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value force authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_anydata.tpb b/source/expectations/data_values/ut_data_value_anydata.tpb index f6fbdc840..189d2e032 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tpb +++ b/source/expectations/data_values/ut_data_value_anydata.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_anydata as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_anydata.tps b/source/expectations/data_values/ut_data_value_anydata.tps index 60dba5515..ee9725d58 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tps +++ b/source/expectations/data_values/ut_data_value_anydata.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_anydata under ut_data_value_refcursor( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_blob.tpb b/source/expectations/data_values/ut_data_value_blob.tpb index e145a8d4f..42e35fc55 100644 --- a/source/expectations/data_values/ut_data_value_blob.tpb +++ b/source/expectations/data_values/ut_data_value_blob.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_blob as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_blob.tps b/source/expectations/data_values/ut_data_value_blob.tps index 6df3f3273..08813371e 100644 --- a/source/expectations/data_values/ut_data_value_blob.tps +++ b/source/expectations/data_values/ut_data_value_blob.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_blob under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_boolean.tpb b/source/expectations/data_values/ut_data_value_boolean.tpb index 867c3c19c..84af1c34c 100644 --- a/source/expectations/data_values/ut_data_value_boolean.tpb +++ b/source/expectations/data_values/ut_data_value_boolean.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_boolean as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_boolean.tps b/source/expectations/data_values/ut_data_value_boolean.tps index e25b6e0fd..4d7af837b 100644 --- a/source/expectations/data_values/ut_data_value_boolean.tps +++ b/source/expectations/data_values/ut_data_value_boolean.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_boolean under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_clob.tpb b/source/expectations/data_values/ut_data_value_clob.tpb index f8a53a035..2dd00c023 100644 --- a/source/expectations/data_values/ut_data_value_clob.tpb +++ b/source/expectations/data_values/ut_data_value_clob.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_clob as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_clob.tps b/source/expectations/data_values/ut_data_value_clob.tps index 6869798d1..abcc635c9 100644 --- a/source/expectations/data_values/ut_data_value_clob.tps +++ b/source/expectations/data_values/ut_data_value_clob.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_clob under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_date.tpb b/source/expectations/data_values/ut_data_value_date.tpb index 20424d193..dc1c4d22f 100644 --- a/source/expectations/data_values/ut_data_value_date.tpb +++ b/source/expectations/data_values/ut_data_value_date.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_date as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_date.tps b/source/expectations/data_values/ut_data_value_date.tps index f64a577e0..8db1850c2 100644 --- a/source/expectations/data_values/ut_data_value_date.tps +++ b/source/expectations/data_values/ut_data_value_date.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_date under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_dsinterval.tpb b/source/expectations/data_values/ut_data_value_dsinterval.tpb index 026d4970f..bcfb48a2b 100644 --- a/source/expectations/data_values/ut_data_value_dsinterval.tpb +++ b/source/expectations/data_values/ut_data_value_dsinterval.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_dsinterval as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_dsinterval.tps b/source/expectations/data_values/ut_data_value_dsinterval.tps index 6f5cb708c..5add4adf9 100644 --- a/source/expectations/data_values/ut_data_value_dsinterval.tps +++ b/source/expectations/data_values/ut_data_value_dsinterval.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_dsinterval under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_json.tpb b/source/expectations/data_values/ut_data_value_json.tpb index b703af181..9f65ef618 100644 --- a/source/expectations/data_values/ut_data_value_json.tpb +++ b/source/expectations/data_values/ut_data_value_json.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_json as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_json.tps b/source/expectations/data_values/ut_data_value_json.tps index 3b77e54eb..46a78e00e 100644 --- a/source/expectations/data_values/ut_data_value_json.tps +++ b/source/expectations/data_values/ut_data_value_json.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_json under ut_compound_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_number.tpb b/source/expectations/data_values/ut_data_value_number.tpb index 382e6e9aa..53b8ce413 100644 --- a/source/expectations/data_values/ut_data_value_number.tpb +++ b/source/expectations/data_values/ut_data_value_number.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_number as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_number.tps b/source/expectations/data_values/ut_data_value_number.tps index 86d68f356..914252b9f 100644 --- a/source/expectations/data_values/ut_data_value_number.tps +++ b/source/expectations/data_values/ut_data_value_number.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_number under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index a4f0cf7a0..ee1408b56 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_refcursor as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_refcursor.tps b/source/expectations/data_values/ut_data_value_refcursor.tps index 594695e32..7d336bd78 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tps +++ b/source/expectations/data_values/ut_data_value_refcursor.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_refcursor under ut_compound_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_timestamp.tpb b/source/expectations/data_values/ut_data_value_timestamp.tpb index 318f799a3..bfb0ab734 100644 --- a/source/expectations/data_values/ut_data_value_timestamp.tpb +++ b/source/expectations/data_values/ut_data_value_timestamp.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_timestamp as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_timestamp.tps b/source/expectations/data_values/ut_data_value_timestamp.tps index c047e3c79..5c1f0b879 100644 --- a/source/expectations/data_values/ut_data_value_timestamp.tps +++ b/source/expectations/data_values/ut_data_value_timestamp.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_timestamp under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb b/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb index 6127de5f1..ba1610d31 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb +++ b/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_timestamp_ltz as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_timestamp_ltz.tps b/source/expectations/data_values/ut_data_value_timestamp_ltz.tps index 7bb296bc9..51bf615af 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_ltz.tps +++ b/source/expectations/data_values/ut_data_value_timestamp_ltz.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_timestamp_ltz under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_timestamp_tz.tpb b/source/expectations/data_values/ut_data_value_timestamp_tz.tpb index d5d5cdd13..ea0d28090 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_tz.tpb +++ b/source/expectations/data_values/ut_data_value_timestamp_tz.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_timestamp_tz as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_timestamp_tz.tps b/source/expectations/data_values/ut_data_value_timestamp_tz.tps index 01cf11124..435dc8df0 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_tz.tps +++ b/source/expectations/data_values/ut_data_value_timestamp_tz.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_timestamp_tz under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_varchar2.tpb b/source/expectations/data_values/ut_data_value_varchar2.tpb index d04398697..923ef7b9e 100644 --- a/source/expectations/data_values/ut_data_value_varchar2.tpb +++ b/source/expectations/data_values/ut_data_value_varchar2.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_varchar2 as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_varchar2.tps b/source/expectations/data_values/ut_data_value_varchar2.tps index 3fbeb378b..8db175d90 100644 --- a/source/expectations/data_values/ut_data_value_varchar2.tps +++ b/source/expectations/data_values/ut_data_value_varchar2.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_varchar2 under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_xmltype.tpb b/source/expectations/data_values/ut_data_value_xmltype.tpb index 4b21a8937..dc518da54 100644 --- a/source/expectations/data_values/ut_data_value_xmltype.tpb +++ b/source/expectations/data_values/ut_data_value_xmltype.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_xmltype as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_xmltype.tps b/source/expectations/data_values/ut_data_value_xmltype.tps index 9ba738b88..3929b4d7c 100644 --- a/source/expectations/data_values/ut_data_value_xmltype.tps +++ b/source/expectations/data_values/ut_data_value_xmltype.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_xmltype under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_yminterval.tpb b/source/expectations/data_values/ut_data_value_yminterval.tpb index a3a1e7a2f..abba0bc20 100644 --- a/source/expectations/data_values/ut_data_value_yminterval.tpb +++ b/source/expectations/data_values/ut_data_value_yminterval.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_yminterval as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_data_value_yminterval.tps b/source/expectations/data_values/ut_data_value_yminterval.tps index c9ad2e776..734ed545d 100644 --- a/source/expectations/data_values/ut_data_value_yminterval.tps +++ b/source/expectations/data_values/ut_data_value_yminterval.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_yminterval under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_json_data_diff_tmp.sql b/source/expectations/data_values/ut_json_data_diff_tmp.sql index 5ff3440d8..4eda07d7c 100644 --- a/source/expectations/data_values/ut_json_data_diff_tmp.sql +++ b/source/expectations/data_values/ut_json_data_diff_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_json_data_diff_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project 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 diff --git a/source/expectations/data_values/ut_json_leaf.tpb b/source/expectations/data_values/ut_json_leaf.tpb index 83f1009ef..b7a20f11b 100644 --- a/source/expectations/data_values/ut_json_leaf.tpb +++ b/source/expectations/data_values/ut_json_leaf.tpb @@ -1,5 +1,21 @@ create or replace type body ut_json_leaf as - + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ + member procedure init( self in out nocopy ut_json_leaf, a_element_name varchar2, a_element_value varchar2,a_parent_name varchar2, a_access_path varchar2, a_hierarchy_level integer, a_index_position integer, a_json_type in varchar2, diff --git a/source/expectations/data_values/ut_json_leaf.tps b/source/expectations/data_values/ut_json_leaf.tps index 8aa8afd6a..70d4df71d 100644 --- a/source/expectations/data_values/ut_json_leaf.tps +++ b/source/expectations/data_values/ut_json_leaf.tps @@ -1,7 +1,7 @@ create or replace type ut_json_leaf authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_json_leaf_tab.tps b/source/expectations/data_values/ut_json_leaf_tab.tps index 395ab5d9e..10fd3eef6 100644 --- a/source/expectations/data_values/ut_json_leaf_tab.tps +++ b/source/expectations/data_values/ut_json_leaf_tab.tps @@ -1,7 +1,7 @@ create or replace type ut_json_leaf_tab as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_json_tree_details.tpb b/source/expectations/data_values/ut_json_tree_details.tpb index a333ea71c..f82aac5a0 100644 --- a/source/expectations/data_values/ut_json_tree_details.tpb +++ b/source/expectations/data_values/ut_json_tree_details.tpb @@ -1,4 +1,20 @@ create or replace type body ut_json_tree_details as + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ member function get_json_type(a_json_piece json_element_t) return varchar2 is begin diff --git a/source/expectations/data_values/ut_json_tree_details.tps b/source/expectations/data_values/ut_json_tree_details.tps index 20ac2fdcc..9c37f99ea 100644 --- a/source/expectations/data_values/ut_json_tree_details.tps +++ b/source/expectations/data_values/ut_json_tree_details.tps @@ -1,7 +1,7 @@ create or replace type ut_json_tree_details force as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_key_anyval_pair.tps b/source/expectations/data_values/ut_key_anyval_pair.tps index d1068f109..7935ffa09 100644 --- a/source/expectations/data_values/ut_key_anyval_pair.tps +++ b/source/expectations/data_values/ut_key_anyval_pair.tps @@ -1,7 +1,7 @@ create or replace type ut_key_anyval_pair force as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_key_anyval_pairs.tps b/source/expectations/data_values/ut_key_anyval_pairs.tps index 7e10bf50f..2cc1ff225 100644 --- a/source/expectations/data_values/ut_key_anyval_pairs.tps +++ b/source/expectations/data_values/ut_key_anyval_pairs.tps @@ -1,7 +1,7 @@ create or replace type ut_key_anyval_pairs as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_key_anyvalues.tpb b/source/expectations/data_values/ut_key_anyvalues.tpb index d30d8a841..67b877874 100644 --- a/source/expectations/data_values/ut_key_anyvalues.tpb +++ b/source/expectations/data_values/ut_key_anyvalues.tpb @@ -1,7 +1,7 @@ create or replace type body ut_key_anyvalues as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/data_values/ut_key_anyvalues.tps b/source/expectations/data_values/ut_key_anyvalues.tps index 8c672bd00..df14a8101 100644 --- a/source/expectations/data_values/ut_key_anyvalues.tps +++ b/source/expectations/data_values/ut_key_anyvalues.tps @@ -1,7 +1,7 @@ create or replace type ut_key_anyvalues under ut_event_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_between.tpb b/source/expectations/matchers/ut_be_between.tpb index 6aea96f55..787be701b 100644 --- a/source/expectations/matchers/ut_be_between.tpb +++ b/source/expectations/matchers/ut_be_between.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_between is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_between.tps b/source/expectations/matchers/ut_be_between.tps index 9e984085b..a08d7a823 100644 --- a/source/expectations/matchers/ut_be_between.tps +++ b/source/expectations/matchers/ut_be_between.tps @@ -1,7 +1,7 @@ create or replace type ut_be_between under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_empty.tpb b/source/expectations/matchers/ut_be_empty.tpb index e5e02f6b2..bac77166a 100644 --- a/source/expectations/matchers/ut_be_empty.tpb +++ b/source/expectations/matchers/ut_be_empty.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_empty as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_empty.tps b/source/expectations/matchers/ut_be_empty.tps index 9e9f899d0..948e771a3 100644 --- a/source/expectations/matchers/ut_be_empty.tps +++ b/source/expectations/matchers/ut_be_empty.tps @@ -1,7 +1,7 @@ create or replace type ut_be_empty under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_false.tpb b/source/expectations/matchers/ut_be_false.tpb index 4cc88600a..5a5421e8b 100644 --- a/source/expectations/matchers/ut_be_false.tpb +++ b/source/expectations/matchers/ut_be_false.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_false as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_false.tps b/source/expectations/matchers/ut_be_false.tps index ede510719..b6906ece8 100644 --- a/source/expectations/matchers/ut_be_false.tps +++ b/source/expectations/matchers/ut_be_false.tps @@ -1,7 +1,7 @@ create or replace type ut_be_false under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_greater_or_equal.tpb b/source/expectations/matchers/ut_be_greater_or_equal.tpb index 1c2a19c09..fbd165b1d 100644 --- a/source/expectations/matchers/ut_be_greater_or_equal.tpb +++ b/source/expectations/matchers/ut_be_greater_or_equal.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_greater_or_equal AS /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_greater_or_equal.tps b/source/expectations/matchers/ut_be_greater_or_equal.tps index b3ab54ff1..e87740134 100644 --- a/source/expectations/matchers/ut_be_greater_or_equal.tps +++ b/source/expectations/matchers/ut_be_greater_or_equal.tps @@ -1,7 +1,7 @@ create or replace type ut_be_greater_or_equal under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_greater_than.tpb b/source/expectations/matchers/ut_be_greater_than.tpb index 9cce79119..f59c2f0be 100644 --- a/source/expectations/matchers/ut_be_greater_than.tpb +++ b/source/expectations/matchers/ut_be_greater_than.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_greater_than AS /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_greater_than.tps b/source/expectations/matchers/ut_be_greater_than.tps index a5a44692d..b66009bab 100644 --- a/source/expectations/matchers/ut_be_greater_than.tps +++ b/source/expectations/matchers/ut_be_greater_than.tps @@ -1,7 +1,7 @@ create or replace type ut_be_greater_than under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_less_or_equal.tpb b/source/expectations/matchers/ut_be_less_or_equal.tpb index 6acec1dda..24c1f9c96 100644 --- a/source/expectations/matchers/ut_be_less_or_equal.tpb +++ b/source/expectations/matchers/ut_be_less_or_equal.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_less_or_equal AS /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_less_or_equal.tps b/source/expectations/matchers/ut_be_less_or_equal.tps index 118611a41..5114644b0 100644 --- a/source/expectations/matchers/ut_be_less_or_equal.tps +++ b/source/expectations/matchers/ut_be_less_or_equal.tps @@ -1,7 +1,7 @@ create or replace type ut_be_less_or_equal under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_less_than.tpb b/source/expectations/matchers/ut_be_less_than.tpb index 7608e4917..011ad392f 100644 --- a/source/expectations/matchers/ut_be_less_than.tpb +++ b/source/expectations/matchers/ut_be_less_than.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_less_than as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_less_than.tps b/source/expectations/matchers/ut_be_less_than.tps index b652de789..81a25144d 100644 --- a/source/expectations/matchers/ut_be_less_than.tps +++ b/source/expectations/matchers/ut_be_less_than.tps @@ -1,7 +1,7 @@ create or replace type ut_be_less_than under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_like.tpb b/source/expectations/matchers/ut_be_like.tpb index 6865c2942..953adbe5b 100644 --- a/source/expectations/matchers/ut_be_like.tpb +++ b/source/expectations/matchers/ut_be_like.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_like as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_like.tps b/source/expectations/matchers/ut_be_like.tps index dae93a1d9..1d907ed03 100644 --- a/source/expectations/matchers/ut_be_like.tps +++ b/source/expectations/matchers/ut_be_like.tps @@ -1,7 +1,7 @@ create or replace type ut_be_like under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_not_null.tpb b/source/expectations/matchers/ut_be_not_null.tpb index 194e2ea32..df9366fa7 100644 --- a/source/expectations/matchers/ut_be_not_null.tpb +++ b/source/expectations/matchers/ut_be_not_null.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_not_null as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_not_null.tps b/source/expectations/matchers/ut_be_not_null.tps index 196aac9fb..6cd11fc64 100644 --- a/source/expectations/matchers/ut_be_not_null.tps +++ b/source/expectations/matchers/ut_be_not_null.tps @@ -1,7 +1,7 @@ create or replace type ut_be_not_null under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_null.tpb b/source/expectations/matchers/ut_be_null.tpb index 8c672791b..d806bba34 100644 --- a/source/expectations/matchers/ut_be_null.tpb +++ b/source/expectations/matchers/ut_be_null.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_null as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_null.tps b/source/expectations/matchers/ut_be_null.tps index 3b2d6ac84..28f3ac796 100644 --- a/source/expectations/matchers/ut_be_null.tps +++ b/source/expectations/matchers/ut_be_null.tps @@ -1,7 +1,7 @@ create or replace type ut_be_null under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_true.tpb b/source/expectations/matchers/ut_be_true.tpb index fe78b4e22..442e57d7f 100644 --- a/source/expectations/matchers/ut_be_true.tpb +++ b/source/expectations/matchers/ut_be_true.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_true as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_true.tps b/source/expectations/matchers/ut_be_true.tps index 8b5491e39..b55fa484d 100644 --- a/source/expectations/matchers/ut_be_true.tps +++ b/source/expectations/matchers/ut_be_true.tps @@ -1,7 +1,7 @@ create or replace type ut_be_true under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_within.tpb b/source/expectations/matchers/ut_be_within.tpb index e2aa792d0..f77e9feec 100644 --- a/source/expectations/matchers/ut_be_within.tpb +++ b/source/expectations/matchers/ut_be_within.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_within as /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_within.tps b/source/expectations/matchers/ut_be_within.tps index 576f9ff37..06a685832 100644 --- a/source/expectations/matchers/ut_be_within.tps +++ b/source/expectations/matchers/ut_be_within.tps @@ -1,7 +1,7 @@ create or replace type ut_be_within force under ut_be_within_pct( /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_within_helper.pkb b/source/expectations/matchers/ut_be_within_helper.pkb index 5dd82baa2..561bf230b 100644 --- a/source/expectations/matchers/ut_be_within_helper.pkb +++ b/source/expectations/matchers/ut_be_within_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_be_within_helper as /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_within_helper.pks b/source/expectations/matchers/ut_be_within_helper.pks index 41737cc8f..b8480e249 100644 --- a/source/expectations/matchers/ut_be_within_helper.pks +++ b/source/expectations/matchers/ut_be_within_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_be_within_helper authid definer as /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_within_pct.tpb b/source/expectations/matchers/ut_be_within_pct.tpb index 8b280ffff..ad821d72c 100644 --- a/source/expectations/matchers/ut_be_within_pct.tpb +++ b/source/expectations/matchers/ut_be_within_pct.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_within_pct as /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_be_within_pct.tps b/source/expectations/matchers/ut_be_within_pct.tps index 499e9a2d8..645e9c485 100644 --- a/source/expectations/matchers/ut_be_within_pct.tps +++ b/source/expectations/matchers/ut_be_within_pct.tps @@ -1,7 +1,7 @@ create or replace type ut_be_within_pct force under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ create or replace type ut_be_within_pct force under ut_comparison_matcher( limitations under the License. */ - /** * Holds information about mather options */ diff --git a/source/expectations/matchers/ut_comparison_matcher.tpb b/source/expectations/matchers/ut_comparison_matcher.tpb index 20ed35927..b7cef4f59 100644 --- a/source/expectations/matchers/ut_comparison_matcher.tpb +++ b/source/expectations/matchers/ut_comparison_matcher.tpb @@ -1,7 +1,7 @@ create or replace type body ut_comparison_matcher as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_comparison_matcher.tps b/source/expectations/matchers/ut_comparison_matcher.tps index 68ecb4462..11b46d47c 100644 --- a/source/expectations/matchers/ut_comparison_matcher.tps +++ b/source/expectations/matchers/ut_comparison_matcher.tps @@ -1,7 +1,7 @@ create or replace type ut_comparison_matcher under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_contain.tpb b/source/expectations/matchers/ut_contain.tpb index c9691f731..a8eb71ecd 100644 --- a/source/expectations/matchers/ut_contain.tpb +++ b/source/expectations/matchers/ut_contain.tpb @@ -1,7 +1,7 @@ create or replace type body ut_contain as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_contain.tps b/source/expectations/matchers/ut_contain.tps index e572edf62..6d7c525c6 100644 --- a/source/expectations/matchers/ut_contain.tps +++ b/source/expectations/matchers/ut_contain.tps @@ -1,7 +1,7 @@ create or replace type ut_contain under ut_equal( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_equal.tpb b/source/expectations/matchers/ut_equal.tpb index d514e34d0..f5932b2ad 100644 --- a/source/expectations/matchers/ut_equal.tpb +++ b/source/expectations/matchers/ut_equal.tpb @@ -1,7 +1,7 @@ create or replace type body ut_equal as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_equal.tps b/source/expectations/matchers/ut_equal.tps index e48b797ed..e23eaf23b 100644 --- a/source/expectations/matchers/ut_equal.tps +++ b/source/expectations/matchers/ut_equal.tps @@ -1,7 +1,7 @@ create or replace type ut_equal force under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_have_count.tpb b/source/expectations/matchers/ut_have_count.tpb index 457cd6272..0d4cfbcc0 100644 --- a/source/expectations/matchers/ut_have_count.tpb +++ b/source/expectations/matchers/ut_have_count.tpb @@ -1,7 +1,7 @@ create or replace type body ut_have_count as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_have_count.tps b/source/expectations/matchers/ut_have_count.tps index d48dc44c8..bd075e8f4 100644 --- a/source/expectations/matchers/ut_have_count.tps +++ b/source/expectations/matchers/ut_have_count.tps @@ -1,7 +1,7 @@ create or replace type ut_have_count under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_match.tpb b/source/expectations/matchers/ut_match.tpb index 3c7a71402..de645a135 100644 --- a/source/expectations/matchers/ut_match.tpb +++ b/source/expectations/matchers/ut_match.tpb @@ -1,7 +1,7 @@ create or replace type body ut_match as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_match.tps b/source/expectations/matchers/ut_match.tps index ee51a4c28..ababff18f 100644 --- a/source/expectations/matchers/ut_match.tps +++ b/source/expectations/matchers/ut_match.tps @@ -1,7 +1,7 @@ create or replace type ut_match under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_matcher.tpb b/source/expectations/matchers/ut_matcher.tpb index 6b5b98465..07e082a71 100644 --- a/source/expectations/matchers/ut_matcher.tpb +++ b/source/expectations/matchers/ut_matcher.tpb @@ -1,7 +1,7 @@ create or replace type body ut_matcher as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_matcher.tps b/source/expectations/matchers/ut_matcher.tps index a034e4ed2..2551ce003 100644 --- a/source/expectations/matchers/ut_matcher.tps +++ b/source/expectations/matchers/ut_matcher.tps @@ -1,7 +1,7 @@ create or replace type ut_matcher under ut_matcher_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_matcher_base.tps b/source/expectations/matchers/ut_matcher_base.tps index ef7fd98a2..c6d44468d 100644 --- a/source/expectations/matchers/ut_matcher_base.tps +++ b/source/expectations/matchers/ut_matcher_base.tps @@ -1,4 +1,21 @@ create or replace type ut_matcher_base force authid current_user as object( + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ + self_type varchar2(250) ) not final not instantiable diff --git a/source/expectations/matchers/ut_matcher_options.tpb b/source/expectations/matchers/ut_matcher_options.tpb index 8730c204b..1acb4405b 100644 --- a/source/expectations/matchers/ut_matcher_options.tpb +++ b/source/expectations/matchers/ut_matcher_options.tpb @@ -1,7 +1,7 @@ create or replace type body ut_matcher_options as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_matcher_options.tps b/source/expectations/matchers/ut_matcher_options.tps index 276cad2ec..835316e7c 100644 --- a/source/expectations/matchers/ut_matcher_options.tps +++ b/source/expectations/matchers/ut_matcher_options.tps @@ -1,7 +1,7 @@ create or replace type ut_matcher_options authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_matcher_options_items.tpb b/source/expectations/matchers/ut_matcher_options_items.tpb index 92da588ce..921d3ecd2 100644 --- a/source/expectations/matchers/ut_matcher_options_items.tpb +++ b/source/expectations/matchers/ut_matcher_options_items.tpb @@ -1,7 +1,7 @@ create or replace type body ut_matcher_options_items is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/matchers/ut_matcher_options_items.tps b/source/expectations/matchers/ut_matcher_options_items.tps index 53787070d..73c2bb92d 100644 --- a/source/expectations/matchers/ut_matcher_options_items.tps +++ b/source/expectations/matchers/ut_matcher_options_items.tps @@ -1,7 +1,7 @@ create or replace type ut_matcher_options_items authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/ut_expectation.tpb b/source/expectations/ut_expectation.tpb index 309759d48..12aef603a 100644 --- a/source/expectations/ut_expectation.tpb +++ b/source/expectations/ut_expectation.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/ut_expectation.tps b/source/expectations/ut_expectation.tps index 30fe985d3..b015a95a7 100644 --- a/source/expectations/ut_expectation.tps +++ b/source/expectations/ut_expectation.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation force under ut_expectation_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/ut_expectation_base.tpb b/source/expectations/ut_expectation_base.tpb index 20b3e7a95..3d6e9b469 100644 --- a/source/expectations/ut_expectation_base.tpb +++ b/source/expectations/ut_expectation_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_base as /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ create or replace type body ut_expectation_base as See the License for the specific language governing permissions and limitations under the License. */ + member procedure to_(self in ut_expectation_base, a_matcher ut_matcher_base) is l_expectation_result boolean; l_matcher ut_matcher := treat(a_matcher as ut_matcher); diff --git a/source/expectations/ut_expectation_base.tps b/source/expectations/ut_expectation_base.tps index a542d26ea..24e180b92 100644 --- a/source/expectations/ut_expectation_base.tps +++ b/source/expectations/ut_expectation_base.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_base authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2019 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ create or replace type ut_expectation_base authid current_user as object( See the License for the specific language governing permissions and limitations under the License. */ + actual_data ut_data_value, description varchar2(4000 char), diff --git a/source/expectations/ut_expectation_compound.tpb b/source/expectations/ut_expectation_compound.tpb index 6fc2e2647..1131885b0 100644 --- a/source/expectations/ut_expectation_compound.tpb +++ b/source/expectations/ut_expectation_compound.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_compound as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/ut_expectation_compound.tps b/source/expectations/ut_expectation_compound.tps index 46da23fea..ebf534222 100644 --- a/source/expectations/ut_expectation_compound.tps +++ b/source/expectations/ut_expectation_compound.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_compound under ut_expectation( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/ut_expectation_json.tpb b/source/expectations/ut_expectation_json.tpb index b71e8ea83..90a3a3d31 100644 --- a/source/expectations/ut_expectation_json.tpb +++ b/source/expectations/ut_expectation_json.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_json as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/expectations/ut_expectation_json.tps b/source/expectations/ut_expectation_json.tps index 561c5d11f..d873cc99c 100644 --- a/source/expectations/ut_expectation_json.tps +++ b/source/expectations/ut_expectation_json.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_json under ut_expectation( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/install.sql b/source/install.sql index 22ce75365..a2c73ef17 100644 --- a/source/install.sql +++ b/source/install.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/install_above_12_1.sql b/source/install_above_12_1.sql index 69e47ce9a..5a1943358 100644 --- a/source/install_above_12_1.sql +++ b/source/install_above_12_1.sql @@ -1,3 +1,20 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. +*/ + def FILE_NAME = '&&1' column SCRIPT_NAME new_value SCRIPT_NAME noprint diff --git a/source/install_component.sql b/source/install_component.sql index 373c85c54..1189df496 100644 --- a/source/install_component.sql +++ b/source/install_component.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/install_ddl_trigger.sql b/source/install_ddl_trigger.sql index bc147c2be..b23b4bc63 100644 --- a/source/install_ddl_trigger.sql +++ b/source/install_ddl_trigger.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/install_headless.sql b/source/install_headless.sql index 183262675..be1e5becf 100644 --- a/source/install_headless.sql +++ b/source/install_headless.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/install_headless_with_trigger.sql b/source/install_headless_with_trigger.sql index 76ae48ccb..2c05403c5 100644 --- a/source/install_headless_with_trigger.sql +++ b/source/install_headless_with_trigger.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_ansiconsole_helper.pkb b/source/reporters/ut_ansiconsole_helper.pkb index 53e6bc6aa..46960cf5c 100644 --- a/source/reporters/ut_ansiconsole_helper.pkb +++ b/source/reporters/ut_ansiconsole_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_ansiconsole_helper as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_ansiconsole_helper.pks b/source/reporters/ut_ansiconsole_helper.pks index 217d36a49..fd4549965 100644 --- a/source/reporters/ut_ansiconsole_helper.pks +++ b/source/reporters/ut_ansiconsole_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_ansiconsole_helper as /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_cobertura_reporter.tpb b/source/reporters/ut_coverage_cobertura_reporter.tpb index d833ac0aa..833ca09be 100644 --- a/source/reporters/ut_coverage_cobertura_reporter.tpb +++ b/source/reporters/ut_coverage_cobertura_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_cobertura_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_cobertura_reporter.tps b/source/reporters/ut_coverage_cobertura_reporter.tps index 1292e60fb..ee2d9b71d 100644 --- a/source/reporters/ut_coverage_cobertura_reporter.tps +++ b/source/reporters/ut_coverage_cobertura_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_cobertura_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_html_reporter.tpb b/source/reporters/ut_coverage_html_reporter.tpb index b1f9f6651..253c067e5 100644 --- a/source/reporters/ut_coverage_html_reporter.tpb +++ b/source/reporters/ut_coverage_html_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_html_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_html_reporter.tps b/source/reporters/ut_coverage_html_reporter.tps index 42f2fd4e3..db65e1e00 100644 --- a/source/reporters/ut_coverage_html_reporter.tps +++ b/source/reporters/ut_coverage_html_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_html_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_report_html_helper.pkb b/source/reporters/ut_coverage_report_html_helper.pkb index f7e0b5ed0..7ebf891f9 100644 --- a/source/reporters/ut_coverage_report_html_helper.pkb +++ b/source/reporters/ut_coverage_report_html_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_report_html_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_report_html_helper.pks b/source/reporters/ut_coverage_report_html_helper.pks index 42a59c123..c028168a8 100644 --- a/source/reporters/ut_coverage_report_html_helper.pks +++ b/source/reporters/ut_coverage_report_html_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_report_html_helper authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_sonar_reporter.tpb b/source/reporters/ut_coverage_sonar_reporter.tpb index 1861a9be3..8148fc7fc 100644 --- a/source/reporters/ut_coverage_sonar_reporter.tpb +++ b/source/reporters/ut_coverage_sonar_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_sonar_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coverage_sonar_reporter.tps b/source/reporters/ut_coverage_sonar_reporter.tps index 715bdefd2..b5e964a3a 100644 --- a/source/reporters/ut_coverage_sonar_reporter.tps +++ b/source/reporters/ut_coverage_sonar_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_sonar_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coveralls_reporter.tpb b/source/reporters/ut_coveralls_reporter.tpb index 14672303e..fc459c906 100644 --- a/source/reporters/ut_coveralls_reporter.tpb +++ b/source/reporters/ut_coveralls_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coveralls_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_coveralls_reporter.tps b/source/reporters/ut_coveralls_reporter.tps index 74363b751..e547793d1 100644 --- a/source/reporters/ut_coveralls_reporter.tps +++ b/source/reporters/ut_coveralls_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coveralls_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_debug_reporter.tpb b/source/reporters/ut_debug_reporter.tpb index 879725172..b17f039ea 100644 --- a/source/reporters/ut_debug_reporter.tpb +++ b/source/reporters/ut_debug_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_debug_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_debug_reporter.tps b/source/reporters/ut_debug_reporter.tps index 2123f19cc..85c0eeb54 100644 --- a/source/reporters/ut_debug_reporter.tps +++ b/source/reporters/ut_debug_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_debug_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_documentation_reporter.tpb b/source/reporters/ut_documentation_reporter.tpb index e8c0a4e31..489b6efd2 100644 --- a/source/reporters/ut_documentation_reporter.tpb +++ b/source/reporters/ut_documentation_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_documentation_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_documentation_reporter.tps b/source/reporters/ut_documentation_reporter.tps index 422225117..23b86226f 100644 --- a/source/reporters/ut_documentation_reporter.tps +++ b/source/reporters/ut_documentation_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_documentation_reporter under ut_console_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_junit_reporter.tpb b/source/reporters/ut_junit_reporter.tpb index 3bceb52a4..a2cffd287 100644 --- a/source/reporters/ut_junit_reporter.tpb +++ b/source/reporters/ut_junit_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_junit_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_junit_reporter.tps b/source/reporters/ut_junit_reporter.tps index 6cdaff1b9..5999c33f5 100644 --- a/source/reporters/ut_junit_reporter.tps +++ b/source/reporters/ut_junit_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_junit_reporter force under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_realtime_reporter.tpb b/source/reporters/ut_realtime_reporter.tpb index 9c2af57ec..fac7cd9b8 100644 --- a/source/reporters/ut_realtime_reporter.tpb +++ b/source/reporters/ut_realtime_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_realtime_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_realtime_reporter.tps b/source/reporters/ut_realtime_reporter.tps index 0501006e4..5ab350162 100644 --- a/source/reporters/ut_realtime_reporter.tps +++ b/source/reporters/ut_realtime_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_realtime_reporter force under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_sonar_test_reporter.tpb b/source/reporters/ut_sonar_test_reporter.tpb index 7c46879d2..dfa6a7421 100644 --- a/source/reporters/ut_sonar_test_reporter.tpb +++ b/source/reporters/ut_sonar_test_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_sonar_test_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_sonar_test_reporter.tps b/source/reporters/ut_sonar_test_reporter.tps index ac3b16bd1..d9f98071d 100644 --- a/source/reporters/ut_sonar_test_reporter.tps +++ b/source/reporters/ut_sonar_test_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_sonar_test_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index ff095a369..02246b97e 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -1,5 +1,20 @@ create or replace type body ut_tap_reporter is - + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result is begin diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index bed809059..94423b6fc 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -1,4 +1,20 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( + /* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. + */ constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob), diff --git a/source/reporters/ut_teamcity_reporter.tpb b/source/reporters/ut_teamcity_reporter.tpb index e05dc994f..2e09c7103 100644 --- a/source/reporters/ut_teamcity_reporter.tpb +++ b/source/reporters/ut_teamcity_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_teamcity_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_teamcity_reporter.tps b/source/reporters/ut_teamcity_reporter.tps index e03fa3643..e5c43b59e 100644 --- a/source/reporters/ut_teamcity_reporter.tps +++ b/source/reporters/ut_teamcity_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_teamcity_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_teamcity_reporter_helper.pkb b/source/reporters/ut_teamcity_reporter_helper.pkb index 1633d10aa..575af645d 100644 --- a/source/reporters/ut_teamcity_reporter_helper.pkb +++ b/source/reporters/ut_teamcity_reporter_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_teamcity_reporter_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_teamcity_reporter_helper.pks b/source/reporters/ut_teamcity_reporter_helper.pks index d7fa86cdc..727d02913 100644 --- a/source/reporters/ut_teamcity_reporter_helper.pks +++ b/source/reporters/ut_teamcity_reporter_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_teamcity_reporter_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_tfs_junit_reporter.tpb b/source/reporters/ut_tfs_junit_reporter.tpb index 5e36aad17..8c2bd6333 100644 --- a/source/reporters/ut_tfs_junit_reporter.tpb +++ b/source/reporters/ut_tfs_junit_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_tfs_junit_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_tfs_junit_reporter.tps b/source/reporters/ut_tfs_junit_reporter.tps index 61cbc3fd8..3af2226a5 100644 --- a/source/reporters/ut_tfs_junit_reporter.tps +++ b/source/reporters/ut_tfs_junit_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_tfs_junit_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_xunit_reporter.tpb b/source/reporters/ut_xunit_reporter.tpb index 4612fb640..164703917 100644 --- a/source/reporters/ut_xunit_reporter.tpb +++ b/source/reporters/ut_xunit_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_xunit_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/reporters/ut_xunit_reporter.tps b/source/reporters/ut_xunit_reporter.tps index 6c530fee4..970e4d162 100644 --- a/source/reporters/ut_xunit_reporter.tps +++ b/source/reporters/ut_xunit_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_xunit_reporter under ut_junit_reporter( /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/set_install_params.sql b/source/set_install_params.sql index 34a23dc93..b559b8023 100644 --- a/source/set_install_params.sql +++ b/source/set_install_params.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/uninstall.sql b/source/uninstall.sql index ced7b8dc4..712845fb7 100644 --- a/source/uninstall.sql +++ b/source/uninstall.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/uninstall_all.sql b/source/uninstall_all.sql index cfaaaa29f..d3d3f3fbe 100644 --- a/source/uninstall_all.sql +++ b/source/uninstall_all.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2021 utPLSQL Project + Copyright 2016 - 2026 utPLSQL Project Licensed under the Apache License, Version 2.0 (the "License"): you may not use this file except in compliance with the License. diff --git a/source/uninstall_coverage_tables.sql b/source/uninstall_coverage_tables.sql index 890aa7090..df3c19627 100644 --- a/source/uninstall_coverage_tables.sql +++ b/source/uninstall_coverage_tables.sql @@ -1,3 +1,20 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. +*/ + set echo off set feedback off begin diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index df8b51d35..8ef644aa9 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -1,3 +1,20 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. +*/ + set echo off declare procedure drop_if_exists(a_object_type varchar2, a_object_name varchar2) is diff --git a/source/uninstall_synonyms.sql b/source/uninstall_synonyms.sql index 2c96c03a4..4a12340f6 100644 --- a/source/uninstall_synonyms.sql +++ b/source/uninstall_synonyms.sql @@ -1,3 +1,20 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2026 utPLSQL Project + + 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. +*/ + set echo off set feedback off declare From 5633cae49b40742a824ce78c33f15d871c351af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 12:50:37 +0300 Subject: [PATCH 132/144] Rewrite of README.md file Added CHANGELOG.md --- CHANGELOG.md | 599 +++++++++++++++++++++++++++++++++++++++++++++++++++ readme.md | 196 +++++++---------- 2 files changed, 673 insertions(+), 122 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..aae364bab --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,599 @@ +# Changelog + +All notable changes to utPLSQL are documented here. +Releases are available on the [GitHub Releases page](https://github.com/utPLSQL/utPLSQL/releases). + +--- + +## [v3.2.01] - unreleased + +## Important + - Dropped support for Oracle Database versions older than 19c + +## New features + - Add TAP reporter by @WayneNani in [#1305](https://github.com/utPLSQL/utPLSQL/pull/1305) + +## Enhancements and bug fixes + - Added duplicate detection on cursor comparison using `join_by` by @lwasylow in [#1295](https://github.com/utPLSQL/utPLSQL/pull/1295) + - Fix code causing the object duration Oracle exception on oracle 23.26 by @lwasylow in [#1310](https://github.com/utPLSQL/utPLSQL/pull/1310) + - Packages with annotation-like comments are not test suites by @jgebal in [#1313](https://github.com/utPLSQL/utPLSQL/pull/1313) + - Updated documentation and copyright banners across source files @jgebal in [#1319](https://github.com/utPLSQL/utPLSQL/pull/1319) + +--- + +## [v3.1.14] - 2024-02-19 + +## New features + + - Added support for `and` and `or` operators when running tests by tags by @lwasylow in [#1250](https://github.com/utPLSQL/utPLSQL/pull/1250) + +## Enhancements + + - Allow for test runs over 4 hours by @jgebal in [#1243](https://github.com/utPLSQL/utPLSQL/pull/1243) + - Framework performance improvements by @jgebal in [#1249](https://github.com/utPLSQL/utPLSQL/pull/1249) + - Support multiple expectation failures with teamcity reporter by @jgebal in [#1251](https://github.com/utPLSQL/utPLSQL/pull/1251) + - Update TFS reporter to correct format by @lwasylow in [#1270](https://github.com/utPLSQL/utPLSQL/pull/1270) + +## Bug fixes + + - Address issue where the `not_to(contain)` did not run correctly by @lwasylow in [#1246](https://github.com/utPLSQL/utPLSQL/pull/1246) + - Fix regex to be NLS_SORT independent by @jgebal in [#1253](https://github.com/utPLSQL/utPLSQL/pull/1253) + - Fix output length error and output buffer. by @jgebal in [#1255](https://github.com/utPLSQL/utPLSQL/pull/1255) + - (docs): Update running-unit-tests.md - remove example by @gassenmj in [#1261](https://github.com/utPLSQL/utPLSQL/pull/1261) + - The line-rate is not recorded for packages and classes in cobertura coverage reporter by @lwasylow in [#1269](https://github.com/utPLSQL/utPLSQL/pull/1269) + - (docs): Fix nested list issue by @iamrachid in [#1274](https://github.com/utPLSQL/utPLSQL/pull/1274) + +--- + +## [v3.1.13] - 2022-12-11 + +## New features + + - Add ability to run tests by part of a name. Fixed in [#1203](https://github.com/utPLSQL/utPLSQL/pull/1203), resolves [#470](https://github.com/utPLSQL/utPLSQL/issues/470) + +## Enhancements + + - Added documentation section on creating a custom reporter. Fixed in [#1225](https://github.com/utPLSQL/utPLSQL/pull/1225), resolves [#710](https://github.com/utPLSQL/utPLSQL/issues/701) + - Add ability to specify code coverage objects include/exclude masks as regular expressions. Fixed in [#1186](https://github.com/utPLSQL/utPLSQL/issues/1186), resolves [#1053](https://github.com/utPLSQL/utPLSQL/issues/1053) + +## Bug fixes + + - Comparing collection that have long type names. Fixed in [#1238](https://github.com/utPLSQL/utPLSQL/issues/1238), resolves [#1235](https://github.com/utPLSQL/utPLSQL/issues/1235). + - Code coverage reporting on code with long lines. Fixed in [#1240](https://github.com/utPLSQL/utPLSQL/issues/1240), resolves [#1232](https://github.com/utPLSQL/utPLSQL/issues/1232), [#1087](https://github.com/utPLSQL/utPLSQL/issues/1087). + - Code coverage reporting does not exclude tests. Fixed in [#1226](https://github.com/utPLSQL/utPLSQL/issues/1226), resolves [#1222](https://github.com/utPLSQL/utPLSQL/issues/1222). + - Uninstall script buffer overflow. Fixed in [#1221](https://github.com/utPLSQL/utPLSQL/issues/1221), resolves [#1220](https://github.com/utPLSQL/utPLSQL/issues/1220). + +## Internal improvements + + - Improved process of generating utPLSQL documentation. Implemented in [689bbd0](https://github.com/utPLSQL/utPLSQL/commit/689bbd0e365ed919315c29727bc10fbfc0dadce8), resolves [#1237](https://github.com/utPLSQL/utPLSQL/issues/1237). + - Removed username env variables for internal development. Implemented in [#1201](https://github.com/utPLSQL/utPLSQL/issues/1221), resolves [#1200](https://github.com/utPLSQL/utPLSQL/issues/1200). + - Test execution data of utPLSQL project not showing on SonarCloud. Implemented in [#1199](https://github.com/utPLSQL/utPLSQL/issues/1199), resolves [#1198](https://github.com/utPLSQL/utPLSQL/issues/1198). + +--- + +## [v3.1.12] - 2022-02-25 + +## New features + - Added support for description in the `--%disabled` annotation. See [documentation](https://github.com/utPLSQL/utPLSQL/blob/4515e0b5a3b4b0de0c2198db3235ef8614bff4d8/docs/userguide/annotations.md#disabled). Implemented in: [#1183](https://github.com/utPLSQL/utPLSQL/pull/1183), resolves [#610](https://github.com/utPLSQL/utPLSQL/issues/610). + - Added support for native `JSON` datatype on Oracle `21c`. Implemented in [#1181](https://github.com/utPLSQL/utPLSQL/pull/1181), resolves [#1114](https://github.com/utPLSQL/utPLSQL/issues/1114). + - Added new mather `to_be_within( distance|pct ).of_(expoected)`. See [documentation](https://github.com/utPLSQL/utPLSQL/blob/fd7ef9c14111a48e03fff7851f990c7192539170/docs/userguide/expectations.md#to_be_within-of). Implemented in [#1076](https://github.com/utPLSQL/utPLSQL/pull/1076), resolves [#77](https://github.com/utPLSQL/utPLSQL/issues/77). + +## Enhancements + +- Improved performance of SQL used to retrieve Coverage sources. Implemented in [#1187](https://github.com/utPLSQL/utPLSQL/pull/1187), resolves [#1169](https://github.com/utPLSQL/utPLSQL/issues/1169). +- Added ability for utPLSQL to gather coverage on code invoking DBMS_STATS package. Implemented in [#1184](https://github.com/utPLSQL/utPLSQL/pull/1184), resolves [#1097](https://github.com/utPLSQL/utPLSQL/issues/1097), [#1094](https://github.com/utPLSQL/utPLSQL/issues/1094). +- Fixed typos and improved documentation. Implemented in [#1173](https://github.com/utPLSQL/utPLSQL/pull/1173), [#1171](https://github.com/utPLSQL/utPLSQL/pull/1171) + +## Bug fixes + +- Actual and Expected are now correctly reported when comparing `JSON` data. Implemented in [#1181](https://github.com/utPLSQL/utPLSQL/pull/1181), resolves [#1113](https://github.com/utPLSQL/utPLSQL/issues/1113). +- Packages with removed annotations are now correctly recognized as non-utPLSQL packages. Implemented in [#1180](https://github.com/utPLSQL/utPLSQL/pull/1180), resolves [#1177](https://github.com/utPLSQL/utPLSQL/issues/1177). +- Fixed issues with comparison of nested object structures. Implemented in [#1179](https://github.com/utPLSQL/utPLSQL/pull/1179), resolves [#1082](https://github.com/utPLSQL/utPLSQL/issues/1082), [#1083](https://github.com/utPLSQL/utPLSQL/issues/1083), [#1098](https://github.com/utPLSQL/utPLSQL/issues/1098). + +## Internal improvements + +- Moved build and test process for utPLSQL from Travis to GithubActions. Implemented in [#1175](https://github.com/utPLSQL/utPLSQL/pull/1175) + +--- + +## [v3.1.11] - 2021-11-17 + +## Enhancements + +- utPLSQL can now be used to generate coverage reports for external tools. See [documentation](https://github.com/utPLSQL/utPLSQL/blob/955de5c2dc527a98a6f5dc0dd8bd8d81a44c459f/docs/userguide/coverage.md#reporting-coverage-outside-of-utplsql) + Implemented in: [#1079](https://github.com/utPLSQL/utPLSQL/pull/1079), resolves [#1025](https://github.com/utPLSQL/utPLSQL/issues/1025) +- Enhanced UT_COVERAGE_COBERTURA_REPORTER to better support TFS and GitLab. Implemented in [#1137](https://github.com/utPLSQL/utPLSQL/pull/1137) and [#1140](https://github.com/utPLSQL/utPLSQL/pull/1140), resolves [#1107](https://github.com/utPLSQL/utPLSQL/issues/1107) +- Added support for installation on Oracle 21c - removed dependency on DBMS_OBFUSCATION_TOOLKIT. Implemented in [#1112](https://github.com/utPLSQL/utPLSQL/pull/1112), resolves [#1111](https://github.com/utPLSQL/utPLSQL/issues/1111) and [#1127](https://github.com/utPLSQL/utPLSQL/issues/1127) +- Added support for running utPLSQL framework in parallel-enabled database. Implemented in [#1160](https://github.com/utPLSQL/utPLSQL/pull/1160), resolves [#1134](https://github.com/utPLSQL/utPLSQL/issues/1134) + +## Bug fixes + +- Suite structure is built properly even with other than English TNS settings. Implemented in [#1061](https://github.com/utPLSQL/utPLSQL/pull/1061), resolves [#1060](https://github.com/utPLSQL/utPLSQL/issues/1060) +- Fixed XML content reporting (CDATA) in UT_REALTIME_REPORTER used by SQLDeveloper plugin. Implemented in [#1075](https://github.com/utPLSQL/utPLSQL/pull/1075), resolves [#1073](https://github.com/utPLSQL/utPLSQL/issues/1073) +- Fixed XML content reporting (CDATA) in JUnit reporter - regression. Implemented in [#1085](https://github.com/utPLSQL/utPLSQL/pull/1085), resolves [#1084](https://github.com/utPLSQL/utPLSQL/issues/1084) +- Fixed issue with utPLSQL failing to run coverage reporting when trigger has overlapping name with procedure/function/package/type. Implemented in [#1091](https://github.com/utPLSQL/utPLSQL/pull/1091), resolves [#1086](https://github.com/utPLSQL/utPLSQL/issues/1086) +- Fixed issue with parsing utPLSQL suites with DDL trigger when usign AUTHID clause. Implemented in [#1093](https://github.com/utPLSQL/utPLSQL/pull/1093), resolves [#1088](https://github.com/utPLSQL/utPLSQL/issues/1088) + +## Internal improvements + +- Improved how privilege checks are handled by framework installation. Implemented in [#1056](https://github.com/utPLSQL/utPLSQL/pull/1056), resolves [#1050](https://github.com/utPLSQL/utPLSQL/issues/1050) +- Restructured installation instructions to make it more readable. Implemented in [#1063](https://github.com/utPLSQL/utPLSQL/pull/1063), resolves [#1062](https://github.com/utPLSQL/utPLSQL/issues/1062) +- Updated database requirements in documentation. Implemented in [#1065](https://github.com/utPLSQL/utPLSQL/pull/1065), resolves [#1064](https://github.com/utPLSQL/utPLSQL/issues/1064) +- Removed duplicated call to install profiler tables. Implemented in [#1164](https://github.com/utPLSQL/utPLSQL/pull/1164), resolves [#1149](https://github.com/utPLSQL/utPLSQL/issues/1149) +- Fixed failing internal framework tests on Oracle 21c. Implemented in [#1158](https://github.com/utPLSQL/utPLSQL/pull/1158), resolves [#1151](https://github.com/utPLSQL/utPLSQL/issues/1151) +- Fixed confusing typo in documentation. Resolves [#1154](https://github.com/utPLSQL/utPLSQL/issues/1154) +- Moved build process from travis-ci.org to travis-ci.com. Implemented in [#1152](https://github.com/utPLSQL/utPLSQL/pull/1152) +- Added an example of reporter reporting all expectations, not only the failing ones. Implemented in [#1092](https://github.com/utPLSQL/utPLSQL/pull/1092) + +--- + +## [v3.1.10] - 2020-02-23 + +## Enhancements + +- utPLSQL test runner is now validating arguments of `--%throws` annotations at runtime [#721](https://github.com/utPLSQL/utPLSQL/issues/721) [#1033](https://github.com/utPLSQL/utPLSQL/issues/1033) +- Documented limitations of insignificant spaces comparison in compound data [#880](https://github.com/utPLSQL/utPLSQL/issues/880) +- utPLSQL will now detect empty annotation cache for schema even with DLL trigger enabled [#975](https://github.com/utPLSQL/utPLSQL/issues/975) +- Order of procedures and annotation now determines default order of tests in suite [#1036](https://github.com/utPLSQL/utPLSQL/issues/1036) + +## Bug fixes + +- Nested contexts are now properly identified [#1034](https://github.com/utPLSQL/utPLSQL/issues/1034) +- TeamCity test reporter is now including error message [#1045](https://github.com/utPLSQL/utPLSQL/issues/1045) + +## Internal improvements + +- All self-tests for utPLSQL framework can now be executed using test-owner schema [#969](https://github.com/utPLSQL/utPLSQL/issues/969) +- Misleading rollback warning is no longer showing when running self-tests for utPLSQL [#982](https://github.com/utPLSQL/utPLSQL/issues/982) + +--- + +## [v3.1.9] - 2019-11-10 + +## New features + +- Added ability to define [nested contexts](https://github.com/utPLSQL/utPLSQL/blob/v3.1.9/docs/userguide/annotations.md#context) within test suite [#938](https://github.com/utPLSQL/utPLSQL/issues/938) +- Added ability to [exclude tests/suites by tags](https://github.com/utPLSQL/utPLSQL/blob/v3.1.9/docs/userguide/annotations.md#excluding-testssuites-by-tags) when invoking a test-run [#1007](https://github.com/utPLSQL/utPLSQL/issues/1007) [#983](https://github.com/utPLSQL/utPLSQL/issues/983) +- Added new annotation [`--%name`](https://github.com/utPLSQL/utPLSQL/blob/v3.1.9/docs/userguide/annotations.md#name) to allow for providing custom name for contexts [#1016](https://github.com/utPLSQL/utPLSQL/issues/1016) + +## Important changes + +The value of `--%context` annotation is no longer representing context `name`. +This value is now context description (displayname). +With this change, the `--%context` annotation is now aligned with `--%test` and `--%suite` annotation syntax. + +New annotation `--%name` was introduced to facilitate naming of contexts. + +## Enhancements + +- Improved documentation for running tests +- Improved documentation for tags [#1003](https://github.com/utPLSQL/utPLSQL/issues/1003) +- Improved documentation for annotations + +## Bug fixes + +- Fixed bug with bad stacktrace showing in failing/erroring test [#1000](https://github.com/utPLSQL/utPLSQL/issues/1000) +- Fixed issue with lack of validation for context name [#966](https://github.com/utPLSQL/utPLSQL/issues/966) +- Fixed problem with install script privilege check for installation with DDL trigger [#992](https://github.com/utPLSQL/utPLSQL/issues/992) +- Fixed issue with some common column names causing cursor comparison to fail [#997](https://github.com/utPLSQL/utPLSQL/issues/997) +- Fixed issue with invocation of standalone expectations on cursor [#998](https://github.com/utPLSQL/utPLSQL/issues/998) + +## Internal improvements + +- Fixed runability of utplsql self-tests [#968](https://github.com/utPLSQL/utPLSQL/issues/968) + +--- + +## [v3.1.8] - 2019-09-03 + +## New features + +- Added support for [session context](https://github.com/utPLSQL/utPLSQL/blob/v3.1.8/docs/userguide/annotations.md#sys_context) to provide test and suite information during test run [#963](https://github.com/utPLSQL/utPLSQL/issues/963) [#781](https://github.com/utPLSQL/utPLSQL/issues/781) +- Added ability to [invoke expectations without running framework](https://github.com/utPLSQL/utPLSQL/blob/v3.1.8/docs/userguide/expectations.md#running-expectations-outside-utplsql-framework) [#956](https://github.com/utPLSQL/utPLSQL/issues/956) [#963](https://github.com/utPLSQL/utPLSQL/issues/963) +- Failing expectations are now reported with call stack [#967](https://github.com/utPLSQL/utPLSQL/issues/967) [#963](https://github.com/utPLSQL/utPLSQL/issues/963) + +## Enhancements + +- Improved framework table private data protection [#922](https://github.com/utPLSQL/utPLSQL/issues/922) [#954](https://github.com/utPLSQL/utPLSQL/issues/954) +- Improved install process. It is now unified for installation with both public and private synonyms [#957](https://github.com/utPLSQL/utPLSQL/issues/957) [#954](https://github.com/utPLSQL/utPLSQL/issues/954) +- Improved reporting of warnings for integration with SQLDeveloper [#964](https://github.com/utPLSQL/utPLSQL/issues/964) +- Improved query to retrieve coverage sources [#981](https://github.com/utPLSQL/utPLSQL/issues/981) [#970](https://github.com/utPLSQL/utPLSQL/issues/970) +- Improved security around malicious utPLSQL owner name [#920](https://github.com/utPLSQL/utPLSQL/issues/920) + +## Bug fixes + +- Fixed cursor comparison on Oracle 11.2 [#947](https://github.com/utPLSQL/utPLSQL/issues/947) +- Fixed issue with retrieving suite data [#977](https://github.com/utPLSQL/utPLSQL/issues/977) [#974](https://github.com/utPLSQL/utPLSQL/issues/974) [#978](https://github.com/utPLSQL/utPLSQL/issues/978) +- Application context is now reset in session after test run [#951](https://github.com/utPLSQL/utPLSQL/issues/951) + +--- + +## [v3.1.7] - 2019-06-18 + +## New features + +- Added support for [comparing `json`](https://github.com/utPLSQL/utPLSQL/blob/v3.1.7/docs/userguide/expectations.md#comparing-json-objects) in Oracle 12.2 and above [#924](https://github.com/utPLSQL/utPLSQL/issues/924) +- Introduced [`tag` annotation](https://github.com/utPLSQL/utPLSQL/blob/v3.1.7/docs/userguide/annotations.md#tags) to enable tagging of tests and suites [#66](https://github.com/utPLSQL/utPLSQL/issues/66) +- Added support for [random order](https://github.com/utPLSQL/utPLSQL/blob/v3.1.7/docs/userguide/running-unit-tests.md#random-order) of test execution [#422](https://github.com/utPLSQL/utPLSQL/issues/422) + +## Enhancements + +- Added optional [install with DDL trigger](https://github.com/utPLSQL/utPLSQL/blob/v3.1.7/docs/userguide/install.md#installation-with-ddl-trigger) to speed up framework start [#901](https://github.com/utPLSQL/utPLSQL/issues/901) +- Removed dependency on `dbms_utility.name_resolve` [#569](https://github.com/utPLSQL/utPLSQL/issues/569) [#885](https://github.com/utPLSQL/utPLSQL/issues/885) +- New output buffer table structures improving performance and addressing timeout issues [#915](https://github.com/utPLSQL/utPLSQL/issues/915) + +## Bug fixes + +- Fixed `ut_realtime_reporter` missing warnings in test and suite output structures [#936](https://github.com/utPLSQL/utPLSQL/issues/936) +- Fixed output_buffer purging error [#934](https://github.com/utPLSQL/utPLSQL/issues/934) +- Fixed `join_by / exclude / include` invalid syntax on collection in anydata compare [#912](https://github.com/utPLSQL/utPLSQL/issues/912) +- Fixed `ut_junit_reporter` producing invalid output on failing tests with long failure message [#927](https://github.com/utPLSQL/utPLSQL/issues/927) +- Fixed `ut_sonar_test_reporter` producing invalid output on failing tests with long failure message [#925](https://github.com/utPLSQL/utPLSQL/issues/925) +- Fixed `ut_coverage_cobertura_reporter` producing wrong line breaks which breaks the xml validation against DTD [#917](https://github.com/utPLSQL/utPLSQL/issues/917) +- Fixed `exclude` option for ref cursor where column order was not resolved correctly [#911](https://github.com/utPLSQL/utPLSQL/issues/911) +- Fixed `unordered` option for ref cursor with null values [#914](https://github.com/utPLSQL/utPLSQL/issues/914) +- Fixed number precision when selecting from dual [#907](https://github.com/utPLSQL/utPLSQL/issues/907) +- Fixed ref cursor errors with generated column names [#902](https://github.com/utPLSQL/utPLSQL/issues/902) +- Fixed `ORA-00907` when comparing ref cursors with BINARY_ columns [#899](https://github.com/utPLSQL/utPLSQL/issues/899) +- Fixed wrong results when comparing CLOBs with `to_be_like` in Oracle Database 11.2.0.4 due to Oracle Bug 14402514 [#891](https://github.com/utPLSQL/utPLSQL/issues/891) +- Fixed performance issue with code coverage report on huge PL/SQL code base [#882](https://github.com/utPLSQL/utPLSQL/issues/882) + +## Documentation improvements + +- Added install instructions for DDL trigger [#874](https://github.com/utPLSQL/utPLSQL/issues/874) + +## Internal enhancements + +- Fixed SQL vulnerability on all input parameters used in dynamic SQL and PL/SQL [#921](https://github.com/utPLSQL/utPLSQL/issues/921) +- Fixed message id in output buffer [#916](https://github.com/utPLSQL/utPLSQL/issues/916) +- Included 19c database in self testing [#909](https://github.com/utPLSQL/utPLSQL/issues/909) +- Introduced testing with multiple schemas and different grants [#893](https://github.com/utPLSQL/utPLSQL/issues/893) +- Fixed installation script warnings [#879](https://github.com/utPLSQL/utPLSQL/issues/879) + +--- + +## [v3.1.6] - 2019-03-24 + +Bugfix release for `v3.1.5` + +## Bug fixes + +- Fixed a bug in release `3.1.5` where `to_equal` matcher was failing due to privileges when comparing non sql diffable types [#870](https://github.com/utPLSQL/utPLSQL/issues/870) + +## Improvements +- Reduced number of information displaying about user defined type. We will now display only type name instead of full structure [#866](https://github.com/utPLSQL/utPLSQL/issues/866) + +--- + +## [v3.1.5] - 2019-03-20 + +Bugfix release for `v3.1.4` + +## Bug fixes + +- Fixed a bug in release `3.1.4` where `to_be_empty` matcher was failing due to privileges [#864](https://github.com/utPLSQL/utPLSQL/issues/864) + +--- + +## [v3.1.4] - 2019-03-19 + +**This release contains a bug that is fixed by release 3.1.5** +Please use release 3.1.5 rather than this release. + +## New features + +- Added `to_contain` matcher for collections and cursors [#79](https://github.com/utPLSQL/utPLSQL/issues/79) +- Added `unordered_columns` (`uc`) option for cursor comparison to ignore the order of the columns [#779](https://github.com/utPLSQL/utPLSQL/issues/779) +- Added `ut_debug_reporter` for debug logging [#480](https://github.com/utPLSQL/utPLSQL/issues/480) +- Added `ut_realtime_reporter` for utPLSQL-SQLDeveloper extension [#795](https://github.com/utPLSQL/utPLSQL/issues/795) + +## Important Changes + +- Due to improvements of the cursor comparison, it is now necessary to use `ut.set_nls()` before creating the cursor and `ut.reset_nls()` after the __expectation__ when comparing dates. [More info in the docs](https://github.com/utPLSQL/utPLSQL/blob/v3.1.4/docs/userguide/expectations.md#comparing-cursor-data-containing-date-fields) + +## Enhancements + +- Improved performance of cursor comparison [#780](https://github.com/utPLSQL/utPLSQL/issues/780) +- Added support for installation on databases with block size < 8KB [#848](https://github.com/utPLSQL/utPLSQL/issues/848) +- Added initial timeout to `ut_output_buffer` [#840](https://github.com/utPLSQL/utPLSQL/issues/840) +- Enhanced performance of `get_reporters_list` function [#814](https://github.com/utPLSQL/utPLSQL/issues/814) +- Moved calls of `dbms_lock.sleep` to `dbms_session` for newer DB versions [#806](https://github.com/utPLSQL/utPLSQL/issues/806) +- utPLSQL coverage will now work without re-install after DB-upgrade from 12.1 to 12.2 [#803](https://github.com/utPLSQL/utPLSQL/issues/803) + +## Bug fixes + +- Fixed problem with REGEXP in annotation parsing with NLS CANADIAN FRENCH [#844](https://github.com/utPLSQL/utPLSQL/issues/844) +- Fixed issue with Rollback to savepoint failing on distributed transaction [#839](https://github.com/utPLSQL/utPLSQL/issues/839) +- Fixed reporting of differences when comparing collections scalar values [#835](https://github.com/utPLSQL/utPLSQL/issues/835) +- Fixed issue with test run failing due to too many transaction invalidators [#834](https://github.com/utPLSQL/utPLSQL/issues/834) +- Fixed randomly occurring error during cursor comparison [#827](https://github.com/utPLSQL/utPLSQL/issues/827) +- utPLSQL install script will now support special characters in passwords [#804](https://github.com/utPLSQL/utPLSQL/issues/804) + +## Documentation improvements + +- Fixed documentation examples for context annotation [#851](https://github.com/utPLSQL/utPLSQL/issues/851) +- Added description on how to check version of utPLSQL [#822](https://github.com/utPLSQL/utPLSQL/issues/822) + +## Internal enhancements + +- Implemented Sonar analysis on DBA Views [#850](https://github.com/utPLSQL/utPLSQL/issues/850) +- Finished migration from old-tests [#475](https://github.com/utPLSQL/utPLSQL/issues/475) +- Fixed shell scripts to support multiple unix dialects (especially for macOS) [#796](https://github.com/utPLSQL/utPLSQL/issues/796) +- Added info on project support from Redgate [#841](https://github.com/utPLSQL/utPLSQL/issues/841) +- Added `code_of_conduct` [#836](https://github.com/utPLSQL/utPLSQL/issues/836) +- Added issue templates [#842](https://github.com/utPLSQL/utPLSQL/issues/842) +- Added utPLSQL logo [#845](https://github.com/utPLSQL/utPLSQL/issues/845) + +--- + +## [v3.1.3] - 2018-11-20 + +## New features + +- added function `ut_runner.is_test` [#788](https://github.com/utPLSQL/utPLSQL/issues/788) +- added function `ut_runner.is_suite` [#787](https://github.com/utPLSQL/utPLSQL/issues/787) +- added function `ut_runner.has_suites` [#786](https://github.com/utPLSQL/utPLSQL/issues/786) +- added ability to disable automatic rollback for a test-run [#784](https://github.com/utPLSQL/utPLSQL/issues/784) +- when invoked with package name, utPLSQL will now run only tests from specified package even if package has child packages by suitepath [#776](https://github.com/utPLSQL/utPLSQL/issues/776) + +## Enhancements + +- Improved performance of schema-scanning and utPLSQL startup [#778](https://github.com/utPLSQL/utPLSQL/issues/778) +- Improved performance of output-buffer [#777](https://github.com/utPLSQL/utPLSQL/issues/777) +- Improved documentation to mention ability to pass client encoding for HTML & XML reports [#775](https://github.com/utPLSQL/utPLSQL/issues/775) +- Improved documentation for cursor comparison to mention challenges with TIMESTAMP bind variables + +## Bug-fixes + +- utPLSQL code coverage will now work properly with long object names [#716](https://github.com/utPLSQL/utPLSQL/issues/716) +- utPLSQL installation will now also work properly, when user performing the install has `ANY` grants [#737](https://github.com/utPLSQL/utPLSQL/issues/737) +- fixed documentation bug for `--%context` with `--%displayname` [#726](https://github.com/utPLSQL/utPLSQL/issues/726) +- fixed Teamcity reporter issues with missing escape for some characters and long messages [#747](https://github.com/utPLSQL/utPLSQL/issues/747) +- fixed issue with sonar test results reporter when contexts are used [#749](https://github.com/utPLSQL/utPLSQL/issues/749) +- fixed issue with ORA-07455 getting thrown on cursor comparison [#752](https://github.com/utPLSQL/utPLSQL/issues/752) +- fixed issue with wrong failure message for unordered data [#764](https://github.com/utPLSQL/utPLSQL/issues/764) +- fixed missing privilege issue for unordered/join-by cursor data comparison [#765](https://github.com/utPLSQL/utPLSQL/issues/765) [#770](https://github.com/utPLSQL/utPLSQL/issues/770) + +## Internal enhancements + +- added suite-level cache to allow for faster retrieval of suite contents and enable implementation of additional features [#783](https://github.com/utPLSQL/utPLSQL/issues/783) + +--- + +## [v3.1.2] - 2018-07-22 + +## New features + +- Added ability to join and compare cursor content by specific columns (PK/UK) [#453](https://github.com/utPLSQL/utPLSQL/issues/453) +- Added support for comma separated list of suite paths/packages when calling `ut.run` [#479](https://github.com/utPLSQL/utPLSQL/issues/479) +- Added ability to run a test package that got invalidated due to dependency invalidation [#489](https://github.com/utPLSQL/utPLSQL/issues/489) +- Added support for package level constants and predefined exceptions in `--%throws` annotation [#685](https://github.com/utPLSQL/utPLSQL/issues/685) +- Added support for standalone `--%beforeall`, `--%beforeeach`, `--%afterall`, `--%aftereach` annotations with list of procedures to execute [#649](https://github.com/utPLSQL/utPLSQL/issues/649) +- Added support for list of procedure names in before/after annotations [#649](https://github.com/utPLSQL/utPLSQL/issues/649) +- Added support for BLOB/CLOB in `is_empty()` matcher [#707](https://github.com/utPLSQL/utPLSQL/issues/707) + +## Enhancements + +- utPLSQL will now provide additional warnings, when unsupported annotations are found in a unit test suite package [#624](https://github.com/utPLSQL/utPLSQL/issues/624) +- utPLSQL will now produce valid XML in UT_JUNIT_REPORTER when dbms_output or test results contain ` supported_by_redgate -utPLSQL has been supported by Redgate in the form of sponsored stickers and t-shirts. Thank you for helping us spreading the word! +utPLSQL has been supported by Redgate in the form of sponsored stickers and t-shirts. Thank you for helping us spread the word! +--- + +[Authors](docs/about/authors.md) From 1ab7ab68c7341d658e135d7b56914c7a7c88bddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 13:01:19 +0300 Subject: [PATCH 133/144] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aae364bab..d3ad2141f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Releases are available on the [GitHub Releases page](https://github.com/utPLSQL/ - Added duplicate detection on cursor comparison using `join_by` by @lwasylow in [#1295](https://github.com/utPLSQL/utPLSQL/pull/1295) - Fix code causing the object duration Oracle exception on oracle 23.26 by @lwasylow in [#1310](https://github.com/utPLSQL/utPLSQL/pull/1310) - Packages with annotation-like comments are not test suites by @jgebal in [#1313](https://github.com/utPLSQL/utPLSQL/pull/1313) + - Performance improvements to annotation parsing by @lwasylow in [#1312](https://github.com/utPLSQL/utPLSQL/pull/1319) - Updated documentation and copyright banners across source files @jgebal in [#1319](https://github.com/utPLSQL/utPLSQL/pull/1319) --- From b32e2fbf705140bfccde3251fa98f160367ecb9b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 11:04:38 +0100 Subject: [PATCH 134/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 4b0190a75..591b9b6dc 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4361 +4366 diff --git a/docs/about/authors.md b/docs/about/authors.md index b2ee45733..73564c8cf 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 4f97da2a1..7d78f5480 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 3833254af..523623762 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 3f6297dc5..52ff83e1c 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 667092b1c..f027f41a7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 420aa96ce..9177d4a1e 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 8f3f03beb..8f370fa5d 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 16f6e1471..18864b297 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 68ddee6c9..f574c9e1e 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 96cb4b0be..d32e2f975 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index b1baa871b..f9f114fe0 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 025046ebc..efcb0832b 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index e5d3b8129..987e50672 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index fca25c6ee..1651fcb1d 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 7ef328f3e..c7e36ed40 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index aa190fb2f..13341367e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 2ef1a898b..b8bd93570 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index c0af7012e..d3a6e2af9 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.2.01.4361-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4366-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e5b966b01a192d2b9714117b9582249edab8e353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 13:40:18 +0300 Subject: [PATCH 135/144] Removed references to Oracle 11, 12, 18 in documentation. --- docs/userguide/annotations.md | 6 +++--- docs/userguide/coverage.md | 19 ++++++++++--------- docs/userguide/expectations.md | 10 +++------- docs/userguide/install.md | 18 +++++------------- 4 files changed, 21 insertions(+), 32 deletions(-) diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 8f3f03beb..47818e02f 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -46,7 +46,7 @@ package test_package is --%disabled procedure my_first_procedure; - $if dbms_db_version.version >= 12 $then --This is ok - annotation before procedure + $if dbms_db_version.version >= 19 $then --This is ok - annotation before procedure --%test() procedure my_first_procedure; $end @@ -71,7 +71,7 @@ package test_package is procedure proc1; --%test() --This is wrong as there is a compiler directive between procedure and annotation - $if dbms_db_version.version >= 12 $then + $if dbms_db_version.version >= 19 $then procedure proc_12; $end @@ -1755,7 +1755,7 @@ The `--%throws` annotation allows you to specify a list of exceptions as one of: - number literals - example `--%throws(-20134)` - variables of type exception defined in a package specification - example `--%throws(exc_pkg.c_exception_No_variable)` - variables of type number defined in a package specification - example `--%throws(exc_pkg.c_some_exception)` -- [predefined oracle exceptions](https://docs.oracle.com/cd/E11882_01/timesten.112/e21639/exceptions.htm#CIHFIGFE) - example `--%throws(no_data_found)` +- [predefined oracle exceptions](https://docs.oracle.com/en//database/oracle/oracle-database/19/lnpls/predefined-exceptions.html) - example `--%throws(no_data_found)` The annotation is ignored, when no valid arguments are provided. Examples of invalid annotations `--%throws()`,`--%throws`, `--%throws(abe, 723pf)`. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 68ddee6c9..4ca496d54 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,6 +1,6 @@ ![version](https://img.shields.io/badge/version-v3.2.01.4361--develop-blue.svg) -utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. +utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting combines data from package DBMS_PROFILER and DBMS_PLSQL_CODE_COVERAGE. Code coverage is gathered for the following source types: * package bodies @@ -27,7 +27,7 @@ The following code coverage reporters are supplied with utPLSQL: * `ut_coverage_cobertura_reporter` - generates a basic Cobertura coverage (http://cobertura.sourceforge.net/xml/coverage-04.dtd) report providing detailed information on code coverage with line numbers. This coverage report is designed to be consumed by services like TFS and Jenkins. Check this link for an example of XML generated by Java: https://raw.githubusercontent.com/jenkinsci/cobertura-plugin/master/src/test/resources/hudson/plugins/cobertura/coverage-with-data.xml ## Security model -utPLSQL code coverage uses DBMS_PROFILER to gather information about the execution of code under test and therefore follows the [DBMS_PROFILER's Security Model](https://docs.oracle.com/database/121/ARPLS/d_profil.htm#ARPLS67465). +utPLSQL code coverage uses DBMS_PROFILER to gather information about the execution of code under test and therefore follows the [DBMS_PROFILER's Security Model](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_PROFILER.html#GUID-DEE5EA97-14AA-4AF2-A5F7-4AB1D004B99F). In order to be able to gather coverage information, the user executing unit tests needs to be either: * The owner of the code that is being tested @@ -63,14 +63,15 @@ The report allow you to navigate to each source file and inspect line by line co ![Coverage Details page](../images/coverage_html_details.png) -### Oracle 12.2 extended coverage with profiler and block coverage -Using data collected from profiler and block coverage running parallel we are able to enrich information about coverage. -For every line recorded by the profiler if we have a partially covered same line in block coverage we will display that information -presenting line as partially covered, displaying number of block and how many blocks have been covered in that line.The feature will be automatically enabled in the Oracle database version 12.2 and higher, for older versions current profiler will be used. +### Partial Coverage -utPLSQL installation automatically creates tables needed by `dbms_plsql_code_coverage` on databases in versions above 12c Release 1. -Due to security model of `dbms_plsql_code_coverage` package, utPLSQL grants access to those tables and creates synonyms for those tables. -The access and synonyms will be public when using the headless installation. This approach avoids complexity of forcing every user of utPLSQL framework to create tables on their own. +#### What it does +Partial coverage combines two data sources — the profiler and block coverage — to give you a more detailed picture of which parts of your code have been tested. +When a line appears in both sources, and block coverage shows it was only partially covered, the display will reflect that: you'll see the line marked as partially covered, along with how many blocks on that line were executed out of the total. + +#### Setup and permissions +utPLSQL automatically creates the tables required by Oracle's dbms_plsql_code_coverage package — you don't need to create them manually. +Because of how dbms_plsql_code_coverage handles security, utPLSQL also takes care of granting access to those tables and creating the necessary synonyms. In a headless installation, both the grants and synonyms are made public, keeping things simple without requiring every utPLSQL user to set up their own tables. Sample output: diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index b1baa871b..3f4bd6222 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -648,9 +648,7 @@ Syntax: `ut.expect( a_actual ).to_be_like( a_mask [, a_escape_char] )` -Parameters `a_mask` and `a_escape_char` represent valid parameters of the [Oracle LIKE condition](https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF52142). - -If you use Oracle Database version 11.2.0.4, you may run into Oracle Bug 14402514: WRONG RESULTS WITH LIKE ON CLOB USING ESCAPE CHARACTER. In this case we recommend to use `match` instead of `be_like`. +Parameters `a_mask` and `a_escape_char` represent valid parameters of the [Oracle LIKE condition](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Pattern-matching-Conditions.html). Usage: ```sql linenums="1" @@ -1224,9 +1222,7 @@ utPLSQL is capable of comparing compound data-types including: - Comparison of cursor returning `TIMESTAMP` **columns** against cursor returning `TIMESTAMP` **bind variables** requires variables to be cast to proper precision. This is an Oracle SQL - PLSQL compatibility issue and usage of CAST is the only known workaround for now. See [Comparing cursor data containing TIMESTAMP bind variables](#comparing-cursor-data-containing-timestamp-bind-variables) for examples. - To compare nested table/varray type you need to convert it to `anydata` by using `anydata.convertCollection()` - To compare object type you need to convert it to `anydata` by using `anydata.convertObject()` -- It is possible to compare PL/SQL records, collections, varrays and associative arrays. To compare this types of data, use cursor comparison feature of utPLSQL and TABLE operator in SQL query - - On Oracle 11g Release 2 - pipelined table functions are needed (see section [Implicit (Shadow) Types in this artcile](https://oracle-base.com/articles/misc/pipelined-table-functions)) - - On Oracle 12c and above - use [TABLE function on nested tables/varrays/associative arrays of PL/SQL records](https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1) +- It is possible to compare PL/SQL records, collections, varrays and associative arrays. To compare this types of data, use cursor comparison feature of utPLSQL and [TABLE operator in SQL query](https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1) - utPLSQL is not able to distinguish between NULL and whitespace-only column/attribute value when comparing compound data. This is due to Oracle limitation on of XMLType. See [issue #880](https://github.com/utPLSQL/utPLSQL/issues/880) for details. *Note: This behavior might be fixed in future releases, when utPLSQL is no longer depending on XMLType for compound data comparison.* @@ -1763,7 +1759,7 @@ FAILURE ## Comparing Json objects -utPLSQL is capable of comparing json data-types of `json_element_t` **on Oracle 12.2 and above**, and also `json` **on Oracle 21 and above** +utPLSQL is capable of comparing json data-types of `json_element_t`, and also `json` **on Oracle 21 and above** !!! note Whenever a database is upgraded to compatible version the utPLSQL needs to be reinstalled to pick up json changes. E.g. upgrade from 18c to 21c to enable `json` type compare. diff --git a/docs/userguide/install.md b/docs/userguide/install.md index e5d3b8129..235e3ad82 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -2,19 +2,11 @@ ## Supported database versions -utPLSQL is continuously tested against following versions of Oracle databases +- Oracle Database 19c or newer (SE/EE/Cloud/Free) -* 11g R2 -* 12c -* 12c R2 -* 18c -* 19c +We do our best to assure full compatibility with **actively supported** versions of Oracle databases. +See [this page](https://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf#page=6) for Oracle Database Releases and their Support Lifetime by Oracle. -We do our best to assure full compatibility with supported versions of Oracle databases [See](http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf#page=6) - -## Requirements - -utPLSQL will run on any Oracle Database version 11g relase 2 or above. ### Licensed features required @@ -179,7 +171,7 @@ If the installing user and utPLSQL owner is one and the same, the user must have In addition, the user must be granted the execute privilege on `DBMS_LOCK` and `DBMS_CRYPTO` packages. -utPLSQL is using [DBMS_PROFILER tables](https://docs.oracle.com/cd/E18283_01/appdev.112/e16760/d_profil.htm#i999476) for code coverage. The tables required by DBMS_PROFILER will be created in the installation schema unless they already exist. +utPLSQL is using [DBMS_PROFILER tables](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_PROFILER.html) for code coverage. The tables required by DBMS_PROFILER will be created in the installation schema unless they already exist. It is up to DBA to maintain the storage of the profiler tables. @@ -274,7 +266,7 @@ select ## Additional requirements In order to use the Code Coverage functionality of utPLSQL, users executing the tests must have the CREATE privilege on the PLSQL code that the coverage is gathered on. -This is a requirement of [DBMS_PROFILER package](https://docs.oracle.com/cd/E18283_01/appdev.112/e16760/d_profil.htm#i999476). +This is a requirement of [DBMS_PROFILER package](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_PROFILER.html#GUID-DEE5EA97-14AA-4AF2-A5F7-4AB1D004B99F). In practice, user running tests for PLSQL code that he does not own, needs to have CREATE ANY PROCEDURE/CREATE ANY TRIGGER privileges. Running code coverage on objects that the user does not own will **not produce any coverage information** without those privileges. From 8fa483ec14bad87785006b43c01d8bacf05ec63f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 12:11:22 +0100 Subject: [PATCH 136/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 591b9b6dc..81b1d8a7e 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4366 +4371 diff --git a/docs/about/authors.md b/docs/about/authors.md index 73564c8cf..ae790e611 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 7d78f5480..160567b6f 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 523623762..e867e7ad4 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 52ff83e1c..f8e806019 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index f027f41a7..c797cd6d1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 9177d4a1e..c56e413ba 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7259e9f68..466f755b7 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 18864b297..ce901fe8d 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 59b70270c..c7ae7b6ad 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting combines data from package DBMS_PROFILER and DBMS_PLSQL_CODE_COVERAGE. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index d32e2f975..e16981591 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 0b490ac5b..dea108844 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index efcb0832b..c63ced510 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 9673668ef..a7dbf0cf4 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 1651fcb1d..623694390 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index c7e36ed40..297881659 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 13341367e..565f1c1ff 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index b8bd93570..17de0556a 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4366--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 921996f7f..eea9ee5cc 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.2.01.4366-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4371-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ee69baffc4bf5f5255407664288e2675f29a625c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 14:12:40 +0300 Subject: [PATCH 137/144] Update of refresh sources - remove git repo references --- development/refresh_sources.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/development/refresh_sources.sh b/development/refresh_sources.sh index 83518d7cc..87869d581 100755 --- a/development/refresh_sources.sh +++ b/development/refresh_sources.sh @@ -9,6 +9,7 @@ git rev-parse && cd "$(git rev-parse --show-cdup)" rm -rf ${UTPLSQL_DIR:-utPLSQL_latest_release} # clone utPLSQL main branch from upstream into utPLSQL sub-directory of your project git clone --depth=1 --branch=${SELFTESTING_BRANCH:-main} https://github.com/utPLSQL/utPLSQL.git ${UTPLSQL_DIR:-utPLSQL_latest_release} +rm -rf ${UTPLSQL_DIR:-utPLSQL_latest_release}/.git rm -rf utPLSQL-cli/* # download latest release version of utPLSQL-cli From 5b79bd8267cd8ec5c871b3c13a22b72616c07ff4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 12:18:50 +0100 Subject: [PATCH 138/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 81b1d8a7e..12cd854ce 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4371 +4372 diff --git a/docs/about/authors.md b/docs/about/authors.md index ae790e611..3041eb36b 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 160567b6f..e78d36f14 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index e867e7ad4..360cc4e07 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index f8e806019..4169c1a88 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index c797cd6d1..8b3283ca9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index c56e413ba..adb623892 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 466f755b7..8d8405c29 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index ce901fe8d..ccfdd5aa5 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c7ae7b6ad..a46add1f4 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting combines data from package DBMS_PROFILER and DBMS_PLSQL_CODE_COVERAGE. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e16981591..d0753bf3b 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index dea108844..17a39d362 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index c63ced510..460766ca8 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index a7dbf0cf4..402180d1f 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 623694390..5a970b328 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 297881659..cef7a944b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 565f1c1ff..0d9e4d706 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 17de0556a..425bd69be 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4371--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index eea9ee5cc..6c3555cd8 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.2.01.4371-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4372-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 5e80efae15a9c798e4f86fb7d94b5178384eee13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 14:21:25 +0300 Subject: [PATCH 139/144] Update documentation --- docs/userguide/expectations.md | 4 ++-- docs/userguide/install.md | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 17a39d362..109799dfc 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -804,7 +804,7 @@ Syntax: `ut.expect( a_actual ).to_match( a_pattern [, a_modifiers] );` -Parameters `a_pattern` and `a_modifiers` represent a valid regexp pattern accepted by [Oracle REGEXP_LIKE condition](https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF00501) +Parameters `a_pattern` and `a_modifiers` represent a valid regexp pattern accepted by [Oracle REGEXP_LIKE condition](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Pattern-matching-Conditions.html#GUID-D2124F3A-C6E4-4CCA-A40E-2FFCABFD8E19) Usage: ```sql linenums="1" @@ -1762,7 +1762,7 @@ FAILURE utPLSQL is capable of comparing json data-types of `json_element_t`, and also `json` **on Oracle 21 and above** !!! note - Whenever a database is upgraded to compatible version the utPLSQL needs to be reinstalled to pick up json changes. E.g. upgrade from 18c to 21c to enable `json` type compare. + Whenever a database is upgraded to compatible version the utPLSQL needs to be reinstalled to pick up json changes. E.g. upgrade from 19c to 23 AI to enable `json` type compare. ### Notes on comparison of json data diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 402180d1f..a286cbe18 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -10,9 +10,7 @@ See [this page](https://www.oracle.com/us/support/library/lifetime-support-techn ### Licensed features required -utPLSQL doesn't require any extra licensed features of Oracle database. It can be installed on any Standard Edition Oracle Database. - -In fact, it even supports Oracle 11g XE which is a free Oracle Database version with minimal features and storage limits. +utPLSQL doesn't require any extra licensed features of Oracle database. It can be installed on any Edition of Oracle Database. ### Storage requirements @@ -116,9 +114,6 @@ The scripts need to be executed by `SYSDBA`, in order to grant access to `DBMS_L - `DBMS_LOCK` is required for session synchronization between main session and session consuming realtime reports.
- The user performing the installation must have the `ADMINISTER DATABASE TRIGGER` privilege. This is required for installation of trigger that is responsible for parsing annotations at at compile-time of a package.
- When installed with DDL trigger, utPLSQL will not be registering unit tests for any of oracle-maintained schemas.
- - For Oracle 11g following users are excluded:
- ANONYMOUS, APPQOSSYS, AUDSYS, DBSFWUSER, DBSNMP, DIP, GGSYS, GSMADMIN_INTERNAL, GSMCATUSER, GSMUSER, ORACLE_OCM, OUTLN, REMOTE_SCHEDULER_AGENT, SYS, SYS$UMF, SYSBACKUP, SYSDG, SYSKM, SYSRAC, SYSTEM, WMSYS, XDB, XS$NULL
- - For Oracle 12c and above the users returned by below query are excluded by utPLSQL:
`select username from all_users where oracle_maintained='Y';`
### Installation without DDL trigger From 9e659c4d4b169258257caefc67df5c622b7c924f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 12:27:44 +0100 Subject: [PATCH 140/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 12cd854ce..ae1550799 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4372 +4373 diff --git a/docs/about/authors.md b/docs/about/authors.md index 3041eb36b..e3736ca96 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index e78d36f14..a8bc7c21a 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 360cc4e07..722f603ee 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 4169c1a88..eb73d4adb 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8b3283ca9..eb44d57c4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index adb623892..5a2d2cd83 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 8d8405c29..8add10a7b 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index ccfdd5aa5..100b7da11 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index a46add1f4..7c80396b2 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting combines data from package DBMS_PROFILER and DBMS_PLSQL_CODE_COVERAGE. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index d0753bf3b..9648be0f6 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 109799dfc..b4745dd18 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 460766ca8..8e5b8d9bd 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index a286cbe18..23b5f5cb4 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 5a970b328..76044c619 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index cef7a944b..7d7606963 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 0d9e4d706..d8e5ad36c 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 425bd69be..88ca240c1 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4372--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 6c3555cd8..388928a74 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.2.01.4372-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4373-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From d4478651d7e066ea54d7fdd492d0e9a22d87246c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 14:43:56 +0300 Subject: [PATCH 141/144] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3ad2141f..f75662f75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ Releases are available on the [GitHub Releases page](https://github.com/utPLSQL/ --- -## [v3.2.01] - unreleased +## [v3.2.01] - 2026-04-22 ## Important - Dropped support for Oracle Database versions older than 19c From 3d21de6520d0480f302296d288882dc0ad02298b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 12:50:14 +0100 Subject: [PATCH 142/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index ae1550799..bce5ffdd8 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4373 +4374 diff --git a/docs/about/authors.md b/docs/about/authors.md index e3736ca96..8d53b662c 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index a8bc7c21a..3d02ef041 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 722f603ee..6e101b18a 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index eb73d4adb..529a89cd4 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index eb44d57c4..2bb7d19e0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 5a2d2cd83..8e21d13ff 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 8add10a7b..5ee141ad7 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 100b7da11..65db4a49c 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 7c80396b2..dcf7855f8 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting combines data from package DBMS_PROFILER and DBMS_PLSQL_CODE_COVERAGE. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 9648be0f6..fef6e5602 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index b4745dd18..2cb1aeca7 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 8e5b8d9bd..c07624cd2 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 23b5f5cb4..0d3ba6790 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 76044c619..5bd1755a2 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 7d7606963..e08f035ae 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index d8e5ad36c..889455594 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 88ca240c1..13063c3d5 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4373--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 388928a74..f28dc4e1d 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.2.01.4373-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4374-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 8db20e2e62fd6fbbac617418d354f9b36c3509fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 22 Apr 2026 14:50:26 +0300 Subject: [PATCH 143/144] Removed old references to travis from links and documentation. --- docs/about/license.md | 4 ---- sonar-project.properties | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/about/license.md b/docs/about/license.md index 3d02ef041..320b7c24f 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -9,9 +9,5 @@ External code used in the development of this project, but is not required for u | Tool | License | Purpose | | ---- | --------| --------| -| [Travis-Oracle](https://github.com/cbandy/travis-oracle) | [ISC](https://github.com/cbandy/travis-oracle/blob/master/LICENSE) | Install Oracle for Travis Builds | | [mkDocs](http://www.mkdocs.org/) | [BSD](http://www.mkdocs.org/about/license/) | Produce HTML version of documentation | -**Note:** - -Version 1 & 2 of utPLSQL were licensed under GPL, version 3 was a complete rewrite from scratch which a allowed us to change the license to be more permissive. diff --git a/sonar-project.properties b/sonar-project.properties index 24e77c11f..efcaeb5e6 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -15,7 +15,7 @@ sonar.coverage.exclusions=**/*.sql,**/*.pks sonar.tests=./test sonar.testExecutionReportPaths=./test_results.xml sonar.links.issue=https://github.com/utPLSQL/utPLSQL/issues -sonar.links.ci=https://travis-ci.org/utPLSQL/utPLSQL +sonar.links.ci=https://github.com/utPLSQL/utPLSQL/actions sonar.links.homepage=https://github.com/utPLSQL/utPLSQL sonar.projectDescription=PL/SQL Unit Testing Framework sonar.plsql.file.suffixes=sql,tab,pkb,tpb From 698dcd65cda1c47e66c9c46ba8805ab130a33288 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Apr 2026 12:57:43 +0100 Subject: [PATCH 144/144] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index bce5ffdd8..61cb37f72 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4374 +4375 diff --git a/docs/about/authors.md b/docs/about/authors.md index 8d53b662c..e55e244a7 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 320b7c24f..bd60e0af4 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 6e101b18a..4f1086a89 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 529a89cd4..ae284c8b7 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 2bb7d19e0..bced9d1e9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 8e21d13ff..d18e15f23 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 5ee141ad7..6ee24ed59 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 65db4a49c..0bd08a80d 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index dcf7855f8..43187f22c 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting combines data from package DBMS_PROFILER and DBMS_PLSQL_CODE_COVERAGE. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index fef6e5602..6b6ae8bc9 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 2cb1aeca7..aa7efdde0 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index c07624cd2..db5a08115 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 0d3ba6790..095fd4085 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 5bd1755a2..4f2a53b28 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index e08f035ae..a29c5c3ef 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 889455594..a9906cb78 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 13063c3d5..f3ffa333c 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.2.01.4374--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.2.01.4375--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index f28dc4e1d..6f9a3abfd 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.2.01.4374-develop'; + gc_version constant varchar2(50) := 'v3.2.01.4375-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall';