public void ReadSymbolTest5()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => EnumFiles(3);

            Dictionary <string, byte[]> data = new Dictionary <string, byte[]> {
                { @"C:\dir\file1.dat", new byte[] { 0x12, 0x33 } },
                { @"C:\dir\file2.dat", new byte[] { 0xEA, 0x33 } },
                { @"C:\dir\file3.dat", new byte[] { 0x13 } },
            };

            platform.ReadFileFunc = x => new MemoryStream(data[x]);

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                Assert.IsTrue(stream.ReadSymbol(out byte symbol));
                Assert.AreEqual(0x12, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x33, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0xEA, symbol);
                stream.Reset();
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x12, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x33, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0xEA, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x33, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x13, symbol);
                Assert.IsFalse(stream.ReadSymbol(out symbol));
            }
        }
        public void ReadSymbolTest1()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => new FileSystemEntry[0];

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir", fileSystemService, platform)) {
                Assert.IsFalse(stream.ReadSymbol(out byte _));
                Assert.IsFalse(stream.ReadSymbol(out byte _));
            }
        }
        public void SizeInBytesPropertyTest1()
        {
            fileSystemService.EnumFileSystemEntriesFunc = x => new FileSystemEntry[0];

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                while (stream.ReadSymbol(out byte _))
                {
                }
                Assert.AreEqual(0, stream.SizeInBytes);
            }
        }
        public void SizeInBytesPropertyGuardTest()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => EnumFiles(2);

            Dictionary <string, byte[]> data = new Dictionary <string, byte[]> {
                { @"C:\dir\file1.dat", new byte[] { 0x12, 0x33 } },
                { @"C:\dir\file2.dat", new byte[] { 0xEA, 0x33 } },
            };

            platform.ReadFileFunc = x => new MemoryStream(data[x]);

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                Assert.Throws <InvalidOperationException>(() => { long size = stream.SizeInBytes; });
            }
        }
        private EncodingStatistics Encode(string inputPath, string outputFile, CancellationToken cancellationToken, IProgress <CodingProgressInfo> progress)
        {
            HuffmanEncoder encoder = new HuffmanEncoder();
            DirectoryEncodingInputStream directoryInputStream = new DirectoryEncodingInputStream(inputPath, fileSystemService, platform);
            FileEncodingOutputStream     outputStream         = new FileEncodingOutputStream(outputFile, platform);

            ITaskProgressController tpc = CreateTaskProgressController(progress, directoryInputStream);

            try {
                outputStream.BeginWrite();
                tpc.StartIndeterminate();
                EncodingToken encodingToken = encoder.CreateEncodingToken(directoryInputStream, cancellationToken);
                tpc.EndIndeterminate();
                streamBuilder.Initialize(platform, encodingToken, outputStream);
                streamBuilder.AddWeightsTable(new BootstrapSegment(encodingToken.WeightsTable));
                tpc.Start();
                foreach (FileSystemEntry entry in fileSystemService.EnumFileSystemEntries(inputPath))
                {
                    switch (entry.Type)
                    {
                    case FileSystemEntryType.Directory:
                        streamBuilder.AddDirectory(new DirectorySegment(entry.Name, entry.Cardinality));
                        break;

                    case FileSystemEntryType.File:
                        streamBuilder.AddFile(new FileSegment(entry.Name, entry.Path), cancellationToken, tpc);
                        break;

                    default:
                        throw new InvalidOperationException();
                    }
                }
                outputStream.EndWrite();
                tpc.Finish();
                return(new EncodingStatistics(directoryInputStream.SizeInBytes, outputStream.SizeInBytes));
            }
            catch {
                tpc.Error();
                throw;
            }
            finally {
                directoryInputStream.Dispose();
                outputStream.Dispose();
            }
        }
        public void SizeInBytesPropertyTest2()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => EnumFiles(3);

            Dictionary <string, byte[]> data = new Dictionary <string, byte[]> {
                { @"C:\dir\file1.dat", new byte[10 * 1024] },
                { @"C:\dir\file2.dat", new byte[12 * 1024] },
                { @"C:\dir\file3.dat", new byte[123] },
            };

            platform.ReadFileFunc = x => new MemoryStream(data[x]);

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                while (stream.ReadSymbol(out byte _))
                {
                }
                Assert.AreEqual(22651, stream.SizeInBytes);
            }
        }
        public void IsTraversedPropertyTest()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => EnumFiles(2);

            Dictionary <string, byte[]> data = new Dictionary <string, byte[]> {
                { @"C:\dir\file1.dat", new byte[] { 0x12, 0x33 } },
                { @"C:\dir\file2.dat", new byte[] { 0xEA, 0x33 } },
            };

            platform.ReadFileFunc = x => new MemoryStream(data[x]);

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                Assert.IsFalse(stream.IsTraversed);
                while (stream.ReadSymbol(out byte _))
                {
                }
                Assert.IsTrue(stream.IsTraversed);
            }
        }
        public void DisposeTest()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => {
                return(new[] {
                    new FileSystemEntry(FileSystemEntryType.File, "file1.dat", @"C:\dir\file1.dat"),
                    new FileSystemEntry(FileSystemEntryType.File, "file2.dat", @"C:\dir\file2.dat"),
                    new FileSystemEntry(FileSystemEntryType.File, "file3.dat", @"C:\dir\file3.dat"),
                });
            };
            List <TestMemoryStream> streamList = new List <TestMemoryStream>(16);

            platform.ReadFileFunc = x => {
                return(new TestMemoryStream(new byte[] { 1 }, streamList));
            };

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                while (stream.ReadSymbol(out byte _))
                {
                }
            }
            Assert.That(streamList, Is.All.Matches <TestMemoryStream>(x => x.Trace == "->Dispose;"));
        }
        public void ReadSymbolTest4()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => {
                return(new[] {
                    new FileSystemEntry(FileSystemEntryType.File, "file1.dat", @"C:\dir\file1.dat"),
                    new FileSystemEntry(FileSystemEntryType.Directory, "subdir1", @"C:\dir\subdir1"),
                    new FileSystemEntry(FileSystemEntryType.File, "file2.dat", @"C:\dir\file2.dat"),
                    new FileSystemEntry(FileSystemEntryType.Directory, "subdir2", @"C:\dir\subdir2"),
                    new FileSystemEntry(FileSystemEntryType.File, "file3.dat", @"C:\dir\file3.dat"),
                });
            };

            Dictionary <string, byte[]> data = new Dictionary <string, byte[]> {
                { @"C:\dir\file1.dat", new byte[] { 0x11, 0x33 } },
                { @"C:\dir\file2.dat", new byte[] { 0xEA, 0x22, 0x33 } },
                { @"C:\dir\file3.dat", new byte[] { 0x13 } },
            };

            platform.ReadFileFunc = x => new MemoryStream(data[x]);

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\", fileSystemService, platform)) {
                Assert.IsTrue(stream.ReadSymbol(out byte symbol));
                Assert.AreEqual(0x11, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x33, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0xEA, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x22, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x33, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x13, symbol);
                Assert.IsFalse(stream.ReadSymbol(out symbol));
            }
        }
        public void ReadSymbolTest2()
        {
            fileSystemService.EnumFileSystemEntriesFunc = _ => {
                return(new[] { new FileSystemEntry(FileSystemEntryType.File, "file.dat", @"C:\dir\file.dat") });
            };

            Dictionary <string, byte[]> data = new Dictionary <string, byte[]> {
                { @"C:\dir\file.dat", new byte[] { 0x1, 0x2, 0x3, 0x7 } }
            };

            platform.ReadFileFunc = x => new MemoryStream(data[x]);

            using (DirectoryEncodingInputStream stream = new DirectoryEncodingInputStream(@"C:\dir\file.dat", fileSystemService, platform)) {
                Assert.IsTrue(stream.ReadSymbol(out byte symbol));
                Assert.AreEqual(0x1, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x2, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x3, symbol);
                Assert.IsTrue(stream.ReadSymbol(out symbol));
                Assert.AreEqual(0x7, symbol);
                Assert.IsFalse(stream.ReadSymbol(out symbol));
            }
        }
 private ITaskProgressController CreateTaskProgressController(IProgress <CodingProgressInfo> progress, DirectoryEncodingInputStream inputStream)
 {
     if (progress == null)
     {
         return(new NullTaskProgressController());
     }
     return(new EncodingTaskProgressController(progress, () => inputStream.SizeInBytes));
 }