2022-06-19 22:05:52 +02:00
using System.IO ;
2015-12-30 11:19:42 +00:00
using SharpCompress.Common ;
2018-04-22 11:19:11 +01:00
using SharpCompress.IO ;
2016-09-26 11:49:49 +01:00
using SharpCompress.Readers ;
2018-07-10 10:15:21 -07:00
using SharpCompress.Test.Mocks ;
2015-12-30 11:19:42 +00:00
using Xunit ;
2022-12-20 15:06:44 +00:00
namespace SharpCompress.Test ;
public abstract class ReaderTests : TestBase
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
protected void Read (
string testArchive ,
CompressionType expectedCompression ,
ReaderOptions ? options = null
)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
testArchive = Path . Combine ( TEST_ARCHIVES_PATH , testArchive ) ;
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
options ? ? = new ReaderOptions ( ) ;
2018-07-11 18:37:49 -07:00
2022-12-20 15:06:44 +00:00
options . LeaveStreamOpen = true ;
ReadImpl ( testArchive , expectedCompression , options ) ;
2018-07-11 18:37:49 -07:00
2022-12-20 15:06:44 +00:00
options . LeaveStreamOpen = false ;
ReadImpl ( testArchive , expectedCompression , options ) ;
VerifyFiles ( ) ;
}
2018-07-11 15:34:57 -07:00
2022-12-20 15:06:44 +00:00
private void ReadImpl (
string testArchive ,
CompressionType expectedCompression ,
ReaderOptions options
)
{
using var file = File . OpenRead ( testArchive ) ;
using var protectedStream = NonDisposingStream . Create (
2022-12-20 15:14:22 +00:00
new ForwardOnlyStream ( file ) ,
throwOnDispose : true
) ;
2022-12-20 15:06:44 +00:00
using var testStream = new TestStream ( protectedStream ) ;
using ( var reader = ReaderFactory . Open ( testStream , options ) )
2018-07-11 15:34:57 -07:00
{
2022-12-20 15:06:44 +00:00
UseReader ( reader , expectedCompression ) ;
protectedStream . ThrowOnDispose = false ;
2022-12-20 15:14:22 +00:00
Assert . False ( testStream . IsDisposed , "{nameof(testStream)} prematurely closed" ) ;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
// Boolean XOR -- If the stream should be left open (true), then the stream should not be diposed (false)
// and if the stream should be closed (false), then the stream should be disposed (true)
var message =
$"{nameof(options.LeaveStreamOpen)} is set to '{options.LeaveStreamOpen}', so {nameof(testStream.IsDisposed)} should be set to '{!testStream.IsDisposed}', but is set to {testStream.IsDisposed}" ;
Assert . True ( options . LeaveStreamOpen ! = testStream . IsDisposed , message ) ;
}
public void UseReader ( IReader reader , CompressionType expectedCompression )
{
while ( reader . MoveToNextEntry ( ) )
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
if ( ! reader . Entry . IsDirectory )
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
Assert . Equal ( expectedCompression , reader . Entry . CompressionType ) ;
reader . WriteEntryToDirectory (
SCRATCH_FILES_PATH ,
new ExtractionOptions ( ) { ExtractFullPath = true , Overwrite = true }
) ;
2015-12-30 11:19:42 +00:00
}
}
}
}