| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -3,14 +3,65 @@ require "./spec_helper" | 
															
														
														
													
														
															
																 | 
																 | 
																describe Crystal::Scatter do | 
																 | 
																 | 
																describe Crystal::Scatter do | 
															
														
														
													
														
															
																 | 
																 | 
																  # TODO: Write tests | 
																 | 
																 | 
																  # TODO: Write tests | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																  it "add elements" do | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg = Crystal::Scatter::RingGraph.new  | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg.add(UInt64.new(1),[0,0,0,0,0,0],"OSD0") | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg.add(UInt64.new(1),[0,0,0,0,0,1],"OSD1") | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg.add(UInt64.new(1),[0,0,0,0,1,0],"OSD2") | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg.get_weight.should eq(3) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg.generate_ring(BigRational.new(1)) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg[0][0][0][0][0][0].range_effector.not_nil!.[0].should eq(0) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    rg[0][0][0][0][1][0].range_effector.not_nil!.[1].should eq(UInt64::MAX) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																  end | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    it "add elements to RingGraphs" do | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg = Crystal::Scatter::RingGraph.new  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg.add(UInt64.new(1),[0,0,0,0,0,0],"OSD0") | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg.add(UInt64.new(1),[0,0,0,0,0,1],"OSD1") | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg.add(UInt64.new(1),[0,0,0,0,1,0],"OSD2") | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg.get_weight.should eq(3) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg.generate_ring(BigRational.new(1)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg[0][0][0][0][0][0].range_effector.not_nil!.[0].should eq(0) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        rg[0][0][0][0][1][0].range_effector.not_nil!.[1].should eq(UInt64::MAX) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    it "hashes data fast" do | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        v = Crystal::Scatter::MetaRing.new(3) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        time = Time.now | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        (1..100).each do |numb| | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            v.hash(numb.to_s) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        t = (Time.now - time) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        (t.milliseconds <= 1).should be_true | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    it "hashes data good" do | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        v = Crystal::Scatter::MetaRing.new(3) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        hash_nb =1000000 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        store = Hash(UInt64, Int32).new | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        (1..hash_nb).each do |numb| | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            h = v.hash(numb.to_s) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            nb=store.fetch(h,0) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            store[h]=nb+1 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																         | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																         | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        conflicts = hash_nb-store.size | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        (conflicts <= 100).should be_true | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        mod_array = Array(Int32).new(1000,0) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        slice_array = Array(Int32).new(1000,0) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        store.each_key do |key| | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            key_mod = key%1000 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            mod_array[key_mod]+=1 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            key_slice = key/(UInt64::MAX/1000) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            slice_array[key_slice]+=1 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        good_mod = true | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        good_slice = true | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        mod_array.each do |v| | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            good_mod&=(v > (hash_nb/1000*4/5)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        slice_array.each do |v| | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            good_slice&=(v > (hash_nb/1000*4/5)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        good_mod.should be_true | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        good_slice.should be_true | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    end | 
															
														
														
													
														
															
																 | 
																 | 
																end | 
																 | 
																 | 
																end |