unittests/Support/PathV2: Make tests much shorter; although harder to understand.
[oota-llvm.git] / unittests / Support / Path.cpp
1 //===- llvm/unittest/Support/Path.cpp - Path tests ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/Support/PathV2.h"
11
12 #include "gtest/gtest.h"
13
14 using namespace llvm;
15
16 #define TEST_OUT(func, result) outs() << "    " #func ": " << result << '\n';
17
18 #define TEST_PATH_(header, func, funcname, output) \
19   header; \
20   if (error_code ec = sys::path::func) \
21     ASSERT_FALSE(ec.message().c_str()); \
22   TEST_OUT(funcname, output)
23
24 #define TEST_PATH(func, ipath, res) TEST_PATH_(, func(ipath, res), func, res);
25
26 #define TEST_PATH_SMALLVEC(func, ipath, inout) \
27   TEST_PATH_(inout = ipath, func(inout), func, inout)
28
29 #define TEST_PATH_SMALLVEC_P(func, ipath, inout, param) \
30   TEST_PATH_(inout = ipath, func(inout, param), func, inout)
31
32 namespace {
33
34 TEST(Support, Path) {
35   SmallVector<StringRef, 40> paths;
36   paths.push_back("");
37   paths.push_back(".");
38   paths.push_back("..");
39   paths.push_back("foo");
40   paths.push_back("/");
41   paths.push_back("/foo");
42   paths.push_back("foo/");
43   paths.push_back("/foo/");
44   paths.push_back("foo/bar");
45   paths.push_back("/foo/bar");
46   paths.push_back("//net");
47   paths.push_back("//net/foo");
48   paths.push_back("///foo///");
49   paths.push_back("///foo///bar");
50   paths.push_back("/.");
51   paths.push_back("./");
52   paths.push_back("/..");
53   paths.push_back("../");
54   paths.push_back("foo/.");
55   paths.push_back("foo/..");
56   paths.push_back("foo/./");
57   paths.push_back("foo/./bar");
58   paths.push_back("foo/..");
59   paths.push_back("foo/../");
60   paths.push_back("foo/../bar");
61   paths.push_back("c:");
62   paths.push_back("c:/");
63   paths.push_back("c:foo");
64   paths.push_back("c:/foo");
65   paths.push_back("c:foo/");
66   paths.push_back("c:/foo/");
67   paths.push_back("c:/foo/bar");
68   paths.push_back("prn:");
69   paths.push_back("c:\\");
70   paths.push_back("c:foo");
71   paths.push_back("c:\\foo");
72   paths.push_back("c:foo\\");
73   paths.push_back("c:\\foo\\");
74   paths.push_back("c:\\foo/");
75   paths.push_back("c:/foo\\bar");
76
77   for (SmallVector<StringRef, 40>::const_iterator i = paths.begin(),
78                                                   e = paths.end();
79                                                   i != e;
80                                                   ++i) {
81     outs() << *i << " =>\n    Iteration: [";
82     for (sys::path::const_iterator ci = sys::path::begin(*i),
83                                    ce = sys::path::end(*i);
84                                    ci != ce;
85                                    ++ci) {
86       outs() << *ci << ',';
87     }
88     outs() << "]\n";
89
90     outs() << "    Reverse Iteration: [";
91     for (sys::path::reverse_iterator ci = sys::path::rbegin(*i),
92                                      ce = sys::path::rend(*i);
93                                      ci != ce;
94                                      ++ci) {
95       outs() << *ci << ',';
96     }
97     outs() << "]\n";
98
99     StringRef sfres;
100     TEST_PATH(root_path, *i, sfres);
101     TEST_PATH(root_name, *i, sfres);
102     TEST_PATH(root_directory, *i, sfres);
103     TEST_PATH(parent_path, *i, sfres);
104     TEST_PATH(filename, *i, sfres);
105     TEST_PATH(stem, *i, sfres);
106     TEST_PATH(extension, *i, sfres);
107
108     SmallString<16> temp_store;
109     TEST_PATH_SMALLVEC(make_absolute, *i, temp_store);
110     TEST_PATH_SMALLVEC(remove_filename, *i, temp_store);
111
112     TEST_PATH_SMALLVEC_P(replace_extension, *i, temp_store, "ext");
113     StringRef filename(temp_store.begin(), temp_store.size()), stem, ext;
114     TEST_PATH(stem, filename, stem);
115     TEST_PATH(extension, filename, ext);
116     EXPECT_EQ(*(--sys::path::end(filename)), (stem + ext).str());
117
118     TEST_PATH_(, native(*i, temp_store), native, temp_store);
119
120     outs().flush();
121   }
122 }
123
124 } // anonymous namespace