File:
[LON-CAPA] /
loncom /
xml /
lontable.test
Revision
1.4:
download - view:
text,
annotated -
select for diffs
Mon Dec 29 11:57:37 2008 UTC (15 years, 10 months ago) by
foxr
Branches:
MAIN
CVS tags:
language_hyphenation_merge,
language_hyphenation,
bz6209-base,
bz6209,
bz5969,
bz2851,
PRINT_INCOMPLETE_base,
PRINT_INCOMPLETE,
HEAD,
GCI_3,
BZ5971-printing-apage,
BZ5434-fox,
BZ4492-merge,
BZ4492-feature_horizontal_radioresponse
Add code to support horizontal alignment, correct bordering, and
table width.
#!/usr/bin/perl
# The LearningOnline Network with CAPA
# Generating TeX tables.
#
# $Id: lontable.test,v 1.4 2008/12/29 11:57:37 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
## Copyright for TtHfunc and TtMfunc by Ian Hutchinson.
# TtHfunc and TtMfunc (the "Code") may be compiled and linked into
# binary executable programs or libraries distributed by the
# Michigan State University (the "Licensee"), but any binaries so
# distributed are hereby licensed only for use in the context
# of a program or computational system for which the Licensee is the
# primary author or distributor, and which performs substantial
# additional tasks beyond the translation of (La)TeX into HTML.
# The C source of the Code may not be distributed by the Licensee
# to any other parties under any circumstances.
#
# A TEST SUITE??? You've got to be kidding!!! LonCAPA don't have no
# TEST SUITEs!!!
#
# Well lontable does and this is it. The test suite ensures that
# the lontable.pm module is able to create the data structures it
# purports to create. The suite also ensures that the correct
# information is passed ot the LaTeX::Table class at generate
# time.
#
use strict;
use lontable;
use Test::More tests=>88;
#------------------- Default Construction tests: ---------------------------------
# Tests the getter forms of the configuration methods too:
my $testobject = new Apache::lontable();
ok(($testobject->alignment() eq 'left'), "Default Construction - Correct alignment");
ok(($testobject->table_border() == 0), "Default Construction - Correct table border");
ok(($testobject->cell_border() == 0), "Default Construction - Correct cell border");
ok(($testobject->caption() eq ''), "Default Construction - Correct caption");
ok(($testobject->theme() eq "Zurich"), "Default Construction - Correct theme");
ok(($testobject->get_object_attribute('column_count') == 0),
"Default Construction - zero columncount");
ok((!$testobject->get_object_attribute('row_open')),
"Default Construction - Row not open");
my $rows = $testobject->get_object_attribute('rows');
ok((scalar(@$rows) == 0), 'Default Construction - empty row array');
#--------------- Configured construction tests -----------------------------------
#
$testobject = new Apache::lontable({alignment => 'right',
outer_border => 1,
inner_border => 1,
caption => 'Test caption',
theme => 'Houston'});
ok($testobject->alignment() eq 'right', 'Configured Construction - Correct alignment');
ok($testobject->table_border() == 1, 'Configured Construction - correct border');
ok($testobject->cell_border() == 1, 'Configured Construction - correct cell border');
ok($testobject->caption eq 'Test caption', 'Configured Construction - Correct caption');
ok($testobject->theme() eq 'Houston', 'Confiugred construction - correct theme');
#-------------- Test global configuration setters ----------------------------
# Each test starts with a fresh object:
# Table of methods to test...
$testobject = new Apache::lontable();
my @configmethods = ('alignment', 'table_border', 'cell_border', 'caption', 'theme');
# Table of parameters for each method and expected results from the getter
my @values = ('center', '1', '1', "Testing", 'Miami');
my $i = 0;
foreach my $method (@configmethods) {
$testobject = new Apache::lontable();
$testobject->$method($values[$i]);
ok($testobject->$method() eq $values[$i], "Global Config: Testing $method as a setter");
$i++;
}
#--------------- Test row management --------------------------------------
# start row adds a row to the table; in default config unless overridden.
$testobject = new Apache::lontable();
$testobject->start_row(); # Unconfigured row.
ok($testobject->get_object_attribute('row_open') == 1, "One row added");
$rows = $testobject->get_object_attribute('rows');
ok(scalar(@$rows) == 1, ' only one row');
my $row = $rows->[0];
my $cells = $row->{'cells'};
ok($row->{'default_halign'} eq 'left', "default row halign");
ok($row->{'default_valign'} eq 'top', 'default row valign');
ok(scalar(@$cells) == 0, 'Initial cell count');
# Start row with row open makes a second row:
$testobject->start_row();
ok($testobject->get_object_attribute('row_open') == 1, "Two rows.. still open");
$rows = $testobject->get_object_attribute('rows');
ok(scalar(@$rows) == 2, 'two rows now');
# Creating row with configuration:
$testobject->start_row({'default_halign' => "center",
'default_valign' => 'bottom'});
$rows = $testobject->get_object_attribute('rows');
$row = $rows->[-1]; # Last row should be configured:
ok($row->{'default_halign'} eq 'center', "Overridden horiz align");
ok($row->{'default_valign'} eq 'bottom', 'Overridden vert. align');
# end row says no row is open..we'll need to look at it again when we
# start adding cells, as it also manages the max cell count.
$testobject->end_row();
ok($testobject->get_object_attribute('row_open') == 0, "Row closed");
#-------------------- Cell management -------------------------------
$testobject = new Apache::lontable();
$testobject->start_row();
$testobject->add_cell("cell 0");
$testobject->add_cell("cell 1");
$testobject->end_row();
# At this point we should have one row (that's already been tested).
# we should have max cell count of 2
# we should be able to see the cells we added with default values.
ok($testobject->get_object_attribute('column_count') == 2, 'max cells ok');
$rows = $testobject->get_object_attribute('rows');
$row = $rows->[0];
my $cols = $row->{'cells'}; # Reference to cell array
ok(scalar(@$cols) == 2, ' correct cell count');
my $cell = $cols->[0];
ok($cell->{'contents'} eq 'cell 0', 'Correct cell 0 contents');
ok($cell->{'rowspan'} == 1, 'Correct cell 0 rowspan');
ok($cell->{'colspan'} == 1, 'Correct cell 0 colspan');
$cell = $cols->[1];
ok($cell->{'contents'} eq 'cell 1', 'correct cell 1 contents');
ok($cell->{'rowspan'} == 1, 'correct cell 1 rowspan');
ok($cell->{'colspan'} == 1, 'correct cell 1 column span');
# Add a second row that has 3 columns and some rowspans.
# - column_count -> 3
# - the cells should have the correct rowspans/colspans.
$testobject->start_row();
$testobject->add_cell("row2 cell 0",
{'rowspan' => 2});
$testobject->add_cell('row2 cell 1',
{'rowspan' => 3});
$testobject->add_cell('row 2 cell 3');
$testobject->end_row();
$row = $rows->[1];
$cols = $row->{'cells'};
ok(scalar(@$cols) == 3, 'correct columnm count');
ok($testobject->get_object_attribute('column_count') == 3, 'max cols ok');
$cell = $cols->[0];
ok($cell->{'contents'} eq 'row2 cell 0', 'Contents 2,0');
ok($cell->{'rowspan'} == 2, 'rowspand 2,0');
ok($cell->{'colspan'} == 1, 'colspan 2,0');
$cell = $cols->[1];
ok($cell->{'contents'} eq 'row2 cell 1', 'Contents 2,1');
ok($cell->{'rowspan'} == 3, 'rowspand 2,1');
ok($cell->{'colspan'} == 1, 'colspan 2,2');
$cell = $cols->[2];
ok($cell->{'contents'} eq 'row 2 cell 3', "Contents 2,2");
ok($cell->{'rowspan'} == 1, "Rowspan 2,2");
ok($cell->{'colspan'} == 1, 'Colspan 2,2');
#--------------------------- Test colspans with row spans. ----------------------
#
# Make a table that looks like:
#
# +-------------------------+---------------------+
# | Spans 2 cols, 3 rows| spans 2 cols 1 row |
# | +-----------+---------+
# | | span 1,1 | span 1 1|
# | +-----------+---------+
# | |2rows 1col | span 1 1|
# +----------+--------------+ +---------+
# | Span 1 1 | span 1 1 | |span 1 1 |
# +----------+---------+----+-----------+---------+
$testobject = new Apache::lontable({theme => "Dresden",
caption => "This is the table caption",
outer_border => 1,
inner_border => 1,
width => '1.0\textwidth',
alignment => 'left'});
$testobject->start_row();
$testobject->add_cell('2 cols 3 rows', {rowspan => 3, colspan => 2});
$testobject->add_cell('2 cols 1 row', {colspan => 2});
$testobject->end_row();
$testobject->start_row({default_halign => 'left'});
$testobject->add_cell('ordinary cell');
$testobject->add_cell('ordinary cell', {halign => 'center'});
$testobject->end_row();
$testobject->start_row({default_halign => 'right'});
$testobject->add_cell('2 rows 1 col', {rowspan => 2, halign => 'right'});
$testobject->add_cell('ordinary cell');
$testobject->end_row();
$testobject->start_row({default_halign => 'center'});
$testobject->add_cell('ordinary cell');
$testobject->add_cell('ordinary cell');
$testobject->add_cell('ordinary cell', {halign => 'left'});
$testobject->end_row();
# First of all the table should have figured out there are 4 cols and 4 rows:
ok($testobject->get_object_attribute('column_count') == 4, 'col count with spans');
# First row should be trivial 2 cells with the spans described.
my $row = $testobject->get_row(0);
my $cells = $row->{'cells'}; # Refs an array of cells.
ok(scalar(@$cells) == 2, ' 2 cell hashes in the row 0');
ok($cells->[0]->{'rowspan'} == 3, '1,1 rowspan');
ok($cells->[0]->{'colspan'} == 2, '1,1 colspan');
ok($cells->[0]->{'contents'} eq '2 cols 3 rows', '1,1 contents');
ok($cells->[1]->{'rowspan'} == 1, '1 2 rowspan');
ok($cells->[1]->{'colspan'} == 2, '1 2 colspan');
ok($cells->[1]->{'contents'} eq '2 cols 1 row', '1 2 contents');
# Second row, the first cell should carry down an empty cell from the row
# above it (first cell), same colspan, rowspan of 2 now, then there should
# be two ordinary cells:
$row = $testobject->get_row(1);
$cells = $row->{'cells'};
ok(scalar(@$cells) == 3, ' 3 cell hashes in row 1');
ok($cells->[0]->{'rowspan'} == 2, '2,1 rowspan carried from above');
ok($cells->[0]->{'colspan'} == 2, '2,1 colspan carried from above');
ok($cells->[0]->{'contents'} eq '', '2,1 should be empty');
ok($cells->[1]->{'rowspan'} == 1, '2,2 rowspan');
ok($cells->[1]->{'colspan'} == 1, '2,2 colspan');
ok($cells->[1]->{'contents'} eq 'ordinary cell', '2,2 contents');
ok($cells->[2]->{'rowspan'} == 1, '2,3 rowspan');
ok($cells->[2]->{'colspan'} == 1, '2,3 colspan');
ok($cells->[2]->{'contents'} eq 'ordinary cell','2,3 contents');
# 3'd row. Shoould look a lot like the second row, but the second cell
# has a rowspan of 2.
$row = $testobject->get_row(2);
$cells = $row->{'cells'};
ok(scalar(@$cells) == 3, '3 cell hashes in row 3');
ok($cells->[0]->{'rowspan'} == 1, '3,1 rowspan carried from above, down -> 1');
ok($cells->[0]->{'colspan'} == 2, '3,1 colspan carried from above.');
ok($cells->[0]->{'contents'} eq "" , '3,1 contetns empty');
ok($cells->[1]->{'rowspan'} == 2, '3,2, rowspan');
ok($cells->[1]->{'colspan'} == 1, '3,2 colspan');
ok($cells->[1]->{'contents'} eq '2 rows 1 col', '3,2 contents');
ok($cells->[2]->{'rowspan'} == 1, '3,3 rowspan');
ok($cells->[2]->{'colspan'} == 1, '3,3 colspan');
ok($cells->[2]->{'contents'} eq 'ordinary cell', '3,3 contents');
# last row, should have cell 3 carried down from above. all other cells
# are ordinary.
$row = $testobject->get_row(3);
$cells = $row->{'cells'};
ok(scalar(@$cells) == 4, '4 cell hashes in row 4');
ok($cells->[0]->{'rowspan'} == 1, "4,1 rowsspan");
ok($cells->[0]->{'colspan'} == 1, "4,1 colspan");
ok($cells->[0]->{'contents'} eq 'ordinary cell', '4,1 contents');
ok($cells->[1]->{'rowspan'} == 1, '4,2 rowspan');
ok($cells->[1]->{'colspan'} == 1, '4,2 colspan');
my $contents = $cells->[1]->{'contents'};
ok($cells->[1]->{'contents'} eq 'ordinary cell', '4,2, contents');
ok($cells->[2]->{'rowspan'} == 1, "4,3 rowspan carried down");
ok($cells->[2]->{'colspan'} == 1, '4,3 colspan carried down');
ok($cells->[2]->{'contents'} eq '', '4,3 contents empty');
ok($cells->[3]->{'rowspan'} == 1, "4,4 rowspan");
ok($cells->[3]->{'colspan'} == 1, '4,4 colspan');
ok($cells->[3]->{'contents'} eq 'ordinary cell', '4,4 contents');
my $table = $testobject->generate();
$table->set_filename('table.tex');
$table->generate();
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>