mirror of
https://github.com/gulrak/filesystem.git
synced 2025-12-07 01:06:38 +08:00
Compare commits
198 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fda7b0afb | ||
|
|
076592ce6e | ||
|
|
157feb3651 | ||
|
|
f08e8b0064 | ||
|
|
99c3500205 | ||
|
|
f43846877b | ||
|
|
b1982f06c8 | ||
|
|
fbc5d213fc | ||
|
|
72a03b3c6d | ||
|
|
9fe68b91c7 | ||
|
|
56776c92f7 | ||
|
|
42ea4fc615 | ||
|
|
eeed314237 | ||
|
|
768b5cb11b | ||
|
|
2fc4b46375 | ||
|
|
fc19b58459 | ||
|
|
f19cbbbd31 | ||
|
|
0ef214a7a0 | ||
|
|
fcea331ebb | ||
|
|
1ab54e53cc | ||
|
|
58e983167c | ||
|
|
c4683aa4a1 | ||
|
|
144954ff4e | ||
|
|
48d46cccef | ||
|
|
23710d3b56 | ||
|
|
64f9c5a61a | ||
|
|
a55c96a2ba | ||
|
|
aaaf381d9d | ||
|
|
72a76d774e | ||
|
|
e5ae1bd3e3 | ||
|
|
8a2edd6d92 | ||
|
|
e9e32f8830 | ||
|
|
9f61ee0eb5 | ||
|
|
d1f0d79054 | ||
|
|
61176cd82a | ||
|
|
78b746d901 | ||
|
|
9df22d5396 | ||
|
|
9ffca3839f | ||
|
|
2a81c2c355 | ||
|
|
e3341b2f64 | ||
|
|
6a94e84da4 | ||
|
|
a7a6d930fb | ||
|
|
7da9be91c9 | ||
|
|
e6b34e29bf | ||
|
|
b1ff2ce95e | ||
|
|
3afbd9c315 | ||
|
|
de64decd91 | ||
|
|
f3c1058928 | ||
|
|
f3033c29fb | ||
|
|
4041174f96 | ||
|
|
c8113e14b1 | ||
|
|
b6d302f5b9 | ||
|
|
efc077f553 | ||
|
|
bc05cc59f4 | ||
|
|
a9c18e0880 | ||
|
|
9afb43851d | ||
|
|
c57242b4bc | ||
|
|
3337cc252a | ||
|
|
655b0b354a | ||
|
|
f0caeb7d58 | ||
|
|
6c6f2c2ec0 | ||
|
|
3e5b930d96 | ||
|
|
d3d968e583 | ||
|
|
404c57f1b0 | ||
|
|
4c33b91fe9 | ||
|
|
089ef64aa3 | ||
|
|
4f0824fd76 | ||
|
|
28f7c929e0 | ||
|
|
ab8a78d806 | ||
|
|
f6d7d5b826 | ||
|
|
cd6805e94d | ||
|
|
6cc60fb687 | ||
|
|
fb4bb2b764 | ||
|
|
c4907cc681 | ||
|
|
5d1d579048 | ||
|
|
7fa1bde113 | ||
|
|
7a53650e73 | ||
|
|
1ae0195287 | ||
|
|
e5bbc754e7 | ||
|
|
977e5d6284 | ||
|
|
723c787b9e | ||
|
|
91e71f7f54 | ||
|
|
c4b507e9d8 | ||
|
|
e8a17c1319 | ||
|
|
d4e12344d6 | ||
|
|
f437344e79 | ||
|
|
f0467f4384 | ||
|
|
a07ddedeae | ||
|
|
614bbe87b8 | ||
|
|
09908b7241 | ||
|
|
1dbe2d9bec | ||
|
|
7b8cf519f2 | ||
|
|
d279a4f73d | ||
|
|
97d7fa8d10 | ||
|
|
1f3943b1c4 | ||
|
|
6a835afddf | ||
|
|
7bc5c17305 | ||
|
|
924d84acf0 | ||
|
|
d87ac130cf | ||
|
|
1d3d5f5d7d | ||
|
|
6fad24ecb9 | ||
|
|
b3d9a50bb5 | ||
|
|
cd68567543 | ||
|
|
15e814e820 | ||
|
|
4e21ab3057 | ||
|
|
a0e5e43c90 | ||
|
|
c029736d27 | ||
|
|
19d0c63c29 | ||
|
|
e402bad9b8 | ||
|
|
51d62f88bb | ||
|
|
231b64fec0 | ||
|
|
31665c040a | ||
|
|
70cf2f03ba | ||
|
|
d0b13bbc8e | ||
|
|
05a41f6dae | ||
|
|
9c6ff202e7 | ||
|
|
a697b05dd7 | ||
|
|
cf4e05d42f | ||
|
|
e51e6ee46b | ||
|
|
873a55addf | ||
|
|
7e009bcf6f | ||
|
|
e65a6baf76 | ||
|
|
37442cc5ea | ||
|
|
134dffdcbd | ||
|
|
777e3c9a34 | ||
|
|
22d1133ea5 | ||
|
|
b9faee7f5d | ||
|
|
7fb50217da | ||
|
|
6ab0cb2844 | ||
|
|
fc875735dd | ||
|
|
6dc4ece24b | ||
|
|
494e751709 | ||
|
|
76c3966df4 | ||
|
|
2a8b380f8d | ||
|
|
c29d535bb5 | ||
|
|
865f09be7b | ||
|
|
fd9bb43015 | ||
|
|
9092e09c99 | ||
|
|
1037c02950 | ||
|
|
b82066f27e | ||
|
|
d768b60d49 | ||
|
|
b8cff0c99c | ||
|
|
828062889a | ||
|
|
67e708cc4f | ||
|
|
399941fe55 | ||
|
|
8d45dc4d41 | ||
|
|
0858444609 | ||
|
|
7b6b600fd1 | ||
|
|
b15977a05a | ||
|
|
dbf882b124 | ||
|
|
6033320a1a | ||
|
|
2a7ebf36c0 | ||
|
|
f86be09be3 | ||
|
|
f37cdd5af5 | ||
|
|
264445eaee | ||
|
|
5c02ca36b4 | ||
|
|
8a19af1f63 | ||
|
|
bc69aa355c | ||
|
|
f98478c33b | ||
|
|
0e5f2f5d1b | ||
|
|
b78b0239a3 | ||
|
|
daf0e7dfbf | ||
|
|
34fe1e314a | ||
|
|
011e039c4b | ||
|
|
799fcb4d4d | ||
|
|
31ea91b7bd | ||
|
|
57f3186ee2 | ||
|
|
0d109a7666 | ||
|
|
402f462062 | ||
|
|
77a8df068d | ||
|
|
88f9c3613a | ||
|
|
2dbb71acae | ||
|
|
2298e68d5c | ||
|
|
0f6f0af4b4 | ||
|
|
3d3c02ce35 | ||
|
|
9970d3354f | ||
|
|
306ad540ed | ||
|
|
967c563d07 | ||
|
|
c1fcd93c29 | ||
|
|
8353715199 | ||
|
|
fdf5bb0179 | ||
|
|
05f0aa8ae1 | ||
|
|
4e0a591a59 | ||
|
|
9e3d42fd72 | ||
|
|
75c647f327 | ||
|
|
ff271edfee | ||
|
|
6699f6a3da | ||
|
|
3eddea2ea8 | ||
|
|
4944a87e18 | ||
|
|
a7abc2ad4a | ||
|
|
c96b0059c3 | ||
|
|
8fac7e5254 | ||
|
|
b869b9fc4b | ||
|
|
973abff4b9 | ||
|
|
de57485877 | ||
|
|
0dde29d260 | ||
|
|
6bf13c0ce1 | ||
|
|
9206877fc8 |
27
.cirrus.yml
27
.cirrus.yml
@ -1,6 +1,6 @@
|
|||||||
freebsd_task:
|
freebsd_task:
|
||||||
freebsd_instance:
|
freebsd_instance:
|
||||||
image_family: freebsd-12-1
|
image_family: freebsd-14-0
|
||||||
install_script: |
|
install_script: |
|
||||||
pkg install -y cmake
|
pkg install -y cmake
|
||||||
pw groupadd testgrp
|
pw groupadd testgrp
|
||||||
@ -11,25 +11,24 @@ freebsd_task:
|
|||||||
test_script: |
|
test_script: |
|
||||||
sudo -u testuser .ci/unix-test.sh
|
sudo -u testuser .ci/unix-test.sh
|
||||||
|
|
||||||
centos7_task:
|
rockylinux8_task:
|
||||||
container:
|
container:
|
||||||
image: centos:7
|
image: docker.io/rockylinux:8
|
||||||
install_script: |
|
install_script: |
|
||||||
yum install -y centos-release-scl
|
dnf group install -y "Development Tools"
|
||||||
yum install -y devtoolset-9
|
dnf install cmake -y
|
||||||
curl -L https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-Linux-x86_64.tar.gz | tar xzvf - -C /usr/local --strip-components 1
|
|
||||||
build_script: |
|
build_script: |
|
||||||
source /opt/rh/devtoolset-9/enable && PATH=$PATH:/usr/local/bin .ci/unix-build.sh
|
.ci/unix-build.sh
|
||||||
test_script: |
|
test_script: |
|
||||||
PATH=$PATH:/usr/local/bin .ci/unix-test.sh
|
.ci/unix-test.sh
|
||||||
|
|
||||||
centos8_task:
|
rockylinux9_task:
|
||||||
container:
|
container:
|
||||||
image: centos:8
|
image: docker.io/rockylinux:9
|
||||||
install_script: |
|
install_script: |
|
||||||
yum group install -y "Development Tools"
|
dnf group install -y "Development Tools"
|
||||||
curl -L https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-Linux-x86_64.tar.gz | tar xzvf - -C /usr/local --strip-components 1
|
dnf install cmake -y
|
||||||
build_script: |
|
build_script: |
|
||||||
PATH=$PATH:/usr/local/bin .ci/unix-build.sh
|
.ci/unix-build.sh
|
||||||
test_script: |
|
test_script: |
|
||||||
PATH=$PATH:/usr/local/bin .ci/unix-test.sh
|
.ci/unix-test.sh
|
||||||
|
|||||||
170
.github/workflows/build_cmake.yml
vendored
Normal file
170
.github/workflows/build_cmake.yml
vendored
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
name: CMake Build Matrix
|
||||||
|
|
||||||
|
on: [ push, pull_request ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.config.name }}
|
||||||
|
runs-on: ${{ matrix.config.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
config:
|
||||||
|
- name: "Ubuntu 22.04 GCC 11"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja-build
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: gcc
|
||||||
|
cxx: g++
|
||||||
|
|
||||||
|
- name: "Ubuntu 22.04 Clang 13.0"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja-build libc++-13-dev libc++abi-13-dev
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: clang-13
|
||||||
|
cxx: clang++-13
|
||||||
|
|
||||||
|
- name: "Ubuntu 22.04 Clang 15.0"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja-build libc++-15-dev libc++abi-15-dev
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: clang-15
|
||||||
|
cxx: clang++-15
|
||||||
|
|
||||||
|
- name: "Ubuntu 22.04 GCC 11 coverage"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
build_type: Debug
|
||||||
|
packages: ninja-build lcov
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: gcc
|
||||||
|
cxx: g++
|
||||||
|
|
||||||
|
- name: "Ubuntu 20.04 GCC 9.3"
|
||||||
|
os: ubuntu-20.04
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja-build
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: gcc
|
||||||
|
cxx: g++
|
||||||
|
|
||||||
|
- name: "Ubuntu 20.04 Clang 10.0"
|
||||||
|
os: ubuntu-20.04
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja-build
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: clang-10
|
||||||
|
cxx: clang++-10
|
||||||
|
|
||||||
|
- name: "Ubuntu 20.04 Clang 11.0"
|
||||||
|
os: ubuntu-20.04
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja-build clang-11 libc++-11-dev libc++abi-11-dev
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: clang-11
|
||||||
|
cxx: clang++-11
|
||||||
|
|
||||||
|
- name: "Ubuntu 20.04 GCC 9.3 coverage"
|
||||||
|
os: ubuntu-20.04
|
||||||
|
build_type: Debug
|
||||||
|
packages: ninja-build lcov
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: gcc
|
||||||
|
cxx: g++
|
||||||
|
|
||||||
|
- name: "Windows MSVC 2019"
|
||||||
|
os: windows-2019
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja
|
||||||
|
generator: "Visual Studio 16 2019"
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: cl
|
||||||
|
cxx: cl
|
||||||
|
|
||||||
|
- name: "macOS 13 AppleClang"
|
||||||
|
os: macos-13
|
||||||
|
build_type: Release
|
||||||
|
packages: ninja
|
||||||
|
generator: Ninja
|
||||||
|
compatibility: "cxx_std_11;cxx_std_17;cxx_std_20"
|
||||||
|
cc: clang
|
||||||
|
cxx: clang++
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: print environment
|
||||||
|
run: |
|
||||||
|
echo github.event.action: ${{ github.event.action }}
|
||||||
|
echo github.event_name: ${{ github.event_name }}
|
||||||
|
|
||||||
|
- name: Install dependencies on Ubuntu
|
||||||
|
if: startsWith(matrix.config.os, 'ubuntu')
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install ${{ matrix.config.packages }}
|
||||||
|
|
||||||
|
- name: Install dependencies on windows
|
||||||
|
if: startsWith(matrix.config.os, 'windows')
|
||||||
|
run: |
|
||||||
|
choco install ${{ matrix.config.packages }}
|
||||||
|
|
||||||
|
- name: Install dependencies on macOS
|
||||||
|
if: startsWith(matrix.config.os, 'macos')
|
||||||
|
run: |
|
||||||
|
brew install ${{ matrix.config.packages }}
|
||||||
|
|
||||||
|
- name: Configure project
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
export CC=${{ matrix.config.cc }}
|
||||||
|
export CXX=${{ matrix.config.cxx }}
|
||||||
|
ninja --version
|
||||||
|
cmake --version
|
||||||
|
mkdir build
|
||||||
|
mkdir install
|
||||||
|
if [[ "${{ matrix.config.build_type }}" == "Debug" ]]; then
|
||||||
|
cmake -G "${{ matrix.config.generator }}" -S . -B build -DCMAKE_BUILD_TYPE=Debug -DGHC_COVERAGE=ON -DGHC_FILESYSTEM_TEST_COMPILE_FEATURES="${{ matrix.config.compatibility }}" -DCMAKE_INSTALL_PREFIX:PATH=install
|
||||||
|
else
|
||||||
|
cmake -G "${{ matrix.config.generator }}" -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} -DGHC_FILESYSTEM_TEST_COMPILE_FEATURES="${{ matrix.config.compatibility }}" -DCMAKE_INSTALL_PREFIX:PATH=install
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Build project
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cmake --build build --config ${{ matrix.config.build_type }}
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
cd build && ctest -C ${{ matrix.config.build_type }}
|
||||||
|
|
||||||
|
- name: Collect coverage info
|
||||||
|
if: startsWith(matrix.config.build_type, 'Debug')
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
lcov --compat-libtool --directory . --capture --output-file coverage_output.info
|
||||||
|
lcov --remove coverage_output.info '/usr/*' '*/c++/*' '*.h' '*/catch.hpp' -o coverage.info
|
||||||
|
# sed -i 's|SF:/.*/filesystem/|SF:../|g' coverage.info
|
||||||
|
|
||||||
|
- name: Upload coverage info
|
||||||
|
if: startsWith(matrix.config.build_type, 'Debug')
|
||||||
|
env:
|
||||||
|
COVERALLS_DEBUG: true
|
||||||
|
NODE_COVERALLS_DEBUG: 1
|
||||||
|
uses: coverallsapp/github-action@master
|
||||||
|
with:
|
||||||
|
path-to-lcov: ${{ github.workspace }}/build/coverage.info
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
100
.travis.yml
100
.travis.yml
@ -1,100 +0,0 @@
|
|||||||
language: cpp
|
|
||||||
|
|
||||||
dist: xenial # default distribution
|
|
||||||
os: linux # default os
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
include:
|
|
||||||
- env: MATRIX_EVAL="CC=gcc-5 && CXX=g++-5 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["g++-5"], sources: ["ubuntu-toolchain-r-test"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=gcc-6 && CXX=g++-6 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["g++-6"], sources: ["ubuntu-toolchain-r-test"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["g++-7"], sources: ["ubuntu-toolchain-r-test"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && GENERATOR='Unix Makefiles' && CONFIG=Debug && GHC_COVERAGE=1"
|
|
||||||
addons: { apt: { packages: ["g++-7", "lcov"], sources: ["ubuntu-toolchain-r-test"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=gcc-8 && CXX=g++-8 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["g++-8"], sources: ["ubuntu-toolchain-r-test"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=gcc-9 && CXX=g++-9 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["g++-9"], sources: ["ubuntu-toolchain-r-test"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["clang-5.0"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["clang-6.0"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=clang-7 && CXX=clang++-7 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["clang-7", "libc++-7-dev", "libc++abi-7-dev"], sources: ["llvm-toolchain-xenial-7"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=clang-8 && CXX=clang++-8 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["clang-8", "libc++-8-dev", "libc++abi-8-dev"], sources: ["llvm-toolchain-xenial-8"] } }
|
|
||||||
|
|
||||||
- env: MATRIX_EVAL="CC=clang-9 && CXX=clang++-9 && GENERATOR='Unix Makefiles' && CONFIG=Release"
|
|
||||||
addons: { apt: { packages: ["clang-9", "libc++-9-dev", "libc++abi-9-dev"], sources: [{sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main', key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'}] } }
|
|
||||||
|
|
||||||
- os: osx
|
|
||||||
env: MATRIX_EVAL="CC=clang && CXX=clang++ && GENERATOR=Xcode && CONFIG=Release"
|
|
||||||
osx_image: xcode9.2
|
|
||||||
|
|
||||||
- os: osx
|
|
||||||
env: MATRIX_EVAL="CC=clang && CXX=clang++ && GENERATOR=Xcode && CONFIG=Release"
|
|
||||||
osx_image: xcode10.1
|
|
||||||
|
|
||||||
- os: osx
|
|
||||||
env: MATRIX_EVAL="CC=clang && CXX=clang++ && GENERATOR=Xcode && CONFIG=Release"
|
|
||||||
osx_image: xcode11.3
|
|
||||||
|
|
||||||
install:
|
|
||||||
- eval "${MATRIX_EVAL}"
|
|
||||||
- |
|
|
||||||
if [ "${GHC_COVERAGE}" = "1" ]; then
|
|
||||||
gem install coveralls-lcov
|
|
||||||
fi
|
|
||||||
- $CC --version
|
|
||||||
- $CXX --version
|
|
||||||
- cmake --version
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- eval "${MATRIX_EVAL}"
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- export VERBOSE=1
|
|
||||||
- |
|
|
||||||
if [ "${CONFIG}" = "Debug" ]; then
|
|
||||||
cmake -G"${GENERATOR}" -DCMAKE_CXX_COMPILER=${CXX} -DCMAKE_C_COMPILER=${CC} -DCMAKE_BUILD_TYPE=${CONFIG} -DGHC_COVERAGE=ON ..
|
|
||||||
else
|
|
||||||
cmake -G"${GENERATOR}" -DCMAKE_CXX_COMPILER=${CXX} -DCMAKE_C_COMPILER=${CC} -DCMAKE_BUILD_TYPE=${CONFIG} ..
|
|
||||||
fi
|
|
||||||
|
|
||||||
script:
|
|
||||||
- export VERBOSE=1
|
|
||||||
- cmake --build . --config ${CONFIG} --target filesystem_test
|
|
||||||
- |
|
|
||||||
if [ "${GHC_COVERAGE}" = "1" ]; then
|
|
||||||
cmake --build . --config ${CONFIG} --target filesystem_test
|
|
||||||
test/filesystem_test
|
|
||||||
else
|
|
||||||
cmake --build . --config ${CONFIG}
|
|
||||||
ctest -C ${CONFIG} -E Windows
|
|
||||||
if [ -f "test/std_filesystem_test" ]; then
|
|
||||||
test/std_filesystem_test || true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- |
|
|
||||||
if [ "${GHC_COVERAGE}" = "1" ]; then
|
|
||||||
lcov --compat-libtool --directory . --capture --output-file coverage_output.info
|
|
||||||
lcov --remove coverage_output.info '/usr/*' '*/c++/*' '*.h' '*/catch.hpp' -o coverage.info
|
|
||||||
sed -i 's|SF:/.*/filesystem/|SF:../|g' coverage.info
|
|
||||||
coveralls-lcov coverage.info
|
|
||||||
fi
|
|
||||||
@ -1,41 +1,55 @@
|
|||||||
cmake_minimum_required(VERSION 3.7.2)
|
cmake_minimum_required(VERSION 3.7.2)
|
||||||
project(ghcfilesystem)
|
project(
|
||||||
|
ghcfilesystem,
|
||||||
|
VERSION 1.5.15
|
||||||
|
)
|
||||||
|
|
||||||
|
if (POLICY CMP0077)
|
||||||
|
cmake_policy(SET CMP0077 NEW)
|
||||||
|
endif()
|
||||||
if(POLICY CMP0110)
|
if(POLICY CMP0110)
|
||||||
cmake_policy(PUSH)
|
cmake_policy(SET CMP0110 NEW)
|
||||||
cmake_policy(SET CMP0110 OLD)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(CMakeDependentOption)
|
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
||||||
|
option(GHC_FILESYSTEM_BUILD_TESTING "Enable tests" ON)
|
||||||
cmake_dependent_option(GHC_FILESYSTEM_BUILD_TESTING
|
option(GHC_FILESYSTEM_BUILD_EXAMPLES "Build examples" ON)
|
||||||
"Enable tests" ON
|
option(GHC_FILESYSTEM_WITH_INSTALL "With install target" ON)
|
||||||
"CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
|
else()
|
||||||
cmake_dependent_option(GHC_FILESYSTEM_BUILD_EXAMPLES
|
option(GHC_FILESYSTEM_BUILD_EXAMPLES "Build examples" OFF)
|
||||||
"Build examples" ON
|
option(GHC_FILESYSTEM_BUILD_TESTING "Enable tests" OFF)
|
||||||
"CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
|
option(GHC_FILESYSTEM_WITH_INSTALL "With install target" OFF)
|
||||||
cmake_dependent_option(GHC_FILESYSTEM_WITH_INSTALL
|
endif()
|
||||||
"With install target" ON
|
option(GHC_FILESYSTEM_BUILD_STD_TESTING "Enable STD tests" ${GHC_FILESYSTEM_BUILD_TESTING})
|
||||||
"CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
|
if(NOT DEFINED GHC_FILESYSTEM_TEST_COMPILE_FEATURES)
|
||||||
|
set(GHC_FILESYSTEM_TEST_COMPILE_FEATURES ${CMAKE_CXX_COMPILE_FEATURES})
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_CXX_STANDARD)
|
if(NOT DEFINED CMAKE_CXX_STANDARD)
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
if(NOT CYGWIN)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_CXX_STANDARD LESS 11)
|
if(CMAKE_CXX_STANDARD LESS 11)
|
||||||
message(FATAL_ERROR "CMAKE_CXX_STANDARD is less than 11, ghc::filesystem only works with C++11 and above.")
|
message(FATAL_ERROR "CMAKE_CXX_STANDARD is less than 11, ghc::filesystem only works with C++11 and above.")
|
||||||
endif()
|
endif()
|
||||||
|
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
||||||
|
message(STATUS "System name: ${CMAKE_SYSTEM_NAME}")
|
||||||
|
message(STATUS "Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
|
||||||
|
message(STATUS "CMAKE_CXX_COMPILE_FEATURES: ${CMAKE_CXX_COMPILE_FEATURES}")
|
||||||
|
endif()
|
||||||
|
|
||||||
add_library(ghc_filesystem INTERFACE)
|
add_library(ghc_filesystem INTERFACE)
|
||||||
|
add_library(ghcFilesystem::ghc_filesystem ALIAS ghc_filesystem)
|
||||||
target_include_directories(ghc_filesystem INTERFACE
|
target_include_directories(ghc_filesystem INTERFACE
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
$<INSTALL_INTERFACE:include>)
|
$<INSTALL_INTERFACE:include>)
|
||||||
target_compile_options(ghc_filesystem INTERFACE "$<$<C_COMPILER_ID:MSVC>:/utf-8>")
|
target_compile_options(ghc_filesystem INTERFACE "$<$<C_COMPILER_ID:MSVC>:/utf-8>")
|
||||||
target_compile_options(ghc_filesystem INTERFACE "$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
|
target_compile_options(ghc_filesystem INTERFACE "$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
|
||||||
|
|
||||||
get_directory_property(hasParent PARENT_DIRECTORY)
|
if(GHC_FILESYSTEM_BUILD_TESTING OR GHC_FILESYSTEM_BUILD_EXAMPLES)
|
||||||
if(NOT hasParent)
|
|
||||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
|
||||||
include(GhcHelper)
|
include(GhcHelper)
|
||||||
@ -53,12 +67,24 @@ endif()
|
|||||||
if(GHC_FILESYSTEM_WITH_INSTALL)
|
if(GHC_FILESYSTEM_WITH_INSTALL)
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||||
install(TARGETS ghc_filesystem EXPORT ghcFilesystemConfig)
|
install(TARGETS ghc_filesystem EXPORT ghc_filesystem-targets)
|
||||||
install(EXPORT ghcFilesystemConfig NAMESPACE ghcFilesystem:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ghcFilesystem)
|
install(EXPORT ghc_filesystem-targets NAMESPACE ghcFilesystem:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ghc_filesystem")
|
||||||
endif()
|
export(EXPORT ghc_filesystem-targets NAMESPACE ghcFilesystem:: FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/ghc_filesystem-targets.cmake")
|
||||||
|
configure_package_config_file(
|
||||||
if(POLICY CMP0110)
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.cmake.in"
|
||||||
cmake_policy(POP)
|
"${PROJECT_BINARY_DIR}/cmake/ghc_filesystem-config.cmake"
|
||||||
|
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ghc_filesystem"
|
||||||
|
PATH_VARS CMAKE_INSTALL_INCLUDEDIR)
|
||||||
|
write_basic_package_version_file(
|
||||||
|
"${PROJECT_BINARY_DIR}/cmake/ghc_filesystem-config-version.cmake"
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
COMPATIBILITY SameMinorVersion
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
"${PROJECT_BINARY_DIR}/cmake/ghc_filesystem-config.cmake"
|
||||||
|
"${PROJECT_BINARY_DIR}/cmake/ghc_filesystem-config-version.cmake"
|
||||||
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ghc_filesystem"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
macro(AddExecutableWithStdFS targetName)
|
macro(AddExecutableWithStdFS targetName)
|
||||||
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 7.0 OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0))
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 7.0 OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0))
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
include_directories(/usr/local/opt/llvm/include)
|
include_directories(/usr/local/opt/llvm/include)
|
||||||
link_directories(/usr/local/opt/llvm/lib)
|
link_directories(/usr/local/opt/llvm/lib)
|
||||||
@ -12,7 +11,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND (CMAKE_CXX_COMPILER_VERSION
|
|||||||
target_link_libraries(${targetName} -lc++fs)
|
target_link_libraries(${targetName} -lc++fs)
|
||||||
else()
|
else()
|
||||||
target_compile_options(${targetName} PRIVATE "-stdlib=libc++")
|
target_compile_options(${targetName} PRIVATE "-stdlib=libc++")
|
||||||
target_link_libraries(${targetName} -stdlib=libc++ -lc++fs)
|
target_link_libraries(${targetName} -stdlib=libc++ -lc++fs $<$<PLATFORM_ID:Linux>:rt>)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
if(NOT APPLE)
|
if(NOT APPLE)
|
||||||
@ -20,6 +19,12 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND (CMAKE_CXX_COMPILER_VERSION
|
|||||||
target_link_libraries(${targetName} -stdlib=libc++)
|
target_link_libraries(${targetName} -stdlib=libc++)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "(SunOS|Solaris)")
|
||||||
|
target_link_libraries(filesystem_test xnet)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Haiku")
|
||||||
|
target_link_libraries(filesystem_test network)
|
||||||
|
endif()
|
||||||
target_compile_definitions(${targetName} PRIVATE USE_STD_FS)
|
target_compile_definitions(${targetName} PRIVATE USE_STD_FS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -29,6 +34,13 @@ if (CMAKE_COMPILER_IS_GNUCXX AND (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 8.0 O
|
|||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
|
||||||
target_link_libraries(${targetName} -lstdc++fs)
|
target_link_libraries(${targetName} -lstdc++fs)
|
||||||
endif()
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "(SunOS|Solaris)")
|
||||||
|
target_link_libraries(${targetName} xnet)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Haiku")
|
||||||
|
target_link_libraries(${targetName} network)
|
||||||
|
endif()
|
||||||
|
target_compile_options(${targetName} PRIVATE $<$<BOOL:${CYGWIN}>:-Wa,-mbig-obj>)
|
||||||
target_compile_definitions(${targetName} PRIVATE USE_STD_FS)
|
target_compile_definitions(${targetName} PRIVATE USE_STD_FS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -46,11 +58,19 @@ macro(AddTestExecutableWithStdCpp cppStd)
|
|||||||
add_executable(filesystem_test_cpp${cppStd} ${ARGN})
|
add_executable(filesystem_test_cpp${cppStd} ${ARGN})
|
||||||
set_property(TARGET filesystem_test_cpp${cppStd} PROPERTY CXX_STANDARD ${cppStd})
|
set_property(TARGET filesystem_test_cpp${cppStd} PROPERTY CXX_STANDARD ${cppStd})
|
||||||
target_link_libraries(filesystem_test_cpp${cppStd} ghc_filesystem)
|
target_link_libraries(filesystem_test_cpp${cppStd} ghc_filesystem)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "(SunOS|Solaris)")
|
||||||
|
target_link_libraries(filesystem_test_cpp${cppStd} xnet)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Haiku")
|
||||||
|
target_link_libraries(filesystem_test_cpp${cppStd} network)
|
||||||
|
endif()
|
||||||
target_compile_options(filesystem_test_cpp${cppStd} PRIVATE
|
target_compile_options(filesystem_test_cpp${cppStd} PRIVATE
|
||||||
$<$<BOOL:${EMSCRIPTEN}>:-s DISABLE_EXCEPTION_CATCHING=0>
|
$<$<BOOL:${EMSCRIPTEN}>:-s DISABLE_EXCEPTION_CATCHING=0>
|
||||||
$<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Werror -Wno-error=deprecated-declarations>
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Werror -Wno-error=deprecated-declarations>
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Wno-psabi -Werror -Wno-error=deprecated-declarations>
|
$<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Wno-psabi -Werror -Wno-error=deprecated-declarations>
|
||||||
$<$<CXX_COMPILER_ID:MSVC>:/WX /wd"4996">)
|
$<$<CXX_COMPILER_ID:MSVC>:/WX /wd4996>
|
||||||
|
$<$<BOOL:${CYGWIN}>:-Wa,-mbig-obj>
|
||||||
|
$<$<BOOL:${GHC_COVERAGE}>:--coverage>)
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||||
target_compile_definitions(filesystem_test_cpp${cppStd} PRIVATE _CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(filesystem_test_cpp${cppStd} PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
@PACKAGE_INIT@
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
set_and_check(ghcfilesystem_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@")
|
# import targets
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/ghc_filesystem-targets.cmake")
|
||||||
|
|
||||||
check_required_components(ghcfilesystem)
|
check_required_components(ghcfilesystem)
|
||||||
@ -10,3 +10,8 @@ add_executable(fs_du du.cpp)
|
|||||||
target_link_libraries(fs_du ghc_filesystem)
|
target_link_libraries(fs_du ghc_filesystem)
|
||||||
AddExecutableWithStdFS(std_fs_du du.cpp)
|
AddExecutableWithStdFS(std_fs_du du.cpp)
|
||||||
|
|
||||||
|
if(EXISTS "${PROJECT_SOURCE_DIR}/examples/benchmark.cpp")
|
||||||
|
add_executable(fs_benchmark benchmark.cpp)
|
||||||
|
set_property(TARGET fs_benchmark PROPERTY CXX_STANDARD 17)
|
||||||
|
target_link_libraries(fs_benchmark ghc_filesystem)
|
||||||
|
endif()
|
||||||
File diff suppressed because it is too large
Load Diff
@ -25,7 +25,7 @@
|
|||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
// fs_fwd.hpp - The forwarding header for the header/implementation seperated usage of
|
// fs_fwd.hpp - The forwarding header for the header/implementation separated usage of
|
||||||
// ghc::filesystem.
|
// ghc::filesystem.
|
||||||
// This file can be include at any place, where ghc::filesystem api is needed while
|
// This file can be include at any place, where ghc::filesystem api is needed while
|
||||||
// not bleeding implementation details (e.g. system includes) into the global namespace,
|
// not bleeding implementation details (e.g. system includes) into the global namespace,
|
||||||
@ -34,5 +34,5 @@
|
|||||||
#ifndef GHC_FILESYSTEM_FWD_H
|
#ifndef GHC_FILESYSTEM_FWD_H
|
||||||
#define GHC_FILESYSTEM_FWD_H
|
#define GHC_FILESYSTEM_FWD_H
|
||||||
#define GHC_FILESYSTEM_FWD
|
#define GHC_FILESYSTEM_FWD
|
||||||
#include <ghc/filesystem.hpp>
|
#include "filesystem.hpp"
|
||||||
#endif // GHC_FILESYSTEM_FWD_H
|
#endif // GHC_FILESYSTEM_FWD_H
|
||||||
|
|||||||
@ -25,11 +25,11 @@
|
|||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
// fs_impl.hpp - The implementation header for the header/implementation seperated usage of
|
// fs_impl.hpp - The implementation header for the header/implementation separated usage of
|
||||||
// ghc::filesystem.
|
// ghc::filesystem.
|
||||||
// This file can be used to hide the implementation of ghc::filesystem into a single cpp.
|
// This file can be used to hide the implementation of ghc::filesystem into a single cpp.
|
||||||
// The cpp has to include this before including fs_fwd.hpp directly or via a different
|
// The cpp has to include this before including fs_fwd.hpp directly or via a different
|
||||||
// header to work.
|
// header to work.
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
#define GHC_FILESYSTEM_IMPLEMENTATION
|
#define GHC_FILESYSTEM_IMPLEMENTATION
|
||||||
#include <ghc/filesystem.hpp>
|
#include "filesystem.hpp"
|
||||||
|
|||||||
@ -30,27 +30,48 @@
|
|||||||
// namespace fs.
|
// namespace fs.
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
#ifndef GHC_FILESYSTEM_STD_H
|
#ifndef GHC_FILESYSTEM_STD_H
|
||||||
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || (defined(__cplusplus) && __cplusplus >= 201703L)) && defined(__has_include)
|
#define GHC_FILESYSTEM_STD_H
|
||||||
#if __has_include(<filesystem>) && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500)
|
|
||||||
#define GHC_USE_STD_FS
|
|
||||||
#include <filesystem>
|
|
||||||
namespace fs {
|
|
||||||
using namespace std::filesystem;
|
|
||||||
using ifstream = std::ifstream;
|
|
||||||
using ofstream = std::ofstream;
|
|
||||||
using fstream = std::fstream;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef GHC_USE_STD_FS
|
|
||||||
#define GHC_WIN_WSTRING_STRING_TYPE
|
|
||||||
#include <ghc/filesystem.hpp>
|
|
||||||
namespace fs {
|
|
||||||
using namespace ghc::filesystem;
|
|
||||||
using ifstream = ghc::filesystem::ifstream;
|
|
||||||
using ofstream = ghc::filesystem::ofstream;
|
|
||||||
using fstream = ghc::filesystem::fstream;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif // GHC_FILESYSTEM_STD_H
|
|
||||||
|
|
||||||
|
#if defined(_MSVC_LANG) && _MSVC_LANG >= 201703L || __cplusplus >= 201703L && defined(__has_include)
|
||||||
|
// ^ Supports MSVC prior to 15.7 without setting /Zc:__cplusplus to fix __cplusplus
|
||||||
|
// _MSVC_LANG works regardless. But without the switch, the compiler always reported 199711L: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/
|
||||||
|
#if __has_include(<filesystem>) // Two stage __has_include needed for MSVC 2015 and per https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005finclude.html
|
||||||
|
#define GHC_USE_STD_FS
|
||||||
|
|
||||||
|
// Old Apple OSs don't support std::filesystem, though the header is available at compile
|
||||||
|
// time. In particular, std::filesystem is unavailable before macOS 10.15, iOS/tvOS 13.0,
|
||||||
|
// and watchOS 6.0.
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <Availability.h>
|
||||||
|
// Note: This intentionally uses std::filesystem on any new Apple OS, like visionOS
|
||||||
|
// released after std::filesystem, where std::filesystem is always available.
|
||||||
|
// (All other __<platform>_VERSION_MIN_REQUIREDs will be undefined and thus 0.)
|
||||||
|
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 \
|
||||||
|
|| defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 \
|
||||||
|
|| defined(__TV_OS_VERSION_MIN_REQUIRED) && __TV_OS_VERSION_MIN_REQUIRED < 130000 \
|
||||||
|
|| defined(__WATCH_OS_VERSION_MAX_ALLOWED) && __WATCH_OS_VERSION_MAX_ALLOWED < 60000
|
||||||
|
#undef GHC_USE_STD_FS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GHC_USE_STD_FS
|
||||||
|
#include <filesystem>
|
||||||
|
namespace fs {
|
||||||
|
using namespace std::filesystem;
|
||||||
|
using ifstream = std::ifstream;
|
||||||
|
using ofstream = std::ofstream;
|
||||||
|
using fstream = std::fstream;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#include "filesystem.hpp"
|
||||||
|
namespace fs {
|
||||||
|
using namespace ghc::filesystem;
|
||||||
|
using ifstream = ghc::filesystem::ifstream;
|
||||||
|
using ofstream = ghc::filesystem::ofstream;
|
||||||
|
using fstream = ghc::filesystem::fstream;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // GHC_FILESYSTEM_STD_H
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
// fs_std_fwd.hpp - The forwarding header for the header/implementation seperated usage of
|
// fs_std_fwd.hpp - The forwarding header for the header/implementation separated usage of
|
||||||
// ghc::filesystem that uses std::filesystem if it detects it.
|
// ghc::filesystem that uses std::filesystem if it detects it.
|
||||||
// This file can be include at any place, where fs::filesystem api is needed while
|
// This file can be include at any place, where fs::filesystem api is needed while
|
||||||
// not bleeding implementation details (e.g. system includes) into the global namespace,
|
// not bleeding implementation details (e.g. system includes) into the global namespace,
|
||||||
@ -33,28 +33,47 @@
|
|||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
#ifndef GHC_FILESYSTEM_STD_FWD_H
|
#ifndef GHC_FILESYSTEM_STD_FWD_H
|
||||||
#define GHC_FILESYSTEM_STD_FWD_H
|
#define GHC_FILESYSTEM_STD_FWD_H
|
||||||
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || (defined(__cplusplus) && __cplusplus >= 201703L)) && defined(__has_include)
|
|
||||||
#if __has_include(<filesystem>) && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500)
|
|
||||||
#define GHC_USE_STD_FS
|
|
||||||
#include <filesystem>
|
|
||||||
namespace fs {
|
|
||||||
using namespace std::filesystem;
|
|
||||||
using ifstream = std::ifstream;
|
|
||||||
using ofstream = std::ofstream;
|
|
||||||
using fstream = std::fstream;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef GHC_USE_STD_FS
|
|
||||||
#define GHC_WIN_WSTRING_STRING_TYPE
|
|
||||||
#define GHC_FILESYSTEM_FWD
|
|
||||||
#include <ghc/filesystem.hpp>
|
|
||||||
namespace fs {
|
|
||||||
using namespace ghc::filesystem;
|
|
||||||
using ifstream = ghc::filesystem::ifstream;
|
|
||||||
using ofstream = ghc::filesystem::ofstream;
|
|
||||||
using fstream = ghc::filesystem::fstream;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif // GHC_FILESYSTEM_STD_FWD_H
|
|
||||||
|
|
||||||
|
#if defined(_MSVC_LANG) && _MSVC_LANG >= 201703L || __cplusplus >= 201703L && defined(__has_include)
|
||||||
|
// ^ Supports MSVC prior to 15.7 without setting /Zc:__cplusplus to fix __cplusplus
|
||||||
|
// _MSVC_LANG works regardless. But without the switch, the compiler always reported 199711L: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/
|
||||||
|
#if __has_include(<filesystem>) // Two stage __has_include needed for MSVC 2015 and per https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005finclude.html
|
||||||
|
#define GHC_USE_STD_FS
|
||||||
|
|
||||||
|
// Old Apple OSs don't support std::filesystem, though the header is available at compile
|
||||||
|
// time. In particular, std::filesystem is unavailable before macOS 10.15, iOS/tvOS 13.0,
|
||||||
|
// and watchOS 6.0.
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <Availability.h>
|
||||||
|
// Note: This intentionally uses std::filesystem on any new Apple OS, like visionOS
|
||||||
|
// released after std::filesystem, where std::filesystem is always available.
|
||||||
|
// (All other __<platform>_VERSION_MIN_REQUIREDs will be undefined and thus 0.)
|
||||||
|
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 \
|
||||||
|
|| defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 \
|
||||||
|
|| defined(__TV_OS_VERSION_MIN_REQUIRED) && __TV_OS_VERSION_MIN_REQUIRED < 130000 \
|
||||||
|
|| defined(__WATCH_OS_VERSION_MAX_ALLOWED) && __WATCH_OS_VERSION_MAX_ALLOWED < 60000
|
||||||
|
#undef GHC_USE_STD_FS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GHC_USE_STD_FS
|
||||||
|
#include <filesystem>
|
||||||
|
namespace fs {
|
||||||
|
using namespace std::filesystem;
|
||||||
|
using ifstream = std::ifstream;
|
||||||
|
using ofstream = std::ofstream;
|
||||||
|
using fstream = std::fstream;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#include "fs_fwd.hpp"
|
||||||
|
namespace fs {
|
||||||
|
using namespace ghc::filesystem;
|
||||||
|
using ifstream = ghc::filesystem::ifstream;
|
||||||
|
using ofstream = ghc::filesystem::ofstream;
|
||||||
|
using fstream = ghc::filesystem::fstream;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // GHC_FILESYSTEM_STD_FWD_H
|
||||||
|
|||||||
@ -25,19 +25,36 @@
|
|||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
// fs_std_impl.hpp - The implementation header for the header/implementation seperated usage of
|
// fs_std_impl.hpp - The implementation header for the header/implementation separated usage of
|
||||||
// ghc::filesystem that does nothing if std::filesystem is detected.
|
// ghc::filesystem that does nothing if std::filesystem is detected.
|
||||||
// This file can be used to hide the implementation of ghc::filesystem into a single cpp.
|
// This file can be used to hide the implementation of ghc::filesystem into a single cpp.
|
||||||
// The cpp has to include this before including fs_std_fwd.hpp directly or via a different
|
// The cpp has to include this before including fs_std_fwd.hpp directly or via a different
|
||||||
// header to work.
|
// header to work.
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || (defined(__cplusplus) && __cplusplus >= 201703L)) && defined(__has_include)
|
#if defined(_MSVC_LANG) && _MSVC_LANG >= 201703L || __cplusplus >= 201703L && defined(__has_include)
|
||||||
#if __has_include(<filesystem>) && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500)
|
// ^ Supports MSVC prior to 15.7 without setting /Zc:__cplusplus to fix __cplusplus
|
||||||
#define GHC_USE_STD_FS
|
// _MSVC_LANG works regardless. But without the switch, the compiler always reported 199711L: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/
|
||||||
#endif
|
#if __has_include(<filesystem>) // Two stage __has_include needed for MSVC 2015 and per https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005finclude.html
|
||||||
|
#define GHC_USE_STD_FS
|
||||||
|
|
||||||
|
// Old Apple OSs don't support std::filesystem, though the header is available at compile
|
||||||
|
// time. In particular, std::filesystem is unavailable before macOS 10.15, iOS/tvOS 13.0,
|
||||||
|
// and watchOS 6.0.
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <Availability.h>
|
||||||
|
// Note: This intentionally uses std::filesystem on any new Apple OS, like visionOS
|
||||||
|
// released after std::filesystem, where std::filesystem is always available.
|
||||||
|
// (All other __<platform>_VERSION_MIN_REQUIREDs will be undefined and thus 0.)
|
||||||
|
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 \
|
||||||
|
|| defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 \
|
||||||
|
|| defined(__TV_OS_VERSION_MIN_REQUIRED) && __TV_OS_VERSION_MIN_REQUIRED < 130000 \
|
||||||
|
|| defined(__WATCH_OS_VERSION_MAX_ALLOWED) && __WATCH_OS_VERSION_MAX_ALLOWED < 60000
|
||||||
|
#undef GHC_USE_STD_FS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef GHC_USE_STD_FS
|
#ifndef GHC_USE_STD_FS
|
||||||
#define GHC_WIN_WSTRING_STRING_TYPE
|
#include "fs_impl.hpp"
|
||||||
#define GHC_FILESYSTEM_IMPLEMENTATION
|
|
||||||
#include <ghc/filesystem.hpp>
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -3,6 +3,20 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
|
|||||||
set(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS ON)
|
set(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS ON)
|
||||||
include(ParseAndAddCatchTests)
|
include(ParseAndAddCatchTests)
|
||||||
|
|
||||||
|
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND UNIX AND NOT APPLE AND NOT BSD)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "-lc++abi")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function(SetTestCompileOptions target_name)
|
||||||
|
target_compile_options(${target_name} PRIVATE
|
||||||
|
$<$<BOOL:${EMSCRIPTEN}>:-s DISABLE_EXCEPTION_CATCHING=0>
|
||||||
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Werror -Wno-deprecated-declarations>
|
||||||
|
$<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Wno-psabi -Werror -Wno-deprecated-declarations>
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:/WX /wd4996>
|
||||||
|
$<$<BOOL:${CYGWIN}>:-Wa,-mbig-obj>)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
if(GHC_COVERAGE)
|
if(GHC_COVERAGE)
|
||||||
message("Generating test runner for coverage run...")
|
message("Generating test runner for coverage run...")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMCMAKE_EXE_LINKER_FLAGS} --coverage")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMCMAKE_EXE_LINKER_FLAGS} --coverage")
|
||||||
@ -13,41 +27,54 @@ if(GHC_COVERAGE)
|
|||||||
target_compile_options(filesystem_test PUBLIC --coverage)
|
target_compile_options(filesystem_test PUBLIC --coverage)
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(filesystem_test PUBLIC ghc_filesystem --coverage)
|
target_link_libraries(filesystem_test PUBLIC ghc_filesystem --coverage)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "(SunOS|Solaris)")
|
||||||
|
target_link_libraries(filesystem_test PUBLIC xnet)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Haiku")
|
||||||
|
target_link_libraries(filesystem_test PUBLIC network)
|
||||||
|
endif()
|
||||||
|
if("cxx_std_17" IN_LIST GHC_FILESYSTEM_TEST_COMPILE_FEATURES)
|
||||||
|
AddTestExecutableWithStdCpp(17 filesystem_test.cpp catch.hpp)
|
||||||
|
endif()
|
||||||
|
if("cxx_std_20" IN_LIST GHC_FILESYSTEM_TEST_COMPILE_FEATURES)
|
||||||
|
AddTestExecutableWithStdCpp(20 filesystem_test.cpp catch.hpp)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
message("Generating test runner for normal test...")
|
message("Generating test runner for normal test...")
|
||||||
add_executable(filesystem_test filesystem_test.cpp catch.hpp)
|
add_executable(filesystem_test filesystem_test.cpp catch.hpp)
|
||||||
target_link_libraries(filesystem_test ghc_filesystem)
|
target_link_libraries(filesystem_test ghc_filesystem)
|
||||||
target_compile_options(filesystem_test PRIVATE
|
if(${CMAKE_SYSTEM_NAME} MATCHES "(SunOS|Solaris)")
|
||||||
$<$<BOOL:${EMSCRIPTEN}>:-s DISABLE_EXCEPTION_CATCHING=0>
|
target_link_libraries(filesystem_test xnet)
|
||||||
$<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Werror>
|
endif()
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -Wshadow -Wconversion -Wsign-conversion -Wpedantic -Wno-psabi -Werror>
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Haiku")
|
||||||
$<$<CXX_COMPILER_ID:MSVC>:/WX>)
|
target_link_libraries(filesystem_test network)
|
||||||
|
endif()
|
||||||
|
SetTestCompileOptions(filesystem_test)
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||||
target_compile_definitions(filesystem_test PRIVATE _CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(filesystem_test PRIVATE _CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN NOMINMAX)
|
||||||
endif()
|
endif()
|
||||||
if(EMSCRIPTEN)
|
if(EMSCRIPTEN)
|
||||||
set_target_properties(filesystem_test PROPERTIES LINK_FLAGS "-g4 -s DISABLE_EXCEPTION_CATCHING=0 -s ALLOW_MEMORY_GROWTH=1")
|
set_target_properties(filesystem_test PROPERTIES LINK_FLAGS "-g4 -s DISABLE_EXCEPTION_CATCHING=0 -s ALLOW_MEMORY_GROWTH=1")
|
||||||
endif()
|
endif()
|
||||||
ParseAndAddCatchTests(filesystem_test)
|
ParseAndAddCatchTests(filesystem_test)
|
||||||
AddExecutableWithStdFS(std_filesystem_test filesystem_test.cpp catch.hpp)
|
if(GHC_FILESYSTEM_BUILD_STD_TESTING)
|
||||||
if(WIN32)
|
AddExecutableWithStdFS(std_filesystem_test filesystem_test.cpp catch.hpp)
|
||||||
add_executable(filesystem_test_wchar filesystem_test.cpp catch.hpp)
|
|
||||||
target_link_libraries(filesystem_test_wchar ghc_filesystem)
|
|
||||||
target_compile_options(filesystem_test_wchar PRIVATE
|
|
||||||
$<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Werror>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Wall -Werror>
|
|
||||||
$<$<CXX_COMPILER_ID:MSVC>:/WX>)
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
||||||
target_compile_definitions(filesystem_test_wchar PRIVATE _CRT_SECURE_NO_WARNINGS GHC_WIN_WSTRING_STRING_TYPE)
|
|
||||||
else()
|
|
||||||
target_compile_definitions(filesystem_test_wchar PRIVATE GHC_WIN_WSTRING_STRING_TYPE)
|
|
||||||
endif()
|
|
||||||
ParseAndAddCatchTests(filesystem_test_wchar)
|
|
||||||
endif()
|
endif()
|
||||||
if("cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
|
if(WIN32)
|
||||||
|
add_executable(filesystem_test_char filesystem_test.cpp catch.hpp)
|
||||||
|
target_link_libraries(filesystem_test_char ghc_filesystem)
|
||||||
|
SetTestCompileOptions(filesystem_test_char)
|
||||||
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||||
|
target_compile_definitions(filesystem_test_char PRIVATE _CRT_SECURE_NO_WARNINGS GHC_WIN_DISABLE_WSTRING_STORAGE_TYPE)
|
||||||
|
else()
|
||||||
|
target_compile_definitions(filesystem_test_char PRIVATE GHC_WIN_DISABLE_WSTRING_STORAGE_TYPE)
|
||||||
|
endif()
|
||||||
|
ParseAndAddCatchTests(filesystem_test_char)
|
||||||
|
endif()
|
||||||
|
if("cxx_std_17" IN_LIST GHC_FILESYSTEM_TEST_COMPILE_FEATURES)
|
||||||
AddTestExecutableWithStdCpp(17 filesystem_test.cpp catch.hpp)
|
AddTestExecutableWithStdCpp(17 filesystem_test.cpp catch.hpp)
|
||||||
endif()
|
endif()
|
||||||
if("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
|
if("cxx_std_20" IN_LIST GHC_FILESYSTEM_TEST_COMPILE_FEATURES)
|
||||||
AddTestExecutableWithStdCpp(20 filesystem_test.cpp catch.hpp)
|
AddTestExecutableWithStdCpp(20 filesystem_test.cpp catch.hpp)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
@ -58,8 +85,15 @@ add_test(multifile_test multifile_test)
|
|||||||
|
|
||||||
add_executable(fwd_impl_test fwd_test.cpp impl_test.cpp)
|
add_executable(fwd_impl_test fwd_test.cpp impl_test.cpp)
|
||||||
target_link_libraries(fwd_impl_test ghc_filesystem)
|
target_link_libraries(fwd_impl_test ghc_filesystem)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "(SunOS|Solaris)")
|
||||||
|
target_link_libraries(fwd_impl_test xnet)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Haiku")
|
||||||
|
target_link_libraries(fwd_impl_test network)
|
||||||
|
endif()
|
||||||
|
SetTestCompileOptions(fwd_impl_test)
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||||
target_compile_definitions(fwd_impl_test PRIVATE _CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(fwd_impl_test PRIVATE _CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN NOMINMAX)
|
||||||
endif()
|
endif()
|
||||||
add_test(fwd_impl_test fwd_impl_test)
|
add_test(fwd_impl_test fwd_impl_test)
|
||||||
|
|
||||||
@ -68,3 +102,4 @@ if(NOT MSVC)
|
|||||||
target_compile_options(exception PRIVATE -fno-exceptions)
|
target_compile_options(exception PRIVATE -fno-exceptions)
|
||||||
endif()
|
endif()
|
||||||
target_include_directories(exception PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
target_include_directories(exception PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
||||||
|
SetTestCompileOptions(exception)
|
||||||
|
|||||||
7827
test/catch.hpp
7827
test/catch.hpp
File diff suppressed because it is too large
Load Diff
@ -76,6 +76,7 @@ using fstream = ghc::filesystem::fstream;
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef GHC_FILESYSTEM_FWD_TEST
|
#ifndef GHC_FILESYSTEM_FWD_TEST
|
||||||
@ -98,7 +99,7 @@ using fstream = ghc::filesystem::fstream;
|
|||||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
template <typename TP>
|
template <typename TP>
|
||||||
std::time_t to_time_t(TP tp)
|
static std::time_t to_time_t(TP tp)
|
||||||
{
|
{
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
auto sctp = time_point_cast<system_clock::duration>(tp - TP::clock::now() + system_clock::now());
|
auto sctp = time_point_cast<system_clock::duration>(tp - TP::clock::now() + system_clock::now());
|
||||||
@ -106,7 +107,7 @@ std::time_t to_time_t(TP tp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TP>
|
template <typename TP>
|
||||||
TP from_time_t(std::time_t t)
|
static TP from_time_t(std::time_t t)
|
||||||
{
|
{
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
auto sctp = system_clock::from_time_t(t);
|
auto sctp = system_clock::from_time_t(t);
|
||||||
@ -127,6 +128,14 @@ struct StringMaker<fs::perms>
|
|||||||
static std::string convert(fs::perms const& value) { return std::to_string(static_cast<unsigned int>(value)); }
|
static std::string convert(fs::perms const& value) { return std::to_string(static_cast<unsigned int>(value)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct StringMaker<fs::file_status>
|
||||||
|
{
|
||||||
|
static std::string convert(fs::file_status const& value) {
|
||||||
|
return std::string("[") + std::to_string(static_cast<unsigned int>(value.type())) + "," + std::to_string(static_cast<unsigned int>(value.permissions())) + "]";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __cpp_lib_char8_t
|
#ifdef __cpp_lib_char8_t
|
||||||
template <>
|
template <>
|
||||||
struct StringMaker<char8_t>
|
struct StringMaker<char8_t>
|
||||||
@ -205,7 +214,8 @@ static void generateFile(const fs::path& pathname, int withSize = -1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GHC_OS_WINDOWS
|
#ifdef GHC_OS_WINDOWS
|
||||||
inline bool isWow64Proc()
|
#if !defined(_WIN64) && defined(KEY_WOW64_64KEY)
|
||||||
|
static bool isWow64Proc()
|
||||||
{
|
{
|
||||||
typedef BOOL(WINAPI * IsWow64Process_t)(HANDLE, PBOOL);
|
typedef BOOL(WINAPI * IsWow64Process_t)(HANDLE, PBOOL);
|
||||||
BOOL bIsWow64 = FALSE;
|
BOOL bIsWow64 = FALSE;
|
||||||
@ -217,6 +227,7 @@ inline bool isWow64Proc()
|
|||||||
}
|
}
|
||||||
return bIsWow64 == TRUE;
|
return bIsWow64 == TRUE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool is_symlink_creation_supported()
|
static bool is_symlink_creation_supported()
|
||||||
{
|
{
|
||||||
@ -294,13 +305,13 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class T, class U>
|
template <class T, class U>
|
||||||
bool operator==(TestAllocator<T> const&, TestAllocator<U> const&) noexcept
|
static bool operator==(TestAllocator<T> const&, TestAllocator<U> const&) noexcept
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T, class U>
|
template <class T, class U>
|
||||||
bool operator!=(TestAllocator<T> const& x, TestAllocator<U> const& y) noexcept
|
static bool operator!=(TestAllocator<T> const& x, TestAllocator<U> const& y) noexcept
|
||||||
{
|
{
|
||||||
return !(x == y);
|
return !(x == y);
|
||||||
}
|
}
|
||||||
@ -354,7 +365,7 @@ TEST_CASE("fs::detail::toUtf8", "[filesystem][fs.detail.utf8]")
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEST_CASE("30.10.8.1 path::preferred_separator", "[filesystem][path][fs.path.generic]")
|
TEST_CASE("fs.path.generic - path::preferred_separator", "[filesystem][path][fs.path.generic]")
|
||||||
{
|
{
|
||||||
#ifdef GHC_OS_WINDOWS
|
#ifdef GHC_OS_WINDOWS
|
||||||
CHECK(fs::path::preferred_separator == '\\');
|
CHECK(fs::path::preferred_separator == '\\');
|
||||||
@ -364,7 +375,7 @@ TEST_CASE("30.10.8.1 path::preferred_separator", "[filesystem][path][fs.path.gen
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef GHC_OS_WINDOWS
|
#ifndef GHC_OS_WINDOWS
|
||||||
TEST_CASE("30.10.8.1 path(\"//host\").has_root_name()", "[filesystem][path][fs.path.generic]")
|
TEST_CASE("fs.path.generic - path(\"//host\").has_root_name()", "[filesystem][path][fs.path.generic]")
|
||||||
{
|
{
|
||||||
if (!has_host_root_name_support()) {
|
if (!has_host_root_name_support()) {
|
||||||
WARN("This implementation doesn't support path(\"//host\").has_root_name() == true [C++17 30.12.8.1 par. 4] on this platform, tests based on this are skipped. (Should be okay.)");
|
WARN("This implementation doesn't support path(\"//host\").has_root_name() == true [C++17 30.12.8.1 par. 4] on this platform, tests based on this are skipped. (Should be okay.)");
|
||||||
@ -372,15 +383,26 @@ TEST_CASE("30.10.8.1 path(\"//host\").has_root_name()", "[filesystem][path][fs.p
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.1 path constructors and destructor", "[filesystem][path][fs.path.construct]")
|
TEST_CASE("fs.path.construct - path constructors and destructor", "[filesystem][path][fs.path.construct]")
|
||||||
{
|
{
|
||||||
CHECK("/usr/local/bin" == fs::path("/usr/local/bin").generic_string());
|
CHECK("/usr/local/bin" == fs::path("/usr/local/bin").generic_string());
|
||||||
std::string str = "/usr/local/bin";
|
std::string str = "/usr/local/bin";
|
||||||
|
#if defined(__cpp_lib_char8_t) && !defined(GHC_FILESYSTEM_ENFORCE_CPP17_API)
|
||||||
|
std::u8string u8str = u8"/usr/local/bin";
|
||||||
|
#endif
|
||||||
std::u16string u16str = u"/usr/local/bin";
|
std::u16string u16str = u"/usr/local/bin";
|
||||||
std::u32string u32str = U"/usr/local/bin";
|
std::u32string u32str = U"/usr/local/bin";
|
||||||
|
#if defined(__cpp_lib_char8_t) && !defined(GHC_FILESYSTEM_ENFORCE_CPP17_API)
|
||||||
|
CHECK(u8str == fs::path(u8str).generic_u8string());
|
||||||
|
#endif
|
||||||
|
CHECK(u16str == fs::path(u16str).generic_u16string());
|
||||||
|
CHECK(u32str == fs::path(u32str).generic_u32string());
|
||||||
CHECK(str == fs::path(str, fs::path::format::generic_format));
|
CHECK(str == fs::path(str, fs::path::format::generic_format));
|
||||||
CHECK(str == fs::path(str.begin(), str.end()));
|
CHECK(str == fs::path(str.begin(), str.end()));
|
||||||
CHECK(fs::path(std::wstring(3, 67)) == "CCC");
|
CHECK(fs::path(std::wstring(3, 67)) == "CCC");
|
||||||
|
#if defined(__cpp_lib_char8_t) && !defined(GHC_FILESYSTEM_ENFORCE_CPP17_API)
|
||||||
|
CHECK(str == fs::path(u8str.begin(), u8str.end()));
|
||||||
|
#endif
|
||||||
CHECK(str == fs::path(u16str.begin(), u16str.end()));
|
CHECK(str == fs::path(u16str.begin(), u16str.end()));
|
||||||
CHECK(str == fs::path(u32str.begin(), u32str.end()));
|
CHECK(str == fs::path(u32str.begin(), u32str.end()));
|
||||||
#ifdef GHC_FILESYSTEM_VERSION
|
#ifdef GHC_FILESYSTEM_VERSION
|
||||||
@ -397,7 +419,7 @@ TEST_CASE("30.10.8.4.1 path constructors and destructor", "[filesystem][path][fs
|
|||||||
CHECK("//host/foo/bar" == fs::path("//host/foo/bar"));
|
CHECK("//host/foo/bar" == fs::path("//host/foo/bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(GHC_OS_WINDOWS) && !(defined(GCC_VERSION) && GCC_VERSION < 80100) && !defined(USE_STD_FS)
|
#if !defined(GHC_OS_WINDOWS) && !(defined(__GLIBCXX__) && !(defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE >= 8))) && !defined(USE_STD_FS)
|
||||||
std::locale loc;
|
std::locale loc;
|
||||||
bool testUTF8Locale = false;
|
bool testUTF8Locale = false;
|
||||||
try {
|
try {
|
||||||
@ -424,7 +446,7 @@ TEST_CASE("30.10.8.4.1 path constructors and destructor", "[filesystem][path][fs
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.2 path assignments", "[filesystem][path][fs.path.assign]")
|
TEST_CASE("fs.path.assign - path assignments", "[filesystem][path][fs.path.assign]")
|
||||||
{
|
{
|
||||||
fs::path p1{"/foo/bar"};
|
fs::path p1{"/foo/bar"};
|
||||||
fs::path p2{"/usr/local"};
|
fs::path p2{"/usr/local"};
|
||||||
@ -433,6 +455,10 @@ TEST_CASE("30.10.8.4.2 path assignments", "[filesystem][path][fs.path.assign]")
|
|||||||
REQUIRE(p1 == p3);
|
REQUIRE(p1 == p3);
|
||||||
p3 = fs::path{"/usr/local"};
|
p3 = fs::path{"/usr/local"};
|
||||||
REQUIRE(p2 == p3);
|
REQUIRE(p2 == p3);
|
||||||
|
p3 = fs::path{L"/usr/local"};
|
||||||
|
REQUIRE(p2 == p3);
|
||||||
|
p3.assign(L"/usr/local");
|
||||||
|
REQUIRE(p2 == p3);
|
||||||
#if defined(IS_WCHAR_PATH) || defined(GHC_USE_WCHAR_T)
|
#if defined(IS_WCHAR_PATH) || defined(GHC_USE_WCHAR_T)
|
||||||
p3 = fs::path::string_type{L"/foo/bar"};
|
p3 = fs::path::string_type{L"/foo/bar"};
|
||||||
REQUIRE(p1 == p3);
|
REQUIRE(p1 == p3);
|
||||||
@ -455,7 +481,7 @@ TEST_CASE("30.10.8.4.2 path assignments", "[filesystem][path][fs.path.assign]")
|
|||||||
REQUIRE(p2 == p3);
|
REQUIRE(p2 == p3);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.3 path appends", "[filesystem][path][fs.path.append]")
|
TEST_CASE("fs.path.append - path appends", "[filesystem][path][fs.path.append]")
|
||||||
{
|
{
|
||||||
#ifdef GHC_OS_WINDOWS
|
#ifdef GHC_OS_WINDOWS
|
||||||
CHECK(fs::path("foo") / "c:/bar" == "c:/bar");
|
CHECK(fs::path("foo") / "c:/bar" == "c:/bar");
|
||||||
@ -481,7 +507,7 @@ TEST_CASE("30.10.8.4.3 path appends", "[filesystem][path][fs.path.append]")
|
|||||||
// TODO: append(first, last)
|
// TODO: append(first, last)
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.4 path concatenation", "[filesystem][path][fs.path.concat]")
|
TEST_CASE("fs.path.concat - path concatenation", "[filesystem][path][fs.path.concat]")
|
||||||
{
|
{
|
||||||
CHECK((fs::path("foo") += fs::path("bar")) == "foobar");
|
CHECK((fs::path("foo") += fs::path("bar")) == "foobar");
|
||||||
CHECK((fs::path("foo") += fs::path("/bar")) == "foo/bar");
|
CHECK((fs::path("foo") += fs::path("/bar")) == "foo/bar");
|
||||||
@ -491,9 +517,13 @@ TEST_CASE("30.10.8.4.4 path concatenation", "[filesystem][path][fs.path.concat]"
|
|||||||
|
|
||||||
CHECK((fs::path("foo") += "bar") == "foobar");
|
CHECK((fs::path("foo") += "bar") == "foobar");
|
||||||
CHECK((fs::path("foo") += "/bar") == "foo/bar");
|
CHECK((fs::path("foo") += "/bar") == "foo/bar");
|
||||||
|
CHECK((fs::path("foo") += L"bar") == "foobar");
|
||||||
|
CHECK((fs::path("foo") += L"/bar") == "foo/bar");
|
||||||
|
|
||||||
CHECK((fs::path("foo") += 'b') == "foob");
|
CHECK((fs::path("foo") += 'b') == "foob");
|
||||||
CHECK((fs::path("foo") += '/') == "foo/");
|
CHECK((fs::path("foo") += '/') == "foo/");
|
||||||
|
CHECK((fs::path("foo") += L'b') == "foob");
|
||||||
|
CHECK((fs::path("foo") += L'/') == "foo/");
|
||||||
|
|
||||||
CHECK((fs::path("foo") += std::string("bar")) == "foobar");
|
CHECK((fs::path("foo") += std::string("bar")) == "foobar");
|
||||||
CHECK((fs::path("foo") += std::string("/bar")) == "foo/bar");
|
CHECK((fs::path("foo") += std::string("/bar")) == "foo/bar");
|
||||||
@ -506,6 +536,8 @@ TEST_CASE("30.10.8.4.4 path concatenation", "[filesystem][path][fs.path.concat]"
|
|||||||
|
|
||||||
CHECK(fs::path("foo").concat("bar") == "foobar");
|
CHECK(fs::path("foo").concat("bar") == "foobar");
|
||||||
CHECK(fs::path("foo").concat("/bar") == "foo/bar");
|
CHECK(fs::path("foo").concat("/bar") == "foo/bar");
|
||||||
|
CHECK(fs::path("foo").concat(L"bar") == "foobar");
|
||||||
|
CHECK(fs::path("foo").concat(L"/bar") == "foo/bar");
|
||||||
std::string bar = "bar";
|
std::string bar = "bar";
|
||||||
CHECK(fs::path("foo").concat(bar.begin(), bar.end()) == "foobar");
|
CHECK(fs::path("foo").concat(bar.begin(), bar.end()) == "foobar");
|
||||||
#ifndef USE_STD_FS
|
#ifndef USE_STD_FS
|
||||||
@ -514,7 +546,7 @@ TEST_CASE("30.10.8.4.4 path concatenation", "[filesystem][path][fs.path.concat]"
|
|||||||
// TODO: contat(first, last)
|
// TODO: contat(first, last)
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.5 path modifiers", "[filesystem][path][fs.path.modifiers]")
|
TEST_CASE("fs.path.modifiers - path modifiers", "[filesystem][path][fs.path.modifiers]")
|
||||||
{
|
{
|
||||||
fs::path p = fs::path("/foo/bar");
|
fs::path p = fs::path("/foo/bar");
|
||||||
p.clear();
|
p.clear();
|
||||||
@ -553,7 +585,7 @@ TEST_CASE("30.10.8.4.5 path modifiers", "[filesystem][path][fs.path.modifiers]")
|
|||||||
CHECK(p2 == "foo");
|
CHECK(p2 == "foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.6 path native format observers", "[filesystem][path][fs.path.native.obs]")
|
TEST_CASE("fs.path.native.obs - path native format observers", "[filesystem][path][fs.path.native.obs]")
|
||||||
{
|
{
|
||||||
#ifdef GHC_OS_WINDOWS
|
#ifdef GHC_OS_WINDOWS
|
||||||
#if defined(IS_WCHAR_PATH) || defined(GHC_USE_WCHAR_T)
|
#if defined(IS_WCHAR_PATH) || defined(GHC_USE_WCHAR_T)
|
||||||
@ -591,7 +623,7 @@ TEST_CASE("30.10.8.4.6 path native format observers", "[filesystem][path][fs.pat
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.7 path generic format observers", "[filesystem][path][fs.path.generic.obs]")
|
TEST_CASE("fs.path.generic.obs - path generic format observers", "[filesystem][path][fs.path.generic.obs]")
|
||||||
{
|
{
|
||||||
#ifdef GHC_OS_WINDOWS
|
#ifdef GHC_OS_WINDOWS
|
||||||
#ifndef IS_WCHAR_PATH
|
#ifndef IS_WCHAR_PATH
|
||||||
@ -626,7 +658,7 @@ TEST_CASE("30.10.8.4.7 path generic format observers", "[filesystem][path][fs.pa
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.8 path compare", "[filesystem][path][fs.path.compare]")
|
TEST_CASE("fs.path.compare - path compare", "[filesystem][path][fs.path.compare]")
|
||||||
{
|
{
|
||||||
CHECK(fs::path("/foo/b").compare("/foo/a") > 0);
|
CHECK(fs::path("/foo/b").compare("/foo/a") > 0);
|
||||||
CHECK(fs::path("/foo/b").compare("/foo/b") == 0);
|
CHECK(fs::path("/foo/b").compare("/foo/b") == 0);
|
||||||
@ -652,7 +684,7 @@ TEST_CASE("30.10.8.4.8 path compare", "[filesystem][path][fs.path.compare]")
|
|||||||
#endif // LWG_2936_BEHAVIOUR
|
#endif // LWG_2936_BEHAVIOUR
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.9 path decomposition", "[filesystem][path][fs.path.decompose]")
|
TEST_CASE("fs.path.decompose - path decomposition", "[filesystem][path][fs.path.decompose]")
|
||||||
{
|
{
|
||||||
// root_name()
|
// root_name()
|
||||||
CHECK(fs::path("").root_name() == "");
|
CHECK(fs::path("").root_name() == "");
|
||||||
@ -760,6 +792,9 @@ TEST_CASE("30.10.8.4.9 path decomposition", "[filesystem][path][fs.path.decompos
|
|||||||
CHECK(fs::path("C:/foo").filename() == "foo");
|
CHECK(fs::path("C:/foo").filename() == "foo");
|
||||||
CHECK(fs::path("C:\\foo").filename() == "foo");
|
CHECK(fs::path("C:\\foo").filename() == "foo");
|
||||||
CHECK(fs::path("C:foo").filename() == "foo");
|
CHECK(fs::path("C:foo").filename() == "foo");
|
||||||
|
CHECK(fs::path("t:est.txt").filename() == "est.txt");
|
||||||
|
#else
|
||||||
|
CHECK(fs::path("t:est.txt").filename() == "t:est.txt");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// stem()
|
// stem()
|
||||||
@ -777,6 +812,13 @@ TEST_CASE("30.10.8.4.9 path decomposition", "[filesystem][path][fs.path.decompos
|
|||||||
CHECK(fs::path("/foo/.profile").stem() == ".profile");
|
CHECK(fs::path("/foo/.profile").stem() == ".profile");
|
||||||
CHECK(fs::path(".bar").stem() == ".bar");
|
CHECK(fs::path(".bar").stem() == ".bar");
|
||||||
CHECK(fs::path("..bar").stem() == ".");
|
CHECK(fs::path("..bar").stem() == ".");
|
||||||
|
#ifdef GHC_OS_WINDOWS
|
||||||
|
CHECK(fs::path("t:est.txt").stem() == "est");
|
||||||
|
#else
|
||||||
|
CHECK(fs::path("t:est.txt").stem() == "t:est");
|
||||||
|
#endif
|
||||||
|
CHECK(fs::path("/foo/.").stem() == ".");
|
||||||
|
CHECK(fs::path("/foo/..").stem() == "..");
|
||||||
|
|
||||||
// extension()
|
// extension()
|
||||||
CHECK(fs::path("/foo/bar.txt").extension() == ".txt");
|
CHECK(fs::path("/foo/bar.txt").extension() == ".txt");
|
||||||
@ -784,6 +826,9 @@ TEST_CASE("30.10.8.4.9 path decomposition", "[filesystem][path][fs.path.decompos
|
|||||||
CHECK(fs::path("/foo/.profile").extension() == "");
|
CHECK(fs::path("/foo/.profile").extension() == "");
|
||||||
CHECK(fs::path(".bar").extension() == "");
|
CHECK(fs::path(".bar").extension() == "");
|
||||||
CHECK(fs::path("..bar").extension() == ".bar");
|
CHECK(fs::path("..bar").extension() == ".bar");
|
||||||
|
CHECK(fs::path("t:est.txt").extension() == ".txt");
|
||||||
|
CHECK(fs::path("/foo/.").extension() == "");
|
||||||
|
CHECK(fs::path("/foo/..").extension() == "");
|
||||||
|
|
||||||
if (has_host_root_name_support()) {
|
if (has_host_root_name_support()) {
|
||||||
// //host-based root-names
|
// //host-based root-names
|
||||||
@ -802,7 +847,7 @@ TEST_CASE("30.10.8.4.9 path decomposition", "[filesystem][path][fs.path.decompos
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.10 path query", "[fielsystem][path][fs.path.query]")
|
TEST_CASE("fs.path.query - path query", "[fielsystem][path][fs.path.query]")
|
||||||
{
|
{
|
||||||
// empty
|
// empty
|
||||||
CHECK(fs::path("").empty());
|
CHECK(fs::path("").empty());
|
||||||
@ -900,7 +945,7 @@ TEST_CASE("30.10.8.4.10 path query", "[fielsystem][path][fs.path.query]")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.4.11 path generation", "[filesystem][path][fs.path.gen]")
|
TEST_CASE("fs.path.gen - path generation", "[filesystem][path][fs.path.gen]")
|
||||||
{
|
{
|
||||||
// lexically_normal()
|
// lexically_normal()
|
||||||
CHECK(fs::path("foo/./bar/..").lexically_normal() == "foo/");
|
CHECK(fs::path("foo/./bar/..").lexically_normal() == "foo/");
|
||||||
@ -920,6 +965,10 @@ TEST_CASE("30.10.8.4.11 path generation", "[filesystem][path][fs.path.gen]")
|
|||||||
// lexically_relative()
|
// lexically_relative()
|
||||||
CHECK(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d");
|
CHECK(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d");
|
||||||
CHECK(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c");
|
CHECK(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c");
|
||||||
|
CHECK(fs::path("/a/b/c").lexically_relative("/a/b/c/d/..") == ".");
|
||||||
|
CHECK(fs::path("/a/b/c/").lexically_relative("/a/b/c/d/..") == ".");
|
||||||
|
CHECK(fs::path("").lexically_relative("/a/..") == "");
|
||||||
|
CHECK(fs::path("").lexically_relative("a/..") == ".");
|
||||||
CHECK(fs::path("a/b/c").lexically_relative("a") == "b/c");
|
CHECK(fs::path("a/b/c").lexically_relative("a") == "b/c");
|
||||||
CHECK(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
|
CHECK(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
|
||||||
CHECK(fs::path("a/b/c").lexically_relative("a/b/c") == ".");
|
CHECK(fs::path("a/b/c").lexically_relative("a/b/c") == ".");
|
||||||
@ -987,7 +1036,7 @@ static std::string reverseIterateResult(const fs::path& path)
|
|||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.5 path iterators", "[filesystem][path][fs.path.itr]")
|
TEST_CASE("fs.path.itr - path iterators", "[filesystem][path][fs.path.itr]")
|
||||||
{
|
{
|
||||||
CHECK(iterateResult(fs::path()).empty());
|
CHECK(iterateResult(fs::path()).empty());
|
||||||
CHECK("." == iterateResult(fs::path(".")));
|
CHECK("." == iterateResult(fs::path(".")));
|
||||||
@ -1070,7 +1119,7 @@ TEST_CASE("30.10.8.5 path iterators", "[filesystem][path][fs.path.itr]")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.6 path non-member functions", "[filesystem][path][fs.path.nonmember]")
|
TEST_CASE("fs.path.nonmember - path non-member functions", "[filesystem][path][fs.path.nonmember]")
|
||||||
{
|
{
|
||||||
fs::path p1("foo/bar");
|
fs::path p1("foo/bar");
|
||||||
fs::path p2("some/other");
|
fs::path p2("some/other");
|
||||||
@ -1092,7 +1141,7 @@ TEST_CASE("30.10.8.6 path non-member functions", "[filesystem][path][fs.path.non
|
|||||||
CHECK(p1 / p2 == "some/other/foo/bar");
|
CHECK(p1 / p2 == "some/other/foo/bar");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.6.1 path inserter and extractor", "[filesystem][path][fs.path.io]")
|
TEST_CASE("fs.path.io - path inserter and extractor", "[filesystem][path][fs.path.io]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
@ -1142,7 +1191,7 @@ TEST_CASE("30.10.8.6.1 path inserter and extractor", "[filesystem][path][fs.path
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.8.6.2 path factory functions", "[filesystem][path][fs.path.factory]")
|
TEST_CASE("fs.path.factory - path factory functions", "[filesystem][path][fs.path.factory]")
|
||||||
{
|
{
|
||||||
CHECK(fs::u8path("foo/bar") == fs::path("foo/bar"));
|
CHECK(fs::u8path("foo/bar") == fs::path("foo/bar"));
|
||||||
CHECK(fs::u8path("foo/bar") == fs::path("foo/bar"));
|
CHECK(fs::u8path("foo/bar") == fs::path("foo/bar"));
|
||||||
@ -1150,7 +1199,7 @@ TEST_CASE("30.10.8.6.2 path factory functions", "[filesystem][path][fs.path.fact
|
|||||||
CHECK(fs::u8path(str.begin(), str.end()) == str);
|
CHECK(fs::u8path(str.begin(), str.end()) == str);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.9 class filesystem_error", "[filesystem][filesystem_error][fs.class.filesystem_error]")
|
TEST_CASE("fs.class.filesystem_error - class filesystem_error", "[filesystem][filesystem_error][fs.class.filesystem_error]")
|
||||||
{
|
{
|
||||||
std::error_code ec(1, std::system_category());
|
std::error_code ec(1, std::system_category());
|
||||||
fs::filesystem_error fse("None", std::error_code());
|
fs::filesystem_error fse("None", std::error_code());
|
||||||
@ -1169,12 +1218,12 @@ TEST_CASE("30.10.9 class filesystem_error", "[filesystem][filesystem_error][fs.c
|
|||||||
CHECK(fse.path2() == "some/other");
|
CHECK(fse.path2() == "some/other");
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr fs::perms constExprOwnerAll()
|
static constexpr fs::perms constExprOwnerAll()
|
||||||
{
|
{
|
||||||
return fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec;
|
return fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.10.4 enum class perms", "[filesystem][enum][fs.enum]")
|
TEST_CASE("fs.enum - enum class perms", "[filesystem][enum][fs.enum]")
|
||||||
{
|
{
|
||||||
static_assert(constExprOwnerAll() == fs::perms::owner_all, "constexpr didn't result in owner_all");
|
static_assert(constExprOwnerAll() == fs::perms::owner_all, "constexpr didn't result in owner_all");
|
||||||
CHECK((fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec) == fs::perms::owner_all);
|
CHECK((fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec) == fs::perms::owner_all);
|
||||||
@ -1184,7 +1233,7 @@ TEST_CASE("30.10.10.4 enum class perms", "[filesystem][enum][fs.enum]")
|
|||||||
CHECK((fs::perms::all | fs::perms::set_uid | fs::perms::set_gid | fs::perms::sticky_bit) == fs::perms::mask);
|
CHECK((fs::perms::all | fs::perms::set_uid | fs::perms::set_gid | fs::perms::sticky_bit) == fs::perms::mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.11 class file_status", "[filesystem][file_status][fs.class.file_status]")
|
TEST_CASE("fs.class.file_status - class file_status", "[filesystem][file_status][fs.class.file_status]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
fs::file_status fs;
|
fs::file_status fs;
|
||||||
@ -1219,9 +1268,20 @@ TEST_CASE("30.10.11 class file_status", "[filesystem][file_status][fs.class.file
|
|||||||
CHECK(fs.type() == fs::file_type::regular);
|
CHECK(fs.type() == fs::file_type::regular);
|
||||||
CHECK(fs.permissions() == fs::perms::unknown);
|
CHECK(fs.permissions() == fs::perms::unknown);
|
||||||
}
|
}
|
||||||
|
#if !defined(USE_STD_FS) || defined(GHC_FILESYSTEM_RUNNING_CPP20)
|
||||||
|
{
|
||||||
|
fs::file_status fs1{fs::file_type::regular, fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec};
|
||||||
|
fs::file_status fs2{fs::file_type::regular, fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec};
|
||||||
|
fs::file_status fs3{fs::file_type::directory, fs::perms::owner_read | fs::perms::owner_write | fs::perms::owner_exec};
|
||||||
|
fs::file_status fs4{fs::file_type::regular, fs::perms::owner_read | fs::perms::owner_write};
|
||||||
|
CHECK(fs1 == fs2);
|
||||||
|
CHECK_FALSE(fs1 == fs3);
|
||||||
|
CHECK_FALSE(fs1 == fs4);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.12 class directory_entry", "[filesystem][directory_entry][fs.dir.entry]")
|
TEST_CASE("fs.dir.entry - class directory_entry", "[filesystem][directory_entry][fs.dir.entry]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -1336,9 +1396,19 @@ TEST_CASE("30.10.12 class directory_entry", "[filesystem][directory_entry][fs.di
|
|||||||
CHECK(!(d2 != d2));
|
CHECK(!(d2 != d2));
|
||||||
CHECK(d1 == d1);
|
CHECK(d1 == d1);
|
||||||
CHECK(!(d1 == d2));
|
CHECK(!(d1 == d2));
|
||||||
|
if(is_symlink_creation_supported()) {
|
||||||
|
fs::create_symlink(t.path() / "nonexistent", t.path() / "broken");
|
||||||
|
for (auto d3 : fs::directory_iterator(t.path())) {
|
||||||
|
CHECK_NOTHROW(d3.symlink_status());
|
||||||
|
CHECK_NOTHROW(d3.status());
|
||||||
|
CHECK_NOTHROW(d3.refresh());
|
||||||
|
}
|
||||||
|
fs::directory_entry entry(t.path() / "broken");
|
||||||
|
CHECK_NOTHROW(entry.refresh());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.13 class directory_iterator", "[filesystem][directory_iterator][fs.class.directory_iterator]")
|
TEST_CASE("fs.class.directory_iterator - class directory_iterator", "[filesystem][directory_iterator][fs.class.directory_iterator]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
@ -1399,7 +1469,7 @@ TEST_CASE("30.10.13 class directory_iterator", "[filesystem][directory_iterator]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.14 class recursive_directory_iterator", "[filesystem][recursive_directory_iterator][fs.class.rec.dir.itr]")
|
TEST_CASE("fs.class.rec.dir.itr - class recursive_directory_iterator", "[filesystem][recursive_directory_iterator][fs.class.rec.dir.itr]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
auto iter = fs::recursive_directory_iterator(".");
|
auto iter = fs::recursive_directory_iterator(".");
|
||||||
@ -1555,9 +1625,40 @@ TEST_CASE("30.10.14 class recursive_directory_iterator", "[filesystem][recursive
|
|||||||
}
|
}
|
||||||
CHECK(os.str() == "[./a,0],[./d1,0],[./d1/d2,1],[./e,0],");
|
CHECK(os.str() == "[./a,0],[./d1,0],[./d1/d2,1],[./e,0],");
|
||||||
}
|
}
|
||||||
|
if (is_symlink_creation_supported()) {
|
||||||
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
|
fs::create_directory("d1");
|
||||||
|
generateFile("d1/a");
|
||||||
|
fs::create_directory("d2");
|
||||||
|
generateFile("d2/b");
|
||||||
|
fs::create_directory_symlink("../d1", "d2/ds1");
|
||||||
|
fs::create_directory_symlink("d3", "d2/ds2");
|
||||||
|
std::multiset<std::string> result;
|
||||||
|
REQUIRE_NOTHROW([&](){
|
||||||
|
for (const auto& de : fs::recursive_directory_iterator("d2", fs::directory_options::follow_directory_symlink)) {
|
||||||
|
result.insert(de.path().generic_string());
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
std::stringstream os;
|
||||||
|
for(const auto& p : result) {
|
||||||
|
os << p << ",";
|
||||||
|
}
|
||||||
|
CHECK(os.str() == "d2/b,d2/ds1,d2/ds1/a,d2/ds2,");
|
||||||
|
os.str("");
|
||||||
|
result.clear();
|
||||||
|
REQUIRE_NOTHROW([&](){
|
||||||
|
for (const auto& de : fs::recursive_directory_iterator("d2")) {
|
||||||
|
result.insert(de.path().generic_string());
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
for(const auto& p : result) {
|
||||||
|
os << p << ",";
|
||||||
|
}
|
||||||
|
CHECK(os.str() == "d2/b,d2/ds1,d2/ds2,");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.1 absolute", "[filesystem][operations][fs.op.absolute]")
|
TEST_CASE("fs.op.absolute - absolute", "[filesystem][operations][fs.op.absolute]")
|
||||||
{
|
{
|
||||||
CHECK(fs::absolute("") == fs::current_path() / "");
|
CHECK(fs::absolute("") == fs::current_path() / "");
|
||||||
CHECK(fs::absolute(fs::current_path()) == fs::current_path());
|
CHECK(fs::absolute(fs::current_path()) == fs::current_path());
|
||||||
@ -1571,7 +1672,7 @@ TEST_CASE("30.10.15.1 absolute", "[filesystem][operations][fs.op.absolute]")
|
|||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.2 canonical", "[filesystem][operations][fs.op.canonical]")
|
TEST_CASE("fs.op.canonical - canonical", "[filesystem][operations][fs.op.canonical]")
|
||||||
{
|
{
|
||||||
CHECK_THROWS_AS(fs::canonical(""), fs::filesystem_error);
|
CHECK_THROWS_AS(fs::canonical(""), fs::filesystem_error);
|
||||||
{
|
{
|
||||||
@ -1614,7 +1715,7 @@ TEST_CASE("30.10.15.2 canonical", "[filesystem][operations][fs.op.canonical]")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.3 copy", "[filesystem][operations][fs.op.copy]")
|
TEST_CASE("fs.op.copy - copy", "[filesystem][operations][fs.op.copy]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
@ -1683,7 +1784,7 @@ TEST_CASE("30.10.15.3 copy", "[filesystem][operations][fs.op.copy]")
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.4 copy_file", "[filesystem][operations][fs.op.copy_file]")
|
TEST_CASE("fs.op.copy_file - copy_file", "[filesystem][operations][fs.op.copy_file]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -1706,9 +1807,22 @@ TEST_CASE("30.10.15.4 copy_file", "[filesystem][operations][fs.op.copy_file]")
|
|||||||
CHECK_NOTHROW(fs::copy_file("foobar", "foobar2", ec));
|
CHECK_NOTHROW(fs::copy_file("foobar", "foobar2", ec));
|
||||||
CHECK(ec);
|
CHECK(ec);
|
||||||
CHECK(!fs::exists("foobar"));
|
CHECK(!fs::exists("foobar"));
|
||||||
|
fs::path file1("temp1.txt");
|
||||||
|
fs::path file2("temp2.txt");
|
||||||
|
generateFile(file1, 200);
|
||||||
|
generateFile(file2, 200);
|
||||||
|
auto allWrite = fs::perms::owner_write | fs::perms::group_write | fs::perms::others_write;
|
||||||
|
CHECK_NOTHROW(fs::permissions(file1, allWrite, fs::perm_options::remove));
|
||||||
|
CHECK((fs::status(file1).permissions() & fs::perms::owner_write) != fs::perms::owner_write);
|
||||||
|
CHECK_NOTHROW(fs::permissions(file2, allWrite, fs::perm_options::add));
|
||||||
|
CHECK((fs::status(file2).permissions() & fs::perms::owner_write) == fs::perms::owner_write);
|
||||||
|
fs::copy_file(file1, file2, fs::copy_options::overwrite_existing);
|
||||||
|
CHECK((fs::status(file2).permissions() & fs::perms::owner_write) != fs::perms::owner_write);
|
||||||
|
CHECK_NOTHROW(fs::permissions(file1, allWrite, fs::perm_options::add));
|
||||||
|
CHECK_NOTHROW(fs::permissions(file2, allWrite, fs::perm_options::add));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.5 copy_symlink", "[filesystem][operations][fs.op.copy_symlink]")
|
TEST_CASE("fs.op.copy_symlink - copy_symlink", "[filesystem][operations][fs.op.copy_symlink]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -1733,7 +1847,7 @@ TEST_CASE("30.10.15.5 copy_symlink", "[filesystem][operations][fs.op.copy_symlin
|
|||||||
CHECK(ec);
|
CHECK(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.6 create_directories", "[filesystem][operations][fs.op.create_directories]")
|
TEST_CASE("fs.op.create_directories - create_directories", "[filesystem][operations][fs.op.create_directories]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
fs::path p = t.path() / "testdir";
|
fs::path p = t.path() / "testdir";
|
||||||
@ -1780,7 +1894,7 @@ TEST_CASE("30.10.15.6 create_directories", "[filesystem][operations][fs.op.creat
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.7 create_directory", "[filesystem][operations][fs.op.create_directory]")
|
TEST_CASE("fs.op.create_directory - create_directory", "[filesystem][operations][fs.op.create_directory]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
fs::path p = t.path() / "testdir";
|
fs::path p = t.path() / "testdir";
|
||||||
@ -1827,7 +1941,7 @@ TEST_CASE("30.10.15.7 create_directory", "[filesystem][operations][fs.op.create_
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.8 create_directory_symlink", "[filesystem][operations][fs.op.create_directory_symlink]")
|
TEST_CASE("fs.op.create_directory_symlink - create_directory_symlink", "[filesystem][operations][fs.op.create_directory_symlink]")
|
||||||
{
|
{
|
||||||
if (is_symlink_creation_supported()) {
|
if (is_symlink_creation_supported()) {
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
@ -1846,7 +1960,7 @@ TEST_CASE("30.10.15.8 create_directory_symlink", "[filesystem][operations][fs.op
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.9 create_hard_link", "[filesystem][operations][fs.op.create_hard_link]")
|
TEST_CASE("fs.op.create_hard_link - create_hard_link", "[filesystem][operations][fs.op.create_hard_link]")
|
||||||
{
|
{
|
||||||
#ifndef GHC_OS_WEB
|
#ifndef GHC_OS_WEB
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
@ -1865,7 +1979,7 @@ TEST_CASE("30.10.15.9 create_hard_link", "[filesystem][operations][fs.op.create_
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.10 create_symlink", "[filesystem][operations][fs.op.create_symlink]")
|
TEST_CASE("fs.op.create_symlink - create_symlink", "[filesystem][operations][fs.op.create_symlink]")
|
||||||
{
|
{
|
||||||
if (is_symlink_creation_supported()) {
|
if (is_symlink_creation_supported()) {
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
@ -1884,7 +1998,7 @@ TEST_CASE("30.10.15.10 create_symlink", "[filesystem][operations][fs.op.create_s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.11 current_path", "[filesystem][operations][fs.op.current_path]")
|
TEST_CASE("fs.op.current_path - current_path", "[filesystem][operations][fs.op.current_path]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t;
|
TemporaryDirectory t;
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -1899,7 +2013,7 @@ TEST_CASE("30.10.15.11 current_path", "[filesystem][operations][fs.op.current_pa
|
|||||||
CHECK(ec);
|
CHECK(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.12 equivalent", "[filesystem][operations][fs.op.equivalent]")
|
TEST_CASE("fs.op.equivalent - equivalent", "[filesystem][operations][fs.op.equivalent]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
generateFile("foo", 1234);
|
generateFile("foo", 1234);
|
||||||
@ -1953,7 +2067,7 @@ TEST_CASE("30.10.15.12 equivalent", "[filesystem][operations][fs.op.equivalent]"
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.13 exists", "[filesystem][operations][fs.op.exists]")
|
TEST_CASE("fs.op.exists - exists", "[filesystem][operations][fs.op.exists]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -1963,6 +2077,9 @@ TEST_CASE("30.10.15.13 exists", "[filesystem][operations][fs.op.exists]")
|
|||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
ec = std::error_code(42, std::system_category());
|
ec = std::error_code(42, std::system_category());
|
||||||
CHECK(!fs::exists("foo", ec));
|
CHECK(!fs::exists("foo", ec));
|
||||||
|
#if defined(__cpp_lib_char8_t) && !defined(GHC_FILESYSTEM_ENFORCE_CPP17_API)
|
||||||
|
CHECK(!fs::exists(u8"foo"));
|
||||||
|
#endif
|
||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
ec.clear();
|
ec.clear();
|
||||||
CHECK(fs::exists(t.path()));
|
CHECK(fs::exists(t.path()));
|
||||||
@ -1978,7 +2095,7 @@ TEST_CASE("30.10.15.13 exists", "[filesystem][operations][fs.op.exists]")
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.14 file_size", "[filesystem][operations][fs.op.file_size]")
|
TEST_CASE("fs.op.file_size - file_size", "[filesystem][operations][fs.op.file_size]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2000,7 +2117,16 @@ TEST_CASE("30.10.15.14 file_size", "[filesystem][operations][fs.op.file_size]")
|
|||||||
ec.clear();
|
ec.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.15 hard_link_count", "[filesystem][operations][fs.op.hard_link_count]")
|
#ifndef GHC_OS_WINDOWS
|
||||||
|
static uintmax_t getHardlinkCount(const fs::path& p)
|
||||||
|
{
|
||||||
|
struct stat st = {};
|
||||||
|
auto rc = ::lstat(p.c_str(), &st);
|
||||||
|
return rc == 0 ? st.st_nlink : ~0u;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TEST_CASE("fs.op.hard_link_count - hard_link_count", "[filesystem][operations][fs.op.hard_link_count]")
|
||||||
{
|
{
|
||||||
#ifndef GHC_OS_WEB
|
#ifndef GHC_OS_WEB
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
@ -2015,9 +2141,9 @@ TEST_CASE("30.10.15.15 hard_link_count", "[filesystem][operations][fs.op.hard_li
|
|||||||
// unix/bsd/linux typically implements "."/".." as hardlinks
|
// unix/bsd/linux typically implements "."/".." as hardlinks
|
||||||
// so an empty dir has 2 (from parent and the ".") and
|
// so an empty dir has 2 (from parent and the ".") and
|
||||||
// adding a subdirectory adds one due to its ".."
|
// adding a subdirectory adds one due to its ".."
|
||||||
CHECK(fs::hard_link_count(t.path()) == 2);
|
CHECK(fs::hard_link_count(t.path()) == getHardlinkCount(t.path()));
|
||||||
fs::create_directory("dir");
|
fs::create_directory("dir");
|
||||||
CHECK(fs::hard_link_count(t.path()) == 3);
|
CHECK(fs::hard_link_count(t.path()) == getHardlinkCount(t.path()));
|
||||||
#endif
|
#endif
|
||||||
generateFile("foo");
|
generateFile("foo");
|
||||||
CHECK(fs::hard_link_count(t.path() / "foo") == 1);
|
CHECK(fs::hard_link_count(t.path() / "foo") == 1);
|
||||||
@ -2079,6 +2205,7 @@ public:
|
|||||||
|
|
||||||
fs::path character_path() const
|
fs::path character_path() const
|
||||||
{
|
{
|
||||||
|
#ifndef GHC_OS_SOLARIS
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
if (fs::exists("/dev/null", ec)) {
|
if (fs::exists("/dev/null", ec)) {
|
||||||
return "/dev/null";
|
return "/dev/null";
|
||||||
@ -2086,6 +2213,7 @@ public:
|
|||||||
else if (fs::exists("NUL", ec)) {
|
else if (fs::exists("NUL", ec)) {
|
||||||
return "NUL";
|
return "NUL";
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return fs::path();
|
return fs::path();
|
||||||
}
|
}
|
||||||
fs::path temp_path() const { return _t.path(); }
|
fs::path temp_path() const { return _t.path(); }
|
||||||
@ -2096,7 +2224,7 @@ private:
|
|||||||
bool _hasSocket;
|
bool _hasSocket;
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.16 is_block_file", "[filesystem][operations][fs.op.is_block_file]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_block_file - is_block_file", "[filesystem][operations][fs.op.is_block_file]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_block_file("directory"));
|
CHECK(!fs::is_block_file("directory"));
|
||||||
@ -2125,7 +2253,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.16 is_block_file", "[filesystem][
|
|||||||
CHECK(!fs::is_block_file(fs::file_status(fs::file_type::unknown)));
|
CHECK(!fs::is_block_file(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.17 is_character_file", "[filesystem][operations][fs.op.is_character_file]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_character_file - is_character_file", "[filesystem][operations][fs.op.is_character_file]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_character_file("directory"));
|
CHECK(!fs::is_character_file("directory"));
|
||||||
@ -2154,7 +2282,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.17 is_character_file", "[filesyst
|
|||||||
CHECK(!fs::is_character_file(fs::file_status(fs::file_type::unknown)));
|
CHECK(!fs::is_character_file(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.18 is_directory", "[filesystem][operations][fs.op.is_directory]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_directory - is_directory", "[filesystem][operations][fs.op.is_directory]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(fs::is_directory("directory"));
|
CHECK(fs::is_directory("directory"));
|
||||||
@ -2183,7 +2311,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.18 is_directory", "[filesystem][o
|
|||||||
CHECK(!fs::is_directory(fs::file_status(fs::file_type::unknown)));
|
CHECK(!fs::is_directory(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.19 is_empty", "[filesystem][operations][fs.op.is_empty]")
|
TEST_CASE("fs.op.is_empty - is_empty", "[filesystem][operations][fs.op.is_empty]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2205,7 +2333,7 @@ TEST_CASE("30.10.15.19 is_empty", "[filesystem][operations][fs.op.is_empty]")
|
|||||||
CHECK(ec);
|
CHECK(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.20 is_fifo", "[filesystem][operations][fs.op.is_fifo]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_fifo - is_fifo", "[filesystem][operations][fs.op.is_fifo]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_fifo("directory"));
|
CHECK(!fs::is_fifo("directory"));
|
||||||
@ -2234,7 +2362,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.20 is_fifo", "[filesystem][operat
|
|||||||
CHECK(!fs::is_fifo(fs::file_status(fs::file_type::unknown)));
|
CHECK(!fs::is_fifo(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.21 is_other", "[filesystem][operations][fs.op.is_other]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_other - is_other", "[filesystem][operations][fs.op.is_other]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_other("directory"));
|
CHECK(!fs::is_other("directory"));
|
||||||
@ -2263,7 +2391,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.21 is_other", "[filesystem][opera
|
|||||||
CHECK(fs::is_other(fs::file_status(fs::file_type::unknown)));
|
CHECK(fs::is_other(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.22 is_regular_file", "[filesystem][operations][fs.op.is_regular_file]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_regular_file - is_regular_file", "[filesystem][operations][fs.op.is_regular_file]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_regular_file("directory"));
|
CHECK(!fs::is_regular_file("directory"));
|
||||||
@ -2292,7 +2420,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.22 is_regular_file", "[filesystem
|
|||||||
CHECK(!fs::is_regular_file(fs::file_status(fs::file_type::unknown)));
|
CHECK(!fs::is_regular_file(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.23 is_socket", "[filesystem][operations][fs.op.is_socket]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_socket - is_socket", "[filesystem][operations][fs.op.is_socket]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_socket("directory"));
|
CHECK(!fs::is_socket("directory"));
|
||||||
@ -2321,7 +2449,7 @@ TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.23 is_socket", "[filesystem][oper
|
|||||||
CHECK(!fs::is_socket(fs::file_status(fs::file_type::unknown)));
|
CHECK(!fs::is_socket(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(FileTypeMixFixture, "30.10.15.24 is_symlink", "[filesystem][operations][fs.op.is_symlink]")
|
TEST_CASE_METHOD(FileTypeMixFixture, "fs.op.is_symlink - is_symlink", "[filesystem][operations][fs.op.is_symlink]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(!fs::is_symlink("directory"));
|
CHECK(!fs::is_symlink("directory"));
|
||||||
@ -2364,7 +2492,7 @@ static fs::file_time_type timeFromString(const std::string& str)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEST_CASE("30.10.15.25 last_write_time", "[filesystem][operations][fs.op.last_write_time]")
|
TEST_CASE("fs.op.last_write_time - last_write_time", "[filesystem][operations][fs.op.last_write_time]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2399,7 +2527,7 @@ TEST_CASE("30.10.15.25 last_write_time", "[filesystem][operations][fs.op.last_wr
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.26 permissions", "[filesystem][operations][fs.op.permissions]")
|
TEST_CASE("fs.op.permissions - permissions", "[filesystem][operations][fs.op.permissions]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2407,8 +2535,13 @@ TEST_CASE("30.10.15.26 permissions", "[filesystem][operations][fs.op.permissions
|
|||||||
auto allWrite = fs::perms::owner_write | fs::perms::group_write | fs::perms::others_write;
|
auto allWrite = fs::perms::owner_write | fs::perms::group_write | fs::perms::others_write;
|
||||||
CHECK_NOTHROW(fs::permissions("foo", allWrite, fs::perm_options::remove));
|
CHECK_NOTHROW(fs::permissions("foo", allWrite, fs::perm_options::remove));
|
||||||
CHECK((fs::status("foo").permissions() & fs::perms::owner_write) != fs::perms::owner_write);
|
CHECK((fs::status("foo").permissions() & fs::perms::owner_write) != fs::perms::owner_write);
|
||||||
CHECK_THROWS_AS(fs::resize_file("foo", 1024), fs::filesystem_error);
|
#if !defined(GHC_OS_WINDOWS)
|
||||||
CHECK(fs::file_size("foo") == 512);
|
if (geteuid() != 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
CHECK_THROWS_AS(fs::resize_file("foo", 1024), fs::filesystem_error);
|
||||||
|
CHECK(fs::file_size("foo") == 512);
|
||||||
|
}
|
||||||
CHECK_NOTHROW(fs::permissions("foo", fs::perms::owner_write, fs::perm_options::add));
|
CHECK_NOTHROW(fs::permissions("foo", fs::perms::owner_write, fs::perm_options::add));
|
||||||
CHECK((fs::status("foo").permissions() & fs::perms::owner_write) == fs::perms::owner_write);
|
CHECK((fs::status("foo").permissions() & fs::perms::owner_write) == fs::perms::owner_write);
|
||||||
CHECK_NOTHROW(fs::resize_file("foo", 2048));
|
CHECK_NOTHROW(fs::resize_file("foo", 2048));
|
||||||
@ -2419,7 +2552,7 @@ TEST_CASE("30.10.15.26 permissions", "[filesystem][operations][fs.op.permissions
|
|||||||
CHECK_THROWS_AS(fs::permissions("bar", fs::perms::owner_write, static_cast<fs::perm_options>(0)), fs::filesystem_error);
|
CHECK_THROWS_AS(fs::permissions("bar", fs::perms::owner_write, static_cast<fs::perm_options>(0)), fs::filesystem_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.27 proximate", "[filesystem][operations][fs.op.proximate]")
|
TEST_CASE("fs.op.proximate - proximate", "[filesystem][operations][fs.op.proximate]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK(fs::proximate("/a/d", "/a/b/c") == "../../d");
|
CHECK(fs::proximate("/a/d", "/a/b/c") == "../../d");
|
||||||
@ -2449,7 +2582,7 @@ TEST_CASE("30.10.15.27 proximate", "[filesystem][operations][fs.op.proximate]")
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.28 read_symlink", "[filesystem][operations][fs.op.read_symlink]")
|
TEST_CASE("fs.op.read_symlink - read_symlink", "[filesystem][operations][fs.op.read_symlink]")
|
||||||
{
|
{
|
||||||
if (is_symlink_creation_supported()) {
|
if (is_symlink_creation_supported()) {
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
@ -2465,7 +2598,7 @@ TEST_CASE("30.10.15.28 read_symlink", "[filesystem][operations][fs.op.read_symli
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.29 relative", "[filesystem][operations][fs.op.relative]")
|
TEST_CASE("fs.op.relative - relative", "[filesystem][operations][fs.op.relative]")
|
||||||
{
|
{
|
||||||
CHECK(fs::relative("/a/d", "/a/b/c") == "../../d");
|
CHECK(fs::relative("/a/d", "/a/b/c") == "../../d");
|
||||||
CHECK(fs::relative("/a/b/c", "/a/d") == "../b/c");
|
CHECK(fs::relative("/a/b/c", "/a/d") == "../b/c");
|
||||||
@ -2478,7 +2611,7 @@ TEST_CASE("30.10.15.29 relative", "[filesystem][operations][fs.op.relative]")
|
|||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.30 remove", "[filesystem][operations][fs.op.remove]")
|
TEST_CASE("fs.op.remove - remove", "[filesystem][operations][fs.op.remove]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2502,7 +2635,7 @@ TEST_CASE("30.10.15.30 remove", "[filesystem][operations][fs.op.remove]")
|
|||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.31 remove_all", "[filesystem][operations][fs.op.remove_all]")
|
TEST_CASE("fs.op.remove_all - remove_all", "[filesystem][operations][fs.op.remove_all]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2518,11 +2651,15 @@ TEST_CASE("30.10.15.31 remove_all", "[filesystem][operations][fs.op.remove_all]"
|
|||||||
CHECK_NOTHROW(fs::remove_all("dir1/non-existing", ec));
|
CHECK_NOTHROW(fs::remove_all("dir1/non-existing", ec));
|
||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
CHECK(fs::remove_all("dir1/non-existing", ec) == 0);
|
CHECK(fs::remove_all("dir1/non-existing", ec) == 0);
|
||||||
|
if (is_symlink_creation_supported()) {
|
||||||
|
fs::create_directory_symlink("dir1", "dir1link");
|
||||||
|
CHECK(fs::remove_all("dir1link") == 1);
|
||||||
|
}
|
||||||
CHECK(fs::remove_all("dir1") == 5);
|
CHECK(fs::remove_all("dir1") == 5);
|
||||||
CHECK(fs::directory_iterator(t.path()) == fs::directory_iterator());
|
CHECK(fs::directory_iterator(t.path()) == fs::directory_iterator());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.32 rename", "[filesystem][operations][fs.op.rename]")
|
TEST_CASE("fs.op.rename - rename", "[filesystem][operations][fs.op.rename]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2546,7 +2683,7 @@ TEST_CASE("30.10.15.32 rename", "[filesystem][operations][fs.op.rename]")
|
|||||||
CHECK(!fs::exists("barfoo"));
|
CHECK(!fs::exists("barfoo"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.33 resize_file", "[filesystem][operations][fs.op.resize_file]")
|
TEST_CASE("fs.op.resize_file - resize_file", "[filesystem][operations][fs.op.resize_file]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2564,7 +2701,7 @@ TEST_CASE("30.10.15.33 resize_file", "[filesystem][operations][fs.op.resize_file
|
|||||||
CHECK(!fs::exists("bar"));
|
CHECK(!fs::exists("bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.34 space", "[filesystem][operations][fs.op.space]")
|
TEST_CASE("fs.op.space - space", "[filesystem][operations][fs.op.space]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
fs::space_info si;
|
fs::space_info si;
|
||||||
@ -2596,7 +2733,7 @@ TEST_CASE("30.10.15.34 space", "[filesystem][operations][fs.op.space]")
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.35 status", "[filesystem][operations][fs.op.status]")
|
TEST_CASE("fs.op.status - status", "[filesystem][operations][fs.op.status]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2624,7 +2761,7 @@ TEST_CASE("30.10.15.35 status", "[filesystem][operations][fs.op.status]")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.36 status_known", "[filesystem][operations][fs.op.status_known]")
|
TEST_CASE("fs.op.status_known - status_known", "[filesystem][operations][fs.op.status_known]")
|
||||||
{
|
{
|
||||||
CHECK(!fs::status_known(fs::file_status()));
|
CHECK(!fs::status_known(fs::file_status()));
|
||||||
CHECK(fs::status_known(fs::file_status(fs::file_type::not_found)));
|
CHECK(fs::status_known(fs::file_status(fs::file_type::not_found)));
|
||||||
@ -2637,7 +2774,7 @@ TEST_CASE("30.10.15.36 status_known", "[filesystem][operations][fs.op.status_kno
|
|||||||
CHECK(fs::status_known(fs::file_status(fs::file_type::unknown)));
|
CHECK(fs::status_known(fs::file_status(fs::file_type::unknown)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.37 symlink_status", "[filesystem][operations][fs.op.symlink_status]")
|
TEST_CASE("fs.op.symlink_status - symlink_status", "[filesystem][operations][fs.op.symlink_status]")
|
||||||
{
|
{
|
||||||
TemporaryDirectory t(TempOpt::change_path);
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@ -2664,7 +2801,7 @@ TEST_CASE("30.10.15.37 symlink_status", "[filesystem][operations][fs.op.symlink_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.38 temporary_directory_path", "[filesystem][operations][fs.op.temp_dir_path]")
|
TEST_CASE("fs.op.temp_dir_path - temporary_directory_path", "[filesystem][operations][fs.op.temp_dir_path]")
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
CHECK_NOTHROW(fs::exists(fs::temp_directory_path()));
|
CHECK_NOTHROW(fs::exists(fs::temp_directory_path()));
|
||||||
@ -2673,7 +2810,7 @@ TEST_CASE("30.10.15.38 temporary_directory_path", "[filesystem][operations][fs.o
|
|||||||
CHECK(!ec);
|
CHECK(!ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("30.10.15.39 weakly_canonical", "[filesystem][operations][fs.op.weakly_canonical]")
|
TEST_CASE("fs.op.weakly_canonical - weakly_canonical", "[filesystem][operations][fs.op.weakly_canonical]")
|
||||||
{
|
{
|
||||||
INFO("This might fail on std::implementations that return fs::current_path() for fs::canonical(\"\")");
|
INFO("This might fail on std::implementations that return fs::current_path() for fs::canonical(\"\")");
|
||||||
CHECK(fs::weakly_canonical("") == ".");
|
CHECK(fs::weakly_canonical("") == ".");
|
||||||
@ -2712,33 +2849,40 @@ TEST_CASE("30.10.15.39 weakly_canonical", "[filesystem][operations][fs.op.weakly
|
|||||||
|
|
||||||
TEST_CASE("std::string_view support", "[filesystem][fs.string_view]")
|
TEST_CASE("std::string_view support", "[filesystem][fs.string_view]")
|
||||||
{
|
{
|
||||||
#if __cpp_lib_string_view
|
#if defined(GHC_HAS_STD_STRING_VIEW) || defined(GHC_HAS_STD_EXPERIMENTAL_STRING_VIEW)
|
||||||
|
|
||||||
|
#if defined(GHC_HAS_STD_STRING_VIEW)
|
||||||
using namespace std::literals;
|
using namespace std::literals;
|
||||||
|
using string_view = std::string_view;
|
||||||
|
using wstring_view = std::wstring_view;
|
||||||
|
#elif defined(GHC_HAS_STD_EXPERIMENTAL_STRING_VIEW)
|
||||||
|
using string_view = std::experimental::string_view;
|
||||||
|
using wstring_view = std::experimental::wstring_view;
|
||||||
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
std::string p("foo/bar");
|
std::string p("foo/bar");
|
||||||
std::string_view sv(p);
|
string_view sv(p);
|
||||||
CHECK(fs::path(sv, fs::path::format::generic_format).generic_string() == "foo/bar");
|
CHECK(fs::path(sv, fs::path::format::generic_format).generic_string() == "foo/bar");
|
||||||
fs::path p2("fo");
|
fs::path p2("fo");
|
||||||
p2 += std::string_view("o");
|
p2 += string_view("o");
|
||||||
CHECK(p2 == "foo");
|
CHECK(p2 == "foo");
|
||||||
CHECK(p2.compare(std::string_view("foo")) == 0);
|
CHECK(p2.compare(string_view("foo")) == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto p = fs::path{"XYZ"};
|
auto p = fs::path{"XYZ"};
|
||||||
p /= std::string_view("Appendix");
|
p /= string_view("Appendix");
|
||||||
CHECK(p == "XYZ/Appendix");
|
CHECK(p == "XYZ/Appendix");
|
||||||
}
|
}
|
||||||
#if defined(IS_WCHAR_PATH) || defined(GHC_USE_WCHAR_T)
|
|
||||||
{
|
{
|
||||||
std::wstring p(L"foo/bar");
|
std::wstring p(L"foo/bar");
|
||||||
std::wstring_view sv(p);
|
wstring_view sv(p);
|
||||||
CHECK(fs::path(sv, fs::path::format::generic_format).generic_string() == "foo/bar");
|
CHECK(fs::path(sv, fs::path::format::generic_format).generic_string() == "foo/bar");
|
||||||
fs::path p2(L"fo");
|
fs::path p2(L"fo");
|
||||||
p2 += std::wstring_view(L"o");
|
p2 += wstring_view(L"o");
|
||||||
CHECK(p2 == "foo");
|
CHECK(p2 == "foo");
|
||||||
CHECK(p2.compare(std::wstring_view(L"foo")) == 0);
|
CHECK(p2.compare(wstring_view(L"foo")) == 0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
WARN("std::string_view specific tests are empty without std::string_view.");
|
WARN("std::string_view specific tests are empty without std::string_view.");
|
||||||
@ -2758,13 +2902,15 @@ TEST_CASE("Windows: Long filename support", "[filesystem][path][fs.path.win.long
|
|||||||
CHECK_NOTHROW(fs::create_directory(dir));
|
CHECK_NOTHROW(fs::create_directory(dir));
|
||||||
CHECK(fs::exists(dir));
|
CHECK(fs::exists(dir));
|
||||||
generateFile(dir / "f0");
|
generateFile(dir / "f0");
|
||||||
CHECK(fs::exists(dir / "f0"));
|
REQUIRE(fs::exists(dir / "f0"));
|
||||||
auto native = dir.u8string();
|
|
||||||
if (native.substr(0, 4) == u8"\\\\?\\") {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
CHECK(c <= 'Z');
|
CHECK(c > 'Z');
|
||||||
|
fs::remove_all(fs::current_path() / std::string(16, 'A'));
|
||||||
|
CHECK(!fs::exists(fs::current_path() / std::string(16, 'A')));
|
||||||
|
CHECK_NOTHROW(fs::create_directories(dir));
|
||||||
|
CHECK(fs::exists(dir));
|
||||||
|
generateFile(dir / "f0");
|
||||||
|
CHECK(fs::exists(dir / "f0"));
|
||||||
#else
|
#else
|
||||||
WARN("Windows specific tests are empty on non-Windows systems.");
|
WARN("Windows specific tests are empty on non-Windows systems.");
|
||||||
#endif
|
#endif
|
||||||
@ -2797,8 +2943,8 @@ TEST_CASE("Windows: path namespace handling", "[filesystem][path][fs.path.win.na
|
|||||||
{R"(\\?\C:\Windows\notepad.exe)", R"(\\?\C:\Windows\notepad.exe)", "\\\\?", "\\\\?\\", "//?,/,C:,Windows,notepad.exe"},
|
{R"(\\?\C:\Windows\notepad.exe)", R"(\\?\C:\Windows\notepad.exe)", "\\\\?", "\\\\?\\", "//?,/,C:,Windows,notepad.exe"},
|
||||||
{R"(\??\C:\Windows\notepad.exe)", R"(\??\C:\Windows\notepad.exe)", "\\??", "\\??\\", "/??,/,C:,Windows,notepad.exe"},
|
{R"(\??\C:\Windows\notepad.exe)", R"(\??\C:\Windows\notepad.exe)", "\\??", "\\??\\", "/??,/,C:,Windows,notepad.exe"},
|
||||||
#else
|
#else
|
||||||
{R"(\\?\C:\Windows\notepad.exe)", R"(C:\Windows\notepad.exe)", "C:", "C:\\", "C:,/,Windows,notepad.exe"},
|
{R"(\\?\C:\Windows\notepad.exe)", R"(\\?\C:\Windows\notepad.exe)", "C:", "C:\\", "//?/,C:,/,Windows,notepad.exe"},
|
||||||
{R"(\??\C:\Windows\notepad.exe)", R"(C:\Windows\notepad.exe)", "C:", "C:\\", "C:,/,Windows,notepad.exe"},
|
{R"(\??\C:\Windows\notepad.exe)", R"(\??\C:\Windows\notepad.exe)", "C:", "C:\\", "/?\?/,C:,/,Windows,notepad.exe"},
|
||||||
#endif
|
#endif
|
||||||
{R"(\\.\C:\Windows\notepad.exe)", R"(\\.\C:\Windows\notepad.exe)", "\\\\.", "\\\\.\\", "//.,/,C:,Windows,notepad.exe"},
|
{R"(\\.\C:\Windows\notepad.exe)", R"(\\.\C:\Windows\notepad.exe)", "\\\\.", "\\\\.\\", "//.,/,C:,Windows,notepad.exe"},
|
||||||
{R"(\\?\HarddiskVolume1\Windows\notepad.exe)", R"(\\?\HarddiskVolume1\Windows\notepad.exe)", "\\\\?", "\\\\?\\", "//?,/,HarddiskVolume1,Windows,notepad.exe"},
|
{R"(\\?\HarddiskVolume1\Windows\notepad.exe)", R"(\\?\HarddiskVolume1\Windows\notepad.exe)", "\\\\?", "\\\\?\\", "//?,/,HarddiskVolume1,Windows,notepad.exe"},
|
||||||
@ -2815,6 +2961,7 @@ TEST_CASE("Windows: path namespace handling", "[filesystem][path][fs.path.win.na
|
|||||||
INFO("Used path: " + ti._path);
|
INFO("Used path: " + ti._path);
|
||||||
auto p = fs::path(ti._path);
|
auto p = fs::path(ti._path);
|
||||||
CHECK(p.string() == ti._string);
|
CHECK(p.string() == ti._string);
|
||||||
|
CHECK(p.is_absolute());
|
||||||
CHECK(p.root_name().string() == ti._rootName);
|
CHECK(p.root_name().string() == ti._rootName);
|
||||||
CHECK(p.root_path().string() == ti._rootPath);
|
CHECK(p.root_path().string() == ti._rootPath);
|
||||||
CHECK(iterateResult(p) == ti._iterateResult);
|
CHECK(iterateResult(p) == ti._iterateResult);
|
||||||
@ -2823,3 +2970,31 @@ TEST_CASE("Windows: path namespace handling", "[filesystem][path][fs.path.win.na
|
|||||||
WARN("Windows specific tests are empty on non-Windows systems.");
|
WARN("Windows specific tests are empty on non-Windows systems.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Windows: Mapped folders handling ", "[filesystem][fs.win][fs.win.mapped]")
|
||||||
|
{
|
||||||
|
#ifdef GHC_OS_WINDOWS
|
||||||
|
// this test expects a mapped volume on C:\\fs-test as is the case on the development test system
|
||||||
|
// does nothing on other systems
|
||||||
|
if (fs::exists("C:\\fs-test")) {
|
||||||
|
CHECK(fs::canonical("C:\\fs-test\\Test.txt").string() == "C:\\fs-test\\Test.txt");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
WARN("Windows specific tests are empty on non-Windows systems.");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Windows: Deletion of Read-only Files", "[filesystem][fs.win][fs.win.remove]")
|
||||||
|
{
|
||||||
|
#ifdef GHC_OS_WINDOWS
|
||||||
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
|
std::error_code ec;
|
||||||
|
generateFile("foo", 512);
|
||||||
|
auto allWrite = fs::perms::owner_write | fs::perms::group_write | fs::perms::others_write;
|
||||||
|
CHECK_NOTHROW(fs::permissions("foo", allWrite, fs::perm_options::remove));
|
||||||
|
CHECK_NOTHROW(fs::remove("foo"));
|
||||||
|
CHECK(!fs::exists("foo"));
|
||||||
|
#else
|
||||||
|
WARN("Windows specific tests are empty on non-Windows systems.");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|||||||
@ -3,7 +3,6 @@
|
|||||||
// where exactly one cpp includes fs_impl.hpp and all others use
|
// where exactly one cpp includes fs_impl.hpp and all others use
|
||||||
// fs_fwd.hpp (to test this with maximum functionality, the unit tests
|
// fs_fwd.hpp (to test this with maximum functionality, the unit tests
|
||||||
// are included here, signaling they should only include the fs_fwd.hpp)
|
// are included here, signaling they should only include the fs_fwd.hpp)
|
||||||
#define NOMINMAX
|
|
||||||
#include <ghc/fs_impl.hpp>
|
#include <ghc/fs_impl.hpp>
|
||||||
#define CATCH_CONFIG_MAIN
|
#define CATCH_CONFIG_MAIN
|
||||||
#include "catch.hpp"
|
#include "catch.hpp"
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
#include <ghc/filesystem.hpp>
|
#include <ghc/filesystem.hpp>
|
||||||
namespace fs = ghc::filesystem;
|
namespace fs = ghc::filesystem;
|
||||||
|
|
||||||
// This test and the one in multi2.cpp doesn't actualy test relevant functionality,
|
// This test and the one in multi2.cpp doesn't actually test relevant functionality,
|
||||||
// it is just used to check that it is possible to include filesystem.h in multiple
|
// it is just used to check that it is possible to include filesystem.h in multiple
|
||||||
// source files.
|
// source files.
|
||||||
TEST_CASE("Multifile-test 1", "[multi]")
|
TEST_CASE("Multifile-test 1", "[multi]")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user