spec/registry_store_spec.rb in yard-0.7.5 vs spec/registry_store_spec.rb in yard-0.8.0

- old
+ new

@@ -3,42 +3,46 @@ describe YARD::RegistryStore do before do FileUtils.rm_rf("foo") @store = RegistryStore.new @serializer = Serializers::YardocSerializer.new('foo') + @foo = CodeObjects::MethodObject.new(nil, :foo) + @bar = CodeObjects::ClassObject.new(nil, :Bar) Serializers::YardocSerializer.stub!(:new).and_return(@serializer) end - + describe '#load' do it "should load root.dat as full object list if it is a Hash" do File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/checksums').and_return(false) File.should_receive(:file?).with('foo/proxy_types').and_return(false) - @serializer.should_receive(:deserialize).with('root').and_return({:root => 'foo', :A => 'bar'}) + File.should_receive(:file?).with('foo/object_types').and_return(false) + @serializer.should_receive(:deserialize).with('root').and_return({:root => @foo, :A => @bar}) @store.load('foo').should == true - @store.root.should == 'foo' - @store.get('A').should == 'bar' + @store.root.should == @foo + @store.get('A').should == @bar end - + it "should load old yardoc format if .yardoc is a file" do File.should_receive(:directory?).with('foo').and_return(false) File.should_receive(:file?).with('foo').and_return(true) File.should_receive(:read_binary).with('foo').and_return('FOO') Marshal.should_receive(:load).with('FOO') @store.load('foo') end - + it "should load new yardoc format if .yardoc is a directory" do File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/checksums').and_return(false) File.should_receive(:file?).with('foo/proxy_types').and_return(false) + File.should_receive(:file?).with('foo/object_types').and_return(false) File.should_receive(:file?).with('foo/objects/root.dat').and_return(false) @store.load('foo').should == true end - + it "should return true if .yardoc is loaded (file)" do File.should_receive(:directory?).with('myyardoc').and_return(false) File.should_receive(:file?).with('myyardoc').and_return(true) File.should_receive(:read_binary).with('myyardoc').and_return(Marshal.dump('')) @store.load('myyardoc').should == true @@ -46,168 +50,214 @@ it "should return true if .yardoc is loaded (directory)" do File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/checksums').and_return(false) File.should_receive(:file?).with('foo/proxy_types').and_return(false) + File.should_receive(:file?).with('foo/object_types').and_return(false) File.should_receive(:file?).with('foo/objects/root.dat').and_return(false) @store.load('foo').should == true end it "should return false if .yardoc does not exist" do @store.load('NONEXIST').should == false end - + it "should return false if there is no file to load" do @store.load(nil).should == false end - + it "should load checksums if they exist" do File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/checksums').and_return(true) File.should_receive(:file?).with('foo/proxy_types').and_return(false) File.should_receive(:file?).with('foo/objects/root.dat').and_return(false) + File.should_receive(:file?).with('foo/object_types').and_return(false) File.should_receive(:readlines).with('foo/checksums').and_return([ 'file1 CHECKSUM1', ' file2 CHECKSUM2 ' ]) @store.load('foo').should == true @store.checksums.should == {'file1' => 'CHECKSUM1', 'file2' => 'CHECKSUM2'} end - + it "should load proxy_types if they exist" do File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/checksums').and_return(false) File.should_receive(:file?).with('foo/proxy_types').and_return(true) + File.should_receive(:file?).with('foo/object_types').and_return(false) File.should_receive(:file?).with('foo/objects/root.dat').and_return(false) File.should_receive(:read_binary).with('foo/proxy_types').and_return(Marshal.dump({'a' => 'b'})) @store.load('foo').should == true @store.proxy_types.should == {'a' => 'b'} end it "should load root object if it exists" do File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/checksums').and_return(false) File.should_receive(:file?).with('foo/proxy_types').and_return(false) + File.should_receive(:file?).with('foo/object_types').and_return(false) File.should_receive(:file?).with('foo/objects/root.dat').and_return(true) - File.should_receive(:read_binary).with('foo/objects/root.dat').and_return(Marshal.dump('foo')) + File.should_receive(:read_binary).with('foo/objects/root.dat').and_return(Marshal.dump(@foo)) @store.load('foo').should == true - @store.root.should == 'foo' + @store.root.should == @foo end end - + describe '#save' do before do @store.stub!(:write_proxy_types) @store.stub!(:write_checksums) @store.stub!(:destroy) end - + after do Registry.single_object_db = nil end - + def saves_to_singledb @serializer.should_receive(:serialize).once.with(instance_of(Hash)) @store.save(true, 'foo') end - + def add_items(n) - n.times {|i| @store[i.to_s] = 'foo' } + n.times {|i| @store[i.to_s] = @foo } end - + def saves_to_multidb times = @store.keys.size @serializer.should_receive(:serialize).exactly(times).times @store.save(true, 'foo') @last = times end - + it "should save as single object db if single_object_db is nil and there are less than 3000 objects" do Registry.single_object_db = nil add_items(100) saves_to_singledb end - + it "should save as single object db if single_object_db is nil and there are more than 3000 objects" do Registry.single_object_db = nil add_items(5000) saves_to_singledb end - + it "should save as single object db if single_object_db is true (and any amount of objects)" do Registry.single_object_db = true add_items(100) saves_to_singledb add_items(5000) saves_to_singledb end - + it "should never save as single object db if single_object_db is false" do Registry.single_object_db = false add_items(100) saves_to_multidb add_items(5000) saves_to_multidb end end - + describe '#put' do it "should assign values" do - @store.put(:YARD, true) - @store.get(:YARD).should == true + @store.put(:YARD, @foo) + @store.get(:YARD).should == @foo end - + it "should treat '' as root" do - @store.put('', 'value') - @store.get(:root).should == 'value' + @store.put('', @foo) + @store.get(:root).should == @foo end end - + describe '#get' do it "should hit cache if object exists" do - @store.put(:YARD, true) - @store.get(:YARD).should == true + @store.put(:YARD, @foo) + @store.get(:YARD).should == @foo end - + it "should hit backstore on cache miss and cache is not fully loaded" do serializer = mock(:serializer) - serializer.should_receive(:deserialize).once.with(:YARD).and_return('foo') + serializer.should_receive(:deserialize).once.with(:YARD).and_return(@foo) @store.load('foo') @store.instance_variable_set("@loaded_objects", 0) @store.instance_variable_set("@available_objects", 100) @store.instance_variable_set("@serializer", serializer) - @store.get(:YARD).should == 'foo' - @store.get(:YARD).should == 'foo' + @store.get(:YARD).should == @foo + @store.get(:YARD).should == @foo @store.instance_variable_get("@loaded_objects").should == 1 end end - + [:keys, :values].each do |item| describe "##{item}" do it "should load entire database if reload=true" do File.should_receive(:directory?).with('foo').and_return(true) @store.load('foo') @store.should_receive(:load_all) @store.send(item, true) end - + it "should not load entire database if reload=false" do File.should_receive(:directory?).with('foo').and_return(true) @store.load('foo') @store.should_not_receive(:load_all) @store.send(item, false) end end end - + + describe '#paths_for_type' do + after { Registry.clear } + + it "should set all object types if not set by object_types" do + File.should_receive(:directory?).with('foo').and_return(true) + File.should_receive(:file?).with('foo/checksums').and_return(false) + File.should_receive(:file?).with('foo/proxy_types').and_return(false) + File.should_receive(:file?).with('foo/object_types').and_return(false) + @serializer.should_receive(:deserialize).with('root').and_return({:'A#foo' => @foo, :A => @bar}) + @store.load('foo') + @store.paths_for_type(:method).should == ['#foo'] + @store.paths_for_type(:class).should == ['Bar'] + end + + it "should keep track of types when assigning values" do + @store.put(:abc, @foo) + @store.paths_for_type(@foo.type).should == ['abc'] + end + + it "should reassign path if type changes" do + foo = CodeObjects::ClassObject.new(:root, :Foo) + @store.put('Foo', foo) + @store.get('Foo').type.should == :class + @store.paths_for_type(:class).should == ["Foo"] + foo = CodeObjects::ModuleObject.new(:root, :Foo) + @store.put('Foo', foo) + @store.get('Foo').type.should == :module + @store.paths_for_type(:class).should == [] + @store.paths_for_type(:module).should == ["Foo"] + end + end + + describe '#values_for_type' do + it "should return all objects with type" do + @store.put(:abc, @foo) + @store.values_for_type(@foo.type).should == [@foo] + end + end + describe '#load_all' do it "should load the entire database" do foomock = mock(:Foo) barmock = mock(:Bar) + foomock.stub!(:type).and_return(:class) + barmock.stub!(:type).and_return(:class) foomock.should_receive(:path).and_return('Foo') barmock.should_receive(:path).and_return('Bar') File.should_receive(:directory?).with('foo').and_return(true) File.should_receive(:file?).with('foo/proxy_types').and_return(false) + File.should_receive(:file?).with('foo/object_types').and_return(false) File.should_receive(:file?).with('foo/checksums').and_return(false) File.should_receive(:file?).with('foo/objects/root.dat').and_return(false) @store.should_receive(:all_disk_objects).at_least(1).times.and_return(['foo/objects/foo', 'foo/objects/bar']) @store.load('foo') serializer = @store.instance_variable_get("@serializer") @@ -218,11 +268,11 @@ @store.instance_variable_get("@loaded_objects").should == 2 @store[:Foo].should == foomock @store[:Bar].should == barmock end end - + describe '#destroy' do it "should destroy file ending in .yardoc when force=false" do File.should_receive(:file?).with('foo.yardoc').and_return(true) File.should_receive(:unlink).with('foo.yardoc') @store.instance_variable_set("@file", 'foo.yardoc') @@ -242,10 +292,10 @@ File.should_not_receive(:unlink).with('foo') FileUtils.should_not_receive(:rm_rf).with('foo') @store.instance_variable_set("@file", 'foo') @store.destroy.should == false end - + it "should destroy any file/dir when force=true" do File.should_receive(:file?).with('foo').and_return(true) File.should_receive(:unlink).with('foo') @store.instance_variable_set("@file", 'foo') @store.destroy(true).should == true