CsvCallbackTest.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Reader\Csv;
  3. use PhpOffice\PhpSpreadsheet\IOFactory;
  4. use PhpOffice\PhpSpreadsheet\Reader\Csv;
  5. use PHPUnit\Framework\TestCase;
  6. class CsvCallbackTest extends TestCase
  7. {
  8. protected function tearDown(): void
  9. {
  10. Csv::setConstructorCallback(null);
  11. }
  12. /**
  13. * @param mixed $obj
  14. */
  15. public function callbackDoNothing($obj): void
  16. {
  17. self::assertInstanceOf(Csv::class, $obj);
  18. }
  19. public function testCallbackDoNothing(): void
  20. {
  21. Csv::setConstructorCallback([$this, 'callbackDoNothing']);
  22. $filename = 'tests/data/Reader/CSV/encoding.iso88591.csv';
  23. $reader = new Csv();
  24. $reader->setInputEncoding(Csv::GUESS_ENCODING);
  25. $spreadsheet = $reader->load($filename);
  26. $sheet = $spreadsheet->getActiveSheet();
  27. self::assertEquals('Å', $sheet->getCell('A1')->getValue());
  28. }
  29. public function callbackSetFallbackEncoding(Csv $reader): void
  30. {
  31. $reader->setFallbackEncoding('ISO-8859-2');
  32. $reader->setInputEncoding(Csv::GUESS_ENCODING);
  33. $reader->setEscapeCharacter((version_compare(PHP_VERSION, '7.4') < 0) ? "\x0" : '');
  34. }
  35. public function testFallbackEncodingDefltIso2(): void
  36. {
  37. Csv::setConstructorCallback([$this, 'callbackSetFallbackEncoding']);
  38. $filename = 'tests/data/Reader/CSV/premiere.win1252.csv';
  39. $reader = new Csv();
  40. $spreadsheet = $reader->load($filename);
  41. $sheet = $spreadsheet->getActiveSheet();
  42. self::assertEquals('premičre', $sheet->getCell('A1')->getValue());
  43. self::assertEquals('sixičme', $sheet->getCell('C2')->getValue());
  44. }
  45. public function testIOFactory(): void
  46. {
  47. Csv::setConstructorCallback([$this, 'callbackSetFallbackEncoding']);
  48. $filename = 'tests/data/Reader/CSV/premiere.win1252.csv';
  49. $spreadsheet = IOFactory::load($filename);
  50. $sheet = $spreadsheet->getActiveSheet();
  51. self::assertEquals('premičre', $sheet->getCell('A1')->getValue());
  52. self::assertEquals('sixičme', $sheet->getCell('C2')->getValue());
  53. }
  54. public function testNonFallbackEncoding(): void
  55. {
  56. Csv::setConstructorCallback([$this, 'callbackSetFallbackEncoding']);
  57. $filename = 'tests/data/Reader/CSV/premiere.utf16be.csv';
  58. $reader = new Csv();
  59. $spreadsheet = $reader->load($filename);
  60. $sheet = $spreadsheet->getActiveSheet();
  61. self::assertEquals('première', $sheet->getCell('A1')->getValue());
  62. self::assertEquals('sixième', $sheet->getCell('C2')->getValue());
  63. }
  64. public function testDefaultEscape(): void
  65. {
  66. self::assertNull(Csv::getConstructorCallback());
  67. $filename = 'tests/data/Reader/CSV/escape.csv';
  68. $spreadsheet = IOFactory::load($filename);
  69. $sheet = $spreadsheet->getActiveSheet();
  70. // this is not how Excel views the file
  71. self::assertEquals('a\"hello', $sheet->getCell('A1')->getValue());
  72. }
  73. public function testBetterEscape(): void
  74. {
  75. Csv::setConstructorCallback([$this, 'callbackSetFallbackEncoding']);
  76. $filename = 'tests/data/Reader/CSV/escape.csv';
  77. $spreadsheet = IOFactory::load($filename);
  78. $sheet = $spreadsheet->getActiveSheet();
  79. // this is how Excel views the file
  80. self::assertEquals('a\"hello;hello;hello;\"', $sheet->getCell('A1')->getValue());
  81. }
  82. }