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 metaprogramming. Inside this folder, create two files called:
attr_init.rb and
test_attr_init.rb.
All Ruby source files must start with a comment containing the lab's title, date, and the authors' personal information. For example:
# Lab 9: Meta-programming Pattern # Date: 26-Oct-2011 # Authors: # 456654 Anthony Stark # 1160611 Thursday Rubinstein
In the attr_init.rb source file, open the Object class and define a new class method called attr_init. This method should work as a class annotation that defines the initialize method in the enclosing class, and also calls the attr_accessor as shown as follows.
For example, given the class definition:
class C attr_init :w, :x, :y, :z end
It should be transformed into something equivalent to this:
class C
def initialize(w, x, y, z)
@w = w
@x = x
@y = y
@z = z
end
attr_accessor :w, :x, :y, :z
end
Use the meta-programming pattern, as explained in page 309 of [OLSEN], to do this.
The following unit tests verify the correct definition of the attr_init class annotation. Place the test class in the test_attr_init.rb source file.
require 'test/unit'
require 'attr_init'
class AttrInitTest < Test::Unit::TestCase
class Alpha
attr_init :beta, :gamma, :delta
end
class BiologicalClassification
attr_init :kingdom, :phylum, :klass, :order, :family, :genus, :species
end
def test_alpha
alpha = Alpha.new('one', 'two', 'three')
assert_equal 3, alpha.method(:initialize).arity
assert_respond_to alpha, :beta
assert_respond_to alpha, :beta=
assert_respond_to alpha, :gamma
assert_respond_to alpha, :gamma=
assert_respond_to alpha, :delta
assert_respond_to alpha, :delta=
assert_equal 'one', alpha.beta
assert_equal 'two', alpha.gamma
assert_equal 'three', alpha.delta
assert_equal 1, (alpha.beta = 1)
assert_equal 2, (alpha.gamma = 2)
assert_equal 3, (alpha.delta = 3)
assert_equal 1, alpha.beta
assert_equal 2, alpha.gamma
assert_equal 3, alpha.delta
end
def test_biological_classification
platapus = BiologicalClassification.new(
'Animalia',
'Chordata',
'Mammalia',
'Monotremata',
'Ornithorhynchidae',
'Ornithorhynchus',
'Ornithorhynchus Anatinus')
assert_equal 7, platapus.method(:initialize).arity
assert_respond_to platapus, :kingdom
assert_respond_to platapus, :phylum
assert_respond_to platapus, :klass
assert_respond_to platapus, :order
assert_respond_to platapus, :family
assert_respond_to platapus, :genus
assert_respond_to platapus, :species
assert_respond_to platapus, :kingdom=
assert_respond_to platapus, :phylum=
assert_respond_to platapus, :klass=
assert_respond_to platapus, :order=
assert_respond_to platapus, :family=
assert_respond_to platapus, :genus=
assert_respond_to platapus, :species=
assert_equal 'Animalia', platapus.kingdom
assert_equal 'Chordata', platapus.phylum
assert_equal 'Mammalia', platapus.klass
assert_equal 'Monotremata', platapus.order
assert_equal 'Ornithorhynchidae', platapus.family
assert_equal 'Ornithorhynchus', platapus.genus
assert_equal 'Ornithorhynchus Anatinus', platapus.species
assert_equal 'Amoebozoa', (platapus.kingdom = 'Amoebozoa')
assert_equal 'Tubulinea', (platapus.phylum = 'Tubulinea')
assert_equal 'Tubulinida', (platapus.order = 'Tubulinida')
assert_equal 'Amoebidae', (platapus.family = 'Amoebidae')
assert_equal 'Amoeba', (platapus.genus = 'Amoeba')
assert_equal 'Amoeba Proteus', (platapus.species = 'Amoeba Proteus')
end
def test_errors
assert_raise(ArgumentError) do
alpha = Alpha.new()
end
assert_raise(ArgumentError) do
alpha = Alpha.new(1, 2, 3, 4)
end
assert_raise(ArgumentError) do
alpha = BiologicalClassification.new()
end
assert_raise(ArgumentError) do
alpha = BiologicalClassification.new(
'Plantae',
'Magnoliophyta',
'Magnoliopsida',
'Rosales',
'Rosaceae')
end
end
end
To hand in your individual lab work, follow these instructions.
lab9_report_A0MMMMMMM.txt, where A0MMMMMMM is your student ID. From your AsciiDoc source, generate the corresponding HTML file. That file should be called lab9_report_A0MMMMMMM.html. Place these two files in the metaprogramming directory.
metaprogramming directory. Call this file metaprogramming.tgz. From a terminal, you can use the following command to create this file (make sure to run it at the same level where the metaprogramming folder resides):
tar czf metaprogramming.tgz metaprogramming
Due date is Tuesday, November 1.
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. |