Beispiel #1
0
        public void TestAddRemoveFileSystem()
        {
            var fs = new AggregateFileSystem();

            Assert.Throws <ArgumentNullException>(() => fs.AddFileSystem(null));
            Assert.Throws <ArgumentException>(() => fs.AddFileSystem(fs));

            var memfs = new MemoryFileSystem();

            fs.AddFileSystem(memfs);
            Assert.Throws <ArgumentException>(() => fs.AddFileSystem(memfs));

            Assert.Throws <ArgumentNullException>(() => fs.RemoveFileSystem(null));

            var memfs2 = new MemoryFileSystem();

            Assert.Throws <ArgumentException>(() => fs.RemoveFileSystem(memfs2));

            var list = fs.GetFileSystems();

            Assert.Equal(1, list.Count);
            Assert.Equal(memfs, list[0]);

            fs.RemoveFileSystem(memfs);

            list = fs.GetFileSystems();
            Assert.Equal(0, list.Count);
        }
        protected AggregateFileSystem GetCommonAggregateFileSystem(out MemoryFileSystem fs1, out MemoryFileSystem fs2, out MemoryFileSystem fs3)
        {
            // ----------------------------------------------
            // This creates the following AggregateFileSystem
            // ----------------------------------------------
            // /a                 -> fs2
            //     /a             -> fs1
            //        a.txt       -> fs1
            //     /b             -> fs1
            //        b.i         -> fs1
            //     /C             -> fs2
            //     /d             -> fs2
            //     a.txt          -> fs2
            //     A.txt          -> fs2
            //     b.txt          -> fs2
            //     c.txt1         -> fs2
            //     d.i            -> fs2
            //     f.i1           -> fs2
            //     E              -> fs2
            // /b                 -> fs1
            //    b.i             -> fs1
            // /C                 -> fs2
            // /d                 -> fs3
            // A.txt              -> fs3
            // b.txt              -> fs2
            // c.txt1             -> fs3
            // d.i                -> fs3
            // f.i1               -> fs3
            // E                  -> fs2

            fs1 = new MemoryFileSystem()
            {
                Name = "mem0"
            };
            CreateFolderStructure(fs1);
            fs2      = fs1.Clone();
            fs2.Name = "mem1";
            fs3      = fs2.Clone();
            fs3.Name = "mem2";

            // Delete part of fs2 so that it will fallback to fs1
            fs2.DeleteDirectory("/a/a", true);
            fs2.DeleteDirectory("/a/b", true);
            fs2.DeleteDirectory("/b", true);

            // Delete on fs3 to fallback to fs2 and fs1
            fs3.DeleteDirectory("/a", true);
            fs3.DeleteDirectory("/C", true);
            fs3.DeleteFile("/b.txt");
            fs3.DeleteFile("/E");

            var aggfs = new AggregateFileSystem(fs1);

            aggfs.AddFileSystem(fs2);
            aggfs.AddFileSystem(fs3);

            return(aggfs);
        }
Beispiel #3
0
        protected override IFileSystem GetTemplateFileSystem()
        {
            // GitHubRelease template is based on the "Default" template
            // => create aggregate file system with the files of both the "Default" and "GitHubRelease" templates
            var templateFileSystem = new AggregateFileSystem();

            templateFileSystem.AddFileSystem(base.GetTemplateFileSystem());
            templateFileSystem.AddFileSystem(CreateEmbeddedResourcesFileSystem("/templates/GitHubRelease"));

            return(templateFileSystem);
        }
Beispiel #4
0
        public void TestFallback()
        {
            // aggregate_fs (fs)
            //      => aggregate_fs (subFs)
            //              => memory_fs (subFsMemFs)
            //      => memory_fs (subMemFs)
            //      => memory_fs (root)
            var root       = new MemoryFileSystem();
            var fs         = new AggregateFileSystem(root);
            var subFsMemFs = new MemoryFileSystem();
            var subFs      = new AggregateFileSystem(subFsMemFs);

            fs.AddFileSystem(subFs);
            var subMemFs = new MemoryFileSystem();

            fs.AddFileSystem(subMemFs);

            root.CreateDirectory("/a");
            root.CreateDirectory("/b");
            root.CreateDirectory("/c");
            {
                using var a = root.OpenFile("/a.txt", FileMode.Create, FileAccess.Write);
                using var b = root.OpenFile("/b.txt", FileMode.Create, FileAccess.Write);
                using var c = root.OpenFile("/c.txt", FileMode.Create, FileAccess.Write);
            }
            subFsMemFs.CreateDirectory("/b");
            {
                using var b = subFsMemFs.OpenFile("/b.txt", FileMode.Create, FileAccess.Write);
            }
            subMemFs.CreateDirectory("/a");
            {
                using var a = subMemFs.OpenFile("/a.txt", FileMode.Create, FileAccess.Write);
            }

            var findA = fs.FindFirstFileSystemEntry("/a");

            Assert.Equal(subMemFs, findA?.FileSystem);

            var findB = fs.FindFirstFileSystemEntry("/b");

            Assert.Equal(subFsMemFs, findB?.FileSystem);

            var findC = fs.FindFirstFileSystemEntry("/c");

            Assert.Equal(root, findC?.FileSystem);

            Assert.True(fs.DirectoryExists("/c"));
            Assert.True(fs.DirectoryExists("/b"));
            Assert.True(fs.DirectoryExists("/a"));

            Assert.True(fs.FileExists("/c.txt"));
            Assert.True(fs.FileExists("/b.txt"));
            Assert.True(fs.FileExists("/a.txt"));
        }
Beispiel #5
0
        public void TestFindFileSystemEntries()
        {
            var fs = new AggregateFileSystem();

            var memfs1 = new MemoryFileSystem();

            memfs1.WriteAllText("/a.txt", "content1");
            memfs1.WriteAllText("/b", "notused");
            fs.AddFileSystem(memfs1);

            var memfs2 = new MemoryFileSystem();

            memfs2.WriteAllText("/a.txt", "content2");
            memfs2.CreateDirectory("/b");
            fs.AddFileSystem(memfs2);

            {
                var entries = fs.FindFileSystemEntries("/a.txt");
                Assert.Equal(2, entries.Count);

                Assert.IsType <FileEntry>(entries[0]);
                Assert.IsType <FileEntry>(entries[1]);
                Assert.Equal(memfs2, entries[0].FileSystem);
                Assert.Equal(memfs1, entries[1].FileSystem);
                Assert.Equal("/a.txt", entries[0].Path.FullName);
                Assert.Equal("/a.txt", entries[1].Path.FullName);
            }

            {
                var entries = fs.FindFileSystemEntries("/b");
                Assert.Single(entries);

                Assert.IsType <DirectoryEntry>(entries[0]);
                Assert.Equal(memfs2, entries[0].FileSystem);
                Assert.Equal("/b", entries[0].Path.FullName);
            }

            {
                var entry = fs.FindFirstFileSystemEntry("/a.txt");
                Assert.NotNull(entry);

                Assert.IsType <FileEntry>(entry);
                Assert.Equal(memfs2, entry.FileSystem);
                Assert.Equal("/a.txt", entry.Path.FullName);
            }
        }
Beispiel #6
0
        public ScribanBaseTemplate(ChangeLogConfiguration configuration)
        {
            m_Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
            m_Filesystem    = new Lazy <IFileSystem>(() =>
            {
                var fileSystem = GetTemplateFileSystem();

                if (!String.IsNullOrEmpty(TemplateSettings.CustomDirectory))
                {
                    var physicalFileSystem = new PhysicalFileSystem();
                    var path = physicalFileSystem.ConvertPathFromInternal(TemplateSettings.CustomDirectory);

                    var aggregateFileSystem = new AggregateFileSystem(fileSystem);
                    aggregateFileSystem.AddFileSystem(physicalFileSystem.GetOrCreateSubFileSystem(path));
                    fileSystem = aggregateFileSystem;
                }

                return(fileSystem);
            });
        }