$I->amInPath(codecept_data_dir() . 'sandbox');
$I->seeDirFound('some/deeply/nested');
$I->seeFileFound('structu.re', 'some/deeply/nested');
$I->seeFileFound('existing_file', 'some/deeply');
// Test a bunch of archive types that we support
foreach (['zip', 'tar', 'tar.gz', 'tar.bz2', 'tgz'] as $archiveType) {
    // First, take everything from the folder 'some/deeply' and make
    // an archive for it located in 'deep'
    $I->taskPack("deeply.{$archiveType}")->add(['deep' => 'some/deeply'])->run();
    $I->seeFileFound("deeply.{$archiveType}");
    // We are next going to extract the archive we created, this time
    // putting it into a folder called "extracted-$archiveType" (different
    // for each archive type we test).  We rely on the default behavior
    // of our extractor to remove the top-level directory in the archive
    // ("deeply").
    $I->taskExtract("deeply.{$archiveType}")->to("extracted-{$archiveType}")->preserveTopDirectory(false)->run();
    $I->seeDirFound("extracted-{$archiveType}");
    $I->seeDirFound("extracted-{$archiveType}/nested");
    $I->seeFileFound('structu.re', "extracted-{$archiveType}/nested");
    // Next, we'll extract the same archive again, this time preserving
    // the top-level folder.
    $I->taskExtract("deeply.{$archiveType}")->to("preserved-{$archiveType}")->preserveTopDirectory()->run();
    $I->seeDirFound("preserved-{$archiveType}");
    $I->seeDirFound("preserved-{$archiveType}/deep/nested");
    $I->seeFileFound('structu.re', "preserved-{$archiveType}/deep/nested");
    // Make another archive, this time composed of fanciful locations
    $I->taskPack("composed.{$archiveType}")->add(['a/b/existing_file' => 'some/deeply/existing_file'])->add(['x/y/z/structu.re' => 'some/deeply/nested/structu.re'])->run();
    $I->seeFileFound("composed.{$archiveType}");
    // Extract our composed archive, and see if the resulting file
    // structure matches expectations.
    $I->taskExtract("composed.{$archiveType}")->to("decomposed-{$archiveType}")->preserveTopDirectory()->run();