summaryrefslogtreecommitdiffstats
path: root/spec/lib/roo/weak_instance_cache_spec.rb
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2019-01-14 01:40:56 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2019-01-14 01:40:56 -0500
commitdddfa903d2b856146f05ffb4415c31d6127bb5bf (patch)
treee38c2aca92b54f06ccd0185f48dc47e3e1b3d77e /spec/lib/roo/weak_instance_cache_spec.rb
parent8280a21a23d44aa90177e2bc041d0b8dc8556f4b (diff)
New upstream version 2.8.0upstream/2.8.0
Diffstat (limited to 'spec/lib/roo/weak_instance_cache_spec.rb')
-rw-r--r--spec/lib/roo/weak_instance_cache_spec.rb92
1 files changed, 92 insertions, 0 deletions
diff --git a/spec/lib/roo/weak_instance_cache_spec.rb b/spec/lib/roo/weak_instance_cache_spec.rb
new file mode 100644
index 0000000..c2ad9b4
--- /dev/null
+++ b/spec/lib/roo/weak_instance_cache_spec.rb
@@ -0,0 +1,92 @@
+require 'spec_helper'
+
+if RUBY_PLATFORM == "java"
+ require 'java'
+ java_import 'java.lang.System'
+end
+
+describe Roo::Helpers::WeakInstanceCache do
+ let(:klass) do
+ Class.new do
+ include Roo::Helpers::WeakInstanceCache
+
+ def memoized_data
+ instance_cache(:@memoized_data) do
+ "Some Costly Operation #{rand(1000)}" * 1_000
+ end
+ end
+ end
+ end
+
+ subject do
+ klass.new
+ end
+
+ it 'should be lazy' do
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ data = subject.memoized_data
+ expect(subject.instance_variables).to include(:@memoized_data)
+ end
+
+
+ it 'should be memoized' do
+ data = subject.memoized_data
+ expect(subject.memoized_data).to equal(data)
+ end
+
+ it 'should recalculate after GC' do
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ GC.disable
+ subject.memoized_data && nil
+ expect(subject.instance_variables).to include(:@memoized_data)
+
+ force_gc
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ GC.disable
+ subject.memoized_data && nil
+ expect(subject.instance_variables).to include(:@memoized_data)
+ end
+
+ it 'must remove instance variable' do
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ GC.disable
+ subject.memoized_data && nil
+ expect(subject.instance_variables).to include(:@memoized_data)
+
+ force_gc
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ end
+
+ context '#inspect must not raise' do
+ it 'before calculation' do
+ expect{subject.inspect}.to_not raise_error
+ end
+ it 'after calculation' do
+ GC.disable
+ subject.memoized_data && nil
+ expect{subject.inspect}.to_not raise_error
+ expect(subject.inspect).to include("Some Costly Operation")
+ force_gc
+ end
+ it 'after GC' do
+ subject.memoized_data && nil
+ force_gc
+ expect(subject.instance_variables).to_not include(:@memoized_data)
+ expect{subject.inspect}.to_not raise_error
+ expect(subject.inspect).to_not include("Some Costly Operation")
+ end
+ end
+
+ if RUBY_PLATFORM == "java"
+ def force_gc
+ System.gc
+ sleep(0.1)
+ end
+ else
+ def force_gc
+ GC.start(full_mark: true, immediate_sweep: true)
+ sleep(0.1)
+ GC.start(full_mark: true, immediate_sweep: true)
+ end
+ end
+end \ No newline at end of file