During this lab session:
This activity helps students develop the following skills, values and attitudes: ability to analyze and synthesize, capacity for identifying and solving problems, and efficient use of computer systems.
The lab activities can be developed individually or in pairs.
The lab report must be developed individually.
Create a folder called templatemethod
. Inside this folder, create two files called table_generator.rb
, and student.rb
. Their initial contents should be as follows. Study them carefully so you understand how they work.
# File name: table_generator.rb class TableGenerator def initialize(header, data) @header = header @data = data end def generate generate_header_row + (@data.map {|x| generate_row(x)}).join end def generate_header_row (@header.map {|x| generate_header_item(x)}).join end def generate_item(item) item end def generate_row(row) (row.map {|x| generate_item(x)}).join end def generate_header_item(item) item end end class CSVTableGenerator < TableGenerator def generate_row(row) "#{(row.map {|x| generate_item(x)}).join(',')}\n" end def generate_header_row generate_row(@header) end end
# File name: student.rb class Student include Enumerable # Note: This class does not support the max, min, or sort methods. def initialize(id, name, grades) @id = id @name = name @grades = grades end def inspect "Student(#{@id}, #{@name.inspect})" end def grade_average @grades.inject(:+)/@grades.size end def each &block yield @id yield @name @grades.each(&block) yield grade_average end end
The TableGenerator
and its subclass CSVTableGenerator
are an implementation of the Template Method pattern. Given some tabular data, they allow generating tables in different kinds of text formats. The Student
class will be used when doing the tests.
table_generator.rb
source file, write the following classes: HTMLTableGenerator
and LaTeXTableGenerator
. These classes must extend TableGenerator
and override the appropriate methods
so that the following test units work as expected. Place the test class in a source files called test_table_generator.rb
.
# File name: test_table_generator.rb require 'test/unit' require './table_generator' require './student' class TableGeneratorTest < Test::Unit::TestCase def setup @headerNums = %w{Snap Crackle Pop} @dataNums = [[10, 20, 30], [12, 64, 13], [34, 11, 29], [99, 15, 34]] @headerStudents = %w{id name grade1 grade2 grade3 average} @dataStudents = [Student.new(123, "Selma Bouvier", [71, 84, 89]), Student.new(241, "Carl Carlson", [78, 85, 90]), Student.new(299, "Todd Flanders", [67, 71, 77]), Student.new(311, "Barney Gumble", [24, 18, 35]), Student.new(427, "Edna Krabappel", [92, 95, 99]), Student.new(666, "Damian Thorn", [66, 66, 66]), Student.new(718, "Manjula Nahasapeemapetilon", [53, 72, 88])] end def test_CSVTableGenerator assert_equal \ "Snap,Crackle,Pop\n" + "10,20,30\n" + "12,64,13\n" + "34,11,29\n" + "99,15,34\n", CSVTableGenerator.new(@headerNums, @dataNums).generate assert_equal \ "id,name,grade1,grade2,grade3,average\n" + "123,Selma Bouvier,71,84,89,81\n" + "241,Carl Carlson,78,85,90,84\n" + "299,Todd Flanders,67,71,77,71\n" + "311,Barney Gumble,24,18,35,25\n" + "427,Edna Krabappel,92,95,99,95\n" + "666,Damian Thorn,66,66,66,66\n" + "718,Manjula Nahasapeemapetilon,53,72,88,71\n", CSVTableGenerator.new(@headerStudents, @dataStudents).generate end def test_HTMLTableGenerator assert_equal \ "<table>\n" + "<tr><th>Snap</th><th>Crackle</th><th>Pop</th></tr>\n" + "<tr><td>10</td><td>20</td><td>30</td></tr>\n" + "<tr><td>12</td><td>64</td><td>13</td></tr>\n" + "<tr><td>34</td><td>11</td><td>29</td></tr>\n" + "<tr><td>99</td><td>15</td><td>34</td></tr>\n" + "</table>\n", HTMLTableGenerator.new(@headerNums, @dataNums).generate assert_equal \ "<table>\n" + "<tr><th>id</th><th>name</th><th>grade1</th>" + "<th>grade2</th><th>grade3</th><th>average</th></tr>\n" + "<tr><td>123</td><td>Selma Bouvier</td><td>71</td>" + "<td>84</td><td>89</td><td>81</td></tr>\n" + "<tr><td>241</td><td>Carl Carlson</td><td>78</td>" + "<td>85</td><td>90</td><td>84</td></tr>\n" + "<tr><td>299</td><td>Todd Flanders</td><td>67</td>" + "<td>71</td><td>77</td><td>71</td></tr>\n" + "<tr><td>311</td><td>Barney Gumble</td><td>24</td>" + "<td>18</td><td>35</td><td>25</td></tr>\n" + "<tr><td>427</td><td>Edna Krabappel</td><td>92</td>" + "<td>95</td><td>99</td><td>95</td></tr>\n" + "<tr><td>666</td><td>Damian Thorn</td><td>66</td>" + "<td>66</td><td>66</td><td>66</td></tr>\n" + "<tr><td>718</td><td>Manjula Nahasapeemapetilon</td><td>53</td>" + "<td>72</td><td>88</td><td>71</td></tr>\n" + "</table>\n", HTMLTableGenerator.new(@headerStudents, @dataStudents).generate end def test_LaTeXTableGenerator assert_equal \ "\\begin{tabular}{ | l | l | l | }\n" + "\\hline\n" + "Snap & Crackle & Pop \\\\\n" + "\\hline\n" + "\\hline\n" + "10 & 20 & 30 \\\\\n" + "\\hline\n" + "12 & 64 & 13 \\\\\n" + "\\hline\n" + "34 & 11 & 29 \\\\\n" + "\\hline\n" + "99 & 15 & 34 \\\\\n" + "\\hline\n" + "\\end{tabular}\n", LaTeXTableGenerator.new(@headerNums, @dataNums).generate assert_equal \ "\\begin{tabular}{ | l | l | l | l | l | l | }\n" + "\\hline\n" + "id & name & grade1 & grade2 & grade3 & average \\\\\n" + "\\hline\n" + "\\hline\n" + "123 & Selma Bouvier & 71 & 84 & 89 & 81 \\\\\n" + "\\hline\n" + "241 & Carl Carlson & 78 & 85 & 90 & 84 \\\\\n" + "\\hline\n" + "299 & Todd Flanders & 67 & 71 & 77 & 71 \\\\\n" + "\\hline\n" + "311 & Barney Gumble & 24 & 18 & 35 & 25 \\\\\n" + "\\hline\n" + "427 & Edna Krabappel & 92 & 95 & 99 & 95 \\\\\n" + "\\hline\n" + "666 & Damian Thorn & 66 & 66 & 66 & 66 \\\\\n" + "\\hline\n" + "718 & Manjula Nahasapeemapetilon & 53 & 72 & 88 & 71 \\\\\n" + "\\hline\n" + "\\end{tabular}\n", LaTeXTableGenerator.new(@headerStudents, @dataStudents).generate end end
All Ruby source files created for this lab must start with a comment containing the lab's title, date, and the authors' personal information. For example:
# Lab 2: Template Method # Date: 25-Jan-2011 # Authors: # 456654 Anthony Stark # 1160611 Thursday Rubinstein
To hand in your individual lab work, follow these instructions.
lab2_report_A0MMMMMMM.tex
, where A0MMMMMMM
is your student ID. From your LaTeX source, generate the
corresponding PDF file. That file should be called
lab2_report_A0MMMMMMM.pdf
. Place these two files in the
templatemethod
directory.
templatemethod
directory. Call this file templatemethod.zip
.
Due date is Thursday, January 27.
This activity will be evaluated using the following criteria:
50% | Implementation of functional requirements. |
---|---|
50% | Lab report. |
DA | The program and/or report was plagiarized. |