aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test
diff options
context:
space:
mode:
authorNicholas Seckar <nseckar@gmail.com>2006-03-27 03:59:35 +0000
committerNicholas Seckar <nseckar@gmail.com>2006-03-27 03:59:35 +0000
commit24403498ba8582d29f55aab16ffd5920dec1c669 (patch)
treed89f14264d5a4e361e505a31d397b77b2d93702a /activesupport/test
parent3f496c66384160ba8eedd8f0e04aca4c9161aedb (diff)
downloadrails-24403498ba8582d29f55aab16ffd5920dec1c669.tar.gz
rails-24403498ba8582d29f55aab16ffd5920dec1c669.tar.bz2
rails-24403498ba8582d29f55aab16ffd5920dec1c669.zip
Add CachingTools::HashCaching to simplify the creation of nested, autofilling hashes.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4059 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activesupport/test')
-rw-r--r--activesupport/test/caching_tools_test.rb81
1 files changed, 81 insertions, 0 deletions
diff --git a/activesupport/test/caching_tools_test.rb b/activesupport/test/caching_tools_test.rb
new file mode 100644
index 0000000000..9f3e42e496
--- /dev/null
+++ b/activesupport/test/caching_tools_test.rb
@@ -0,0 +1,81 @@
+require 'test/unit'
+require File.dirname(__FILE__)+'/../lib/active_support/caching_tools'
+
+class HashCachingTests < Test::Unit::TestCase
+
+ def cached(&proc)
+ return @cached if @cached
+
+ @cached_class = Class.new(&proc)
+ @cached_class.class_eval do
+ extend ActiveSupport::CachingTools::HashCaching
+ hash_cache :slow_method
+ end
+ @cached = @cached_class.new
+ end
+
+ def test_cache_access_should_call_method
+ cached do
+ def slow_method(a) raise "I should be here: #{a}"; end
+ end
+ assert_raises(RuntimeError) { cached.slow_method_cache[1] }
+ end
+
+ def test_cache_access_should_actually_cache
+ cached do
+ def slow_method(a)
+ (@x ||= [])
+ if @x.include?(a) then raise "Called twice for #{a}!"
+ else
+ @x << a
+ a + 1
+ end
+ end
+ end
+ assert_equal 11, cached.slow_method_cache[10]
+ assert_equal 12, cached.slow_method_cache[11]
+ assert_equal 11, cached.slow_method_cache[10]
+ assert_equal 12, cached.slow_method_cache[11]
+ end
+
+ def test_cache_should_be_clearable
+ cached do
+ def slow_method(a)
+ @x ||= 0
+ @x += 1
+ end
+ end
+ assert_equal 1, cached.slow_method_cache[:a]
+ assert_equal 2, cached.slow_method_cache[:b]
+ assert_equal 3, cached.slow_method_cache[:c]
+
+ assert_equal 1, cached.slow_method_cache[:a]
+ assert_equal 2, cached.slow_method_cache[:b]
+ assert_equal 3, cached.slow_method_cache[:c]
+
+ cached.slow_method_cache.clear
+
+ assert_equal 4, cached.slow_method_cache[:a]
+ assert_equal 5, cached.slow_method_cache[:b]
+ assert_equal 6, cached.slow_method_cache[:c]
+ end
+
+ def test_deep_caches_should_work_too
+ cached do
+ def slow_method(a, b, c)
+ a + b + c
+ end
+ end
+ assert_equal 3, cached.slow_method_cache[1][1][1]
+ assert_equal 7, cached.slow_method_cache[1][2][4]
+ assert_equal 7, cached.slow_method_cache[1][2][4]
+ assert_equal 7, cached.slow_method_cache[4][2][1]
+
+ assert_equal({
+ 1 => {1 => {1 => 3}, 2 => {4 => 7}},
+ 4 => {2 => {1 => 7}}},
+ cached.slow_method_cache
+ )
+ end
+
+end