PHP Classes

File: ExternalSortTest.php

Recommend this page to a friend!
  Classes of Philipp Strazny   External Sort   ExternalSortTest.php   Download  
File: ExternalSortTest.php
Role: Unit test script
Content type: text/plain
Description: unit tests for ExternalSort
Class: External Sort
Sort large files similar to the UNIX sort command
Author: By
Last change:
Date: 13 years ago
Size: 12,630 bytes
 

Contents

Class file image Download
<?php /* * ExternalSortTest is copyright 2011. Philipp Strazny. * Licensed under the Academic Free License version 3.0 * * ExternalSortTest implements unit tests for ExternalSort. * * @author Philipp Strazny * @version 1.0 * @copyright Philipp Strazny * @license Academic Free License v. 3.0 * @package ExternalSortTest * filename: ExternalSortTest.php * date: 2011-11-04 * * * command-line usage: * phpunit ExternalSortTest.php */ require('ExternalSort.php'); /** * Test class for ExternalSort. * Generated by PHPUnit on 2011-05-24 at 21:03:54. */ class ExternalSortTest extends PHPUnit_Framework_TestCase { /** * @var ExternalSort */ protected $object; /** * @var ExternalSort ReflectionClass */ protected $testclass; /** * Sets up the fixture, for example, opens a network connection. * This method is called before a test is executed. */ protected function setUp() { $this->object = new ExternalSort();//'dummyarg'); $this->testclass = new ReflectionClass('ExternalSort'); } /** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. */ protected function tearDown() { } /** * tests that * tmpdir and first bucket file are created * and then removed after ExternalSort is set to null * (implicit call do __destruct) */ public function test__destruct() { $arr = array('a','b','c','d'); $tmpfile = 'tmp1.txt'; file_put_contents($tmpfile, implode("\n", $arr)); $this->object->setFile($tmpfile); $fp = fopen($tmpfile, 'r'); $cnt = $this->object->initExternalBuckets($fp); $tmpdir = $this->getProperty('tmpdir'); $this->assertTrue(file_exists($tmpdir.'/0')); $this->object=null; $this->assertFalse(file_exists($tmpdir)); @unlink($tmpfile); //input file @unlink($tmpfile.'.sorted'); //output file } /** * @todo Implement testRun(). */ public function testRun() { $arr = array('a','b','c','d'); $tmpfile = 'tmp1.txt'; file_put_contents($tmpfile, implode("\n", $arr)); $sortedFile = $tmpfile.'.sorted'; $this->assertFalse(file_exists($sortedFile), 'making sure that sorted file does not exist yet'); $this->object->setFile($tmpfile); $this->object->run(); $this->assertTrue(file_exists($sortedFile), 'making sure that sorted file exists after sorting'); unlink($sortedFile); unlink($tmpfile); } /** * @todo Implement testSetVerify(). */ public function testSetVerify() { $this->object->setVerify(); $verifyOutput = $this->getProperty('verifyOutput'); $this->assertFalse($verifyOutput); $this->object->setVerify(true); $verifyOutput = $this->getProperty('verifyOutput'); $this->assertTrue($verifyOutput); } /** * @todo Implement testSetVerifyInput(). */ public function testSetVerifyInput() { $this->object->setVerifyInput(); $verifyInput = $this->getProperty('verifyInput'); $this->assertFalse($verifyInput); $this->object->setVerifyInput(true); $verifyInput = $this->getProperty('verifyInput'); $this->assertTrue($verifyInput); } /** * @todo Implement testSetTrim(). */ public function testSetTrim() { $this->object->setTrim(); $trim = $this->getProperty('trim'); $this->assertFalse($trim); $this->object->setTrim(true); $trim = $this->getProperty('trim'); $this->assertTrue($trim); } /** * @todo Implement testSetFile(). */ public function testSetFile() { $file = 'abc'; $outputfile = 'abc.sorted'; @touch($file); $this->assertFalse(file_exists($outputfile)); $this->object->setFile($file); $fileProp = $this->getProperty('file'); $outputfileProp = $this->getProperty('outputfile'); $this->assertTrue(file_exists($outputfile)); $this->assertEquals($fileProp, $file); $this->assertEquals($outputfileProp, $outputfile); @unlink($file); @unlink($outputfile); } /** * @todo Implement testSetOutputFile(). */ public function testSetOutputFile() { $file = 'abc'; $this->assertFalse(file_exists($file)); $this->object->setOutputFile($file); $outputfile = $this->getProperty('outputfile'); $this->assertTrue(file_exists($file)); $this->assertEquals($outputfile, $file); @unlink($file); //input file @unlink($file.'.sorted'); //output file } /** * @todo Implement testSetLinebreak(). */ public function testSetLinebreak() { $this->object->setLinebreak(); $linebreak = $this->getProperty('linebreak'); $this->assertEquals($linebreak, "\n"); $this->object->setLinebreak(true); $linebreak = $this->getProperty('linebreak'); $this->assertEquals($linebreak, "\r\n"); } /** * @todo Implement testSetTrackingOutput(). */ public function testSetTrackingOutput() { $this->object->setTrackingOutput(); $trackingOutput = $this->getProperty('trackingOutput'); $this->assertFalse($trackingOutput); $this->object->setTrackingOutput(true); $trackingOutput = $this->getProperty('trackingOutput'); $this->assertTrue($trackingOutput); } /** * @todo Implement testSetMaxBucketSize(). */ public function testSetMaxBucketSize() { $this->object->setMaxBucketSize(2345); $maxsize = $this->getProperty('maxsize'); $this->assertEquals($maxsize, 2345); } /** * @todo Implement testExternalSort(). */ public function testExternalSort() { $this->object->setFile('ExternalSort.php'); $this->object->setMaxBucketSize(1000); // } /** * @todo Implement testInitExternalBuckets(). */ public function testInitExternalBuckets() { $arr = array('a','b','c','d'); $tmpfile = 'tmp1.txt'; file_put_contents($tmpfile, implode("\n", $arr)); $this->object->setFile($tmpfile); $tmpdir = $this->getProperty('tmpdir'); $this->assertFalse(file_exists($tmpdir.'/0')); $fp = fopen($tmpfile, 'r'); $this->object->initExternalBuckets($fp); // first bucket should exist now $this->assertTrue(file_exists($tmpdir.'/0')); $extProp = $this->getProperty('externalBuckets'); $b = $extProp->getBucket(0); // first value should be smallest and largest of first bucket $this->assertEquals('a', $b['smallest']); $this->assertEquals('a', $b['biggest']); unlink($tmpfile); @unlink($tmpfile.'.sorted'); //output file } /** * @todo Implement testFillExternalBuckets(). */ public function testFillExternalBuckets() { $arr = array('a','b','c','d'); $tmpfile = 'tmp1.txt'; file_put_contents($tmpfile, implode("\n", $arr)); $this->object->setFile($tmpfile); $fp = fopen($tmpfile, 'r'); $cnt = $this->object->initExternalBuckets($fp); $this->object->fillExternalBuckets($fp, $cnt); // first bucket should now have all items in first array // smallest item is 'a' // biggest item is 'd' $extProp = $this->getProperty('externalBuckets'); $b = $extProp->getBucket(0); // first value should be smallest and largest of first bucket $this->assertEquals('a', $b['smallest']); $this->assertEquals('d', $b['biggest']); $tmpdir = $this->getProperty('tmpdir'); $flushedVals = file($tmpdir.'/0', FILE_IGNORE_NEW_LINES); $this->assertEquals($arr, $flushedVals); unlink($tmpfile); unlink($tmpfile.'.sorted'); //output file } /** * @todo Implement testBucketSanityCheck(). */ public function testBucketSanityCheck() { $tmpinput = 'tmpinputfile.txt'; touch($tmpinput); $fp = fopen($tmpinput, 'r'); $this->object->setFile($tmpinput); $this->object->initExternalBuckets($fp); $externalBuckets = $this->getProperty('externalBuckets'); $tmpdir = 'testBucketSanityCheck'; mkdir ($tmpdir); $fname = $tmpdir.'/0'; $fname1 = $tmpdir.'/1'; //var_dump($externalBuckets); $externalBuckets->addBucket('d', $fname); $externalBuckets->addBucket('p', $fname1); file_put_contents($fname, "n\ne\nm\n"); file_put_contents($fname1, "z\nv\nx\n"); $this->assertTrue($this->object->bucketSanityCheck('test')); file_put_contents($fname1, 'a', FILE_APPEND); $exceptioncaught=false; try{ $this->object->bucketSanityCheck('test'); } catch(Exception $e){ $exceptioncaught=true; } if ( !$exceptioncaught){ $this->fail('An expected exception has not been raised.'); } unlink($fname); unlink($fname1); rmdir($tmpdir); } /** * @todo Implement testSortAndConcatExternalBuckets(). */ public function testSortAndConcatExternalBuckets() { $tmpinput = 'tmpinputfile.txt'; touch($tmpinput); $fp = fopen($tmpinput, 'r'); $this->object->setFile($tmpinput); $this->object->initExternalBuckets($fp); $externalBuckets = $this->getProperty('externalBuckets'); $tmpdir = 'testSortAndConcatExternalBuckets'; mkdir ($tmpdir); $fname = $tmpdir.'/0'; $fname1 = $tmpdir.'/1'; //var_dump($externalBuckets); $externalBuckets->addBucket('d', $fname); $externalBuckets->addBucket('p', $fname1); $items = array('e', 'n', 'm', 'x', 'v', 'z'); $externalBuckets->sortIntoBuckets($items); $this->bucketCollectionClass = new ReflectionClass('BucketCollection'); $buckCollProperty = $this->bucketCollectionClass->getProperty('values'); $buckCollProperty->setAccessible(true); $values = $buckCollProperty->getValue($externalBuckets); //print_r($values); $first = implode(',', $values[1]); $second = implode(',', $values[2]); $this->assertEquals($first, 'e,n,m', 'e,n,m should be sorted into "d" array'); $this->assertEquals($second, 'x,v,z', 'x,v,z should be sorted into "p" array'); //$tmpdir = $this->getProperty('tmpdir'); $externalBuckets->flushBuckets(100, false, $tmpdir); // write contents to files $contents1 = implode(',', file($fname, FILE_IGNORE_NEW_LINES)); $contents2 = implode(',', file($fname1, FILE_IGNORE_NEW_LINES)); $this->assertEquals($contents1, 'e,n,m', 'e,n,m should be in first file'); $this->assertEquals($contents2, 'x,v,z', 'x,v,z should be in second file'); $items = array('g', 'f'); $externalBuckets->sortIntoBuckets($items); $externalBuckets->flushBuckets(100, false, $tmpdir); // write contents to files $contents1 = implode(',', file($fname, FILE_IGNORE_NEW_LINES)); $this->assertEquals($contents1, 'e,n,m,g,f', 'e,n,m,g,f should be in first file'); $outputfile = "tmpoutput.txt"; $this->object->sortAndConcatExternalBuckets(); $output = implode(',', file($tmpinput.'.sorted', FILE_IGNORE_NEW_LINES)); $this->assertEquals($output, 'e,f,g,m,n,v,x,z', 'e,f,g,m,n,v,x,z should be in output file'); unlink($fname); unlink($fname1); unlink($tmpinput); unlink($tmpinput.'.sorted'); rmdir($tmpdir); } /** * @todo Implement testCheckFileSort(). */ public function testCheckFileSort() { $linenumber = -1; $line=''; $prevline = ''; $arr = array('a','b','c','d'); $tmpfile = 'tmp1.txt'; file_put_contents($tmpfile, implode("\n", $arr)); $this->assertTrue(ExternalSort::checkFileSort($tmpfile)); $arr = array('a','c','b','d'); file_put_contents($tmpfile, implode("\n", $arr)); $this->assertFalse(ExternalSort::checkFileSort($tmpfile, $linenumber, $line, $prevline)); $this->assertEquals($linenumber, 2); $this->assertEquals($line, 'b'); $this->assertEquals($prevline, 'c'); $linenumber = -1; $line=''; $prevline = ''; $this->assertFalse(ExternalSort::checkFileSort($tmpfile, $linenumber, $line, $prevline, 2)); $this->assertEquals($linenumber, 2); $this->assertEquals($line, 'b'); $this->assertEquals($prevline, 'c'); unlink($tmpfile); } /** * @todo Implement testCheckArraySort(). */ public function testCheckArraySort() { $linenumber = -1; $line=''; $prevline = ''; $arr = array('a','b','c','d'); $this->assertTrue(ExternalSort::checkArraySort($arr)); $arr = array('a','c','b','d'); $this->assertFalse(ExternalSort::checkArraySort($arr, $linenumber, $line, $prevline)); $this->assertEquals($linenumber, 2); $this->assertEquals($line, 'b'); $this->assertEquals($prevline, 'c'); } protected function getMethod($name) { $method = $this->testclass->getMethod($name); $method->setAccessible(true); return $method; } protected function getProperty($name) { $property = $this->testclass->getProperty($name); $property->setAccessible(true); return $property->getValue($this->object); //use $property->setValue } } ?>