You are here

vfsStreamWrapperTestCase.php in Zircon Profile 8

Namespace

org\bovigo\vfs

File

vendor/mikey179/vfsStream/src/test/php/org/bovigo/vfs/vfsStreamWrapperTestCase.php
View source
<?php

/**
 * This file is part of vfsStream.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @package  org\bovigo\vfs
 */
namespace org\bovigo\vfs;

require_once __DIR__ . '/vfsStreamWrapperBaseTestCase.php';

/**
 * Test for org\bovigo\vfs\vfsStreamWrapper.
 */
class vfsStreamWrapperTestCase extends vfsStreamWrapperBaseTestCase {

  /**
   * ensure that a call to vfsStreamWrapper::register() resets the stream
   *
   * Implemented after a request by David Zülke.
   *
   * @test
   */
  public function resetByRegister() {
    $this
      ->assertSame($this->foo, vfsStreamWrapper::getRoot());
    vfsStreamWrapper::register();
    $this
      ->assertNull(vfsStreamWrapper::getRoot());
  }

  /**
   * @test
   * @since  0.11.0
   */
  public function setRootReturnsRoot() {
    vfsStreamWrapper::register();
    $root = vfsStream::newDirectory('root');
    $this
      ->assertSame($root, vfsStreamWrapper::setRoot($root));
  }

  /**
   * assure that filesize is returned correct
   *
   * @test
   */
  public function filesize() {
    $this
      ->assertEquals(0, filesize($this->fooURL));
    $this
      ->assertEquals(0, filesize($this->fooURL . '/.'));
    $this
      ->assertEquals(0, filesize($this->barURL));
    $this
      ->assertEquals(0, filesize($this->barURL . '/.'));
    $this
      ->assertEquals(4, filesize($this->baz2URL));
    $this
      ->assertEquals(5, filesize($this->baz1URL));
  }

  /**
   * assert that file_exists() delivers correct result
   *
   * @test
   */
  public function file_exists() {
    $this
      ->assertTrue(file_exists($this->fooURL));
    $this
      ->assertTrue(file_exists($this->fooURL . '/.'));
    $this
      ->assertTrue(file_exists($this->barURL));
    $this
      ->assertTrue(file_exists($this->barURL . '/.'));
    $this
      ->assertTrue(file_exists($this->baz1URL));
    $this
      ->assertTrue(file_exists($this->baz2URL));
    $this
      ->assertFalse(file_exists($this->fooURL . '/another'));
    $this
      ->assertFalse(file_exists(vfsStream::url('another')));
  }

  /**
   * assert that filemtime() delivers correct result
   *
   * @test
   */
  public function filemtime() {
    $this
      ->assertEquals(100, filemtime($this->fooURL));
    $this
      ->assertEquals(100, filemtime($this->fooURL . '/.'));
    $this
      ->assertEquals(200, filemtime($this->barURL));
    $this
      ->assertEquals(200, filemtime($this->barURL . '/.'));
    $this
      ->assertEquals(300, filemtime($this->baz1URL));
    $this
      ->assertEquals(400, filemtime($this->baz2URL));
  }

  /**
   * @test
   * @group  issue_23
   */
  public function unlinkRemovesFilesOnly() {
    $this
      ->assertTrue(unlink($this->baz2URL));
    $this
      ->assertFalse(file_exists($this->baz2URL));

    // make sure statcache was cleared
    $this
      ->assertEquals(array(
      $this->bar,
    ), $this->foo
      ->getChildren());
    $this
      ->assertFalse(@unlink($this->fooURL . '/another'));
    $this
      ->assertFalse(@unlink(vfsStream::url('another')));
    $this
      ->assertEquals(array(
      $this->bar,
    ), $this->foo
      ->getChildren());
  }

  /**
   * @test
   * @group  issue_49
   */
  public function unlinkReturnsFalseWhenFileDoesNotExist() {
    vfsStream::setup()
      ->addChild(vfsStream::newFile('foo.blubb'));
    $this
      ->assertFalse(@unlink(vfsStream::url('foo.blubb2')));
  }

  /**
   * @test
   * @group  issue_49
   */
  public function unlinkReturnsFalseWhenFileDoesNotExistAndFileWithSameNameExistsInRoot() {
    vfsStream::setup()
      ->addChild(vfsStream::newFile('foo.blubb'));
    $this
      ->assertFalse(@unlink(vfsStream::url('foo.blubb')));
  }

  /**
   * assert dirname() returns correct directory name
   *
   * @test
   */
  public function dirname() {
    $this
      ->assertEquals($this->fooURL, dirname($this->barURL));
    $this
      ->assertEquals($this->barURL, dirname($this->baz1URL));

    # returns "vfs:" instead of "."

    # however this seems not to be fixable because dirname() does not

    # call the stream wrapper

    #$this->assertEquals(dirname(vfsStream::url('doesNotExist')), '.');
  }

  /**
   * assert basename() returns correct file name
   *
   * @test
   */
  public function basename() {
    $this
      ->assertEquals('bar', basename($this->barURL));
    $this
      ->assertEquals('baz1', basename($this->baz1URL));
    $this
      ->assertEquals('doesNotExist', basename(vfsStream::url('doesNotExist')));
  }

  /**
   * assert is_readable() works correct
   *
   * @test
   */
  public function is_readable() {
    $this
      ->assertTrue(is_readable($this->fooURL));
    $this
      ->assertTrue(is_readable($this->fooURL . '/.'));
    $this
      ->assertTrue(is_readable($this->barURL));
    $this
      ->assertTrue(is_readable($this->barURL . '/.'));
    $this
      ->assertTrue(is_readable($this->baz1URL));
    $this
      ->assertTrue(is_readable($this->baz2URL));
    $this
      ->assertFalse(is_readable($this->fooURL . '/another'));
    $this
      ->assertFalse(is_readable(vfsStream::url('another')));
    $this->foo
      ->chmod(0222);
    $this
      ->assertFalse(is_readable($this->fooURL));
    $this->baz1
      ->chmod(0222);
    $this
      ->assertFalse(is_readable($this->baz1URL));
  }

  /**
   * assert is_writable() works correct
   *
   * @test
   */
  public function is_writable() {
    $this
      ->assertTrue(is_writable($this->fooURL));
    $this
      ->assertTrue(is_writable($this->fooURL . '/.'));
    $this
      ->assertTrue(is_writable($this->barURL));
    $this
      ->assertTrue(is_writable($this->barURL . '/.'));
    $this
      ->assertTrue(is_writable($this->baz1URL));
    $this
      ->assertTrue(is_writable($this->baz2URL));
    $this
      ->assertFalse(is_writable($this->fooURL . '/another'));
    $this
      ->assertFalse(is_writable(vfsStream::url('another')));
    $this->foo
      ->chmod(0444);
    $this
      ->assertFalse(is_writable($this->fooURL));
    $this->baz1
      ->chmod(0444);
    $this
      ->assertFalse(is_writable($this->baz1URL));
  }

  /**
   * assert is_executable() works correct
   *
   * @test
   */
  public function is_executable() {
    $this
      ->assertFalse(is_executable($this->baz1URL));
    $this->baz1
      ->chmod(0766);
    $this
      ->assertTrue(is_executable($this->baz1URL));
    $this
      ->assertFalse(is_executable($this->baz2URL));
  }

  /**
   * assert is_executable() works correct
   *
   * @test
   */
  public function directoriesAndNonExistingFilesAreNeverExecutable() {
    $this
      ->assertFalse(is_executable($this->fooURL));
    $this
      ->assertFalse(is_executable($this->fooURL . '/.'));
    $this
      ->assertFalse(is_executable($this->barURL));
    $this
      ->assertFalse(is_executable($this->barURL . '/.'));
    $this
      ->assertFalse(is_executable($this->fooURL . '/another'));
    $this
      ->assertFalse(is_executable(vfsStream::url('another')));
  }

  /**
   * file permissions
   *
   * @test
   * @group  permissions
   */
  public function chmod() {
    $this
      ->assertEquals(40777, decoct(fileperms($this->fooURL)));
    $this
      ->assertEquals(40777, decoct(fileperms($this->fooURL . '/.')));
    $this
      ->assertEquals(40777, decoct(fileperms($this->barURL)));
    $this
      ->assertEquals(40777, decoct(fileperms($this->barURL . '/.')));
    $this
      ->assertEquals(100666, decoct(fileperms($this->baz1URL)));
    $this
      ->assertEquals(100666, decoct(fileperms($this->baz2URL)));
    $this->foo
      ->chmod(0755);
    $this->bar
      ->chmod(0700);
    $this->baz1
      ->chmod(0644);
    $this->baz2
      ->chmod(0600);
    $this
      ->assertEquals(40755, decoct(fileperms($this->fooURL)));
    $this
      ->assertEquals(40755, decoct(fileperms($this->fooURL . '/.')));
    $this
      ->assertEquals(40700, decoct(fileperms($this->barURL)));
    $this
      ->assertEquals(40700, decoct(fileperms($this->barURL . '/.')));
    $this
      ->assertEquals(100644, decoct(fileperms($this->baz1URL)));
    $this
      ->assertEquals(100600, decoct(fileperms($this->baz2URL)));
  }

  /**
   * @test
   * @group  issue_11
   * @group  permissions
   */
  public function chmodModifiesPermissions() {
    if (version_compare(phpversion(), '5.4.0', '<')) {
      $this
        ->assertFalse(@chmod($this->fooURL, 0755));
      $this
        ->assertFalse(@chmod($this->barURL, 0711));
      $this
        ->assertFalse(@chmod($this->baz1URL, 0644));
      $this
        ->assertFalse(@chmod($this->baz2URL, 0664));
      $this
        ->assertEquals(40777, decoct(fileperms($this->fooURL)));
      $this
        ->assertEquals(40777, decoct(fileperms($this->barURL)));
      $this
        ->assertEquals(100666, decoct(fileperms($this->baz1URL)));
      $this
        ->assertEquals(100666, decoct(fileperms($this->baz2URL)));
    }
    else {
      $this
        ->assertTrue(chmod($this->fooURL, 0755));
      $this
        ->assertTrue(chmod($this->barURL, 0711));
      $this
        ->assertTrue(chmod($this->baz1URL, 0644));
      $this
        ->assertTrue(chmod($this->baz2URL, 0664));
      $this
        ->assertEquals(40755, decoct(fileperms($this->fooURL)));
      $this
        ->assertEquals(40711, decoct(fileperms($this->barURL)));
      $this
        ->assertEquals(100644, decoct(fileperms($this->baz1URL)));
      $this
        ->assertEquals(100664, decoct(fileperms($this->baz2URL)));
    }
  }

  /**
   * @test
   * @group  permissions
   */
  public function fileownerIsCurrentUserByDefault() {
    $this
      ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL));
    $this
      ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL . '/.'));
    $this
      ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->barURL));
    $this
      ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->barURL . '/.'));
    $this
      ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->baz1URL));
    $this
      ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->baz2URL));
  }

  /**
   * @test
   * @group  issue_11
   * @group  permissions
   */
  public function chownChangesUser() {
    if (version_compare(phpversion(), '5.4.0', '<')) {
      $this->foo
        ->chown(vfsStream::OWNER_USER_1);
      $this->bar
        ->chown(vfsStream::OWNER_USER_1);
      $this->baz1
        ->chown(vfsStream::OWNER_USER_2);
      $this->baz2
        ->chown(vfsStream::OWNER_USER_2);
    }
    else {
      chown($this->fooURL, vfsStream::OWNER_USER_1);
      chown($this->barURL, vfsStream::OWNER_USER_1);
      chown($this->baz1URL, vfsStream::OWNER_USER_2);
      chown($this->baz2URL, vfsStream::OWNER_USER_2);
    }
    $this
      ->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->fooURL));
    $this
      ->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->fooURL . '/.'));
    $this
      ->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->barURL));
    $this
      ->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->barURL . '/.'));
    $this
      ->assertEquals(vfsStream::OWNER_USER_2, fileowner($this->baz1URL));
    $this
      ->assertEquals(vfsStream::OWNER_USER_2, fileowner($this->baz2URL));
  }

  /**
   * @test
   * @group  issue_11
   * @group  permissions
   */
  public function chownDoesNotWorkOnVfsStreamUrls() {
    if (version_compare(phpversion(), '5.4.0', '<')) {
      $this
        ->assertFalse(@chown($this->fooURL, vfsStream::OWNER_USER_2));
      $this
        ->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL));
    }
  }

  /**
   * @test
   * @group  issue_11
   * @group  permissions
   */
  public function groupIsCurrentGroupByDefault() {
    $this
      ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL));
    $this
      ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL . '/.'));
    $this
      ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->barURL));
    $this
      ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->barURL . '/.'));
    $this
      ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->baz1URL));
    $this
      ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->baz2URL));
  }

  /**
   * @test
   * @group  issue_11
   * @group  permissions
   */
  public function chgrp() {
    if (version_compare(phpversion(), '5.4.0', '<')) {
      $this->foo
        ->chgrp(vfsStream::GROUP_USER_1);
      $this->bar
        ->chgrp(vfsStream::GROUP_USER_1);
      $this->baz1
        ->chgrp(vfsStream::GROUP_USER_2);
      $this->baz2
        ->chgrp(vfsStream::GROUP_USER_2);
    }
    else {
      chgrp($this->fooURL, vfsStream::GROUP_USER_1);
      chgrp($this->barURL, vfsStream::GROUP_USER_1);
      chgrp($this->baz1URL, vfsStream::GROUP_USER_2);
      chgrp($this->baz2URL, vfsStream::GROUP_USER_2);
    }
    $this
      ->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->fooURL));
    $this
      ->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->fooURL . '/.'));
    $this
      ->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->barURL));
    $this
      ->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->barURL . '/.'));
    $this
      ->assertEquals(vfsStream::GROUP_USER_2, filegroup($this->baz1URL));
    $this
      ->assertEquals(vfsStream::GROUP_USER_2, filegroup($this->baz2URL));
  }

  /**
   * @test
   * @group  issue_11
   * @group  permissions
   */
  public function chgrpDoesNotWorkOnVfsStreamUrls() {
    if (version_compare(phpversion(), '5.4.0', '<')) {
      $this
        ->assertFalse(@chgrp($this->fooURL, vfsStream::GROUP_USER_2));
      $this
        ->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL));
    }
  }

  /**
   * @test
   * @author  Benoit Aubuchon
   */
  public function renameDirectory() {

    // move foo/bar to foo/baz3
    $baz3URL = vfsStream::url('foo/baz3');
    $this
      ->assertTrue(rename($this->barURL, $baz3URL));
    $this
      ->assertFileExists($baz3URL);
    $this
      ->assertFileNotExists($this->barURL);
  }

  /**
   * @test
   */
  public function renameDirectoryWithDots() {

    // move foo/bar to foo/baz3
    $baz3URL = vfsStream::url('foo/baz3');
    $this
      ->assertTrue(rename($this->barURL . '/.', $baz3URL));
    $this
      ->assertFileExists($baz3URL);
    $this
      ->assertFileNotExists($this->barURL);
  }

  /**
   * @test
   * @group  issue_9
   * @since  0.9.0
   */
  public function renameDirectoryWithDotsInTarget() {

    // move foo/bar to foo/baz3
    $baz3URL = vfsStream::url('foo/../baz3/.');
    $this
      ->assertTrue(rename($this->barURL . '/.', $baz3URL));
    $this
      ->assertFileExists($baz3URL);
    $this
      ->assertFileNotExists($this->barURL);
  }

  /**
   * @test
   * @author  Benoit Aubuchon
   */
  public function renameDirectoryOverwritingExistingFile() {

    // move foo/bar to foo/baz2
    $this
      ->assertTrue(rename($this->barURL, $this->baz2URL));
    $this
      ->assertFileExists(vfsStream::url('foo/baz2/baz1'));
    $this
      ->assertFileNotExists($this->barURL);
  }

  /**
   * @test
   * @expectedException  PHPUnit_Framework_Error
   */
  public function renameFileIntoFile() {

    // foo/baz2 is a file, so it can not be turned into a directory
    $baz3URL = vfsStream::url('foo/baz2/baz3');
    $this
      ->assertTrue(rename($this->baz1URL, $baz3URL));
    $this
      ->assertFileExists($baz3URL);
    $this
      ->assertFileNotExists($this->baz1URL);
  }

  /**
   * @test
   * @author  Benoit Aubuchon
   */
  public function renameFileToDirectory() {

    // move foo/bar/baz1 to foo/baz3
    $baz3URL = vfsStream::url('foo/baz3');
    $this
      ->assertTrue(rename($this->baz1URL, $baz3URL));
    $this
      ->assertFileExists($this->barURL);
    $this
      ->assertFileExists($baz3URL);
    $this
      ->assertFileNotExists($this->baz1URL);
  }

  /**
   * assert that trying to rename from a non existing file trigger a warning
   *
   * @expectedException PHPUnit_Framework_Error
   * @test
   */
  public function renameOnSourceFileNotFound() {
    rename(vfsStream::url('notfound'), $this->baz1URL);
  }

  /**
   * assert that trying to rename to a directory that is not found trigger a warning
   * @expectedException PHPUnit_Framework_Error
   * @test
   */
  public function renameOnDestinationDirectoryFileNotFound() {
    rename($this->baz1URL, vfsStream::url('foo/notfound/file2'));
  }

  /**
   * stat() and fstat() should return the same result
   *
   * @test
   */
  public function statAndFstatReturnSameResult() {
    $fp = fopen($this->baz2URL, 'r');
    $this
      ->assertEquals(stat($this->baz2URL), fstat($fp));
    fclose($fp);
  }

  /**
   * stat() returns full data
   *
   * @test
   */
  public function statReturnsFullDataForFiles() {
    $this
      ->assertEquals(array(
      0 => 0,
      1 => 0,
      2 => 0100666,
      3 => 0,
      4 => vfsStream::getCurrentUser(),
      5 => vfsStream::getCurrentGroup(),
      6 => 0,
      7 => 4,
      8 => 400,
      9 => 400,
      10 => 400,
      11 => -1,
      12 => -1,
      'dev' => 0,
      'ino' => 0,
      'mode' => 0100666,
      'nlink' => 0,
      'uid' => vfsStream::getCurrentUser(),
      'gid' => vfsStream::getCurrentGroup(),
      'rdev' => 0,
      'size' => 4,
      'atime' => 400,
      'mtime' => 400,
      'ctime' => 400,
      'blksize' => -1,
      'blocks' => -1,
    ), stat($this->baz2URL));
  }

  /**
   * @test
   */
  public function statReturnsFullDataForDirectories() {
    $this
      ->assertEquals(array(
      0 => 0,
      1 => 0,
      2 => 040777,
      3 => 0,
      4 => vfsStream::getCurrentUser(),
      5 => vfsStream::getCurrentGroup(),
      6 => 0,
      7 => 0,
      8 => 100,
      9 => 100,
      10 => 100,
      11 => -1,
      12 => -1,
      'dev' => 0,
      'ino' => 0,
      'mode' => 040777,
      'nlink' => 0,
      'uid' => vfsStream::getCurrentUser(),
      'gid' => vfsStream::getCurrentGroup(),
      'rdev' => 0,
      'size' => 0,
      'atime' => 100,
      'mtime' => 100,
      'ctime' => 100,
      'blksize' => -1,
      'blocks' => -1,
    ), stat($this->fooURL));
  }

  /**
   * @test
   */
  public function statReturnsFullDataForDirectoriesWithDot() {
    $this
      ->assertEquals(array(
      0 => 0,
      1 => 0,
      2 => 040777,
      3 => 0,
      4 => vfsStream::getCurrentUser(),
      5 => vfsStream::getCurrentGroup(),
      6 => 0,
      7 => 0,
      8 => 100,
      9 => 100,
      10 => 100,
      11 => -1,
      12 => -1,
      'dev' => 0,
      'ino' => 0,
      'mode' => 040777,
      'nlink' => 0,
      'uid' => vfsStream::getCurrentUser(),
      'gid' => vfsStream::getCurrentGroup(),
      'rdev' => 0,
      'size' => 0,
      'atime' => 100,
      'mtime' => 100,
      'ctime' => 100,
      'blksize' => -1,
      'blocks' => -1,
    ), stat($this->fooURL . '/.'));
  }

  /**
   * @test
   * @expectedException PHPUnit_Framework_Error
   */
  public function openFileWithoutDirectory() {
    vfsStreamWrapper::register();
    $this
      ->assertFalse(file_get_contents(vfsStream::url('file.txt')));
  }

  /**
   * @test
   * @group     issue_33
   * @since     1.1.0
   * @requires  PHP 5.4.0
   */
  public function truncateRemovesSuperflouosContent() {
    if (strstr(PHP_VERSION, 'hiphop') !== false) {
      $this
        ->markTestSkipped('Not supported on hhvm');
    }
    $handle = fopen($this->baz1URL, "r+");
    $this
      ->assertTrue(ftruncate($handle, 0));
    $this
      ->assertEquals(0, filesize($this->baz1URL));
    $this
      ->assertEquals('', file_get_contents($this->baz1URL));
    fclose($handle);
  }

  /**
   * @test
   * @group     issue_33
   * @since     1.1.0
   * @requires  PHP 5.4.0
   */
  public function truncateToGreaterSizeAddsZeroBytes() {
    if (strstr(PHP_VERSION, 'hiphop') !== false) {
      $this
        ->markTestSkipped('Not supported on hhvm');
    }
    $handle = fopen($this->baz1URL, "r+");
    $this
      ->assertTrue(ftruncate($handle, 25));
    $this
      ->assertEquals(25, filesize($this->baz1URL));
    $this
      ->assertEquals("baz 1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", file_get_contents($this->baz1URL));
    fclose($handle);
  }

  /**
   * @test
   * @group     issue_11
   * @requires  PHP 5.4.0
   */
  public function touchCreatesNonExistingFile() {
    $this
      ->assertTrue(touch($this->fooURL . '/new.txt'));
    $this
      ->assertTrue($this->foo
      ->hasChild('new.txt'));
  }

  /**
   * @test
   * @group     issue_11
   * @requires  PHP 5.4.0
   */
  public function touchChangesAccessAndModificationTimeForFile() {
    $this
      ->assertTrue(touch($this->baz1URL, 303, 313));
    $this
      ->assertEquals(303, $this->baz1
      ->filemtime());
    $this
      ->assertEquals(313, $this->baz1
      ->fileatime());
  }

  /**
   * @test
   * @group     issue_11
   * @group     issue_80
   * @requires  PHP 5.4.0
   */
  public function touchChangesTimesToCurrentTimestampWhenNoTimesGiven() {
    $this
      ->assertTrue(touch($this->baz1URL));
    $this
      ->assertEquals(time(), $this->baz1
      ->filemtime(), '', 1);
    $this
      ->assertEquals(time(), $this->baz1
      ->fileatime(), '', 1);
  }

  /**
   * @test
   * @group     issue_11
   * @requires  PHP 5.4.0
   */
  public function touchWithModifiedTimeChangesAccessAndModifiedTime() {
    $this
      ->assertTrue(touch($this->baz1URL, 303));
    $this
      ->assertEquals(303, $this->baz1
      ->filemtime());
    $this
      ->assertEquals(303, $this->baz1
      ->fileatime());
  }

  /**
   * @test
   * @group     issue_11
   * @requires  PHP 5.4.0
   */
  public function touchChangesAccessAndModificationTimeForDirectory() {
    $this
      ->assertTrue(touch($this->fooURL, 303, 313));
    $this
      ->assertEquals(303, $this->foo
      ->filemtime());
    $this
      ->assertEquals(313, $this->foo
      ->fileatime());
  }

  /**
   * @test
   * @group  issue_34
   * @since  1.2.0
   */
  public function pathesAreCorrectlySet() {
    $this
      ->assertEquals(vfsStream::path($this->fooURL), $this->foo
      ->path());
    $this
      ->assertEquals(vfsStream::path($this->barURL), $this->bar
      ->path());
    $this
      ->assertEquals(vfsStream::path($this->baz1URL), $this->baz1
      ->path());
    $this
      ->assertEquals(vfsStream::path($this->baz2URL), $this->baz2
      ->path());
  }

  /**
   * @test
   * @group  issue_34
   * @since  1.2.0
   */
  public function urlsAreCorrectlySet() {
    $this
      ->assertEquals($this->fooURL, $this->foo
      ->url());
    $this
      ->assertEquals($this->barURL, $this->bar
      ->url());
    $this
      ->assertEquals($this->baz1URL, $this->baz1
      ->url());
    $this
      ->assertEquals($this->baz2URL, $this->baz2
      ->url());
  }

  /**
   * @test
   * @group  issue_34
   * @since  1.2.0
   */
  public function pathIsUpdatedAfterMove() {

    // move foo/bar/baz1 to foo/baz3
    $baz3URL = vfsStream::url('foo/baz3');
    $this
      ->assertTrue(rename($this->baz1URL, $baz3URL));
    $this
      ->assertEquals(vfsStream::path($baz3URL), $this->baz1
      ->path());
  }

  /**
   * @test
   * @group  issue_34
   * @since  1.2.0
   */
  public function urlIsUpdatedAfterMove() {

    // move foo/bar/baz1 to foo/baz3
    $baz3URL = vfsStream::url('foo/baz3');
    $this
      ->assertTrue(rename($this->baz1URL, $baz3URL));
    $this
      ->assertEquals($baz3URL, $this->baz1
      ->url());
  }

}