diff --git a/.gitignore b/.gitignore index 61a293a..de633b8 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ doc/ config/database.yml TODO +.idea diff --git a/terminator.rb b/terminator.rb index 8bd4a43..7512195 100644 --- a/terminator.rb +++ b/terminator.rb @@ -1,7 +1,26 @@ require "./terminatorable" -class Terminator + +class GoodTerminator include Terminatorable + likes_to_protect [:john_connor, :sarah_connor] + likes_to_destroy [] + + def protects?(person) + [:john_connor, :sarah_connor].include?(person) + end end + + +class BadTerminator + include Terminatorable + + likes_to_protect [] + likes_to_destroy [:john_connor, :sarah_connor] + + def protects?(person) + [].include?(person) + end +end diff --git a/terminator_spec.rb b/terminator_spec.rb index 749dae3..8cde852 100644 --- a/terminator_spec.rb +++ b/terminator_spec.rb @@ -1,23 +1,58 @@ require 'rspec' require "./terminator" -describe Terminator do - it "should destroy_john_connor" do - subject.destroy_john_connor! - subject.current_mission.should eq("destroy: john_connor") +describe GoodTerminator do + it 'should protect_john_connor' do + subject.protect_john_connor! + subject.current_mission.should == 'protect: john_connor' + end + + it 'should protect_sarah_connor' do + subject.protect_sarah_connor! + subject.current_mission.should == 'protect: sarah_connor' end - it "should protect_john_connor" do + describe '#protects?' do + it 'should return true for john connor' do + subject.protects?(:john_connor).should be_true + end + + it 'should return true for sarah connor' do + subject.protects?(:sarah_connor).should be_true + end + + it 'should return false for random unknown person' do + subject.protects?(:random_person).should be_false + end + end + + it 'should say terminator good if protecting someone' do subject.protect_john_connor! - subject.current_mission.should eq("protect: john_connor") + subject.should be_good end - it "should destroy_sarah_connor" do +end + + +describe BadTerminator do + it 'should destroy_john_connor' do + subject.destroy_john_connor! + subject.current_mission.should == 'destroy: john_connor' + end + + it 'should destroy_sarah_connor' do subject.destroy_sarah_connor! - subject.current_mission.should eq("destroy: sarah_connor") + subject.current_mission.should == 'destroy: sarah_connor' end - it "should protect_sarah_connor" do - subject.protect_sarah_connor! - subject.current_mission.should eq("protect: sarah_connor") + it 'should tell us terminator is bad if destroying someone' do + subject.destroy_john_connor! + subject.should_not be_good + end + + describe '#protects?' do + it 'should not protect john_connor' do + subject.destroy_john_connor! + subject.protects?(:john_connor).should be_false + end end end diff --git a/terminatorable.rb b/terminatorable.rb index 378afd6..c261be3 100644 --- a/terminatorable.rb +++ b/terminatorable.rb @@ -2,12 +2,23 @@ module Terminatorable module ClassMethods def likes_to_protect(people=[]) - ["destroy", "protect"].each do |mission_type| people.each do |person| - define_method "#{mission_type}_#{person}!" do - @current_mission = "#{mission_type}: #{person}" + define_method "protect_#{person}!" do + @current_mission = "protect: #{person}" end end + + define_method :good? do + ['protect: john_connor','protect: sarah_connor'].include?(@current_mission) + end + end + + + def likes_to_destroy(people=[]) + people.each do |person| + define_method "destroy_#{person}!" do + @current_mission = "destroy: #{person}" + end end end end