'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', ); } }