Fix several broken test cases from TargetEnvironmentPathsJoinFunctionTest on Windows

GitOrigin-RevId: 81af414ebe660cc7d4a6660ccc82ad5d9a9ea2b6
This commit is contained in:
Alexander Koshevoy
2020-10-21 17:37:43 +00:00
committed by intellij-monorepo-bot
parent ffeb17bd1b
commit d1866cbeae
2 changed files with 33 additions and 9 deletions
@@ -54,8 +54,26 @@ private fun findPathVariants(mappings: Iterable<PathMapping>,
}
internal fun joinTargetPaths(basePath: String, relativePath: String, fileSeparator: Char): String {
val resultCanonicalPath = FileUtil.toCanonicalPath("$basePath$fileSeparator$relativePath", fileSeparator)
// The method `FileUtil.toCanonicalPath()` returns the path with '/' no matter what `fileSeparator` is passed but let's make the result
// system-dependent
return FileUtil.toSystemDependentName(resultCanonicalPath, fileSeparator)
}
val normalizedBasePathForJoining = basePath
.normalizeFileSeparatorCharacter(fileSeparator)
.removeRepetitiveFileSeparators(fileSeparator)
.ensureEndsWithFileSeparator(fileSeparator)
val normalizedRelativePath = relativePath
.normalizeFileSeparatorCharacter(fileSeparator)
.removeRepetitiveFileSeparators(fileSeparator)
.normalizeRelativePath(fileSeparator)
return "$normalizedBasePathForJoining$normalizedRelativePath"
}
private fun String.normalizeFileSeparatorCharacter(fileSeparator: Char): String = if (fileSeparator == '\\') replace('/', fileSeparator) else this
private fun String.removeRepetitiveFileSeparators(fileSeparator: Char): String = replace("$fileSeparator$fileSeparator", fileSeparator.toString())
private fun String.normalizeRelativePath(fileSeparator: Char): String =
when {
length == 1 && this[0] == '.' -> ""
startsWith(prefix = ".$fileSeparator") -> substring(startIndex = 2)
else -> this
}.removeSuffix(fileSeparator.toString())
private fun String.ensureEndsWithFileSeparator(fileSeparator: Char): String = if (endsWith(fileSeparator)) this else "$this$fileSeparator"
@@ -27,18 +27,24 @@ class TargetEnvironmentPathsJoinFunctionTest(private val basePath: String,
arrayOf("/foo/", "bar/", '/', "/foo/bar"),
arrayOf("/", ".", '/', "/"),
arrayOf("/", "..", '/', "/"),
arrayOf("C:\\", ".", '\\', "C:\\"),
arrayOf("C:\\\\", ".", '\\', "C:\\"),
arrayOf("C:\\", "..", '\\', "C:\\"),
arrayOf("C:\\\\", "..", '\\', "C:\\"),
arrayOf("C:\\", "foo", '\\', "C:\\foo"),
arrayOf("C:\\", "foo\\", '\\', "C:\\foo"),
arrayOf("C:/", ".", '\\', "C:\\"),
arrayOf("C://", ".", '\\', "C:\\"),
arrayOf("C:/", "foo", '\\', "C:\\foo"),
arrayOf("C:", "foo/", '\\', "C:\\foo"),
arrayOf("C:\\", "Directory With Spaces\\", '\\', "C:\\Directory With Spaces"),
arrayOf("C:\\Directory With Spaces", "File With Spaces.txt", '\\', "C:\\Directory With Spaces\\File With Spaces.txt"),
arrayOf("C:\\Directory With Spaces", "Subdirectory With Spaces\\", '\\', "C:\\Directory With Spaces\\Subdirectory With Spaces")
arrayOf("C:\\Directory With Spaces", "Subdirectory With Spaces\\", '\\', "C:\\Directory With Spaces\\Subdirectory With Spaces"),
arrayOf("C:/", "Directory With Spaces/", '\\', "C:\\Directory With Spaces"),
arrayOf("C:/Directory With Spaces", "File With Spaces.txt", '\\', "C:\\Directory With Spaces\\File With Spaces.txt"),
arrayOf("C:/Directory With Spaces", "Subdirectory With Spaces/", '\\', "C:\\Directory With Spaces\\Subdirectory With Spaces"),
)
}
}