5 using ICSharpCode.SharpZipLib.Silverlight.Zip.Compression;
6 using ICSharpCode.SharpZipLib.Silverlight.Zip.Compression.Streams;
9 using ICSharpCode.SharpZipLib.Tests.TestSupport;
11 namespace ICSharpCode.SharpZipLib.Tests.Base
14 /// This class contains test cases for Deflater/Inflater streams.
17 public class InflaterDeflaterTestSuite
19 void Inflate(MemoryStream ms, byte[] original, int level, bool zlib)
21 ms.Seek(0, SeekOrigin.Begin);
23 Inflater inflater = new Inflater(!zlib);
24 InflaterInputStream inStream = new InflaterInputStream(ms, inflater);
25 byte[] buf2 = new byte[original.Length];
28 int count = buf2.Length;
34 int numRead = inStream.Read(buf2, currentIndex, count);
39 currentIndex += numRead;
45 Console.WriteLine("Unexpected exception - '{0}'", ex.Message);
49 if ( currentIndex != original.Length )
51 Console.WriteLine("Original {0}, new {1}", original.Length, currentIndex);
52 Assert.Fail("Lengths different");
55 for (int i = 0; i < original.Length; ++i)
57 if ( buf2[i] != original[i] )
59 string description = string.Format("Difference at {0} level {1} zlib {2} ", i, level, zlib);
60 if ( original.Length < 2048 )
62 StringBuilder builder = new StringBuilder(description);
63 for (int d = 0; d < original.Length; ++d)
65 builder.AppendFormat("{0} ", original[d]);
68 Assert.Fail(builder.ToString());
72 Assert.Fail(description);
78 MemoryStream Deflate(byte[] data, int level, bool zlib)
80 MemoryStream memoryStream = new MemoryStream();
82 Deflater deflater = new Deflater(level, !zlib);
83 using ( DeflaterOutputStream outStream = new DeflaterOutputStream(memoryStream, deflater) )
85 outStream.IsStreamOwner = false;
86 outStream.Write(data, 0, data.Length);
93 void RandomDeflateInflate(int size, int level, bool zlib)
95 byte[] buffer = new byte[size];
96 System.Random rnd = new Random();
97 rnd.NextBytes(buffer);
99 MemoryStream ms = Deflate(buffer, level, zlib);
100 Inflate(ms, buffer, level, zlib);
104 /// Basic inflate/deflate test
108 public void InflateDeflateZlib()
110 for (int level = 0; level < 10; ++level)
112 RandomDeflateInflate(100000, level, true);
116 delegate void RunCompress(byte[] buffer);
121 Random runRandom = new Random(5);
123 void DeflateAndInflate(byte[] buffer)
126 MemoryStream ms = Deflate(buffer, runLevel, runZlib);
127 Inflate(ms, buffer, runLevel, runZlib);
130 void TryVariants(RunCompress test, byte[] buffer, int index)
133 while ( worker <= 255 )
135 buffer[index] = (byte)worker;
136 if ( index < buffer.Length - 1)
138 TryVariants(test, buffer, index + 1);
145 worker += runRandom.Next(256);
149 void TryManyVariants(int level, bool zlib, RunCompress test, byte[] buffer)
153 TryVariants(test, buffer, 0);
159 public void SmallBlocks()
161 byte[] buffer = new byte[10];
162 Array.Clear(buffer, 0, buffer.Length);
163 TryManyVariants(0, false, new RunCompress(DeflateAndInflate), buffer);
169 [Category("ExcludeFromAutoBuild")]
170 public void FindBug()
172 using ( FileStream fs = File.OpenRead("c:\\tmp\\original.dat") )
175 long readLength = fs.Length - readOffset;
176 // readLength -= 5567; // 5568 works 5567 doesnt....
178 fs.Seek(readOffset, SeekOrigin.Begin);
180 byte[] original = new byte[readLength];
182 int bytesRead = fs.Read(original, 0, original.Length);
183 Assert.AreEqual(bytesRead, original.Length);
185 MemoryStream ms = Deflate(original, Deflater.BEST_SPEED, true);
186 Inflate(ms, original, Deflater.BEST_SPEED, true);
191 /// Basic inflate/deflate test
195 public void InflateDeflateNonZlib()
197 for (int level = 0; level < 10; ++level)
199 RandomDeflateInflate(100000, level, false);
205 public void CloseDeflatorWithNestedUsing()
207 string tempFile = null;
210 tempFile = Path.GetTempPath();
212 catch (SecurityException)
216 Assert.IsNotNull(tempFile, "No permission to execute this test?");
217 if (tempFile != null)
219 tempFile = Path.Combine(tempFile, "SharpZipTest.Zip");
220 using (FileStream diskFile = File.Create(tempFile))
221 using (DeflaterOutputStream deflator = new DeflaterOutputStream(diskFile))
222 using (StreamWriter txtFile = new StreamWriter(deflator))
224 txtFile.Write("Hello");
228 File.Delete(tempFile);
234 public void DeflatorStreamOwnership()
236 MemoryStreamEx memStream = new MemoryStreamEx();
237 DeflaterOutputStream s = new DeflaterOutputStream(memStream);
239 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
240 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
244 Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
245 Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");
247 memStream = new MemoryStreamEx();
248 s = new DeflaterOutputStream(memStream);
250 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
251 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
253 s.IsStreamOwner = false;
256 Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
257 Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
263 public void InflatorStreamOwnership()
265 MemoryStreamEx memStream = new MemoryStreamEx();
266 InflaterInputStream s = new InflaterInputStream(memStream);
268 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
269 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
273 Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
274 Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");
276 memStream = new MemoryStreamEx();
277 s = new InflaterInputStream(memStream);
279 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
280 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
282 s.IsStreamOwner = false;
285 Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
286 Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
292 public void CloseInflatorWithNestedUsing()
294 string tempFile = null;
297 tempFile = Path.GetTempPath();
299 catch (SecurityException)
303 Assert.IsNotNull(tempFile, "No permission to execute this test?");
305 if (tempFile != null)
307 tempFile = Path.Combine(tempFile, "SharpZipTest.Zip");
308 using (FileStream diskFile = File.Create(tempFile))
309 using (DeflaterOutputStream deflator = new DeflaterOutputStream(diskFile))
310 using (StreamWriter textWriter = new StreamWriter(deflator))
312 textWriter.Write("Hello");
316 using (FileStream diskFile = File.OpenRead(tempFile))
317 using (InflaterInputStream deflator = new InflaterInputStream(diskFile))
318 using (StreamReader textReader = new StreamReader(deflator))
320 char[] buffer = new char[5];
321 int readCount = textReader.Read(buffer, 0, 5);
322 Assert.AreEqual(5, readCount);
324 StringBuilder b = new StringBuilder();
326 Assert.AreEqual("Hello", b.ToString());
330 File.Delete(tempFile);