xref: /aosp_15_r20/external/skia/tests/OSPathTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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