#---
# Excerpted from "The ThoughtWorks Anthology",
# published by The Pragmatic Bookshelf.
# Copyrights apply to this code. It may not be used to create training material, 
# courses, books, articles, and the like. Contact us if you are in doubt.
# We make no guarantees that this code is fit for any purpose. 
# Visit http://www.pragmaticprogrammer.com/titles/twa for more book information.
#---
require 'test/unit'

module ModelTests
  def test_returns_configuration
    assert_equal Configuration, config.class
  end
  def test_items_in_configuration
    assert_equal 4, config.items.size
  end
  def test_contains_acid_bath
    assert config[:acid_bath]
  end
  def test_contains_camera
    assert config.items.detect{|i| :camera == i.id}
  end
    def test_camera_power
        elec =  config[:camera].uses.detect {|r| Electricity == r.class}
        assert_equal 1, elec.power
    end
  def test_acid_bath_requires_hcl
    config[:acid_bath].check
    acids = config[:acid_bath].uses.select {|r| Acid == r.class}
    assert_equal 1, acids.size
    assert_equal :hcl, acids[0].type
  end
  def test_both_items_require_electricity
    elecs = config.items.select do |i| 
      i.uses.detect{|r| r.kind_of? Electricity}
    end
    assert_equal 2, elecs.size
  end  
  def test_power_plant_provides_electricity
    plant = config[:small_power_plant]
    assert plant.provisions.detect{|i| Electricity == i.class}
  end
  def test_captures_dependency
    plant = config[:small_power_plant]
    assert plant.dependencies.include?(config[:secure_air_vent])
  end
end

class PluggableTester < Test::Unit::TestCase
  include ModelTests
  def setup
    builder = Object.const_get "RulesBuilder#{@@id}"
    @config = builder.new.load(File.readlines("rules#{@@id}.rb"))
  end
  attr_reader :config
  def self.run id
    @@id = id
    puts "Testing configuration #%s" % @@id
    require "builder#{@@id}"
    require 'test/unit/ui/console/testrunner'
    Test::Unit::UI::Console::TestRunner.run(self)
  end
end


# class Object
#   def type
#     raise "bong: #{self.inspect}"
#   end
# end
