123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- /**
- * @file
- * Tests for ParserCSV library.
- */
- /**
- * Test aggregating a feed as node items.
- *
- * Using DrupalWebTestCase as DrupalUnitTestCase is broken in SimpleTest 2.8.
- * Not inheriting from Feeds base class as ParserCSV should be moved out of
- * Feeds at some time.
- */
- class ParserCSVTest extends DrupalWebTestCase {
- protected $profile = 'testing';
- public static function getInfo() {
- return array(
- 'name' => 'CSV Parser unit tests',
- 'description' => 'Base level test for Feeds\' built in CSV parser.',
- 'group' => 'Feeds',
- );
- }
- /**
- * Test method.
- */
- public function test() {
- drupal_load('module', 'feeds');
- feeds_include_library('ParserCSV.inc', 'ParserCSV');
- $this->_testSimple();
- $this->_testBatching();
- $this->_testEncodingConversion();
- $this->_testEncodingConversionFailure();
- }
- /**
- * Simple test of parsing functionality.
- */
- protected function _testSimple() {
- // Pull in the $control_result array.
- include $this->absolutePath() . '/tests/feeds/nodes.csv.php';
- $delimiters = $this->getDelimiters();
- foreach($delimiters as $delimiterType => $delimiter) {
- $file = $this->absolutePath() . '/tests/feeds/nodes_' . $delimiterType . '.csv';
- $iterator = new ParserCSVIterator($file);
- $parser = new ParserCSV();
- $parser->setDelimiter($delimiter);
- $rows = $parser->parse($iterator);
- $this->assertFalse($parser->lastLinePos(), t('CSV reports all lines parsed, with delimiter: ') . $delimiterType);
- $this->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), t('Parsed result matches control result.'));
- }
- }
- /**
- * Simple test of encoding conversion prior to parsing.
- */
- protected function _testEncodingConversion() {
- // Pull in the $control_result array.
- include $this->absolutePath() . '/tests/feeds/encoding.csv.php';
- $encodings = $this->getEncodings();
- foreach ($encodings as $encoding) {
- $file = $this->absolutePath() . "/tests/feeds/encoding_{$encoding}.csv";
- $iterator = new ParserCSVIterator($file);
- $parser = new ParserCSV();
- $parser->setDelimiter(',');
- $parser->setEncoding($encoding);
- $rows = $parser->parse($iterator);
- $this->assertFalse($parser->lastLinePos(), format_string('CSV reports all lines parsed, with encoding: %encoding', array('%encoding' => $encoding)));
- $this->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), 'Converted and parsed result matches control result.');
- }
- }
- /**
- * Simple test of failed encoding conversion prior to parsing.
- */
- protected function _testEncodingConversionFailure() {
- // Pull in the $control_result array.
- include $this->absolutePath() . '/tests/feeds/encoding.csv.php';
- $encodings = $this->getEncodings();
- foreach ($encodings as $encoding) {
- $file = $this->absolutePath() . "/tests/feeds/encoding_{$encoding}.csv";
- $iterator = new ParserCSVIterator($file);
- $parser = new ParserCSV();
- $parser->setDelimiter(',');
- // Attempt to read file as UTF-8.
- $parser->setEncoding('UTF-8');
- try {
- $rows = $parser->parse($iterator);
- $this->fail('Incorrect conversion attempt throws exception.');
- }
- catch (ParserCSVEncodingException $e) {
- $this->assertNotNull($e->getMessage(), 'Incorrect conversion attempt throws exception.');
- }
- }
- }
- /**
- * Test batching.
- */
- protected function _testBatching() {
- // Pull in the $control_result array
- include $this->absolutePath() . '/tests/feeds/nodes.csv.php';
- $delimiters = $this->getDelimiters();
- foreach($delimiters as $delimiterType => $delimiter) {
- $file = $this->absolutePath() . '/tests/feeds/nodes_' . $delimiterType . '.csv';
- // Set up parser with 2 lines to parse per call.
- $iterator = new ParserCSVIterator($file);
- $parser = new ParserCSV();
- $parser->setDelimiter($delimiter);
- $parser->setLineLimit(2);
- $rows = array();
- $pos = 0;
- // Call parser until all lines are parsed, then compare to control result.
- do {
- $parser->setStartByte($pos);
- $rows = array_merge($rows, $parser->parse($iterator));
- $pos = $parser->lastLinePos();
- $this->assertTrue($parser->lastLinePos() || count($rows) == 10, t('Parser reports line limit correctly'));
- }
- while ($pos = $parser->lastLinePos());
- $this->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), t('Batch parsed result matches control result for delimiter: ') . $delimiterType);
- }
- }
- /**
- * Absolute path to feeds.
- */
- public function absolutePath() {
- return DRUPAL_ROOT . '/' . drupal_get_path('module', 'feeds');
- }
- static function getDelimiters() {
- return array(
- 'comma' => ',',
- 'pipe' => '|',
- 'semicolon' => ';',
- 'plus' => '+',
- 'tab' => "\t",
- );
- }
- static function getEncodings() {
- return array(
- 'SJIS-win',
- 'SJIS',
- );
- }
- }
|