From 690d3ed5fa1e02e24df589ff0ac1e37bb4dd3ab2 Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Fri, 18 Oct 2013 11:47:07 +0800 Subject: [PATCH] MDL-42112 Tablelib: Add unit tests (some) --- lib/tests/tablelib_test.php | 305 ++++++++++++++++++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 lib/tests/tablelib_test.php diff --git a/lib/tests/tablelib_test.php b/lib/tests/tablelib_test.php new file mode 100644 index 00000000000..00f3ec2b5a8 --- /dev/null +++ b/lib/tests/tablelib_test.php @@ -0,0 +1,305 @@ +. + +/** + * Test tablelib. + * + * @package core + * @category phpunit + * @copyright 2013 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->libdir . '/tablelib.php'); + +/** + * Test some of tablelib. + * + * @package core + * @category phpunit + * @copyright 2013 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class core_tablelib_testcase extends basic_testcase { + protected function generate_columns($cols) { + $columns = array(); + foreach (range(0, $cols - 1) as $j) { + array_push($columns, 'column' . $j); + } + return $columns; + } + + protected function generate_headers($cols) { + $columns = array(); + foreach (range(0, $cols - 1) as $j) { + array_push($columns, 'Column ' . $j); + } + return $columns; + } + + protected function generate_data($rows, $cols) { + $data = array(); + + foreach (range(0, $rows - 1) as $i) { + $row = array(); + foreach (range(0, $cols - 1) as $j) { + $val = 'row ' . $i . ' col ' . $j; + $row['column' . $j] = $val; + } + array_push($data, $row); + } + return $data; + } + + protected function run_table_test($columns, $headers, $sortable, $collapsible, $suppress, $nosorting, $data, $pagesize) { + $table = new flexible_table('tablelib_test'); + + $table->define_columns($columns); + $table->define_headers($headers); + $table->define_baseurl('/invalid.php'); + + $table->sortable($sortable); + $table->collapsible($collapsible); + foreach ($suppress as $column) { + $table->column_suppress($column); + } + + foreach ($nosorting as $column) { + $table->no_sorting($column); + } + + + $table->setup(); + $table->pagesize($pagesize, count($data)); + foreach ($data as $row) { + $table->add_data_keyed($row); + } + $table->finish_output(); + } + + public function test_empty_table() { + $this->expectOutputRegex('/' . get_string('nothingtodisplay') . '/'); + $this->run_table_test( + array('column1', 'column2'), // Columns. + array('Column 1', 'Column 2'), // Headers. + true, // Sortable. + false, // Collapsible. + array(), // Suppress columns. + array(), // No sorting. + array(), // Data. + 10 // Page size. + ); + } + + public function test_has_next_pagination() { + + $data = $this->generate_data(11, 2); + $columns = $this->generate_columns(2); + $headers = $this->generate_headers(2); + + // Search for pagination controls containing 1.*2.*Next + $this->expectOutputRegex('/1.*2<\/a>.*' . get_string('next') . '<\/a>/'); + + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + } + + public function test_has_hide() { + + $data = $this->generate_data(11, 2); + $columns = $this->generate_columns(2); + $headers = $this->generate_headers(2); + + // Search for 'hide' links in the column headers + $this->expectOutputRegex('/' . get_string('hide') . '/'); + + $this->run_table_test( + $columns, + $headers, + true, + true, + array(), + array(), + $data, + 10 + ); + } + + public function test_has_not_hide() { + + $data = $this->generate_data(11, 2); + $columns = $this->generate_columns(2); + $headers = $this->generate_headers(2); + + // Make sure there are no 'hide' links in the headers. + + ob_start(); + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + $output = ob_get_contents(); + ob_end_clean(); + $this->assertNotContains(get_string('hide'), $output); + } + + public function test_has_sort() { + + $data = $this->generate_data(11, 2); + $columns = $this->generate_columns(2); + $headers = $this->generate_headers(2); + + // Search for pagination controls containing 1.*2.*Next + $this->expectOutputRegex('/' . get_string('sortby') . '/'); + + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + } + + public function test_has_not_sort() { + + $data = $this->generate_data(11, 2); + $columns = $this->generate_columns(2); + $headers = $this->generate_headers(2); + + // Make sure there are no 'Sort by' links in the headers. + + ob_start(); + $this->run_table_test( + $columns, + $headers, + false, + false, + array(), + array(), + $data, + 10 + ); + $output = ob_get_contents(); + ob_end_clean(); + $this->assertNotContains(get_string('sortby'), $output); + } + + public function test_has_not_next_pagination() { + + $data = $this->generate_data(10, 2); + $columns = $this->generate_columns(2); + $headers = $this->generate_headers(2); + + // Make sure there are no 'Next' links in the pagination. + + ob_start(); + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + + $output = ob_get_contents(); + ob_end_clean(); + $this->assertNotContains(get_string('next'), $output); + } + + public function test_1_col() { + + $data = $this->generate_data(100, 1); + $columns = $this->generate_columns(1); + $headers = $this->generate_headers(1); + + $this->expectOutputRegex('/row 0 col 0/'); + + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + } + + public function test_5_cols() { + + $data = $this->generate_data(100, 5); + $columns = $this->generate_columns(5); + $headers = $this->generate_headers(5); + + $this->expectOutputRegex('/row 0 col 0/'); + + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + } + + public function test_50_cols() { + + $data = $this->generate_data(100, 50); + $columns = $this->generate_columns(50); + $headers = $this->generate_headers(50); + + $this->expectOutputRegex('/row 0 col 0/'); + + $this->run_table_test( + $columns, + $headers, + true, + false, + array(), + array(), + $data, + 10 + ); + } +}