MDL-75553 mod_data: Fix wording of data fields in Behat tests
[moodle.git] / lib / tests / csvclass_test.php
blob1bf9e49c3dfbaabdf0daaec7f5b6996b668deef0
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
17 namespace core;
19 use csv_export_writer;
20 use csv_import_reader;
22 defined('MOODLE_INTERNAL') || die();
24 global $CFG;
25 require_once($CFG->dirroot . '/lib/csvlib.class.php');
27 /**
28 * Tests csv import and export functions.
30 * @package core
31 * @category test
32 * @copyright 2012 Adrian Greeve
33 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35 class csvclass_test extends \advanced_testcase {
37 protected $testdata = array();
38 protected $teststring = '';
39 protected $teststring2 = '';
40 protected $teststring3 = '';
41 protected $teststring4 = '';
43 protected function setUp(): void {
45 $this->resetAfterTest();
47 $csvdata = array();
48 $csvdata[0][] = 'fullname';
49 $csvdata[0][] = 'description of things';
50 $csvdata[0][] = 'beer';
51 $csvdata[1][] = 'William B Stacey';
52 $csvdata[1][] = '<p>A field that contains "double quotes"</p>';
53 $csvdata[1][] = 'Asahi';
54 $csvdata[2][] = 'Phillip Jenkins';
55 $csvdata[2][] = '<p>This field has </p>
56 <p>Multiple lines</p>
57 <p>and also contains "double quotes"</p>';
58 $csvdata[2][] = 'Yebisu';
59 $this->testdata = $csvdata;
61 // Please note that each line needs a carriage return.
62 $this->teststring = 'fullname,"description of things",beer
63 "William B Stacey","<p>A field that contains ""double quotes""</p>",Asahi
64 "Phillip Jenkins","<p>This field has </p>
65 <p>Multiple lines</p>
66 <p>and also contains ""double quotes""</p>",Yebisu
69 $this->teststring2 = 'fullname,"description of things",beer
70 "Fred Flint","<p>Find the stone inside the box</p>",Asahi,"A fourth column"
71 "Sarah Smith","<p>How are the people next door?</p>,Yebisu,"Forget the next"
74 $this->teststring4 = 'fullname,"description of things",beer
75 "Douglas Dirk","<p>I am fine, thankyou.</p>",Becks
77 "Addelyn Francis","<p>Thanks for the cake</p>",Becks
78 "Josh Frankson","<p>Everything is fine</p>",Asahi
81 "Heath Forscyth","<p>We are going to make you lose your mind</p>",Fosters
85 public function test_csv_functions() {
86 global $CFG;
87 $csvexport = new csv_export_writer();
88 $csvexport->set_filename('unittest');
89 foreach ($this->testdata as $data) {
90 $csvexport->add_data($data);
92 $csvoutput = $csvexport->print_csv_data(true);
93 $this->assertSame($csvoutput, $this->teststring);
95 $test_data = csv_export_writer::print_array($this->testdata, 'comma', '"', true);
96 $this->assertSame($test_data, $this->teststring);
98 // Testing that the content is imported correctly.
99 $iid = csv_import_reader::get_new_iid('lib');
100 $csvimport = new csv_import_reader($iid, 'lib');
101 $contentcount = $csvimport->load_csv_content($this->teststring, 'utf-8', 'comma');
102 $csvimport->init();
103 $dataset = array();
104 $dataset[] = $csvimport->get_columns();
105 while ($record = $csvimport->next()) {
106 $dataset[] = $record;
108 $csvimport->cleanup();
109 $csvimport->close();
110 $this->assertSame($dataset, $this->testdata);
112 // Testing for the wrong count of columns.
113 $errortext = get_string('csvweirdcolumns', 'error');
114 $iid = csv_import_reader::get_new_iid('lib');
115 $csvimport = new csv_import_reader($iid, 'lib');
116 $contentcount = $csvimport->load_csv_content($this->teststring2, 'utf-8', 'comma');
117 $importerror = $csvimport->get_error();
118 $csvimport->cleanup();
119 $csvimport->close();
120 $this->assertSame($importerror, $errortext);
122 // Testing for empty content.
123 $errortext = get_string('csvemptyfile', 'error');
125 $iid = csv_import_reader::get_new_iid('lib');
126 $csvimport = new csv_import_reader($iid, 'lib');
127 $contentcount = $csvimport->load_csv_content($this->teststring3, 'utf-8', 'comma');
128 $importerror = $csvimport->get_error();
129 $csvimport->cleanup();
130 $csvimport->close();
131 $this->assertSame($importerror, $errortext);
133 // Testing for a tab separated file.
134 // The tab separated file has a trailing tab and extra blank lines at the end of the file.
135 $filename = $CFG->dirroot . '/lib/tests/fixtures/tabfile.csv';
136 $fp = fopen($filename, 'r');
137 $tabdata = fread($fp, filesize($filename));
138 fclose($fp);
139 $iid = csv_import_reader::get_new_iid('tab');
140 $csvimport = new csv_import_reader($iid, 'tab');
141 $contentcount = $csvimport->load_csv_content($tabdata, 'utf-8', 'tab');
142 // This should import four rows including the headings.
143 $this->assertEquals($contentcount, 4);
145 // Testing for empty lines.
146 $iid = csv_import_reader::get_new_iid('blanklines');
147 $csvimport = new csv_import_reader($iid, 'blanklines');
148 $contentcount = $csvimport->load_csv_content($this->teststring4, 'utf-8', 'comma');
149 // Five lines including the headings should be imported.
150 $this->assertEquals($contentcount, 5);