[Archipelago-submits] [50] trunk/hyperactive: added tests for Record.reject and Record.select, and fixed some bugs for it
nobody at rubyforge.org
nobody at rubyforge.org
Sun Nov 26 20:14:19 EST 2006
Revision: 50
Author: zond
Date: 2006-11-26 20:14:19 -0500 (Sun, 26 Nov 2006)
Log Message:
-----------
added tests for Record.reject and Record.select, and fixed some bugs for it
Modified Paths:
--------------
trunk/hyperactive/lib/hyperactive/record.rb
trunk/hyperactive/lib/hyperactive/tree.rb
trunk/hyperactive/tests/record_test.rb
Modified: trunk/hyperactive/lib/hyperactive/record.rb
===================================================================
--- trunk/hyperactive/lib/hyperactive/record.rb 2006-11-26 01:04:54 UTC (rev 49)
+++ trunk/hyperactive/lib/hyperactive/record.rb 2006-11-27 01:14:19 UTC (rev 50)
@@ -30,9 +30,10 @@
#
# Depending on <i>@mode</i> and return value of <i>@matcher</i>.call
# may save record in the Hash-like container named <i>@key</i> in
- # the main database.
+ # the main database after having yielded to +block+.
#
- def call(record)
+ def call(record, &block)
+ yield
case @mode
when :select
if @matcher.call(record)
@@ -44,7 +45,7 @@
if @matcher.call(record)
CAPTAIN[@key].delete(record.record_id)
else
- CAPTAIN[@key][record.record_id] = record unless @matcher.call(record)
+ CAPTAIN[@key][record.record_id] = record
end
when :delete_if_match
if @matcher.call(record)
@@ -148,10 +149,11 @@
# is defined.
#
def self.select(name, matcher)
- key = collection_key(name)
+ key = self.collection_key(name)
+ CAPTAIN[key] ||= Tree.get_instance
self.class_eval <<END
def self.#{name}
- CAPTAIN[key]
+ CAPTAIN["#{key}"]
end
END
self.save_hooks << MatchSaver.new(key, matcher, :select)
@@ -165,10 +167,11 @@
# rejector is defined.
#
def self.reject(name, matcher)
- key = collection_key(name)
+ key = self.collection_key(name)
+ CAPTAIN[key] ||= Tree.get_instance
self.class_eval <<END
def self.#{name}
- CAPTAIN[key]
+ CAPTAIN["#{key}"]
end
END
self.save_hooks << MatchSaver.new(key, matcher, :reject)
@@ -246,6 +249,13 @@
private
#
+ # The key used to store the collection with the given +sym+ as name.
+ #
+ def self.collection_key(sym)
+ "Hyperactive::Record::collection_key::#{sym}"
+ end
+
+ #
# Get an Array from +hash+ using <i>self</i> as
# key. If <i>self</i> doesnt exist in the +hash+
# it will recurse by calling the same method in the
Modified: trunk/hyperactive/lib/hyperactive/tree.rb
===================================================================
--- trunk/hyperactive/lib/hyperactive/tree.rb 2006-11-26 01:04:54 UTC (rev 49)
+++ trunk/hyperactive/lib/hyperactive/tree.rb 2006-11-27 01:14:19 UTC (rev 50)
@@ -123,9 +123,9 @@
#
def collect(callable)
rval = []
- self.each do |e|
- rval << callable.call(e)
- end
+ self.each(Proc.new do |k,v|
+ rval << callable.call(k,v)
+ end)
return rval
end
Modified: trunk/hyperactive/tests/record_test.rb
===================================================================
--- trunk/hyperactive/tests/record_test.rb 2006-11-26 01:04:54 UTC (rev 49)
+++ trunk/hyperactive/tests/record_test.rb 2006-11-27 01:14:19 UTC (rev 50)
@@ -56,6 +56,44 @@
@c2.persistence_provider.unlink
@tm.persistence_provider.unlink
end
+
+ def test_select_reject
+ MyRecord.class_eval do
+ select(:brunt, Proc.new do |r|
+ r.bajs == "brunt"
+ end)
+ reject(:not_brunt, Proc.new do |r|
+ r.bajs == "brunt"
+ end)
+ end
+ r1 = MyRecord.get_instance
+ r1.bajs = "brunt"
+ r2 = MyRecord.get_instance
+ r2.bajs = "brunt"
+ r3 = MyRecord.get_instance
+ r3.bajs = "gult"
+ r4 = MyRecord.get_instance
+ r4.bajs = "beige"
+
+ assert_equal(Set.new([r2.record_id,r1.record_id]), Set.new(MyRecord.brunt.collect(Proc.new do |k,v|
+ v.record_id
+ end)))
+ assert_equal(Set.new([r3.record_id,r4.record_id]), Set.new(MyRecord.not_brunt.collect(Proc.new do |k,v|
+ v.record_id
+ end)))
+
+ r1.destroy
+ r2.destroy
+ r3.destroy
+ r4.destroy
+
+ assert_equal(Set.new, Set.new(MyRecord.brunt.collect(Proc.new do |k,v|
+ v.record_id
+ end)))
+ assert_equal(Set.new, Set.new(MyRecord.not_brunt.collect(Proc.new do |k,v|
+ v.record_id
+ end)))
+ end
def test_create_update_destroy
r = MyRecord.get_instance
More information about the Archipelago-submits
mailing list