tczipper.pp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. program tczipper;
  2. {
  3. This file is part of the Free Pascal packages.
  4. Copyright (c) 1999-2012 by the Free Pascal development team
  5. Tests zip/unzip functionality provided by the FPC zipper.pp unit.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$mode objfpc}{$h+}
  13. uses SysUtils, classes, zipper, md5;
  14. type
  15. TCallBackHandler = class(TObject)
  16. public
  17. procedure EndOfFile(Sender:TObject; const Ratio:double);
  18. procedure StartOfFile(Sender:TObject; const AFileName:string);
  19. end;
  20. procedure TCallBackHandler.EndOfFile(Sender : TObject; Const Ratio : Double);
  21. begin
  22. if (Ratio<0) then
  23. begin
  24. writeln('Found compression ratio '+floattostr(Ratio)+', which should never be lower than 0.');
  25. halt(3);
  26. end;
  27. end;
  28. procedure TCallBackHandler.StartOfFile(Sender : TObject; Const AFileName : String);
  29. begin
  30. if AFileName='' then
  31. begin
  32. writeln('Archive filename should not be empty.');
  33. halt(4);
  34. end;
  35. end;
  36. var
  37. code: cardinal;
  38. CallBackHandler: TCallBackHandler;
  39. CompressedFile: string;
  40. FileContents: TStringList;
  41. UncompressedFile1: string;
  42. UncompressedFile1Hash: string;
  43. UncompressedFile2: string;
  44. UncompressedFile2Hash: string;
  45. OurZipper: TZipper;
  46. UnZipper: TUnZipper;
  47. begin
  48. code := 0;
  49. UncompressedFile1:=SysUtils.GetTempFileName('', 'UNC');
  50. UncompressedFile2:=SysUtils.GetTempFileName('', 'UNC');
  51. CompressedFile:=SysUtils.GetTempFileName('', 'ZP');
  52. FileContents:=TStringList.Create;
  53. OurZipper:=TZipper.Create;
  54. UnZipper:=TUnZipper.Create;
  55. CallBackHandler:=TCallBackHandler.Create;
  56. try
  57. // Set up uncompressed files
  58. FileContents.Add('This is an uncompressed file.');
  59. FileContents.Add('And another line.');
  60. FileContents.SaveToFile(UncompressedFile1);
  61. FileContents.Clear;
  62. FileContents.Add('Have you looked into using fpcup today?');
  63. FileContents.Add('It works nicely with fpc and goes well with a fruity red wine, too.');
  64. FileContents.SaveToFile(UncompressedFile2);
  65. // Remember their content, so we can compare later.
  66. UncompressedFile1Hash:=MD5Print(MD5File(UncompressedFile1, MDDefBufSize));
  67. UncompressedFile2Hash:=MD5Print(MD5File(UncompressedFile2, MDDefBufSize));
  68. // Test zip functionality.
  69. OurZipper.FileName:=CompressedFile;
  70. // Add the files only with their filenames, we don't want to create
  71. // subdirectories:
  72. OurZipper.Entries.AddFileEntry(UncompressedFile1,ExtractFileName(UncompressedFile1));
  73. OurZipper.Entries.AddFileEntry(UncompressedFile2,ExtractFileName(UncompressedFile2));
  74. OurZipper.OnStartFile:[email protected];
  75. OurZipper.OnEndFile:[email protected];
  76. OurZipper.ZipAllFiles;
  77. if not FileExists(CompressedFile) then
  78. begin
  79. writeln('Zip file was not created.');
  80. halt(5);
  81. end;
  82. // Delete original files
  83. DeleteFile(UncompressedFile1);
  84. DeleteFile(UncompressedFile2);
  85. // Now unzip
  86. Unzipper.FileName:=CompressedFile;
  87. Unzipper.OutputPath:=ExtractFilePath(UncompressedFile1);
  88. UnZipper.OnStartFile:[email protected];
  89. UnZipper.OnEndFile:[email protected];
  90. Unzipper.Examine;
  91. Unzipper.UnZipAllFiles;
  92. // Now we should have the uncompressed files again
  93. if (not FileExists(UncompressedFile1)) or
  94. (not FileExists(UncompressedFile2)) then
  95. begin
  96. writeln('Unzip failed: could not find decompressed files.');
  97. halt(6);
  98. end;
  99. // Compare hashes
  100. if
  101. (UncompressedFile1Hash<>MD5Print(MD5File(UncompressedFile1, MDDefBufSize)))
  102. or
  103. (UncompressedFile2Hash<>MD5Print(MD5File(UncompressedFile2, MDDefBufSize)))
  104. then
  105. begin
  106. writeln('Unzip failed: uncompressed files are not the same as the originals.');
  107. halt(7);
  108. end;
  109. if code = 0 then
  110. writeln('Basic zip/unzip tests passed')
  111. else
  112. writeln('Basic zip/unzip test failed: ', code);
  113. finally
  114. FileContents.Free;
  115. CallBackHandler.Free;
  116. OurZipper.Free;
  117. UnZipper.Free;
  118. try
  119. if FileExists(CompressedFile) then DeleteFile(CompressedFile);
  120. if FileExists(UncompressedFile1) then DeleteFile(UncompressedFile1);
  121. if FileExists(UncompressedFile2) then DeleteFile(UncompressedFile2);
  122. finally
  123. // Ignore errors; operating system should clean out temp files
  124. end;
  125. end;
  126. Halt(code);
  127. end.