<?php
namespace Site\Test;
require_once __DIR__.'/../../../autoload.php';
use Site\Lib\Tester;
use Site\Lib\Csv;
use Site\Lib\Delimiter;
$test = new Tester([
'colorOutput' => true,
'verboseOutput' => true
]);
$test->describe('Csvの基本的なパーシング', function($test) {
$test->it('簡単なCSVファイルをパーシングするはず', function($test) {
$str = "岩田聡,プロジューサー\n宮本茂,デザイナー\nJeffrey Epstein,幼児性愛者";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_test');
file_put_contents($tmpFile, $str);
$csv = new Csv($tmpFile);
$res = $csv->parse();
unlink($tmpFile);
$expect = [
["岩田聡", "プロジューサー"],
["宮本茂", "デザイナー"],
["Jeffrey Epstein", "幼児性愛者"]
];
$test->assertNotNull($res);
$test->assertEquals($res, $expect);
});
$test->it('異なるデリミタでCSVをパーシングするはず', function ($test) {
// セミコロン
$semiStr = "岩田聡;プロジューサー\n宮本茂;デザイナー";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_semi_test');
file_put_contents($tmpFile, $semiStr);
$csv = new Csv($tmpFile);
$res = $csv->parse(Delimiter::SEMICOLON);
unlink($tmpFile);
$expect = [
["岩田聡", "プロジューサー"],
["宮本茂", "デザイナー"]
];
$test->assertEquals($res, $expect, "セミコロンデリミタでパーシングに失敗");
// タブ
$tabStr = "岩田聡\tプロジューサー\n宮本茂\tデザイナー";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_tab_test');
file_put_contents($tmpFile, $tabStr);
$csv = new Csv($tmpFile);
$res = $csv->parse(Delimiter::TAB);
unlink($tmpFile);
$test->assertEquals($res, $expect, "タブデリミタでパーシングに失敗");
// パイプ
$pipeStr = "岩田聡|プロジューサー\n宮本茂|デザイナー";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_pipe_test');
file_put_contents($tmpFile, $pipeStr);
$csv = new Csv($tmpFile);
$res = $csv->parse(Delimiter::PIPE);
unlink($tmpFile);
$test->assertEquals($res, $expect, "パイプデリミタでパーシングに失敗");
});
$test->it('ヘッダー付きCSVをパーシングするはず', function ($test) {
$str = "name,job title\n岩田聡,プロジューサー\n宮本茂,デザイナー";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_header_test');
file_put_contents($tmpFile, $str);
$csv = new Csv($tmpFile);
$res = $csv->parse(Delimiter::COMMA, true); // isHeader = true
unlink($tmpFile);
$expect = [
'header' => ["name", "job title"],
'body' => [
["岩田聡", "プロジューサー"],
["宮本茂", "デザイナー"],
],
];
$test->assertNotNull($res);
$test->assertEquals($res, $expect, "ヘッダーパーシングに失敗");
});
$test->it('ヘッダーなしでフラット配列を返すはず', function ($test) {
$str = "岩田聡,プロジューサー\n宮本茂,デザイナー";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_no_header_test');
file_put_contents($tmpFile, $str);
$csv = new Csv($tmpFile);
$res = $csv->parse(Delimiter::COMMA, false);
unlink($tmpFile);
$expect = [
["岩田聡", "プロジューサー"],
["宮本茂", "デザイナー"]
];
$test->assertNotNull($res);
$test->assertEquals($res, $expect, "ヘッダーなしでフラット配列が失敗");
$test->assertArrayNotHasKey('header', $res, "「header」キーがありません");
$test->assertArrayNotHasKey('body', $res, "「body」キーがありません");
});
$test->it('セル内にカンマを含むCSVをパーシングするはず', function ($test) {
$str = "\"守矢, 諏訪子\",エンジニア\n\"青, 猫ちゃん\",サーバー管理者";
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_quoted_comma_test');
file_put_contents($tmpFile, $str);
$csv = new Csv($tmpFile);
$res = $csv->parse(\Site\Lib\delimiter::COMMA);
unlink($tmpFile);
$expect = [
["守矢, 諏訪子", "エンジニア"],
["青, 猫ちゃん", "サーバー管理者"]
];
$test->assertNotNull($res);
$test->assertEquals($res, $expect, "セル内にカンマを含むパーシングに失敗");
});
$test->it('CSVデータを書き込んで読み込む', function ($test) {
$tmpFile = tempnam(sys_get_temp_dir(), 'csv_write_test');
$data = [
["岩田聡", "プロジューサー"],
["宮本茂", "デザイナー"]
];
$csv = new Csv($tmpFile);
$test->assertTrue($csv->write($data, Delimiter::COMMA), "書き込みに失敗");
$res = $csv->parse(Delimiter::COMMA, false);
$test->assertEquals($data, $res, "失敗");
unlink($tmpFile);
});
});
$test->printSummary();