[Archipelago-submits] [82] trunk/archipelago: fixed more tests for Current::ThreadedCollection and cleaned it up a lot

nobody at rubyforge.org nobody at rubyforge.org
Wed Nov 29 00:37:04 EST 2006


Revision: 82
Author:   zond
Date:     2006-11-29 00:37:03 -0500 (Wed, 29 Nov 2006)

Log Message:
-----------
fixed more tests for Current::ThreadedCollection and cleaned it up a lot

Modified Paths:
--------------
    trunk/archipelago/lib/archipelago/current.rb
    trunk/archipelago/tests/current_test.rb

Modified: trunk/archipelago/lib/archipelago/current.rb
===================================================================
--- trunk/archipelago/lib/archipelago/current.rb	2006-11-29 03:05:49 UTC (rev 81)
+++ trunk/archipelago/lib/archipelago/current.rb	2006-11-29 05:37:03 UTC (rev 82)
@@ -52,11 +52,7 @@
 
         self.each do |args|
           threads << Thread.new do
-            if callable
-              callable.call(*args)
-            else
-              yield(args)
-            end
+            call_helper(callable, args, &block)
           end
         end
 
@@ -74,12 +70,9 @@
         result = []
         result.extend(Synchronized)
         self.t_each do |args|
+          new_value = call_helper(callable, args, &block)
           result.synchronize do
-            if callable
-              result << callable.call(*args)
-            else
-              result << yield(args)
-            end
+            result << new_value
           end
         end
         return result
@@ -94,11 +87,7 @@
         result = []
         result.extend(Synchronized)
         self.t_each do |args|
-          if callable
-            matches = callable.call(*args)
-          else
-            matches = yield(args)
-          end
+          matches = call_helper(callable, args, &block)
           result.synchronize do
             result << args
           end if matches
@@ -115,11 +104,7 @@
         result = []
         result.extend(Synchronized)
         self.t_each do |args|
-          if callable
-            matches = callable.call(*args)
-          else
-            matches = yield(args)
-          end
+          matches = call_helper(callable, args, &block)
           result.synchronize do
             result << args
           end unless matches
@@ -127,6 +112,20 @@
         return result
       end
 
+      private
+
+      def call_helper(o = nil, args = nil, &block)
+        if o
+          if Array === args
+            return o.call(*args)
+          else
+            return o.call(args)
+          end
+        else
+          return yield(args)
+        end
+      end
+
     end
 
 

Modified: trunk/archipelago/tests/current_test.rb
===================================================================
--- trunk/archipelago/tests/current_test.rb	2006-11-29 03:05:49 UTC (rev 81)
+++ trunk/archipelago/tests/current_test.rb	2006-11-29 05:37:03 UTC (rev 82)
@@ -1,6 +1,22 @@
 
 require File.join(File.dirname(__FILE__), 'test_helper')
 
+class HashCollector
+  attr_accessor :epa
+  def call(k,v)
+    @epa ||= {}
+    @epa[k] = v
+  end
+end
+
+class ArrayCollector
+  attr_accessor :epa
+  def call(e)
+    @epa ||= []
+    @epa << e
+  end
+end
+
 class CurrentTest < Test::Unit::TestCase
 
   def test_synchronized
@@ -24,6 +40,24 @@
     end
   end
 
+  def test_lock_on
+    t = true
+
+    a = "hej"
+    a.extend(Archipelago::Current::Synchronized)
+    a.lock_on("epa")
+    Thread.new do
+      a.lock_on("epa")
+      t = false
+    end
+    Thread.pass
+    assert(t)
+    a.unlock_on("epa")
+    assert_within(0.5) do
+      !t
+    end
+  end
+
   def test_threaded_collection
     a = Array(10)
     a.extend(Archipelago::Current::ThreadedCollection)
@@ -51,6 +85,16 @@
     b = {}
     a.t_each do |k,v| b[k] = v end
     assert_equal(b,a)
+
+    c = HashCollector.new
+    a.t_each(c)
+    assert_equal(a, c.epa)
+
+    a = [1,2,3,4,5,6,7]
+    a.extend(Archipelago::Current::ThreadedCollection)
+    c = ArrayCollector.new
+    a.t_each(c)
+    assert_equal(a.sort, c.epa.sort)
   end
 
 end




More information about the Archipelago-submits mailing list