public void GraftingDuplicateQualifiedPath_RecordsDuplicateGraft()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            builder.AddNamedRoot("Root", root);

            builder.AddGraftPoint(root, "Child", builder.CreateNode(@"C:\Other\A", FileSystemCasing.CasePreservingInsensitive));
            var error = builder.AddGraftPoint(root, "Child", builder.CreateNode(@"C:\Other\B", FileSystemCasing.CasePreservingInsensitive));

            Assert.That(error, Is.InstanceOf <DuplicateGraftDeclaration>());
            Assert.That(builder.Errors, Is.EquivalentTo(new [] { error }));
        }
        public void GraftingLocalRoot_ContainedByExistingGraftedLocalRoot_RecordsOverlappingLocalRoot()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            builder.AddNamedRoot("Root", root);

            builder.AddGraftPoint(root, "A", builder.CreateNode(@"C:\Other", FileSystemCasing.CasePreservingInsensitive));
            var error = builder.AddGraftPoint(root, "B", builder.CreateNode(@"C:\Other\Child", FileSystemCasing.CasePreservingInsensitive));

            Assert.That(error, Is.InstanceOf <OverlappingLocalRootDeclaration>());
            Assert.That(builder.Errors, Is.EquivalentTo(new [] { error }));
        }
        public void GraftingOntoUndeclaredParent_ThrowsInvalidOperationException()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            Assert.Throws <InvalidOperationException>(() =>
                                                      builder.AddGraftPoint(root, "Child", builder.CreateNode(@"C:\Other\A", FileSystemCasing.CasePreservingInsensitive)));
        }
        public void DoesNotResolveQualifiedPathInRoot_UnderGraftPoint()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            builder.AddNamedRoot("Root", root);
            builder.AddGraftPoint(root, "Graft", builder.CreateNode(@"C:\Other", FileSystemCasing.CasePreservingInsensitive));
            var storage = builder.BuildHierarchies();

            Assert.That(storage.TryResolveQualifiedPath(@"C:\root\Graft\some\filepath.txt", out _), Is.False);
        }
        public void GraftingLocalRoot_OntoParentWithDifferingCasingRules_RecordsFileSystemCasingConflict()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            builder.AddNamedRoot("Root", root);

            var error = builder.AddGraftPoint(root, "Child", builder.CreateNode(@"C:\Other", FileSystemCasing.CaseSensitive));

            Assert.That(error, Is.InstanceOf <FileSystemCasingConflict>());
            Assert.That(builder.Errors, Is.EquivalentTo(new [] { error }));
        }
        public void RoundtripsQualifiedPathInGraft_BelongingToRoot()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            builder.AddNamedRoot("Root", root);
            var grafted = builder.CreateNode(@"C:\Other", FileSystemCasing.CasePreservingInsensitive);

            builder.AddGraftPoint(root, "Graft", grafted);
            var storage = builder.BuildHierarchies();

            Assert.That(storage.TryResolveQualifiedPath(@"C:\Other\some\filepath.txt", out var qualifiedPath), Is.True);
            Assert.That(qualifiedPath,
                        Is.EqualTo(new QualifiedPath(grafted, RelativePath.CreateFromSegments("some", "filepath.txt")))
                        .Using(default(QualifiedPath.DefaultEqualityComparer)));

            Assert.That(storage.ResolveToFile(qualifiedPath)?.FullName, Is.EqualTo(@"C:\Other\some\filepath.txt"));
        }
        public void RoundtripsAbstractPathInGraft_BelongingToRoot()
        {
            var builder = new StorageHierarchiesBuilder(new StubFileSystemApi());
            var root    = builder.CreateNode(@"C:\Root", FileSystemCasing.CasePreservingInsensitive);

            builder.AddNamedRoot("Root", root);
            var grafted = builder.CreateNode(@"C:\Other", FileSystemCasing.CasePreservingInsensitive);

            builder.AddGraftPoint(root, "Graft", grafted);
            var storage = builder.BuildHierarchies();

            var qualifiedPath        = new QualifiedPath(grafted, RelativePath.CreateFromSegments("some", "filepath.txt"));
            var expectedAbstractPath = new AbstractPath(storage.NamedRoots.Single(), RelativePath.CreateFromSegments("Graft", "some", "filepath.txt"));

            var abstractPath = storage.MapToAbstractPath(qualifiedPath);

            Assert.That(abstractPath, Is.EqualTo(expectedAbstractPath).Using(default(AbstractPath.DefaultEqualityComparer)));
            Assert.That(storage.MapFromAbstractPath(abstractPath),
                        Is.EqualTo(qualifiedPath)
                        .Using(default(QualifiedPath.DefaultEqualityComparer)));
        }