Skip to content

Commit

Permalink
conflict proxy tests (passing)
Browse files Browse the repository at this point in the history
  • Loading branch information
madskaddie committed Dec 10, 2010
1 parent 0a68443 commit 3d7cda2
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 28 deletions.
49 changes: 21 additions & 28 deletions scheduler/lib/radia_source/lightweight/conflict.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,70 +3,63 @@ module LightWeight

class Conflict < ARProxy

attr_accessor :active_broadcast, :new_broadcasts
proxy_accessor :active_broadcast, :new_broadcasts

def initialize(args={})
super()
@new_broadcasts = args.has_key?(:new_broadcasts) ? args[:new_broadcasts] : []
@active_broadcast = args.has_key?(:active_broadcast) ? args[:active_broadcast] : nil
default = {:new_broadcasts => [], :active_broadcast => nil }
super(default.merge(args))
end

def intersects? broadcast
# if
if @active_broadcast.nil?
return @new_broadcasts.any? { |bc| bc.intersects?(broadcast) }
if active_broadcast.nil?
return new_broadcasts.any? { |bc| broadcast.intersects?(bc) }
end
return @active_broadcast.intersects?(broadcast)
return active_broadcast.intersects?(broadcast)
end

def add_new_broadcast bc
#puts "Real conflict #{bc}"

#filters out any double event...
if @new_broadcasts.find{|x| x.similar?(bc)}.nil?
@new_broadcasts << bc
unless new_broadcasts.any?{|x| x.similar?(bc)}
new_broadcasts << bc
end
@new_broadcasts
puts "blash"
new_broadcasts
end

# A conflict is only automatically solved in two cases:
# - the active broadcast is the similar to the new one
# - if there is no active broadcast and there is only one
# new broadcast
def solvable?
if @new_broadcasts.length == 1
if @active_broadcast.nil?
if new_broadcasts.length == 1
if active_broadcast.nil?
return true
else
return @active_broadcast.similar? @new_broadcasts[0]
return active_broadcast.similar? new_broadcasts[0]
end
else
return false
end
return false
end

# returns the broadcasts to be destroyed if the conflict
# can be automatically solvable. if it cannot be solvable
# it returns an empty list.
def solved_to_destroy
if not self.solvable? or @active_broadcast.nil?
if not self.solvable? or active_broadcast.nil?
return []
end

return @new_broadcasts
return new_broadcasts
end

def save
if @po.nil?
classname = self.class.name.split("::")[-1]
ab = @active_broadcast.nil? ? nil : @active_broadcast.persistent_object
@po = Kernel.const_get(classname.to_s).create(
:active_broadcast => ab,
:new_broadcasts => @new_broadcasts.map{ |bc| bc.persistent_object } )
end
super()
def create_persistent_object args={}
args.update(:active_broadcast => active_broadcast.po!,
:new_broadcasts => new_broadcasts.map {|bc| bc.po!})
super(args)
end

end

end
end
60 changes: 60 additions & 0 deletions scheduler/lib/radia_source/lightweight/test/conflict_proxy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
require 'test/unit'

require 'rubygems'
require 'active_record'

require "#{File.dirname(__FILE__)}/../init"
NS = RadiaSource::LightWeight


class TestNonPersistentConflict < Test::Unit::TestCase

t = Time.now
@@reference_broadcast = NS::Broadcast.new :dtstart => t, :dtend => t + 30.minutes
@@conflicting_broadcast = NS::Broadcast.new :dtstart => t+15.minutes, :dtend => t + 45.minutes


def test_broadcast_methods
a = NS::Conflict.new

assert_respond_to a, :active_broadcast
assert_respond_to a, :new_broadcasts

end


def test_intersection1
c = NS::Conflict.new(:active_broadcast => @@reference_broadcast)

assert c.intersects?(@@conflicting_broadcast)
end

def test_intersection2
c = NS::Conflict.new(:new_broadcasts => [@@reference_broadcast])

assert c.intersects? @@conflicting_broadcast
end

def test_add_new_broadcast
c = NS::Conflict.new :active_broadcast => @@reference_broadcast

assert_equal 1, (c.add_new_broadcast @@conflicting_broadcast).count

#test the filter
assert_equal 1, (c.add_new_broadcast @@conflicting_broadcast).count
end

def test_1_solvable?
c = NS::Conflict.new(:new_broadcasts => [@@reference_broadcast])

assert c.solvable?

c = NS::Conflict.new(:active_broadcast => @@reference_broadcast)
c.add_new_broadcast @@reference_broadcast

assert c.solvable?

end


end
35 changes: 35 additions & 0 deletions scheduler/test/unit/lightweight/conflict_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
require File.dirname(__FILE__) + '/../../test_helper'

NS=RadiaSource::LightWeight

class ConflictTest < ActiveSupport::TestCase

t = Time.now
@@reference_broadcast = NS::Broadcast.new :dtstart => t, :dtend => t + 30.minutes
@@conflicting_broadcast = NS::Broadcast.new :dtstart => t+15.minutes, :dtend => t + 45.minutes
@@yet_another_broadcast = NS::Broadcast.new :dtstart => t+30.minutes, :dtend => t + 55.minutes

def test_proxy_class
assert_equal Kernel.const_get(:Conflict), NS::Conflict.proxy_class
end

def test_save
c = NS::Conflict.new(:active_broadcast => @@reference_broadcast)

assert_equal @@reference_broadcast, c.active_broadcast

c.add_new_broadcast @@conflicting_broadcast
c.add_new_broadcast @@yet_another_broadcast

assert c.save

assert_kind_of Kernel::Conflict, c.po

pc = Kernel::Conflict.first

assert_equal pc, c.po
assert_equal 2, pc.new_broadcasts.count


end
end

0 comments on commit 3d7cda2

Please sign in to comment.