You are here:   ArielOrtiz.com > Software Design and Architecture > Lab 6: Adapter Pattern

Lab 6: Adapter Pattern

Objectives

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.

Activity Description

IMPORTANT NOTE: The lab activities can be developed individually or in pairs. The lab report must be developed individually.

  1. Create a folder called adapter. Inside this folder, create three files called: simple_queue.rb, queue_adapter.rb, and test_adapter.rb.

    All three Ruby source files must start with a comment containing the lab's title, date, and the authors' personal information. For example:

    # Lab 6: Adapter Pattern
    # Date: 29-Feb-2012
    # Authors:
    # 456654  Thursday Rubinstein 
    # 1160611 Anthony Stark
  2. The content of the file simple_queue.rb is as follows:

    # File: simple_queue.rb
    
    # IMPORTANT: Do not modify the following class in any way!
    
    class SimpleQueue
      
      def initialize
        @info =[]
      end
      
      def insert(x)
        @info.push(x)
        self
      end
      
      def remove
        if empty?
          raise "Can't remove if queue is empty"
        else
          @info.shift
        end
      end
      
      def empty?
        @info.empty?
      end
      
      def size
        @info.size
      end
      
      def inspect
        @info.inspect
      end
    end
    

    The SimpleQueue class contains a First-In First-Out (FIFO) data structure that implements the following methods:

    Method Signature Description
    insert(x) Inserts x at the back of this queue. Returns this queue.
    remove Removes and returns the element at the front of this queue. Raises an exception if this queue happens to be empty.
    empty? Returns true if this queue is empty, otherwise returns false.
    size Returns the number of elements currently stored in this queue.

    Write an adapter class called QueueAdapter (place it in the file called queue_adapter.rb) that makes a SimpleQueue instance (as implemented above) behave like a Last-In First-Out (LIFO) stack with the following interface:

    Method Signature Description
    initialize(q) Initializes a new stack, using q as the adaptee.
    push(x) Inserts x at the top of this stack. Returns this stack.
    pop Returns nil if this stack is empty, otherwise removes and returns its top element.
    peek Returns nil if this stack is empty, otherwise returns its top element without removing it.
    empty? Returns true if this stack is empty, otherwise returns false.
    size Returns the number of elements currently stored in this stack.
  3. The following unit test verifies the correct behavior of the QueueAdapter class. Place the test class in the test_adapter.rb source file.
    # File: test_adapter.rb 
    
    require 'test/unit'
    require 'simple_queue'
    require 'queue_adapter'
    
    class QueueAdapterTest < Test::Unit::TestCase  
    
      def test_queue_adapter    
        q = SimpleQueue.new
        qa = QueueAdapter.new(q)
        assert q.empty?
        assert qa.empty?
        assert_nil qa.pop 
        qa.push("Foo")
        assert_equal "Foo", qa.peek
        assert !q.empty?
        assert !qa.empty?
        qa.push("Bar")
        assert_equal "Bar", qa.peek
        qa.push("Baz").push("Quux")
        assert_equal 4, q.size
        assert_equal 4, qa.size
        assert_equal "Quux", qa.peek
        assert_equal "Quux", qa.pop
        assert_equal "Baz", qa.peek
        assert_equal "Baz", qa.pop
        assert_equal "Bar", qa.peek
        assert_equal "Bar", qa.pop
        assert_equal "Foo", qa.peek
        qa.push("Goo")
        assert_equal "Goo", qa.peek
        assert_equal "Goo", qa.pop
        assert_equal "Foo", qa.peek
        assert_equal 1, qa.size
        assert_equal "Foo", qa.pop
        assert_nil qa.peek
        assert_nil qa.pop
        assert q.empty?
        assert qa.empty? 
        assert_equal 0, q.size
        assert_equal 0, qa.size
      end
      
    end

Deliverables

To hand in your individual lab work, follow these instructions.

Due date is Tuesday, March 6.

Evaluation

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.