carolineartz
1/29/2014 - 5:52 AM

challenge2_1_drawer_debugger.rb

class Drawer
  #don't need attribute reader for content at this point

  def initialize
    @contents = []
    @open = true
  end

  def open
    @open = true
  end

  def close
    @open = false
  end

  def add_item(item)
    raise ArgumentError.new('Whoops! Open the drawer first!') unless @open
    @contents << item
  end

  def remove_item(item = @contents.last) #default won't pop last item off until passes test for contains item
    raise ArgumentError.new('Hmmm..don\'t see one of those...') unless @contents.include?(item)
    @contents.delete(item)
  end

  def dump # clears drawer and calls #view_contents which puts message about drawer being empty
    @contents.clear
    view_contents
  end

  def view_contents
    if @contents.empty?
      puts 'Your drawer is empty.'
    else
      puts 'The drawer contains:'
      @contents.each { |silverware| puts '- ' + silverware.type }
    end
  end

end


class Silverware
  attr_reader :type

  def initialize(type, clean = true)
    @type = type
    @clean = clean
  end

  def clean
    @clean = true
  end

  def eat
    puts "eating with the #{@type}"
    @clean = false
  end

  def is_clean?
    puts "This #{@type} is all clean!" if @clean
    puts "This #{@type} is dirty!" unless @clean
  end

end


silverware_drawer = Drawer.new

knife1 = Silverware.new('knife')
silverware_drawer.add_item(knife1)

silverware_drawer.add_item(Silverware.new('spoon'))
silverware_drawer.add_item(Silverware.new('fork'))

silverware_drawer.view_contents ##should have knife, spoon, fork

silverware_drawer.remove_item
silverware_drawer.view_contents ##removed default last item (fork), should have knife, spoon

sharp_knife = Silverware.new('sharp_knife')
silverware_drawer.add_item(sharp_knife)
silverware_drawer.view_contents ##added item: sharp knife. should have knife, spoon, sharp_knife

silverware_drawer.remove_item(sharp_knife)
silverware_drawer.view_contents ##gonna eat, so remove sharp_knife; should have knife and spoon

sharp_knife.eat

sharp_knife.is_clean? ##sharp knife should be dirty
sharp_knife.clean
sharp_knife.is_clean? ##cleaned sharp knife. now it should be clean

silverware_drawer.add_item(sharp_knife)
silverware_drawer.view_contents ##added back in sharp knife: should have knife, spoon, sharp_knife

silverware_drawer.dump ##emptying drawer, should be empty
silverware_drawer.view_contents ##showing contents to double check its empty

fork = Silverware.new('fork')
silverware_drawer.add_item(fork)
silverware_drawer.view_contents ##got a new fork; should have only a fork

silverware_drawer.remove_item(fork)
silverware_drawer.view_contents ##removed fork; drawer should be empty
silverware_drawer.close ##closed the drawer

fork.eat ##eat with fork
fork.is_clean? ##fork should be dirty
fork.clean 
fork.is_clean? ##cleaned my fork, should be clean

silverware_drawer.add_item(fork) #raise argument error, can't add item before opening the drawer!

silverware_drawer.open ##opened the drawer
silverware_drawer.add_item(fork)
silverware_drawer.view_contents ##added fork, should have only a fork

spork = Silverware.new('spork') #for testing argument error

silverware_drawer.remove_item(spork) #raise argument error, can't remove item not in drawer

###################################REFLECTION#######################################
# This challenge was a little difficult to get started. It was tough to really understand what it was
# modeling. It seems a little weird to have `item` and `type` as they are and not have an is-a
# relationship: item is a type (e.g, sharp knife is a knife). But I guess that isn't what's going on.