[C++] Improve NormalizePath

So now NormalizePath("../foo") will be "../foo" and "/../foo"
will be "/foo".
diff --git a/strutil_test.cc b/strutil_test.cc
index b9c5580..048a974 100644
--- a/strutil_test.cc
+++ b/strutil_test.cc
@@ -22,18 +22,21 @@
 #include <vector>
 
 #include "string_piece.h"
+#include "testutil.h"
 
 using namespace std;
 
+namespace {
+
 void TestWordScanner() {
   vector<StringPiece> ss;
   for (StringPiece tok : WordScanner("foo bar baz")) {
     ss.push_back(tok);
   }
   assert(ss.size() == 3LU);
-  assert(ss[0] == "foo");
-  assert(ss[1] == "bar");
-  assert(ss[2] == "baz");
+  ASSERT_EQ(ss[0], "foo");
+  ASSERT_EQ(ss[1], "bar");
+  ASSERT_EQ(ss[2], "baz");
 }
 
 void TestHasPrefix() {
@@ -57,14 +60,14 @@
 }
 
 void TestSubstPattern() {
-  assert(SubstPattern("x.c", "%.c", "%.o") == "x.o");
-  assert(SubstPattern("c.x", "c.%", "o.%") == "o.x");
-  assert(SubstPattern("x.c.c", "%.c", "%.o") == "x.c.o");
-  assert(SubstPattern("x.x y.c", "%.c", "%.o") == "x.x y.o");
-  assert(SubstPattern("x.%.c", "%.%.c", "OK") == "OK");
-  assert(SubstPattern("x.c", "x.c", "OK") == "OK");
-  assert(SubstPattern("x.c.c", "x.c", "XX") == "x.c.c");
-  assert(SubstPattern("x.x.c", "x.c", "XX") == "x.x.c");
+  ASSERT_EQ(SubstPattern("x.c", "%.c", "%.o"), "x.o");
+  ASSERT_EQ(SubstPattern("c.x", "c.%", "o.%"), "o.x");
+  ASSERT_EQ(SubstPattern("x.c.c", "%.c", "%.o"), "x.c.o");
+  ASSERT_EQ(SubstPattern("x.x y.c", "%.c", "%.o"), "x.x y.o");
+  ASSERT_EQ(SubstPattern("x.%.c", "%.%.c", "OK"), "OK");
+  ASSERT_EQ(SubstPattern("x.c", "x.c", "OK"), "OK");
+  ASSERT_EQ(SubstPattern("x.c.c", "x.c", "XX"), "x.c.c");
+  ASSERT_EQ(SubstPattern("x.x.c", "x.c", "XX"), "x.x.c");
 }
 
 void TestNoLineBreak() {
@@ -84,6 +87,32 @@
   assert(!HasWord("foo bar baz", "fo"));
 }
 
+static string NormalizePath(string s) {
+  ::NormalizePath(&s);
+  return s;
+}
+
+void TestNormalizePath() {
+  ASSERT_EQ(NormalizePath(""), "");
+  ASSERT_EQ(NormalizePath("."), "");
+  ASSERT_EQ(NormalizePath("/"), "/");
+  ASSERT_EQ(NormalizePath("/tmp"), "/tmp");
+  ASSERT_EQ(NormalizePath("////tmp////"), "/tmp");
+  ASSERT_EQ(NormalizePath("a////b"), "a/b");
+  ASSERT_EQ(NormalizePath("a//.//b"), "a/b");
+  ASSERT_EQ(NormalizePath("a////b//../c/////"), "a/c");
+  ASSERT_EQ(NormalizePath("../foo"), "../foo");
+  ASSERT_EQ(NormalizePath("./foo"), "foo");
+  ASSERT_EQ(NormalizePath("x/y/..//../foo"), "foo");
+  ASSERT_EQ(NormalizePath("x/../../foo"), "../foo");
+  ASSERT_EQ(NormalizePath("/../foo"), "/foo");
+  ASSERT_EQ(NormalizePath("/../../foo"), "/foo");
+  ASSERT_EQ(NormalizePath("/a/../../foo"), "/foo");
+  ASSERT_EQ(NormalizePath("/a/b/.."), "/a");
+}
+
+}  // namespace
+
 int main() {
   TestWordScanner();
   TestHasPrefix();
@@ -91,4 +120,6 @@
   TestSubstPattern();
   TestNoLineBreak();
   TestHasWord();
+  TestNormalizePath();
+  assert(!g_failed);
 }