using Amphora; using System.Collections.Generic; using UnitTestSharp; namespace Glass.UnitTests { public class TypedPathTests : TestFixture { public class WalkTests : TestFixture { private static readonly InMemoryFileSystem NameRules = new InMemoryFileSystem(); [IgnoreTest] private Status Walked(List parts, string text) { return TypedPath.Walk(parts, text, character => character == '/' || character == '\\', name => NameRules.ValidateFileName(name)); } public void Name_IsAddedAsAPart() { var parts = new List { "a" }; CheckEqual(Status.Ok, Walked(parts, "b")); CheckEqual(new List { "a", "b" }, parts); } public void SeveralNames_AreAddedInOrder() { var parts = new List(); Walked(parts, "x/y\\z"); CheckEqual(new List { "x", "y", "z" }, parts); } public void EmptyAndDotParts_ChangeNothing() { var parts = new List { "a" }; CheckEqual(Status.Ok, Walked(parts, "/././/")); CheckEqual(new List { "a" }, parts); } public void DotDot_DropsTheLastPart() { var parts = new List { "a", "b" }; Walked(parts, ".."); CheckEqual(new List { "a" }, parts); } public void DotDot_WithNoParts_DoesNothing() { var parts = new List(); CheckEqual(Status.Ok, Walked(parts, "../..")); CheckEqual(0, parts.Count); } public void DotDot_AfterAName_DropsThatName() { var parts = new List(); Walked(parts, "a/../b"); CheckEqual(new List { "b" }, parts); } public void Empty_FailsAsBlank() { var parts = new List { "a" }; CheckEqual(NameRules.ValidateFileName(""), Walked(parts, "")); CheckEqual(new List { "a" }, parts); } public void PartThatCantBeAName_GivesTheReasonAndKeepsTheEarlierParts() { var parts = new List { "a" }; string bad = "b" + (char)1; CheckEqual(NameRules.ValidateFileName(bad), Walked(parts, "ok/" + bad + "/never")); CheckEqual(new List { "a", "ok" }, parts); } } } }