diff --git a/.github/workflows/run-image-comparison.yml b/.github/workflows/run-image-comparison.yml new file mode 100644 index 00000000..a23f9a60 --- /dev/null +++ b/.github/workflows/run-image-comparison.yml @@ -0,0 +1,59 @@ +# Run cf-plot tests including image comparison, in the reference environment +name: Run image comparison testing + +on: + pull_request: + types: [opened, reopened, ready_for_review] + branches: + - main + +jobs: + test-image-comparison: + strategy: + fail-fast: true + matrix: + os: [ubuntu-latest, macos-15-intel] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout cf-plot + uses: actions/checkout@v7 + with: + path: main + + - name: Setup reference Conda environment + uses: conda-incubator/setup-miniconda@v4 + with: + auto-update-conda: true + miniconda-version: "latest" + environment-file: main/cfplot-test-env.yml + activate-environment: cfplot-test-env + + - name: Check reference environment + shell: bash -l {0} + run: | + python --version + python -c "import sys; assert sys.version_info[:3] == (3, 14, 8), f'Expected Python 3.14.8, got {sys.version}'" + + echo "*Conda report:*" + conda info + conda list + + echo "*Pip report:*" + pip --version + pip list + + - name: Install cf-plot from source + shell: bash -l {0} + working-directory: ${{ github.workspace }}/main + run: pip install --no-deps -e . + + - name: Run full test suite including image comparison + shell: bash -l {0} + working-directory: ${{ github.workspace }}/main + run: pytest tests + + - name: Notify about a completed run + if: success() + run: echo "Image comparison testing completed successfully on ${{ matrix.os }}." diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 00000000..f77670d3 --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,197 @@ + +# A GitHub Action to run the cf-plot test suite after PR events on main. +name: Run all testing excluding image comparison aspect + +# Triggers the workflow on PR events targeting main. +on: + # For now, at least, do not enable on push to save on limited usage resource + #push: + # branches: + # - main + pull_request: + # 'reopened' enables manual retrigger via close & re-open. Disable for all + # edits to manage limited resource (PRs often change before merge-ready). + types: [opened, reopened, ready_for_review] + branches: + - main + +jobs: + # Test on Linux and Intel macOS. + + # Test the suite on Linux (with Ubuntu as representative distribution). + test-on-linux: + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + # DO NOT RUN on the latest Python, because we run this for the + # image comparison workflow so it would just be duplicating the + # same test. + python-version: ["3.11", "3.12", "3.13"] + + steps: + - name: Checkout cf-plot + uses: actions/checkout@v7 + with: + path: main + + - name: Notify about setup + run: echo "Now setting up the environment for the cf-plot test suite..." + + - name: Checkout the current cf-python main to use as a dependency + uses: actions/checkout@v7 + with: + repository: NCAS-CMS/cf-python + path: cf-python + + - name: Checkout the current cfdm main to use as a dependency + uses: actions/checkout@v7 + with: + repository: NCAS-CMS/cfdm + path: cfdm + + # Set up Conda for scientific Python dependencies. + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v4 + with: + auto-update-conda: true + miniconda-version: "latest" + activate-environment: cf-latest + python-version: ${{ matrix.python-version }} + channels: ncas, conda-forge + + # Report the configured environment. + - name: Check conda and pip config + shell: bash -l {0} + run: | + echo "*Conda report:*" + conda info + conda list + conda config --show-sources + conda config --show + echo "*Pip report:*" + pip --version + pip list + + # Install the scientific dependencies required by cf-plot and cf-python. + - name: Install dependencies + shell: bash -l {0} + run: | + conda install -c ncas -c conda-forge cf-python udunits2 + conda install -c conda-forge mpich esmpy cartopy scipy matplotlib pytest + + # Install cfdm, cf-python and cf-plot from source. + - name: Install development versions of cf* dependencies and cf-plot + shell: bash -l {0} + run: | + cd cfdm + pip install -e . + + cd ../cf-python + pip install --no-deps -e . + + cd ../main + pip install --no-deps -e . + + - name: Notify about starting testing + run: echo "Setup complete. Now starting to run the cf-plot test suite..." + + # Run the cf-plot test suite. + - name: Run test suite + shell: bash -l {0} + working-directory: ${{ github.workspace }}/main + run: pytest tests --skip-image-comparison + + - name: Notify about a completed run + run: | + echo "The cf-plot test suite on Linux has completed." + + # Test on Intel macOS rather than ARM64, which is not compatible with + # the existing Conda installation approach. + test-on-mac: + runs-on: macos-15-intel + strategy: + fail-fast: true + matrix: + # DO NOT RUN on the latest Python, because we run this for the + # image comparison workflow so it would just be duplicating the + # same test. + python-version: ["3.11", "3.12", "3.13"] + + steps: + - name: Checkout cf-plot + uses: actions/checkout@v7 + with: + path: main + + - name: Notify about setup + run: echo "Now setting up the environment for the cf-plot test suite..." + + - name: Checkout the current cf-python main to use as a dependency + uses: actions/checkout@v7 + with: + repository: NCAS-CMS/cf-python + path: cf-python + + - name: Checkout the current cfdm main to use as a dependency + uses: actions/checkout@v7 + with: + repository: NCAS-CMS/cfdm + path: cfdm + + # Set up Conda for scientific Python dependencies. + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v4 + with: + auto-update-conda: true + miniconda-version: "latest" + activate-environment: cf-latest + python-version: ${{ matrix.python-version }} + channels: ncas, conda-forge + + # Report the configured environment. + - name: Check conda and pip config + shell: bash -l {0} + run: | + echo "*Conda report:*" + conda info + conda list + conda config --show-sources + conda config --show + echo "*Pip report:*" + pip --version + pip list + + # Install the scientific dependencies required by cf-plot and cf-python. + - name: Install dependencies + shell: bash -l {0} + run: | + conda install -c ncas -c conda-forge cf-python udunits2 + conda install -c conda-forge mpich esmpy cartopy scipy matplotlib pytest + + # Install cfunits, cfdm, cf-python and cf-plot from source. + - name: Install development versions of dependencies and cf-plot + shell: bash -l {0} + run: | + cd cfdm + pip install -e . + + cd ../cf-python + pip install --no-deps -e . + + cd ../main + pip install --no-deps -e . + + - name: Notify about starting testing + run: echo "Setup complete. Now starting to run the cf-plot test suite..." + + # Run the cf-plot test suite. + - name: Run test suite + shell: bash -l {0} + working-directory: ${{ github.workspace }}/main + run: pytest tests --skip-image-comparison + + - name: Notify about a completed run + run: | + echo "The cf-plot test suite on Mac has completed." + echo "You may now inspect the results." diff --git a/README.md b/README.md index edfc4ba2..a1e16683 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,45 @@ More detail about installation is provided on the (`https://ncas-cms.github.io/cf-plot/installation.html`) of the documentation. +### Testing + +To run the full test suite, call from the repo root: + +``` bash +$ pytest tests +``` + +Note however this calls image comparison testing on plot outputs and exact +image comparison depends on the environment (libraries and versions) used. +So they may fail if your environment differs from that which was used to +generate the reference images. Therefore, to allow like-for-like comparison, +a specific testing conda environment is provided, ``cfplot-test-env.yml``. +With this environment enabled, the image comparison should pass. Note we +recommend use of `mamba` for environment creation/solving, but `conda` +will also work. + +```console +$ # Deactivate all other environments present first +$ mamba env create --file cfplot-test-env.yml --name cfplot-test-env +$ conda activate cfplot-test-env +$ pytest tests +``` + +However you can disable this aspect with the ``--skip-image-comparison`` +or equivalently ``-I`` option to the cf-plot test suite run with `pytest`, +so that only the functional tests run. This is advised when you use any +environment other than the above, except where some library version +differs for the purpose of regression testing on that versioning change. + +```console +$ pytest tests -I +``` + +> [!NOTE] +> More comprehensive testing across different environments is under development +> but is not yet available. For now, use the reference environment to test with. + + ### Contributing Everyone is welcome to contribute to cf-plot in the form diff --git a/cfplot-test-env.yml b/cfplot-test-env.yml new file mode 100644 index 00000000..59a45c89 --- /dev/null +++ b/cfplot-test-env.yml @@ -0,0 +1,195 @@ +name: cfplot-test-env +channels: + - conda-forge + - defaults +dependencies: + - _libgcc_mutex=0.1 + - _openmp_mutex=5.1 + - aom=3.14.1 + - arrow-cpp=24.0.0 + - attr=2.5.2 + - aws-c-auth=0.10.3 + - aws-c-cal=0.9.14 + - aws-c-common=0.14.0 + - aws-c-compression=0.3.2 + - aws-c-event-stream=0.7.1 + - aws-c-http=0.11.0 + - aws-c-io=0.26.3 + - aws-c-mqtt=0.16.0 + - aws-c-s3=0.12.6 + - aws-c-sdkutils=0.2.5 + - aws-checksums=0.2.10 + - aws-crt-cpp=0.40.1 + - aws-sdk-cpp=1.11.826 + - blosc=1.21.6 + - bokeh=3.10.0 + - brotli=1.2.0 + - brotli-bin=1.2.0 + - bzip2=1.0.8 + - c-ares=1.34.8 + - ca-certificates=2026.9.25 + - cached-property=2.0.1 + - cached_property=2.0.1 + - cartopy=0.26.0 + - certifi=2026.7.22 + - cf-python=3.21.0 + - cfdm=1.13.3.0 + - cftime=1.6.5 + - cfunits=3.3.7 + - click=8.5.0 + - cloudpickle=3.1.2 + - colorama=0.4.6 + - contourpy=1.4.0 + - cuda-cudart=13.0.96 + - cuda-cudart_linux-64=13.0.96 + - cuda-version=13.0 + - cycler=0.12.1 + - cytoolz=1.2.0 + - dask=2026.8.0 + - dask-core=2026.8.0 + - distributed=2026.8.0 + - donfig=0.8.1.post1 + - exceptiongroup=1.3.1 + - fonttools=4.67.0 + - freetype=2.14.3 + - fsspec=2026.9.0 + - geos=3.14.1 + - gflags=2.3.1 + - glog=0.7.1 + - google-crc32c=1.8.0 + - h5netcdf=1.8.1 + - h5py=3.16.0 + - hdf4=4.2.15 + - hdf5=1.14.6 + - icu=73.2 + - importlib-metadata=9.0.1 + - iniconfig=2.3.1 + - jinja2=3.1.6 + - keyutils=1.6.3 + - kiwisolver=1.5.1 + - krb5=1.22.2 + - lcms2=2.19.1 + - ld_impl_linux-64=2.44 + - lerc=4.1.0 + - libabseil=20260526.0 + - libaec=1.1.5 + - libattr=2.5.2 + - libavif=1.4.2 + - libavif16=1.4.2 + - libblas=3.11.0 + - libboost=1.88.0 + - libbrotlicommon=1.2.0 + - libbrotlidec=1.2.0 + - libbrotlienc=1.2.0 + - libcblas=3.11.0 + - libcrc32c=1.1.2 + - libcurl=8.21.0 + - libdav1d7=1.5.4 + - libdeflate=1.22 + - libedit=3.1.20260512 + - libev=4.33 + - libevent=2.1.13 + - libexpat=2.9.0 + - libffi=3.4.8 + - libfreetype=2.14.3 + - libfreetype6=2.14.3 + - libgcc=15.2.0 + - libgcc-ng=15.2.0 + - libgfortran=15.2.0 + - libgfortran5=15.2.0 + - libgrpc=1.83.1 + - libiconv=1.18 + - libjpeg-turbo=3.2.0 + - liblapack=3.11.0 + - libmpdec=4.0.1 + - libnetcdf=4.9.3 + - libnghttp2=1.68.1 + - libopenblas=0.3.34 + - libopenjpeg=2.5.4 + - libpng=1.6.59 + - libprotobuf=7.35.1 + - libre2-11=2025.11.05 + - libsqlite=3.53.4 + - libssh2=1.11.1 + - libstdcxx=15.2.0 + - libstdcxx-ng=15.2.0 + - libthrift=0.23.0 + - libtiff=4.7.2 + - libudunits2=2.2.28 + - libutf8proc=2.11.3 + - libuuid=1.41.5 + - libwebp-base=1.6.0 + - libxcb=1.17.0 + - libxml2=2.13.9 + - libzip=1.12.1 + - libzlib=1.3.2 + - locket=1.0.0 + - lz4=4.4.5 + - lz4-c=1.9.4 + - markupsafe=3.0.4 + - matplotlib-base=3.11.2 + - msgpack-python=1.2.3 + - msgspec=0.22.0 + - munkres=1.1.4 + - narwhals=2.27.1 + - ncurses=6.6 + - netcdf4=1.7.3 + - numcodecs=0.17.0 + - numpy=2.5.4 + - openssl=3.6.5 + - orc=2.2.0 + - packaging=26.3 + - pandas=3.0.6 + - partd=1.4.2 + - pillow=12.3.0 + - pip=26.2.1 + - pluggy=1.7.0 + - proj=9.8.1 + - psutil=7.2.2 + - pthread-stubs=0.3 + - pyarrow=24.0.0 + - pyfive=1.2.1 + - pygments=2.21.0 + - pyparsing=3.3.3 + - pyproj=3.8.0 + - pyshp=3.1.6 + - pytest=9.1.1 + - python=3.14.8 + - python-dateutil=2.9.0.post0 + - python_abi=3.14 + - pyyaml=6.0.3 + - rav1e=0.8.1 + - re2=2025.11.05 + - readline=8.3 + - s2n=1.7.4 + - scipy=1.18.0 + - shapely=2.2.0 + - six=1.17.0 + - snappy=1.2.2 + - sortedcontainers=2.4.0 + - sqlite=3.53.4 + - svt-av1=4.2.0 + - tblib=3.2.2 + - tk=9.0.4 + - tomli=2.5.0 + - toolz=1.2.0 + - tornado=6.5.10 + - typing_extensions=4.16.0 + - tzdata=2026c + - udunits2=2.2.28 + - umfive=0.4.0 + - uritools=6.1.3 + - xarray=2026.9.0 + - xnetcdf=0.1.0 + - xorg-libx11=1.8.13 + - xorg-libxau=1.0.12 + - xorg-libxdmcp=1.1.5 + - xorg-xorgproto=2025.1 + - xyzservices=2026.9.1 + - xz=5.8.4 + - yaml=0.2.5 + - zarr=3.4.1 + - zict=3.0.0 + - zipp=4.1.1 + - zlib=1.3.2 + - zstd=1.5.7 diff --git a/tests/conftest.py b/tests/conftest.py index 15e5c2a0..0eec97ae 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,8 +3,33 @@ import sys from pathlib import Path +import pytest + # Ensure tests import the current checkout before any site-packages install. REPO_ROOT = Path(__file__).resolve().parents[1] repo_root_str = str(REPO_ROOT) if sys.path[0] != repo_root_str: sys.path.insert(0, repo_root_str) + + +def pytest_addoption(parser): + """Add options for skipping certain aspects of testing, etc.""" + parser.addoption( + "--skip-image-comparison", + "-I", + action="store_true", + default=False, + help="Skip reference image comparison while running tests.", + ) + + +@pytest.fixture(autouse=True) +def skip_image_comparison(request, monkeypatch): + """Optionally skip reference image comparisons.""" + if request.config.getoption("--skip-image-comparison"): + monkeypatch.setattr( + request.module, + "_assert_reference_match", + lambda example_id: None, + raising=False, + ) diff --git a/tests/integration/test_advanced_plot_examples.py b/tests/integration/test_advanced_plot_examples.py index 36425459..a9ec922c 100644 --- a/tests/integration/test_advanced_plot_examples.py +++ b/tests/integration/test_advanced_plot_examples.py @@ -26,7 +26,7 @@ TEST_GEN_DIR = ( Path(__file__).parent.parent.parent / "generated-example-images-adv" ) -REF_IMAGE_DIR = Path(__file__).parent.parent / "reference-example-images" +REF_IMAGE_DIR = Path(__file__).parent.parent / "v350-controlled-env-ref-images" TEST_GEN_DIR.mkdir(parents=True, exist_ok=True) diff --git a/tests/integration/test_contour_plot_examples.py b/tests/integration/test_contour_plot_examples.py index b3ac9721..090ecbee 100644 --- a/tests/integration/test_contour_plot_examples.py +++ b/tests/integration/test_contour_plot_examples.py @@ -26,7 +26,7 @@ TEST_GEN_DIR = ( Path(__file__).parent.parent.parent / "generated-example-images-cont" ) -REF_IMAGE_DIR = Path(__file__).parent.parent / "reference-example-images" +REF_IMAGE_DIR = Path(__file__).parent.parent / "v350-controlled-env-ref-images" LOCAL_DATA_DIR = Path(__file__).parent.parent / "data" TEST_GEN_DIR.mkdir(parents=True, exist_ok=True) diff --git a/tests/v350-controlled-env-ref-images/ref_fig_1.png b/tests/v350-controlled-env-ref-images/ref_fig_1.png new file mode 100644 index 00000000..d1dbe5dc Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_1.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_10.png b/tests/v350-controlled-env-ref-images/ref_fig_10.png new file mode 100644 index 00000000..cfd3807f Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_10.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_11.png b/tests/v350-controlled-env-ref-images/ref_fig_11.png new file mode 100644 index 00000000..65e6ffbc Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_11.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_12.png b/tests/v350-controlled-env-ref-images/ref_fig_12.png new file mode 100644 index 00000000..82763e1a Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_12.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_13.png b/tests/v350-controlled-env-ref-images/ref_fig_13.png new file mode 100644 index 00000000..a7a9979e Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_13.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_14.png b/tests/v350-controlled-env-ref-images/ref_fig_14.png new file mode 100644 index 00000000..a67d4522 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_14.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_15.png b/tests/v350-controlled-env-ref-images/ref_fig_15.png new file mode 100644 index 00000000..7c450c32 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_15.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_16a.png b/tests/v350-controlled-env-ref-images/ref_fig_16a.png new file mode 100644 index 00000000..d4e8e47d Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_16a.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_16b.png b/tests/v350-controlled-env-ref-images/ref_fig_16b.png new file mode 100644 index 00000000..34f4e6c1 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_16b.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_16c.png b/tests/v350-controlled-env-ref-images/ref_fig_16c.png new file mode 100644 index 00000000..ccbcfc9e Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_16c.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_17.png b/tests/v350-controlled-env-ref-images/ref_fig_17.png new file mode 100644 index 00000000..3173c76d Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_17.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_18.png b/tests/v350-controlled-env-ref-images/ref_fig_18.png new file mode 100644 index 00000000..afca4f41 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_18.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_19.png b/tests/v350-controlled-env-ref-images/ref_fig_19.png new file mode 100644 index 00000000..ff5d089c Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_19.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_19a.png b/tests/v350-controlled-env-ref-images/ref_fig_19a.png new file mode 100644 index 00000000..547fa933 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_19a.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_2.png b/tests/v350-controlled-env-ref-images/ref_fig_2.png new file mode 100644 index 00000000..790c4efb Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_2.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_20.png b/tests/v350-controlled-env-ref-images/ref_fig_20.png new file mode 100644 index 00000000..567ae189 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_20.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_21.png b/tests/v350-controlled-env-ref-images/ref_fig_21.png new file mode 100644 index 00000000..8ec1164a Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_21.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_21other.png b/tests/v350-controlled-env-ref-images/ref_fig_21other.png new file mode 100644 index 00000000..dad714c0 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_21other.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_22.png b/tests/v350-controlled-env-ref-images/ref_fig_22.png new file mode 100644 index 00000000..8bd9174d Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_22.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_23.png b/tests/v350-controlled-env-ref-images/ref_fig_23.png new file mode 100644 index 00000000..55ca5cc3 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_23.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_23other.png b/tests/v350-controlled-env-ref-images/ref_fig_23other.png new file mode 100644 index 00000000..c89e37d1 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_23other.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_27.png b/tests/v350-controlled-env-ref-images/ref_fig_27.png new file mode 100644 index 00000000..dde39887 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_27.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_28.png b/tests/v350-controlled-env-ref-images/ref_fig_28.png new file mode 100644 index 00000000..58a1a150 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_28.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_29.png b/tests/v350-controlled-env-ref-images/ref_fig_29.png new file mode 100644 index 00000000..3ab80baa Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_29.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_3.png b/tests/v350-controlled-env-ref-images/ref_fig_3.png new file mode 100644 index 00000000..3627fb4f Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_3.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_30.png b/tests/v350-controlled-env-ref-images/ref_fig_30.png new file mode 100644 index 00000000..b144aaa9 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_30.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_31.png b/tests/v350-controlled-env-ref-images/ref_fig_31.png new file mode 100644 index 00000000..5793b1c8 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_31.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_33.png b/tests/v350-controlled-env-ref-images/ref_fig_33.png new file mode 100644 index 00000000..97bcd4ed Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_33.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_34.png b/tests/v350-controlled-env-ref-images/ref_fig_34.png new file mode 100644 index 00000000..9cab5602 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_34.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_35.png b/tests/v350-controlled-env-ref-images/ref_fig_35.png new file mode 100644 index 00000000..a589b826 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_35.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_36.png b/tests/v350-controlled-env-ref-images/ref_fig_36.png new file mode 100644 index 00000000..48cb6d49 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_36.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_37.png b/tests/v350-controlled-env-ref-images/ref_fig_37.png new file mode 100644 index 00000000..80e102c1 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_37.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_37b.png b/tests/v350-controlled-env-ref-images/ref_fig_37b.png new file mode 100644 index 00000000..3b8f6954 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_37b.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_38.png b/tests/v350-controlled-env-ref-images/ref_fig_38.png new file mode 100644 index 00000000..8e8e49e7 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_38.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_39.png b/tests/v350-controlled-env-ref-images/ref_fig_39.png new file mode 100644 index 00000000..1e66b222 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_39.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_39b.png b/tests/v350-controlled-env-ref-images/ref_fig_39b.png new file mode 100644 index 00000000..953a76d9 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_39b.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_4.png b/tests/v350-controlled-env-ref-images/ref_fig_4.png new file mode 100644 index 00000000..5802b577 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_4.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_40.png b/tests/v350-controlled-env-ref-images/ref_fig_40.png new file mode 100644 index 00000000..cc06fb61 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_40.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_41.png b/tests/v350-controlled-env-ref-images/ref_fig_41.png new file mode 100644 index 00000000..a446d7d6 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_41.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_42a.png b/tests/v350-controlled-env-ref-images/ref_fig_42a.png new file mode 100644 index 00000000..1d243bd9 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_42a.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_42b.png b/tests/v350-controlled-env-ref-images/ref_fig_42b.png new file mode 100644 index 00000000..cf06a793 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_42b.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_5.png b/tests/v350-controlled-env-ref-images/ref_fig_5.png new file mode 100644 index 00000000..00c041ec Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_5.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_6.png b/tests/v350-controlled-env-ref-images/ref_fig_6.png new file mode 100644 index 00000000..a42201f8 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_6.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_7.png b/tests/v350-controlled-env-ref-images/ref_fig_7.png new file mode 100644 index 00000000..4c0275c5 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_7.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_8.png b/tests/v350-controlled-env-ref-images/ref_fig_8.png new file mode 100644 index 00000000..5f9a0766 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_8.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_9.png b/tests/v350-controlled-env-ref-images/ref_fig_9.png new file mode 100644 index 00000000..350da663 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_9.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_canari_1.png b/tests/v350-controlled-env-ref-images/ref_fig_canari_1.png new file mode 100644 index 00000000..67b53e12 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_canari_1.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_npstere_da193.png b/tests/v350-controlled-env-ref-images/ref_fig_npstere_da193.png new file mode 100644 index 00000000..6e7135ab Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_npstere_da193.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_numpy.png b/tests/v350-controlled-env-ref-images/ref_fig_numpy.png new file mode 100644 index 00000000..774b67d1 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_numpy.png differ diff --git a/tests/v350-controlled-env-ref-images/ref_fig_seaice_ortho_bbox.png b/tests/v350-controlled-env-ref-images/ref_fig_seaice_ortho_bbox.png new file mode 100644 index 00000000..720f2208 Binary files /dev/null and b/tests/v350-controlled-env-ref-images/ref_fig_seaice_ortho_bbox.png differ