| 
									
										
										
										
											2023-11-26 15:36:27 -08:00
										 |  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | require "extend/blank" | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-18 15:11:11 -08:00
										 |  |  |  | RSpec.describe Object do | 
					
						
							| 
									
										
										
										
											2023-11-26 15:36:27 -08:00
										 |  |  |  |   let(:empty_true) do | 
					
						
							|  |  |  |  |     Class.new(described_class) do | 
					
						
							| 
									
										
										
										
											2025-07-14 14:48:08 +01:00
										 |  |  |  |       # This API is intentionally non-ideal for testing. | 
					
						
							|  |  |  |  |       # rubocop:disable Naming/PredicateMethod | 
					
						
							| 
									
										
										
										
											2023-11-26 15:36:27 -08:00
										 |  |  |  |       def empty? | 
					
						
							|  |  |  |  |         0
 | 
					
						
							|  |  |  |  |       end | 
					
						
							| 
									
										
										
										
											2025-07-14 14:48:08 +01:00
										 |  |  |  |       # rubocop:enable Naming/PredicateMethod | 
					
						
							| 
									
										
										
										
											2023-11-26 15:36:27 -08:00
										 |  |  |  |     end | 
					
						
							|  |  |  |  |   end | 
					
						
							|  |  |  |  |   let(:empty_false) do | 
					
						
							|  |  |  |  |     Class.new(described_class) do | 
					
						
							|  |  |  |  |       def empty? | 
					
						
							| 
									
										
										
										
											2023-12-14 02:52:30 +00:00
										 |  |  |  |         false | 
					
						
							| 
									
										
										
										
											2023-11-26 15:36:27 -08:00
										 |  |  |  |       end | 
					
						
							|  |  |  |  |     end | 
					
						
							|  |  |  |  |   end | 
					
						
							|  |  |  |  |   let(:blank) { [empty_true.new, nil, false, "", "   ", "  \n\t  \r ", " ", "\u00a0", [], {}] } | 
					
						
							|  |  |  |  |   let(:present) { [empty_false.new, described_class.new, true, 0, 1, "a", [nil], { nil => 0 }, Time.now] } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   describe ".blank?" do | 
					
						
							|  |  |  |  |     it "checks if an object is blank" do | 
					
						
							|  |  |  |  |       blank.each { |v| expect(v.blank?).to be true } | 
					
						
							|  |  |  |  |       present.each { |v| expect(v.blank?).to be false } | 
					
						
							|  |  |  |  |     end | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     it "checks if an object is blank with bundled string encodings" do | 
					
						
							|  |  |  |  |       Encoding.list.reject(&:dummy?).each do |encoding| | 
					
						
							|  |  |  |  |         expect(" ".encode(encoding).blank?).to be true | 
					
						
							|  |  |  |  |         expect("a".encode(encoding).blank?).to be false | 
					
						
							|  |  |  |  |       end | 
					
						
							|  |  |  |  |     end | 
					
						
							|  |  |  |  |   end | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   describe ".present?" do | 
					
						
							|  |  |  |  |     it "checks if an object is present" do | 
					
						
							|  |  |  |  |       blank.each { |v| expect(v.present?).to be false } | 
					
						
							|  |  |  |  |       present.each { |v| expect(v.present?).to be true } | 
					
						
							|  |  |  |  |     end | 
					
						
							|  |  |  |  |   end | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   describe ".presence" do | 
					
						
							|  |  |  |  |     it "returns the object if present, or nil" do | 
					
						
							|  |  |  |  |       blank.each { |v| expect(v.presence).to be_nil } | 
					
						
							|  |  |  |  |       present.each { |v| expect(v.presence).to be v } | 
					
						
							|  |  |  |  |     end | 
					
						
							|  |  |  |  |   end | 
					
						
							|  |  |  |  | end |