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 
103ef91c55SMichael J. Spencer #include "llvm/Support/PathV2.h"
113ef91c55SMichael J. Spencer 
123ef91c55SMichael J. Spencer #include "gtest/gtest.h"
133ef91c55SMichael J. Spencer 
143ef91c55SMichael J. Spencer using namespace llvm;
153ef91c55SMichael J. Spencer 
164d0c6fddSMichael J. Spencer #define TEST_OUT(func, result) outs() << "    " #func ": " << result << '\n';
174d0c6fddSMichael J. Spencer 
184d0c6fddSMichael J. Spencer #define TEST_PATH_(header, func, funcname, output) \
194d0c6fddSMichael J. Spencer   header; \
204d0c6fddSMichael J. Spencer   if (error_code ec = sys::path::func) \
214d0c6fddSMichael J. Spencer     ASSERT_FALSE(ec.message().c_str()); \
224d0c6fddSMichael J. Spencer   TEST_OUT(funcname, output)
234d0c6fddSMichael J. Spencer 
244d0c6fddSMichael J. Spencer #define TEST_PATH(func, ipath, res) TEST_PATH_(, func(ipath, res), func, res);
254d0c6fddSMichael J. Spencer 
264d0c6fddSMichael J. Spencer #define TEST_PATH_SMALLVEC(func, ipath, inout) \
274d0c6fddSMichael J. Spencer   TEST_PATH_(inout = ipath, func(inout), func, inout)
284d0c6fddSMichael J. Spencer 
294d0c6fddSMichael J. Spencer #define TEST_PATH_SMALLVEC_P(func, ipath, inout, param) \
304d0c6fddSMichael J. Spencer   TEST_PATH_(inout = ipath, func(inout, param), func, inout)
314d0c6fddSMichael J. Spencer 
323ef91c55SMichael J. Spencer namespace {
333ef91c55SMichael J. Spencer 
343ef91c55SMichael J. Spencer TEST(Support, Path) {
353ef91c55SMichael J. Spencer   SmallVector<StringRef, 40> paths;
363ef91c55SMichael J. Spencer   paths.push_back("");
373ef91c55SMichael J. Spencer   paths.push_back(".");
383ef91c55SMichael J. Spencer   paths.push_back("..");
393ef91c55SMichael J. Spencer   paths.push_back("foo");
403ef91c55SMichael J. Spencer   paths.push_back("/");
413ef91c55SMichael J. Spencer   paths.push_back("/foo");
423ef91c55SMichael J. Spencer   paths.push_back("foo/");
433ef91c55SMichael J. Spencer   paths.push_back("/foo/");
443ef91c55SMichael J. Spencer   paths.push_back("foo/bar");
453ef91c55SMichael J. Spencer   paths.push_back("/foo/bar");
463ef91c55SMichael J. Spencer   paths.push_back("//net");
473ef91c55SMichael J. Spencer   paths.push_back("//net/foo");
483ef91c55SMichael J. Spencer   paths.push_back("///foo///");
493ef91c55SMichael J. Spencer   paths.push_back("///foo///bar");
503ef91c55SMichael J. Spencer   paths.push_back("/.");
513ef91c55SMichael J. Spencer   paths.push_back("./");
523ef91c55SMichael J. Spencer   paths.push_back("/..");
533ef91c55SMichael J. Spencer   paths.push_back("../");
543ef91c55SMichael J. Spencer   paths.push_back("foo/.");
553ef91c55SMichael J. Spencer   paths.push_back("foo/..");
563ef91c55SMichael J. Spencer   paths.push_back("foo/./");
573ef91c55SMichael J. Spencer   paths.push_back("foo/./bar");
583ef91c55SMichael J. Spencer   paths.push_back("foo/..");
593ef91c55SMichael J. Spencer   paths.push_back("foo/../");
603ef91c55SMichael J. Spencer   paths.push_back("foo/../bar");
613ef91c55SMichael J. Spencer   paths.push_back("c:");
623ef91c55SMichael J. Spencer   paths.push_back("c:/");
633ef91c55SMichael J. Spencer   paths.push_back("c:foo");
643ef91c55SMichael J. Spencer   paths.push_back("c:/foo");
653ef91c55SMichael J. Spencer   paths.push_back("c:foo/");
663ef91c55SMichael J. Spencer   paths.push_back("c:/foo/");
673ef91c55SMichael J. Spencer   paths.push_back("c:/foo/bar");
683ef91c55SMichael J. Spencer   paths.push_back("prn:");
693ef91c55SMichael J. Spencer   paths.push_back("c:\\");
703ef91c55SMichael J. Spencer   paths.push_back("c:foo");
713ef91c55SMichael J. Spencer   paths.push_back("c:\\foo");
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\\bar");
763ef91c55SMichael J. Spencer 
773ef91c55SMichael J. Spencer   for (SmallVector<StringRef, 40>::const_iterator i = paths.begin(),
783ef91c55SMichael J. Spencer                                                   e = paths.end();
793ef91c55SMichael J. Spencer                                                   i != e;
803ef91c55SMichael J. Spencer                                                   ++i) {
813ef91c55SMichael J. Spencer     outs() << *i << " =>\n    Iteration: [";
823ef91c55SMichael J. Spencer     for (sys::path::const_iterator ci = sys::path::begin(*i),
833ef91c55SMichael J. Spencer                                    ce = sys::path::end(*i);
843ef91c55SMichael J. Spencer                                    ci != ce;
853ef91c55SMichael J. Spencer                                    ++ci) {
863ef91c55SMichael J. Spencer       outs() << *ci << ',';
873ef91c55SMichael J. Spencer     }
883ef91c55SMichael J. Spencer     outs() << "]\n";
893ef91c55SMichael J. Spencer 
90545cbdf0SMichael J. Spencer     outs() << "    Reverse Iteration: [";
91545cbdf0SMichael J. Spencer     for (sys::path::reverse_iterator ci = sys::path::rbegin(*i),
92545cbdf0SMichael J. Spencer                                      ce = sys::path::rend(*i);
93545cbdf0SMichael J. Spencer                                      ci != ce;
94545cbdf0SMichael J. Spencer                                      ++ci) {
95545cbdf0SMichael J. Spencer       outs() << *ci << ',';
96545cbdf0SMichael J. Spencer     }
97545cbdf0SMichael J. Spencer     outs() << "]\n";
98545cbdf0SMichael J. Spencer 
99*112a7693SMichael J. Spencer     bool      bres;
1004d0c6fddSMichael J. Spencer     StringRef sfres;
101*112a7693SMichael J. Spencer     TEST_PATH(has_root_path, *i, bres);
1024d0c6fddSMichael J. Spencer     TEST_PATH(root_path, *i, sfres);
103*112a7693SMichael J. Spencer     TEST_PATH(has_root_name, *i, bres);
1044d0c6fddSMichael J. Spencer     TEST_PATH(root_name, *i, sfres);
105*112a7693SMichael J. Spencer     TEST_PATH(has_root_directory, *i, bres);
1064d0c6fddSMichael J. Spencer     TEST_PATH(root_directory, *i, sfres);
107*112a7693SMichael J. Spencer     TEST_PATH(has_parent_path, *i, bres);
1084d0c6fddSMichael J. Spencer     TEST_PATH(parent_path, *i, sfres);
109*112a7693SMichael J. Spencer     TEST_PATH(has_filename, *i, bres);
1104d0c6fddSMichael J. Spencer     TEST_PATH(filename, *i, sfres);
111*112a7693SMichael J. Spencer     TEST_PATH(has_stem, *i, bres);
1124d0c6fddSMichael J. Spencer     TEST_PATH(stem, *i, sfres);
113*112a7693SMichael J. Spencer     TEST_PATH(has_extension, *i, bres);
1144d0c6fddSMichael J. Spencer     TEST_PATH(extension, *i, sfres);
1153ef91c55SMichael J. Spencer 
1164d0c6fddSMichael J. Spencer     SmallString<16> temp_store;
1174d0c6fddSMichael J. Spencer     TEST_PATH_SMALLVEC(make_absolute, *i, temp_store);
1184d0c6fddSMichael J. Spencer     TEST_PATH_SMALLVEC(remove_filename, *i, temp_store);
1194d0c6fddSMichael J. Spencer 
1204d0c6fddSMichael J. Spencer     TEST_PATH_SMALLVEC_P(replace_extension, *i, temp_store, "ext");
1214d0c6fddSMichael J. Spencer     StringRef filename(temp_store.begin(), temp_store.size()), stem, ext;
1224d0c6fddSMichael J. Spencer     TEST_PATH(stem, filename, stem);
1234d0c6fddSMichael J. Spencer     TEST_PATH(extension, filename, ext);
1244d0c6fddSMichael J. Spencer     EXPECT_EQ(*(--sys::path::end(filename)), (stem + ext).str());
1254d0c6fddSMichael J. Spencer 
1264d0c6fddSMichael J. Spencer     TEST_PATH_(, native(*i, temp_store), native, temp_store);
1273ef91c55SMichael J. Spencer 
1283ef91c55SMichael J. Spencer     outs().flush();
1293ef91c55SMichael J. Spencer   }
1303ef91c55SMichael J. Spencer }
1313ef91c55SMichael J. Spencer 
1323ef91c55SMichael J. Spencer } // anonymous namespace
133