1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkOSPath.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker /**
17*c8dee2aaSAndroid Build Coastguard Worker * Test SkOSPath::Join, SkOSPath::Basename, and SkOSPath::Dirname.
18*c8dee2aaSAndroid Build Coastguard Worker * Will use SkOSPath::Join to append filename to dir, test that it works correctly,
19*c8dee2aaSAndroid Build Coastguard Worker * and tests using SkOSPath::Basename on the result.
20*c8dee2aaSAndroid Build Coastguard Worker * @param reporter Reporter for test conditions.
21*c8dee2aaSAndroid Build Coastguard Worker * @param dir String representing the path to a folder. May or may not
22*c8dee2aaSAndroid Build Coastguard Worker * end with SkOSPath::SEPARATOR.
23*c8dee2aaSAndroid Build Coastguard Worker * @param filename String representing the basename of a file. Must NOT
24*c8dee2aaSAndroid Build Coastguard Worker * contain SkOSPath::SEPARATOR.
25*c8dee2aaSAndroid Build Coastguard Worker */
test_dir_with_file(skiatest::Reporter * reporter,const SkString & dir,const SkString & filename)26*c8dee2aaSAndroid Build Coastguard Worker static void test_dir_with_file(skiatest::Reporter* reporter, const SkString& dir,
27*c8dee2aaSAndroid Build Coastguard Worker const SkString& filename) {
28*c8dee2aaSAndroid Build Coastguard Worker // If filename contains SkOSPath::SEPARATOR, the tests will fail.
29*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!filename.contains(SkOSPath::SEPARATOR));
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker // Tests for SkOSPath::Join and SkOSPath::Basename
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker // fullName should be "dir<SkOSPath::SEPARATOR>file"
34*c8dee2aaSAndroid Build Coastguard Worker SkString fullName = SkOSPath::Join(dir.c_str(), filename.c_str());
35*c8dee2aaSAndroid Build Coastguard Worker
36*c8dee2aaSAndroid Build Coastguard Worker // fullName should be the combined size of dir and file, plus one if
37*c8dee2aaSAndroid Build Coastguard Worker // dir did not include the final path separator.
38*c8dee2aaSAndroid Build Coastguard Worker size_t expectedSize = dir.size() + filename.size();
39*c8dee2aaSAndroid Build Coastguard Worker if (!dir.endsWith(SkOSPath::SEPARATOR) && !dir.isEmpty()) {
40*c8dee2aaSAndroid Build Coastguard Worker expectedSize++;
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, fullName.size() == expectedSize);
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker SkString basename = SkOSPath::Basename(fullName.c_str());
45*c8dee2aaSAndroid Build Coastguard Worker SkString dirname = SkOSPath::Dirname(fullName.c_str());
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker // basename should be the same as filename
48*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, basename.equals(filename));
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker // dirname should be the same as dir with any trailing seperators removed.
51*c8dee2aaSAndroid Build Coastguard Worker // Except when the the string is just "/".
52*c8dee2aaSAndroid Build Coastguard Worker SkString strippedDir = dir;
53*c8dee2aaSAndroid Build Coastguard Worker while (strippedDir.size() > 2 && strippedDir[strippedDir.size() - 1] == SkOSPath::SEPARATOR) {
54*c8dee2aaSAndroid Build Coastguard Worker strippedDir.remove(strippedDir.size() - 1, 1);
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker if (!dirname.equals(strippedDir)) {
57*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("OOUCH %s %s %s\n", dir.c_str(), strippedDir.c_str(), dirname.c_str());
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, dirname.equals(strippedDir));
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker // basename will not contain a path separator
62*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !basename.contains(SkOSPath::SEPARATOR));
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker // Now take the basename of filename, which should be the same as filename.
65*c8dee2aaSAndroid Build Coastguard Worker basename = SkOSPath::Basename(filename.c_str());
66*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, basename.equals(filename));
67*c8dee2aaSAndroid Build Coastguard Worker }
68*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(OSPath,reporter)69*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(OSPath, reporter) {
70*c8dee2aaSAndroid Build Coastguard Worker SkString dir("dir");
71*c8dee2aaSAndroid Build Coastguard Worker SkString filename("file");
72*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, dir, filename);
73*c8dee2aaSAndroid Build Coastguard Worker
74*c8dee2aaSAndroid Build Coastguard Worker // Now make sure this works with a path separator at the end of dir.
75*c8dee2aaSAndroid Build Coastguard Worker dir.appendUnichar(SkOSPath::SEPARATOR);
76*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, dir, filename);
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker // Test using no filename.
79*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, dir, SkString());
80*c8dee2aaSAndroid Build Coastguard Worker
81*c8dee2aaSAndroid Build Coastguard Worker // Testing using no directory.
82*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, SkString(), filename);
83*c8dee2aaSAndroid Build Coastguard Worker
84*c8dee2aaSAndroid Build Coastguard Worker // Test with a sub directory.
85*c8dee2aaSAndroid Build Coastguard Worker dir.append("subDir");
86*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, dir, filename);
87*c8dee2aaSAndroid Build Coastguard Worker
88*c8dee2aaSAndroid Build Coastguard Worker // Basename of a directory with a path separator at the end is empty.
89*c8dee2aaSAndroid Build Coastguard Worker dir.appendUnichar(SkOSPath::SEPARATOR);
90*c8dee2aaSAndroid Build Coastguard Worker SkString baseOfDir = SkOSPath::Basename(dir.c_str());
91*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, baseOfDir.size() == 0);
92*c8dee2aaSAndroid Build Coastguard Worker
93*c8dee2aaSAndroid Build Coastguard Worker // Basename of nullptr is an empty string.
94*c8dee2aaSAndroid Build Coastguard Worker SkString empty = SkOSPath::Basename(nullptr);
95*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, empty.size() == 0);
96*c8dee2aaSAndroid Build Coastguard Worker
97*c8dee2aaSAndroid Build Coastguard Worker // File in root dir
98*c8dee2aaSAndroid Build Coastguard Worker dir.printf("%c", SkOSPath::SEPARATOR);
99*c8dee2aaSAndroid Build Coastguard Worker filename.set("file");
100*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, dir, filename);
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker // Just the root dir
103*c8dee2aaSAndroid Build Coastguard Worker filename.reset();
104*c8dee2aaSAndroid Build Coastguard Worker test_dir_with_file(reporter, dir, filename);
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard Worker // Test that nullptr can be used for the directory and filename.
107*c8dee2aaSAndroid Build Coastguard Worker SkString emptyPath = SkOSPath::Join(nullptr, nullptr);
108*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, emptyPath.isEmpty());
109*c8dee2aaSAndroid Build Coastguard Worker }
110