13ef91c55SMichael J. Spencer //===- llvm/unittest/Support/Path.cpp - Path tests ------------------------===//
23ef91c55SMichael J. Spencer //
33ef91c55SMichael J. Spencer //                     The LLVM Compiler Infrastructure
43ef91c55SMichael J. Spencer //
53ef91c55SMichael J. Spencer // This file is distributed under the University of Illinois Open Source
63ef91c55SMichael J. Spencer // License. See LICENSE.TXT for details.
73ef91c55SMichael J. Spencer //
83ef91c55SMichael J. Spencer //===----------------------------------------------------------------------===//
93ef91c55SMichael J. Spencer 
104571040eSMichael J. Spencer #include "llvm/Support/FileSystem.h"
113ef91c55SMichael J. Spencer #include "llvm/Support/PathV2.h"
123ef91c55SMichael J. Spencer 
133ef91c55SMichael J. Spencer #include "gtest/gtest.h"
143ef91c55SMichael J. Spencer 
153ef91c55SMichael J. Spencer using namespace llvm;
164571040eSMichael J. Spencer using namespace llvm::sys;
173ef91c55SMichael J. Spencer 
184d0c6fddSMichael J. Spencer #define TEST_OUT(func, result) outs() << "    " #func ": " << result << '\n';
194d0c6fddSMichael J. Spencer 
204d0c6fddSMichael J. Spencer #define TEST_PATH_(header, func, funcname, output) \
214d0c6fddSMichael J. Spencer   header; \
224d0c6fddSMichael J. Spencer   if (error_code ec = sys::path::func) \
234d0c6fddSMichael J. Spencer     ASSERT_FALSE(ec.message().c_str()); \
244d0c6fddSMichael J. Spencer   TEST_OUT(funcname, output)
254d0c6fddSMichael J. Spencer 
269ceae88fSMichael J. Spencer #define TEST_PATH(func, ipath, res) TEST_PATH_(;, func(ipath, res), func, res);
274d0c6fddSMichael J. Spencer 
284d0c6fddSMichael J. Spencer #define TEST_PATH_SMALLVEC(func, ipath, inout) \
294d0c6fddSMichael J. Spencer   TEST_PATH_(inout = ipath, func(inout), func, inout)
304d0c6fddSMichael J. Spencer 
314d0c6fddSMichael J. Spencer #define TEST_PATH_SMALLVEC_P(func, ipath, inout, param) \
324d0c6fddSMichael J. Spencer   TEST_PATH_(inout = ipath, func(inout, param), func, inout)
334d0c6fddSMichael J. Spencer 
343ef91c55SMichael J. Spencer namespace {
353ef91c55SMichael J. Spencer 
363ef91c55SMichael J. Spencer TEST(Support, Path) {
373ef91c55SMichael J. Spencer   SmallVector<StringRef, 40> paths;
383ef91c55SMichael J. Spencer   paths.push_back("");
393ef91c55SMichael J. Spencer   paths.push_back(".");
403ef91c55SMichael J. Spencer   paths.push_back("..");
413ef91c55SMichael J. Spencer   paths.push_back("foo");
423ef91c55SMichael J. Spencer   paths.push_back("/");
433ef91c55SMichael J. Spencer   paths.push_back("/foo");
443ef91c55SMichael J. Spencer   paths.push_back("foo/");
453ef91c55SMichael J. Spencer   paths.push_back("/foo/");
463ef91c55SMichael J. Spencer   paths.push_back("foo/bar");
473ef91c55SMichael J. Spencer   paths.push_back("/foo/bar");
483ef91c55SMichael J. Spencer   paths.push_back("//net");
493ef91c55SMichael J. Spencer   paths.push_back("//net/foo");
503ef91c55SMichael J. Spencer   paths.push_back("///foo///");
513ef91c55SMichael J. Spencer   paths.push_back("///foo///bar");
523ef91c55SMichael J. Spencer   paths.push_back("/.");
533ef91c55SMichael J. Spencer   paths.push_back("./");
543ef91c55SMichael J. Spencer   paths.push_back("/..");
553ef91c55SMichael J. Spencer   paths.push_back("../");
563ef91c55SMichael J. Spencer   paths.push_back("foo/.");
573ef91c55SMichael J. Spencer   paths.push_back("foo/..");
583ef91c55SMichael J. Spencer   paths.push_back("foo/./");
593ef91c55SMichael J. Spencer   paths.push_back("foo/./bar");
603ef91c55SMichael J. Spencer   paths.push_back("foo/..");
613ef91c55SMichael J. Spencer   paths.push_back("foo/../");
623ef91c55SMichael J. Spencer   paths.push_back("foo/../bar");
633ef91c55SMichael J. Spencer   paths.push_back("c:");
643ef91c55SMichael J. Spencer   paths.push_back("c:/");
653ef91c55SMichael J. Spencer   paths.push_back("c:foo");
663ef91c55SMichael J. Spencer   paths.push_back("c:/foo");
673ef91c55SMichael J. Spencer   paths.push_back("c:foo/");
683ef91c55SMichael J. Spencer   paths.push_back("c:/foo/");
693ef91c55SMichael J. Spencer   paths.push_back("c:/foo/bar");
703ef91c55SMichael J. Spencer   paths.push_back("prn:");
713ef91c55SMichael J. Spencer   paths.push_back("c:\\");
723ef91c55SMichael J. Spencer   paths.push_back("c:foo");
733ef91c55SMichael J. Spencer   paths.push_back("c:\\foo");
743ef91c55SMichael J. Spencer   paths.push_back("c:foo\\");
753ef91c55SMichael J. Spencer   paths.push_back("c:\\foo\\");
763ef91c55SMichael J. Spencer   paths.push_back("c:\\foo/");
773ef91c55SMichael J. Spencer   paths.push_back("c:/foo\\bar");
783ef91c55SMichael J. Spencer 
793ef91c55SMichael J. Spencer   for (SmallVector<StringRef, 40>::const_iterator i = paths.begin(),
803ef91c55SMichael J. Spencer                                                   e = paths.end();
813ef91c55SMichael J. Spencer                                                   i != e;
823ef91c55SMichael J. Spencer                                                   ++i) {
833ef91c55SMichael J. Spencer     outs() << *i << " =>\n    Iteration: [";
843ef91c55SMichael J. Spencer     for (sys::path::const_iterator ci = sys::path::begin(*i),
853ef91c55SMichael J. Spencer                                    ce = sys::path::end(*i);
863ef91c55SMichael J. Spencer                                    ci != ce;
873ef91c55SMichael J. Spencer                                    ++ci) {
883ef91c55SMichael J. Spencer       outs() << *ci << ',';
893ef91c55SMichael J. Spencer     }
903ef91c55SMichael J. Spencer     outs() << "]\n";
913ef91c55SMichael J. Spencer 
9275942f9dSMichael J. Spencer #if 0 // Valgrind is whining about this.
93545cbdf0SMichael J. Spencer     outs() << "    Reverse Iteration: [";
94545cbdf0SMichael J. Spencer     for (sys::path::reverse_iterator ci = sys::path::rbegin(*i),
95545cbdf0SMichael J. Spencer                                      ce = sys::path::rend(*i);
96545cbdf0SMichael J. Spencer                                      ci != ce;
97545cbdf0SMichael J. Spencer                                      ++ci) {
98545cbdf0SMichael J. Spencer       outs() << *ci << ',';
99545cbdf0SMichael J. Spencer     }
100545cbdf0SMichael J. Spencer     outs() << "]\n";
10175942f9dSMichael J. Spencer #endif
102545cbdf0SMichael J. Spencer 
103112a7693SMichael J. Spencer     bool      bres;
1044d0c6fddSMichael J. Spencer     StringRef sfres;
105112a7693SMichael J. Spencer     TEST_PATH(has_root_path, *i, bres);
1064d0c6fddSMichael J. Spencer     TEST_PATH(root_path, *i, sfres);
107112a7693SMichael J. Spencer     TEST_PATH(has_root_name, *i, bres);
1084d0c6fddSMichael J. Spencer     TEST_PATH(root_name, *i, sfres);
109112a7693SMichael J. Spencer     TEST_PATH(has_root_directory, *i, bres);
1104d0c6fddSMichael J. Spencer     TEST_PATH(root_directory, *i, sfres);
111112a7693SMichael J. Spencer     TEST_PATH(has_parent_path, *i, bres);
1124d0c6fddSMichael J. Spencer     TEST_PATH(parent_path, *i, sfres);
113112a7693SMichael J. Spencer     TEST_PATH(has_filename, *i, bres);
1144d0c6fddSMichael J. Spencer     TEST_PATH(filename, *i, sfres);
115112a7693SMichael J. Spencer     TEST_PATH(has_stem, *i, bres);
1164d0c6fddSMichael J. Spencer     TEST_PATH(stem, *i, sfres);
117112a7693SMichael J. Spencer     TEST_PATH(has_extension, *i, bres);
1184d0c6fddSMichael J. Spencer     TEST_PATH(extension, *i, sfres);
119a72df5faSMichael J. Spencer     TEST_PATH(is_absolute, *i, bres);
120a72df5faSMichael J. Spencer     TEST_PATH(is_relative, *i, bres);
1213ef91c55SMichael J. Spencer 
1224d0c6fddSMichael J. Spencer     SmallString<16> temp_store;
1234d0c6fddSMichael J. Spencer     TEST_PATH_SMALLVEC(make_absolute, *i, temp_store);
1244d0c6fddSMichael J. Spencer     TEST_PATH_SMALLVEC(remove_filename, *i, temp_store);
1254d0c6fddSMichael J. Spencer 
1264d0c6fddSMichael J. Spencer     TEST_PATH_SMALLVEC_P(replace_extension, *i, temp_store, "ext");
1274d0c6fddSMichael J. Spencer     StringRef filename(temp_store.begin(), temp_store.size()), stem, ext;
1284d0c6fddSMichael J. Spencer     TEST_PATH(stem, filename, stem);
1294d0c6fddSMichael J. Spencer     TEST_PATH(extension, filename, ext);
1304d0c6fddSMichael J. Spencer     EXPECT_EQ(*(--sys::path::end(filename)), (stem + ext).str());
1314d0c6fddSMichael J. Spencer 
1329ceae88fSMichael J. Spencer     TEST_PATH_(;, native(*i, temp_store), native, temp_store);
1333ef91c55SMichael J. Spencer 
1343ef91c55SMichael J. Spencer     outs().flush();
1353ef91c55SMichael J. Spencer   }
1364571040eSMichael J. Spencer 
1374571040eSMichael J. Spencer   int FileDescriptor;
1384571040eSMichael J. Spencer   SmallString<64> TempPath;
1394571040eSMichael J. Spencer   if (error_code ec = sys::fs::unique_file("%%-%%-%%-%%.temp",
1404571040eSMichael J. Spencer                                             FileDescriptor, TempPath))
1414571040eSMichael J. Spencer     ASSERT_FALSE(ec.message().c_str());
1424571040eSMichael J. Spencer 
1434571040eSMichael J. Spencer   bool TempFileExists;
1444571040eSMichael J. Spencer   ASSERT_FALSE(sys::fs::exists(Twine(TempPath), TempFileExists));
1454571040eSMichael J. Spencer   EXPECT_TRUE(TempFileExists);
1464571040eSMichael J. Spencer 
1474571040eSMichael J. Spencer   ::close(FileDescriptor);
1484571040eSMichael J. Spencer   ::remove(TempPath.begin());
1494571040eSMichael J. Spencer 
1504571040eSMichael J. Spencer   ASSERT_FALSE(fs::exists(Twine(TempPath), TempFileExists));
151*ab160547SMichael J. Spencer   // FIXME: This is returning true on some systems...
152*ab160547SMichael J. Spencer   // EXPECT_FALSE(TempFileExists);
1533ef91c55SMichael J. Spencer }
1543ef91c55SMichael J. Spencer 
1553ef91c55SMichael J. Spencer } // anonymous namespace
156