@@ -132,3 +132,61 @@ def test_error_invalid_values(data, all_arithmetic_operators):
132132 )
133133 with pytest .raises (TypeError , match = msg ):
134134 ops (pd .Series ("foo" , index = s .index ))
135+
136+ # Tests for BooleanArray logical and comparison operations
137+ # -------------------------------------------------------------------------
138+
139+ @pytest .mark .parametrize (
140+ "opname, expected" ,[
141+ ("and_" , [True , False , None , False , False , None , None , None , None ]),
142+ ("or_" , [True , True , None , True , False , None , None , None , None ]),
143+ ("xor" , [False , True , None , True , False , None , None , None , None ]),
144+ ],ids = ["and" , "or" , "xor" ],
145+ )
146+
147+ def test_logical_ops (left_array , right_array , opname , expected ):
148+ """Test bitwise logical operations (&, |, ^) for BooleanArray."""
149+ op = getattr (operator , opname )
150+ result = op (left_array , right_array )
151+ expected = pd .array (expected , dtype = "boolean" )
152+ tm .assert_extension_array_equal (result , expected )
153+
154+ def test_invert (left_array ):
155+ """Test inversion (~) for BooleanArray."""
156+ result = operator .invert (left_array )
157+ expected = pd .array (
158+ [False , False , False , True , True , True , None , None , None ],
159+ dtype = "boolean" ,
160+ )
161+ tm .assert_extension_array_equal (result , expected )
162+
163+ @pytest .mark .parametrize (
164+ "opname, expected" ,[
165+ ("eq" , [True , False , None , False , True , None , None , None , None ]),
166+ ("ne" , [False , True , None , True , False , None , None , None , None ]),
167+ ("gt" , [False , True , None , False , False , None , None , None , None ]),
168+ ("lt" , [False , False , None , False , False , None , None , None , None ]),
169+ ("ge" , [True , False , None , True , True , None , None , None , None ]),
170+ ("le" , [True , True , None , False , True , None , None , None , None ]),
171+ ],ids = ["==" , "!=" , ">" , "<" , ">=" , "<=" ],
172+ )
173+ def test_comparison_ops (left_array , right_array , opname , expected ):
174+ """Test comparison operators (==, !=, >, <, >=, <=) for BooleanArray."""
175+ op = getattr (operator , opname )
176+ result = op (left_array , right_array )
177+ expected = pd .array (expected , dtype = "boolean" )
178+ tm .assert_extension_array_equal (result , expected )
179+
180+ def test_logical_with_scalar (left_array ):
181+ """Test logical ops with scalar values (True/False/NA)."""
182+ result_true = left_array & True
183+ result_false = left_array | False
184+ result_na = left_array ^ pd .NA
185+
186+ expected_true = left_array # '&' True→Same
187+ expected_false = left_array # '|' False→same
188+ expected_na = pd .array ([None ] * len (left_array ), dtype = "boolean" ) # XOR NA→All NA
189+
190+ tm .assert_extension_array_equal (result_true , expected_true )
191+ tm .assert_extension_array_equal (result_false , expected_false )
192+ tm .assert_extension_array_equal (result_na , expected_na )
0 commit comments