Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLeitwolf112026-09-24 22:07:03 +0300
committerLeitwolf112026-09-24 22:07:03 +0300
commit9ad804cedf4cc4a85ef89fe097f97a3b44654360 (patch)
treef088e919776b22d19387377bdbec727daa2429c0
parent02f8b5593a15cdec8558256e6f40a0c7fb5862d6 (diff)
downloadcatch3-0.1.0.tar.gz
Add Progmasoft Catch3 property testing and build support0.1.0
Introduce deterministic property execution, built-in generators, shrinking, replayable seeds, and a separate Progmasoft-owned header API while preserving Catch2 compatibility targets and the C++14 engine baseline. Add Bazel, Meson, Xmake, and Premake integration and tests alongside the existing CMake build. Replace Linux-only workflow coverage with Windows and macOS jobs and document the Catch2/Catch3 distinction.
-rw-r--r--.bazelversion1
-rw-r--r--.github/workflows/alternative-build-systems.yml64
-rw-r--r--.github/workflows/linux-bazel-builds.yml28
-rw-r--r--.github/workflows/linux-meson-builds.yml48
-rw-r--r--.github/workflows/linux-other-builds.yml129
-rw-r--r--.github/workflows/linux-simple-builds.yml109
-rw-r--r--.github/workflows/meson-builds.yml42
-rw-r--r--.github/workflows/package-manager-builds.yaml3
-rw-r--r--.github/workflows/validate-header-guards.yml2
-rw-r--r--.gitignore2
-rw-r--r--BUILD.bazel4
-rw-r--r--LICENSES/AdditionRef-Progmasoft-Exception-1.1.txt80
-rw-r--r--LICENSES/MPL-2.0.txt373
-rw-r--r--LICENSES/README.md15
-rw-r--r--MODULE.bazel5
-rw-r--r--README.md45
-rw-r--r--buildsupport/catch2_config.lua57
-rw-r--r--docs/progmasoft-catch3.md131
-rw-r--r--docs/why-catch3.md67
-rw-r--r--meson.build4
-rw-r--r--premake5.lua68
-rw-r--r--src/CMakeLists.txt43
-rw-r--r--src/Progmasoft/BUILD.bazel20
-rw-r--r--src/Progmasoft/Catch3.hpp13
-rw-r--r--src/Progmasoft/Catch3/Assertions.hpp17
-rw-r--r--src/Progmasoft/Catch3/Generator.hpp61
-rw-r--r--src/Progmasoft/Catch3/Generators/Boolean.hpp18
-rw-r--r--src/Progmasoft/Catch3/Generators/Integer.hpp82
-rw-r--r--src/Progmasoft/Catch3/Property.hpp244
-rw-r--r--src/Progmasoft/Catch3/Random.hpp113
-rw-r--r--src/Progmasoft/ProgmasoftCatch3Config.cmake.in7
-rw-r--r--src/Progmasoft/meson.build18
-rw-r--r--tests/CMakeLists.txt7
-rw-r--r--tests/Progmasoft/BUILD.bazel19
-rw-r--r--tests/Progmasoft/Property.tests.cpp233
-rw-r--r--tests/meson.build12
-rw-r--r--xmake.lua49
37 files changed, 1885 insertions, 348 deletions
diff --git a/.bazelversion b/.bazelversion
new file mode 100644
index 00000000..deeb3d66
--- /dev/null
+++ b/.bazelversion
@@ -0,0 +1 @@
+9.2.0
diff --git a/.github/workflows/alternative-build-systems.yml b/.github/workflows/alternative-build-systems.yml
new file mode 100644
index 00000000..7f2cf531
--- /dev/null
+++ b/.github/workflows/alternative-build-systems.yml
@@ -0,0 +1,64 @@
+name: Alternative Build Systems
+
+on: [push, pull_request]
+
+jobs:
+ xmake:
+ name: Xmake on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [windows-2025, macos-15]
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - uses: xmake-io/github-action-setup-xmake@v1
+ with:
+ xmake-version: '3.1.1'
+
+ - name: Configure Clang build
+ run: xmake f --toolchain=clang -m debug -y
+
+ - name: Build
+ run: xmake -j 4
+
+ - name: Run property tests
+ run: xmake run ProgmasoftPropertyTests
+
+ premake:
+ name: Premake on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [windows-2022, macos-15]
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - uses: abel0b/setup-premake@v2.4
+ with:
+ version: '5.0.0-beta7'
+
+ - name: Generate and build Visual Studio projects
+ if: runner.os == 'Windows'
+ shell: pwsh
+ run: |
+ premake5 vs2022
+ msbuild build/premake/Catch3.sln /m /p:Configuration=Debug /p:Platform=x64 /nologo
+
+ - name: Run property tests on Windows
+ if: runner.os == 'Windows'
+ run: build/premake/bin/Debug/ProgmasoftPropertyTests.exe
+
+ - name: Generate and build Clang Makefiles
+ if: runner.os == 'macOS'
+ run: |
+ premake5 gmake
+ make -C build/premake config=debug -j 4
+
+ - name: Run property tests on macOS
+ if: runner.os == 'macOS'
+ run: build/premake/bin/Debug/ProgmasoftPropertyTests
diff --git a/.github/workflows/linux-bazel-builds.yml b/.github/workflows/linux-bazel-builds.yml
deleted file mode 100644
index 20060405..00000000
--- a/.github/workflows/linux-bazel-builds.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-name: Linux Builds (Bazel)
-
-on: [push, pull_request]
-
-env:
- CTEST_OUTPUT_ON_FAILURE: 1
- CTEST_NO_TESTS_ACTION: error
-
-jobs:
- build_and_test_ubuntu:
- name: Linux Ubuntu 22.04 Bazel build <GCC 11.2.0>
- runs-on: ubuntu-22.04
- strategy:
- fail-fast: false
- matrix:
- compilation_mode: [fastbuild, dbg, opt]
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Mount Bazel cache
- uses: actions/cache@v5
- with:
- path: "/home/runner/.cache/bazel"
- key: bazel-ubuntu22-gcc11
-
- - name: Build
- run: bazelisk build --compilation_mode=${{matrix.compilation_mode}} //...
diff --git a/.github/workflows/linux-meson-builds.yml b/.github/workflows/linux-meson-builds.yml
deleted file mode 100644
index 5240c7cb..00000000
--- a/.github/workflows/linux-meson-builds.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-name: Linux Builds (Meson)
-
-on: [push, pull_request]
-
-env:
- CTEST_OUTPUT_ON_FAILURE: 1
- CTEST_NO_TESTS_ACTION: error
-
-jobs:
- build:
- name: meson ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
- runs-on: ubuntu-22.04
- strategy:
- fail-fast: false
- matrix:
- cxx:
- - g++-11
- - clang++-11
- build_type: [debug, release]
- std: [14, 17]
- include:
- - cxx: clang++-11
- other_pkgs: clang-11
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Prepare environment
- run: |
- sudo apt-get update
- sudo apt-get install -y meson ninja-build ${{matrix.other_pkgs}}
-
- - name: Configure
- env:
- CXX: ${{matrix.cxx}}
- CXXFLAGS: -std=c++${{matrix.std}} ${{matrix.cxxflags}}
- # Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}.
- # This is important
- run: |
- meson -Dbuildtype=${{matrix.build_type}} ${{runner.workspace}}/meson-build
-
- - name: Build
- working-directory: ${{runner.workspace}}/meson-build
- run: ninja
-
- - name: Test
- working-directory: ${{runner.workspace}}/meson-build
- run: meson test --verbose
diff --git a/.github/workflows/linux-other-builds.yml b/.github/workflows/linux-other-builds.yml
deleted file mode 100644
index 188a1891..00000000
--- a/.github/workflows/linux-other-builds.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-# The builds in this file are more complex (e.g. they need custom CMake
-# configuration) and thus are unsuitable to the simple build matrix
-# approach used in simple-builds
-name: Linux Builds (Complex)
-
-on: [push, pull_request]
-
-env:
- CTEST_OUTPUT_ON_FAILURE: 1
- CTEST_NO_TESTS_ACTION: error
-
-jobs:
- build:
- name: ${{matrix.build_description}}, ${{matrix.cxx}}, C++${{matrix.std}} ${{matrix.build_type}}
- runs-on: ubuntu-22.04
- strategy:
- fail-fast: false
- matrix:
- # We add builds one by one in this case, because there are no
- # dimensions that are shared across the builds
- include:
-
- # Single surrogate header build
- - cxx: clang++-14
- build_description: Surrogates build
- build_type: Debug
- std: 14
- other_pkgs: clang-14
- cmake_configurations: -DCATCH_BUILD_SURROGATES=ON
-
- # Extras and examples with gcc-11
- - cxx: g++-11
- build_description: Extras + Examples
- build_type: Debug
- std: 14
- other_pkgs: g++-11
- cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
- - cxx: g++-11
- build_description: Extras + Examples
- build_type: Release
- std: 14
- other_pkgs: g++-11
- cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
-
- # Extras and examples with Clang-14
- - cxx: clang++-14
- build_description: Extras + Examples
- build_type: Debug
- std: 17
- other_pkgs: clang-14
- cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
- - cxx: clang++-14
- build_description: Extras + Examples
- build_type: Release
- std: 17
- other_pkgs: clang-14
- cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
-
- # Configure tests with Clang-14
- - cxx: clang++-14
- build_description: CMake configuration tests
- build_type: Debug
- std: 14
- other_pkgs: clang-14
- cmake_configurations: -DCATCH_ENABLE_CONFIGURE_TESTS=ON
-
- # Valgrind test Clang-14
- # - cxx: clang++-14
- # build_description: Valgrind tests
- # build_type: Debug
- # std: 14
- # other_pkgs: clang-14 valgrind
- # cmake_configurations: -DMEMORYCHECK_COMMAND=`which valgrind` -DMEMORYCHECK_COMMAND_OPTIONS="-q --track-origins=yes --leak-check=full --num-callers=50 --show-leak-kinds=definite --error-exitcode=1"
- # other_ctest_args: -T memcheck -LE uses-python
-
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Prepare environment
- run: |
- sudo apt-get update
- sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
-
- - name: Configure build
- run: |
- cmake --preset basic-tests -GNinja \
- -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
- -DCMAKE_CXX_COMPILER=${{matrix.cxx}} \
- -DCMAKE_CXX_STANDARD=${{matrix.std}} \
- ${{matrix.cmake_configurations}}
-
- - name: Build
- run: cmake --build build
-
- - name: Test
- run: ctest --test-dir build -j
-
- clang-tidy:
- name: clang-tidy
- runs-on: ubuntu-22.04
- steps:
- - uses: actions/checkout@v6
-
- - name: Prepare environment
- run: |
- sudo apt-get update
- sudo apt-get install -y ninja-build clang-15 clang-tidy-15
-
- - name: Configure
- run: |
- clangtidy="clang-tidy-15;-use-color"
- # Use a dummy compiler/linker/ar/ranlib to effectively disable the
- # compilation and only run clang-tidy.
- cmake --preset basic-tests -GNinja \
- -DCMAKE_AR=/usr/bin/true \
- -DCMAKE_BUILD_TYPE=Debug \
- -DCMAKE_CXX_CLANG_TIDY="$clangtidy" \
- -DCMAKE_CXX_COMPILER_AR=/usr/bin/true \
- -DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/true \
- -DCMAKE_CXX_COMPILER=clang++-15 \
- -DCMAKE_CXX_LINK_EXECUTABLE=/usr/bin/true \
- -DCMAKE_CXX_STANDARD=17 \
- -DCMAKE_RANLIB=/usr/bin/true \
- -DCATCH_BUILD_EXAMPLES=ON \
- -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON
-
- - name: Run clang-tidy
- run: cmake --build build
diff --git a/.github/workflows/linux-simple-builds.yml b/.github/workflows/linux-simple-builds.yml
deleted file mode 100644
index 17962cb8..00000000
--- a/.github/workflows/linux-simple-builds.yml
+++ /dev/null
@@ -1,109 +0,0 @@
-name: Linux Builds (Basic)
-
-on: [push, pull_request]
-
-env:
- CTEST_OUTPUT_ON_FAILURE: 1
- CTEST_NO_TESTS_ACTION: error
-
-jobs:
- build:
- name: ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}}
- runs-on: ubuntu-22.04
- strategy:
- fail-fast: false
- matrix:
- cxx:
- - g++-9
- - g++-10
- - g++-11
- - g++-12
- - clang++-6.0
- - clang++-7
- - clang++-8
- - clang++-9
- - clang++-10
- - clang++-11
- - clang++-12
- - clang++-13
- - clang++-14
- build_type: [Debug, Release]
- std: [14]
- include:
- - cxx: g++-9
- other_pkgs: g++-9
- - cxx: g++-10
- other_pkgs: g++-10
- - cxx: g++-11
- other_pkgs: g++-11
- - cxx: g++-12
- other_pkgs: g++-12
- - cxx: clang++-6.0
- other_pkgs: clang-6.0
- - cxx: clang++-7
- other_pkgs: clang-7
- - cxx: clang++-8
- other_pkgs: clang-8
- - cxx: clang++-9
- other_pkgs: clang-9
- - cxx: clang++-10
- other_pkgs: clang-10
- - cxx: clang++-11
- other_pkgs: clang-11
- - cxx: clang++-12
- other_pkgs: clang-12
- - cxx: clang++-13
- other_pkgs: clang-13
- - cxx: clang++-14
- other_pkgs: clang-14
- # Clang 14 + C++17
- - cxx: clang++-14
- build_type: Debug
- std: 17
- other_pkgs: clang-14
- - cxx: clang++-14
- build_type: Release
- std: 17
- other_pkgs: clang-14
- - cxx: clang++-14
- build_type: Debug
- std: 20
- other_pkgs: clang-14
- - cxx: clang++-14
- build_type: Release
- std: 20
- other_pkgs: clang-14
- - cxx: g++-11
- build_type: Debug
- std: 20
- other_pkgs: g++-11
- - cxx: g++-11
- build_type: Release
- std: 20
- other_pkgs: g++-11
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Add repositories for older compilers
- run: |
- sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ focal main'
- sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ focal universe'
-
- - name: Prepare environment
- run: |
- sudo apt-get update
- sudo apt-get install -y ninja-build ${{matrix.other_pkgs}}
-
- - name: Configure
- run: |
- cmake --preset basic-tests -GNinja \
- -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
- -DCMAKE_CXX_COMPILER=${{matrix.cxx}} \
- -DCMAKE_CXX_STANDARD=${{matrix.std}}
-
- - name: Build
- run: cmake --build build
-
- - name: Test
- run: ctest --test-dir build -j
diff --git a/.github/workflows/meson-builds.yml b/.github/workflows/meson-builds.yml
new file mode 100644
index 00000000..e7ff79af
--- /dev/null
+++ b/.github/workflows/meson-builds.yml
@@ -0,0 +1,42 @@
+name: Meson Builds
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: Meson on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [windows-2025, macos-15]
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - uses: actions/setup-python@v6
+ with:
+ python-version: '3.14'
+
+ - name: Install Meson and Ninja
+ run: python -m pip install meson ninja
+
+ - name: Configure with Clang-CL on Windows
+ if: runner.os == 'Windows'
+ env:
+ CC: clang-cl
+ CXX: clang-cl
+ run: meson setup build/meson --vsenv -Dtests=true -Dinstall=false
+
+ - name: Configure with Apple Clang on macOS
+ if: runner.os == 'macOS'
+ env:
+ CC: clang
+ CXX: clang++
+ run: meson setup build/meson -Dtests=true -Dinstall=false
+
+ - name: Build
+ run: meson compile -C build/meson
+
+ - name: Test
+ run: meson test -C build/meson --print-errorlogs
diff --git a/.github/workflows/package-manager-builds.yaml b/.github/workflows/package-manager-builds.yaml
index 5754205d..8874b10a 100644
--- a/.github/workflows/package-manager-builds.yaml
+++ b/.github/workflows/package-manager-builds.yaml
@@ -5,9 +5,10 @@ on: [push, pull_request]
jobs:
conan_builds:
name: Conan ${{matrix.conan_version}}
- runs-on: ubuntu-22.04
+ runs-on: ${{matrix.os}}
strategy:
matrix:
+ os: [macos-15, windows-2025]
conan_version:
- '1.63'
- '2.1'
diff --git a/.github/workflows/validate-header-guards.yml b/.github/workflows/validate-header-guards.yml
index e6a1a190..bb82bd84 100644
--- a/.github/workflows/validate-header-guards.yml
+++ b/.github/workflows/validate-header-guards.yml
@@ -5,7 +5,7 @@ on: [push, pull_request]
jobs:
build:
# Set the type of machine to run on
- runs-on: ubuntu-22.04
+ runs-on: macos-15
steps:
- name: Checkout source code
diff --git a/.gitignore b/.gitignore
index dbf9f40a..cde67c29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,6 +32,8 @@ build-fuzzers
debug-build
.vscode
msvc-sln*
+.xmake/
+/build/
# Currently we use Doxygen for dep graphs and the full docs are only slowly
# being filled in, so we definitely do not want git to deal with the docs.
docs/doxygen
diff --git a/BUILD.bazel b/BUILD.bazel
index a318d190..4d4bfac9 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -7,13 +7,13 @@ package(
)
exports_files([
- "LICENSE.MIT",
+ "LICENSE.txt",
])
license(
name = "license",
license_kinds = ["@rules_license//licenses/spdx:BSL-1.0"],
- license_text = "LICENSE.MIT",
+ license_text = "LICENSE.txt",
)
expand_template(
diff --git a/LICENSES/AdditionRef-Progmasoft-Exception-1.1.txt b/LICENSES/AdditionRef-Progmasoft-Exception-1.1.txt
new file mode 100644
index 00000000..b9dab6e0
--- /dev/null
+++ b/LICENSES/AdditionRef-Progmasoft-Exception-1.1.txt
@@ -0,0 +1,80 @@
+Progmasoft Linking Exception, Version 1.1
+
+This Exception is an additional permission to the Mozilla Public License, version 2.0 ("MPL-2.0"). It is intended to preserve MPL-2.0's file-level obligations for Covered Software while removing doubt about combining that software with independent code. Capitalized terms not defined here have the meanings given in MPL-2.0.
+
+1. Definitions
+
+"Independent Component" means software contained in one or more Source Code Form files that neither contain Covered Software nor are Modifications of Covered Software. A component does not cease to be independent merely because compilation, static or dynamic linking, loading, packaging, or deployment places its Executable Form in the same file, process, address space, archive, image, or distribution as Covered Software.
+
+"Combined Work" means a Larger Work that combines Covered Software with one or more Independent Components by any technical means, including static or dynamic linking, loading, embedding, plugins, extensions, language bindings, an API, ABI, FFI boundary, command-line interface, protocol, inter-process communication mechanism, or file format.
+
+"Output" means material produced by executing Covered Software, including generated source, object code, executable code, intermediate representations, documentation, reports, diagnostics, formatted text, and analysis results.
+
+2. Additional Permission for Combined Works
+
+Subject to compliance with MPL-2.0 for the Covered Software, each recipient has a worldwide, royalty-free, non-exclusive, irrevocable additional copyright permission to create, reproduce, use, modify, display, perform, make available, and distribute a Combined Work under terms of the recipient's choice, including proprietary or closed-source terms.
+
+Those chosen terms may govern Independent Components and other portions of the Combined Work, but must not restrict or alter any recipient's rights in the Covered Software under MPL-2.0 and this Exception. No distributor is required to relicense an Independent Component merely because it forms part of a Combined Work.
+
+3. Boundary of Covered Software
+
+Linking, loading, calling, communicating with, packaging, installing, or distributing an Independent Component with Covered Software does not, by itself:
+
+(a) make the Independent Component Covered Software or a Modification;
+(b) subject the Independent Component's Source Code Form to MPL-2.0; or
+(c) expand MPL-2.0 beyond files that are Covered Software or Modifications under MPL-2.0.
+
+If Source Code Form from Covered Software is copied into another file, or a new Source Code Form file contains Covered Software, MPL-2.0 determines whether that file is a Modification. Labels, file extensions, build boundaries, code generation, or later separation of files do not avoid that determination.
+
+4. Outputs
+
+An Output does not become Covered Software merely because Covered Software produced, transformed, linked, or processed it. The copyright license chosen for input material does not change merely because Covered Software processes that material.
+
+If an Output contains copyrightable Source Code Form or other copyrightable material copied or derived from Covered Software, this Exception does not remove MPL-2.0 obligations from that incorporated material. Facts, ideas, interfaces, names, signatures, diagnostics, and other material not protected by copyright are not converted into Covered Software by this Exception.
+
+5. Preservation of MPL-2.0 Obligations
+
+This Exception does not remove, replace, waive, or narrow any MPL-2.0 obligation applicable to Covered Software. In particular:
+
+(a) Covered Software in Source Code Form and every Modification remain subject to MPL-2.0;
+(b) distribution in Executable Form remains subject to MPL-2.0 Section 3.2, including the obligation to inform recipients how to obtain the corresponding Source Code Form when that section applies;
+(c) notices protected by MPL-2.0 Section 3.4 must be retained; and
+(d) this Exception grants no permission to withhold Source Code Form that MPL-2.0 requires to be made available.
+
+Distribution of a Combined Work under terms of choice is permission for the Combined Work as a whole and its Independent Components. It is not permission to relicense a Covered Software file.
+
+6. Packaging and Deployment
+
+Placing Covered Software and an Independent Component in the same archive, package, installer, application bundle, container image, firmware image, distribution medium, hosted deployment, or process does not change their respective copyright licenses. Network interaction or operation as separate processes is not required for independence.
+
+7. Direct Grant to Recipients
+
+The additional permission in this Exception is granted directly by the copyright holders applying it to every recipient of the applicable Covered Software. A distributor need not sublicense this Exception. Distribution through one or more intermediaries does not reduce the permission, and termination of an upstream distributor's rights does not terminate rights already received by a compliant downstream recipient.
+
+8. Termination and Reinstatement
+
+This Exception has no separate patent-litigation, field-of-use, combination, or compatibility termination condition. A recipient may exercise it only while entitled to exercise the corresponding MPL-2.0 copyright rights. If those rights terminate under MPL-2.0 Section 5.1, exercise of this Exception for the affected Covered Software is suspended to the same extent and is reinstated when, and to the extent that, the MPL-2.0 rights are reinstated.
+
+A recipient may elect to use Covered Software under MPL-2.0 without relying on this Exception.
+
+9. Other Rights
+
+This Exception grants copyright permission only. It grants no trademark, trade dress, service mark, publicity, confidential-information, or patent rights. Patent rights, if any, arise only under MPL-2.0 or a separately applicable patent grant. Nothing in this Exception limits rights arising independently under exhaustion, fair use, fair dealing, implied license, estoppel, or other applicable law.
+
+10. Relationship to MPL-2.0
+
+MPL-2.0 and this Exception are read together. If this Exception and MPL-2.0 cannot both be given effect with respect to the creation or distribution of a Combined Work, this Exception controls only to the minimum extent necessary to provide the additional permission stated in Sections 2 through 6. MPL-2.0 controls in every other respect.
+
+Nothing here changes whether Covered Software is "Incompatible With Secondary Licenses" or changes the operation of MPL-2.0 Section 3.3 for a work governed by a Secondary License.
+
+11. Applicability and Version
+
+This Exception applies only to a file that expressly identifies it with this exact SPDX license expression:
+
+MPL-2.0 WITH AdditionRef-Progmasoft-Exception-1.1
+
+Reference to Version 1.1 does not incorporate any later version. A copy of this text supplied in a repository or distribution identifies the permission; the per-file expression determines which files receive it.
+
+12. Severability
+
+If any provision of this Exception is held unenforceable, it shall be reformed only to the minimum extent necessary to make it enforceable. If reformation is unavailable, that provision is severed and the remaining provisions continue to the maximum extent permitted by law.
diff --git a/LICENSES/MPL-2.0.txt b/LICENSES/MPL-2.0.txt
new file mode 100644
index 00000000..d0a1fa14
--- /dev/null
+++ b/LICENSES/MPL-2.0.txt
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or