PathConstraint
PathConstraint serves as the abstract base of constraints
that operate on paths and provides several helper methods.
using System;
using System.IO;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Constraints
{
[NullableContext(1)]
[Nullable(0)]
public abstract class PathConstraint : StringConstraint
{
private const char WindowsDirectorySeparatorChar = '\\';
private const char NonWindowsDirectorySeparatorChar = '/';
private static readonly char[] DirectorySeparatorChars = new char[2] {
'\\',
'/'
};
public PathConstraint RespectCase {
get {
caseInsensitive = false;
return this;
}
}
protected PathConstraint(string expected)
: base(expected)
{
caseInsensitive = (Path.DirectorySeparatorChar == '\\');
}
protected override string GetStringRepresentation()
{
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(6, 3);
defaultInterpolatedStringHandler.AppendLiteral("<");
defaultInterpolatedStringHandler.AppendFormatted(DisplayName.ToLower());
defaultInterpolatedStringHandler.AppendLiteral(" \"");
defaultInterpolatedStringHandler.AppendFormatted(expected);
defaultInterpolatedStringHandler.AppendLiteral("\" ");
defaultInterpolatedStringHandler.AppendFormatted(caseInsensitive ? "ignorecase" : "respectcase");
defaultInterpolatedStringHandler.AppendLiteral(">");
return defaultInterpolatedStringHandler.ToStringAndClear();
}
protected string Canonicalize(string path)
{
if (Path.DirectorySeparatorChar != Path.AltDirectorySeparatorChar)
path = path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
string text = string.Empty;
string text2 = path;
foreach (char c in text2) {
if (c != '\\' && c != '/')
break;
ReadOnlySpan<char> str = text;
char directorySeparatorChar = Path.DirectorySeparatorChar;
text = string.Concat(str, new ReadOnlySpan<char>(ref directorySeparatorChar));
}
string[] array = path.Split(DirectorySeparatorChars, StringSplitOptions.RemoveEmptyEntries);
int num = 0;
bool flag = false;
string[] array2 = array;
foreach (string text3 in array2) {
if (!(text3 == ".") && (text3 == null || text3.Length != 0)) {
if (text3 == "..") {
flag = true;
if (num > 0)
num--;
} else {
if (flag)
array[num] = text3;
num++;
}
} else
flag = true;
}
return text + string.Join(Path.DirectorySeparatorChar.ToString(), array, 0, num);
}
protected StringComparison DetermineComparisonType()
{
if (!caseInsensitive)
return StringComparison.Ordinal;
return StringComparison.OrdinalIgnoreCase;
}
protected bool IsSubPath(string path1, string path2)
{
int length = path1.Length;
int length2 = path2.Length;
if (length >= length2)
return false;
if (!string.Equals(path1, path2.Substring(0, length), DetermineComparisonType()))
return false;
if (path2[length - 1] != Path.DirectorySeparatorChar)
return path2[length] == Path.DirectorySeparatorChar;
return true;
}
}
}