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