16e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===//
26e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//
36e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//                     The LLVM Compiler Infrastructure
46e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//
56e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
66e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// Source Licenses. See LICENSE.TXT for details.
76e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//
86e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===//
96e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// UNSUPPORTED: c++98, c++03
116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// <experimental/filesystem>
136e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// bool create_directories(const path& p);
156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// bool create_directories(const path& p, error_code& ec) noexcept;
166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <experimental/filesystem>
186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <type_traits>
196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cassert>
206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "test_macros.h"
226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "rapid-cxx-test.hpp"
236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "filesystem_test_helper.hpp"
246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierusing namespace std::experimental::filesystem;
266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace fs = std::experimental::filesystem;
276e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
286e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE(filesystem_create_directories_test_suite)
296e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
306e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(test_signatures)
316e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{
326e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    const path p; ((void)p);
336e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    std::error_code ec; ((void)ec);
346e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    ASSERT_SAME_TYPE(decltype(fs::create_directories(p)), bool);
356e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    ASSERT_SAME_TYPE(decltype(fs::create_directories(p, ec)), bool);
366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    ASSERT_NOT_NOEXCEPT(fs::create_directories(p));
376e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    ASSERT_NOEXCEPT(fs::create_directories(p, ec));
386e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier}
396e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
406e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(create_existing_directory)
416e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{
426e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    scoped_test_env env;
436e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    const path dir = env.create_dir("dir1");
446e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    std::error_code ec;
456e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(fs::create_directories(dir, ec) == false);
466e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(!ec);
476e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(is_directory(dir));
486e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier}
496e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
506e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(create_directory_one_level)
516e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{
526e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    scoped_test_env env;
536e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    const path dir = env.make_env_path("dir1");
546e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    std::error_code ec;
556e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(fs::create_directories(dir, ec) == true);
566e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(!ec);
576e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(is_directory(dir));
586e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier}
596e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
606e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(create_directories_multi_level)
616e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{
626e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    scoped_test_env env;
636e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    const path dir = env.make_env_path("dir1/dir2/dir3");
646e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    std::error_code ec;
656e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(fs::create_directories(dir, ec) == true);
666e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(!ec);
676e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier    TEST_CHECK(is_directory(dir));
686e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier}
696e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier
706e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE_END()
71