Sonarr/src/NzbDrone.Common.Test/OsPathFixture.cs

234 lines
7.9 KiB
C#
Raw Normal View History

using System;
using NUnit.Framework;
using NzbDrone.Common.Disk;
using NzbDrone.Test.Common;
using FluentAssertions;
namespace NzbDrone.Common.Test
{
public class OsPathFixture : TestBase
{
[TestCase(@"C:\rooted\windows\path\", OsPathKind.Windows)]
[TestCase(@"C:\rooted\windows\path", OsPathKind.Windows)]
[TestCase(@"C:\", OsPathKind.Windows)]
[TestCase(@"C:", OsPathKind.Windows)]
[TestCase(@"\\rooted\unc\path\", OsPathKind.Windows)]
[TestCase(@"\\rooted\unc\path", OsPathKind.Windows)]
[TestCase(@"\relative\windows\path\", OsPathKind.Windows)]
[TestCase(@"\relative\windows\path", OsPathKind.Windows)]
[TestCase(@"relative\windows\path\", OsPathKind.Windows)]
[TestCase(@"relative\windows\path", OsPathKind.Windows)]
[TestCase(@"relative\", OsPathKind.Windows)]
[TestCase(@"relative", OsPathKind.Unknown)]
[TestCase("/rooted/linux/path/", OsPathKind.Unix)]
[TestCase("/rooted/linux/path", OsPathKind.Unix)]
[TestCase("/", OsPathKind.Unix)]
[TestCase("linux/path", OsPathKind.Unix)]
public void should_auto_detect_kind(string path, OsPathKind kind)
{
var result = new OsPath(path);
result.Kind.Should().Be(kind);
if (kind == OsPathKind.Windows)
{
result.IsWindowsPath.Should().BeTrue();
result.IsUnixPath.Should().BeFalse();
}
else if (kind == OsPathKind.Unix)
{
result.IsWindowsPath.Should().BeFalse();
result.IsUnixPath.Should().BeTrue();
}
else
{
result.IsWindowsPath.Should().BeFalse();
result.IsUnixPath.Should().BeFalse();
}
}
[Test]
public void should_add_directory_slash()
{
var osPath = new OsPath(@"C:\rooted\windows\path\");
osPath.Directory.Should().NotBeNull();
osPath.Directory.ToString().Should().Be(@"C:\rooted\windows\");
}
[TestCase(@"C:\rooted\windows\path", @"C:\rooted\windows\")]
[TestCase(@"C:\rooted", @"C:\")]
[TestCase(@"C:", null)]
[TestCase("/rooted/linux/path", "/rooted/linux/")]
[TestCase("/rooted", "/")]
[TestCase("/", null)]
public void should_return_parent_directory(string path, string expectedParent)
{
var osPath = new OsPath(path);
osPath.Directory.Should().NotBeNull();
osPath.Directory.Should().Be(new OsPath(expectedParent));
}
[Test]
public void should_return_empty_as_parent_of_root_unc()
{
var osPath = new OsPath(@"\\unc");
osPath.Directory.IsEmpty.Should().BeTrue();
}
[TestCase(@"C:\rooted\windows\path")]
[TestCase(@"C:")]
[TestCase(@"\\blaat")]
[TestCase("/rooted/linux/path")]
[TestCase("/")]
public void should_detect_rooted_ospaths(string path)
{
var osPath = new OsPath(path);
osPath.IsRooted.Should().BeTrue();
}
[TestCase(@"\rooted\windows\path")]
[TestCase(@"rooted\windows\path")]
[TestCase(@"path")]
[TestCase("linux/path")]
public void should_detect_unrooted_ospaths(string path)
{
var osPath = new OsPath(path);
osPath.IsRooted.Should().BeFalse();
}
[TestCase(@"C:\rooted\windows\path", "path")]
[TestCase(@"C:", "C:")]
[TestCase(@"\\blaat", "blaat")]
[TestCase("/rooted/linux/path", "path")]
[TestCase("/", null)]
[TestCase(@"\rooted\windows\path\", "path")]
[TestCase(@"rooted\windows\path", "path")]
[TestCase(@"path", "path")]
[TestCase("linux/path", "path")]
public void should_return_filename(string path, string expectedFilePath)
{
var osPath = new OsPath(path);
osPath.FileName.Should().Be(expectedFilePath);
}
[Test]
public void should_compare_windows_ospathkind_case_insensitive()
{
var left = new OsPath(@"C:\rooted\Windows\path");
var right = new OsPath(@"C:\rooted\windows\path");
left.Should().Be(right);
}
[Test]
public void should_compare_unix_ospathkind_case_sensitive()
{
var left = new OsPath(@"/rooted/Linux/path");
var right = new OsPath(@"/rooted/linux/path");
left.Should().NotBe(right);
}
[Test]
public void should_not_ignore_trailing_slash_during_compare()
{
var left = new OsPath(@"/rooted/linux/path/");
var right = new OsPath(@"/rooted/linux/path");
left.Should().NotBe(right);
}
[TestCase(@"C:\Test", @"sub", @"C:\Test\sub")]
[TestCase(@"C:\Test", @"sub\test", @"C:\Test\sub\test")]
[TestCase(@"C:\Test\", @"\sub", @"C:\Test\sub")]
[TestCase(@"C:\Test", @"sub\", @"C:\Test\sub\")]
[TestCase(@"C:\Test", @"C:\Test2\sub", @"C:\Test2\sub")]
[TestCase(@"/Test", @"sub", @"/Test/sub")]
[TestCase(@"/Test", @"sub/", @"/Test/sub/")]
[TestCase(@"/Test/", @"sub/test/", @"/Test/sub/test/")]
[TestCase(@"/Test/", @"/Test2/", @"/Test2/")]
[TestCase(@"C:\Test", "", @"C:\Test")]
public void should_combine_path(string left, string right, string expectedResult)
{
var osPathLeft = new OsPath(left);
var osPathRight = new OsPath(right);
var result = osPathLeft + osPathRight;
result.FullPath.Should().Be(expectedResult);
}
[Test]
public void should_fix_slashes_windows()
{
var osPath = new OsPath(@"C:/on/windows/transmission\uses/forward/slashes");
osPath.Kind.Should().Be(OsPathKind.Windows);
osPath.FullPath.Should().Be(@"C:\on\windows\transmission\uses\forward\slashes");
}
[Test]
public void should_fix_slashes_unix()
{
var osPath = new OsPath(@"/just/a/test\to\verify the/slashes\");
osPath.Kind.Should().Be(OsPathKind.Unix);
osPath.FullPath.Should().Be(@"/just/a/test/to/verify the/slashes/");
}
[Test]
public void should_combine_mixed_slashes()
{
var left = new OsPath(@"C:/on/windows/transmission");
var right = new OsPath(@"uses/forward/slashes", OsPathKind.Unknown);
var osPath = left + right;
osPath.Kind.Should().Be(OsPathKind.Windows);
osPath.FullPath.Should().Be(@"C:\on\windows\transmission\uses\forward\slashes");
}
[TestCase(@"C:\Test\Data\", @"C:\Test\Data\Sub\Folder", @"Sub\Folder")]
[TestCase(@"C:\Test\Data\", @"C:\Test\Data2\Sub\Folder", @"..\Data2\Sub\Folder")]
[TestCase(@"/parent/folder", @"/parent/folder/Sub/Folder", @"Sub/Folder")]
public void should_create_relative_path(string parent, string child, string expected)
{
var left = new OsPath(child);
var right = new OsPath(parent);
var osPath = left - right;
osPath.Kind.Should().Be(OsPathKind.Unknown);
osPath.FullPath.Should().Be(expected);
}
[Test]
public void should_parse_null_as_empty()
{
var result = new OsPath(null);
result.FullPath.Should().BeEmpty();
result.IsEmpty.Should().BeTrue();
}
[TestCase(@"C:\Test\", @"C:\Test", true)]
[TestCase(@"C:\Test\", @"C:\Test\Contains\", true)]
[TestCase(@"C:\Test\", @"C:\Other\", false)]
public void should_evaluate_contains(string parent, string child, bool expectedResult)
{
var left = new OsPath(parent);
var right = new OsPath(child);
var result = left.Contains(right);
result.Should().Be(expectedResult);
}
}
}