diff --git a/DiscImageChef.Filters/PCExchange.cs b/DiscImageChef.Filters/PCExchange.cs index 1967b208..022b8025 100644 --- a/DiscImageChef.Filters/PCExchange.cs +++ b/DiscImageChef.Filters/PCExchange.cs @@ -215,7 +215,7 @@ namespace DiscImageChef.Filters FileStream finderDatStream = new FileStream(Path.Combine(parentFolder, FinderInfo), FileMode.Open, FileAccess.Read); - while(finderDatStream.Position + 0x5C < finderDatStream.Length) + while(finderDatStream.Position + 0x5C <= finderDatStream.Length) { PCExchangeEntry datEntry = new PCExchangeEntry(); byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)]; @@ -269,7 +269,7 @@ namespace DiscImageChef.Filters FileStream finderDatStream = new FileStream(Path.Combine(parentFolder, FinderInfo), FileMode.Open, FileAccess.Read); - while(finderDatStream.Position + 0x5C < finderDatStream.Length) + while(finderDatStream.Position + 0x5C <= finderDatStream.Length) { PCExchangeEntry datEntry = new PCExchangeEntry(); byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)]; @@ -313,6 +313,8 @@ namespace DiscImageChef.Filters basePath = path; opened = true; + + finderDatStream.Close(); } } } diff --git a/DiscImageChef.Tests/DiscImageChef.Tests.csproj b/DiscImageChef.Tests/DiscImageChef.Tests.csproj index aeba41ec..8070a7e5 100644 --- a/DiscImageChef.Tests/DiscImageChef.Tests.csproj +++ b/DiscImageChef.Tests/DiscImageChef.Tests.csproj @@ -50,6 +50,7 @@ + diff --git a/DiscImageChef.Tests/Filters/PCExchange.cs b/DiscImageChef.Tests/Filters/PCExchange.cs new file mode 100644 index 00000000..0a55f52e --- /dev/null +++ b/DiscImageChef.Tests/Filters/PCExchange.cs @@ -0,0 +1,122 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : GZip.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Component +// +// Revision : $Revision$ +// Last change by : $Author$ +// Date : $Date$ +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright (C) 2011-2015 Claunia.com +// ****************************************************************************/ +// //$Id$ +using System.IO; +using DiscImageChef.Checksums; +using DiscImageChef.Filters; +using NUnit.Framework; + +namespace DiscImageChef.Tests.Filters +{ + [TestFixture] + public class PCExchange + { + const string ExpectedFile = "348825a08fa84766d20b91ed917012b9"; + const string ExpectedContents = "c2be571406cf6353269faa59a4a8c0a4"; + const string ExpectedResource = "5cb168d60ce8b2b1b3133c2faaf47165"; + readonly string location; + + public PCExchange() + { + location = Path.Combine(Consts.TestFilesRoot, "filters", "pcexchange", "DC6_RW_DOS_720.img"); + } + + [Test] + public void CheckCorrectFile() + { + MD5Context ctx = new MD5Context(); + ctx.Init(); + string result = ctx.File(Path.Combine(Consts.TestFilesRoot, "filters", "pcexchange", "FINDER.DAT"), out byte[] tmp); + Assert.AreEqual(ExpectedFile, result); + } + + [Test] + public void CheckFilterId() + { + Filter filter = new DiscImageChef.Filters.PCExchange(); + Assert.AreEqual(true, filter.Identify(location)); + } + + [Test] + public void Test() + { + Filter filter = new DiscImageChef.Filters.PCExchange(); + filter.Open(location); + Assert.AreEqual(true, filter.IsOpened()); + Assert.AreEqual(737280, filter.GetDataForkLength()); + Assert.AreNotEqual(null, filter.GetDataForkStream()); + Assert.AreEqual(546, filter.GetResourceForkLength()); + Assert.AreNotEqual(null, filter.GetResourceForkStream()); + Assert.AreEqual(true, filter.HasResourceFork()); + filter.Close(); + } + + [Test] + public void CheckContents() + { + Filter filter = new DiscImageChef.Filters.PCExchange(); + filter.Open(location); + Stream str = filter.GetDataForkStream(); + byte[] data = new byte[737280]; + str.Read(data, 0, 737280); + str.Close(); + str.Dispose(); + filter.Close(); + MD5Context ctx = new MD5Context(); + ctx.Init(); + string result = ctx.Data(data, out byte[] tmp); + Assert.AreEqual(ExpectedContents, result); + } + + [Test] + public void CheckResource() + { + Filter filter = new DiscImageChef.Filters.PCExchange(); + filter.Open(location); + Stream str = filter.GetResourceForkStream(); + byte[] data = new byte[546]; + str.Read(data, 0, 546); + str.Close(); + str.Dispose(); + filter.Close(); + MD5Context ctx = new MD5Context(); + ctx.Init(); + string result = ctx.Data(data, out byte[] tmp); + Assert.AreEqual(ExpectedResource, result); + } + } +}