@@ -26,7 +26,7 @@ public void String_Equals(string? value, string compare, StringComparison? compa
2626
2727 [ Theory ]
2828 [ MemberData ( nameof ( Equitable_Data ) ) ]
29- public void Equitable_Equals < T > ( T value , T compare , bool expected )
29+ public void Equitable_Equals < T > ( T ? value , T compare , bool expected )
3030 where T : IEquatable < T >
3131 {
3232 // Arrange
@@ -37,6 +37,23 @@ public void Equitable_Equals<T>(T value, T compare, bool expected)
3737 Assert . Equal ( expected , areEquals ) ;
3838 }
3939
40+ [ Theory ]
41+ [ InlineData ( null , 0 , false ) ]
42+ [ InlineData ( null , 1 , false ) ]
43+ [ InlineData ( 0 , 0 , true ) ]
44+ [ InlineData ( 1 , 1 , true ) ]
45+ [ InlineData ( 0 , 1 , false ) ]
46+ [ InlineData ( 1 , 0 , false ) ]
47+ public void Equitable_Nulls_Equals ( int ? value1 , int compare , bool expected )
48+ {
49+ // Arrange
50+ // Act
51+ var areEquals = BuildInPredicates . Equal ( value1 , compare ) ;
52+
53+ // Assert
54+ Assert . Equal ( expected , areEquals ) ;
55+ }
56+
4057 [ Theory ]
4158 [ InlineData ( "" , "" , null , false ) ]
4259 [ InlineData ( "abc" , "abc" , null , false ) ]
@@ -57,7 +74,143 @@ public void String_NotEquals(string? value, string compare, StringComparison? co
5774 Assert . Equal ( expected , areEquals ) ;
5875 }
5976
60- public static IEnumerable < object [ ] > Equitable_Data ( )
77+ [ Theory ]
78+ [ MemberData ( nameof ( Equitable_Data ) ) ]
79+ public void Equitable_NotEquals < T > ( T ? value , T compare , bool notExpected )
80+ where T : IEquatable < T >
81+ {
82+ // Arrange
83+ var expected = ! notExpected ;
84+
85+ // Act
86+ var areEquals = BuildInPredicates . NotEqual ( value , compare ) ;
87+
88+ // Assert
89+ Assert . Equal ( expected , areEquals ) ;
90+ }
91+
92+ [ Theory ]
93+ [ InlineData ( null , 0 , true ) ]
94+ [ InlineData ( null , 1 , true ) ]
95+ [ InlineData ( 0 , 0 , false ) ]
96+ [ InlineData ( 1 , 1 , false ) ]
97+ [ InlineData ( 0 , 1 , true ) ]
98+ [ InlineData ( 1 , 0 , true ) ]
99+ public void Equitable_Nulls_NotEquals ( int ? value1 , int compare , bool expected )
100+ {
101+ // Arrange
102+ // Act
103+ var areEquals = BuildInPredicates . NotEqual ( value1 , compare ) ;
104+
105+ // Assert
106+ Assert . Equal ( expected , areEquals ) ;
107+ }
108+
109+ [ Theory ]
110+ [ InlineData ( "" , "" , null , true ) ]
111+ [ InlineData ( "abc" , "abc" , null , true ) ]
112+ [ InlineData ( "abc" , "abcdfg" , null , false ) ]
113+ [ InlineData ( "abc" , "ABC" , null , false ) ]
114+ [ InlineData ( "abc" , "ABC" , StringComparison . OrdinalIgnoreCase , true ) ]
115+ [ InlineData ( "abc" , "ABCdfg" , StringComparison . OrdinalIgnoreCase , false ) ]
116+ [ InlineData ( null , "" , null , false ) ]
117+ [ InlineData ( null , null , null , true ) ]
118+ [ InlineData ( null , "abc" , null , false ) ]
119+ [ InlineData ( "abc" , null , null , false ) ]
120+ public void String_BothEquals ( string ? value1 , string ? value2 , StringComparison ? comparison , bool expected )
121+ {
122+ // Arrange
123+ comparison ??= StringComparison . Ordinal ;
124+
125+ // Act
126+ var areEquals = BuildInPredicates . BothEqual ( value1 , value2 , comparison . Value ) ;
127+
128+ // Assert
129+ Assert . Equal ( expected , areEquals ) ;
130+ }
131+
132+ [ Theory ]
133+ [ MemberData ( nameof ( Equitable_Data ) ) ]
134+ public void Equitable_BothEquals < T > ( T value1 , T value2 , bool expected )
135+ where T : IEquatable < T >
136+ {
137+ // Arrange
138+ // Act
139+ var areEquals = BuildInPredicates . BothEqual ( value1 , value2 ) ;
140+
141+ // Assert
142+ Assert . Equal ( expected , areEquals ) ;
143+ }
144+
145+ [ Theory ]
146+ [ InlineData ( null , null , true ) ]
147+ [ InlineData ( 0 , null , false ) ]
148+ [ InlineData ( null , 0 , false ) ]
149+ [ InlineData ( 0 , 0 , true ) ]
150+ public void Equitable_Nulls_BothEquals ( int ? value1 , int ? value2 , bool expected )
151+ {
152+ // Arrange
153+ // Act
154+ var areEquals = BuildInPredicates . BothEqual ( value1 , value2 ) ;
155+
156+ // Assert
157+ Assert . Equal ( expected , areEquals ) ;
158+ }
159+
160+ [ Theory ]
161+ [ InlineData ( "" , "" , null , false ) ]
162+ [ InlineData ( "abc" , "abc" , null , false ) ]
163+ [ InlineData ( "abc" , "abcdfg" , null , true ) ]
164+ [ InlineData ( "abc" , "ABC" , null , true ) ]
165+ [ InlineData ( "abc" , "ABC" , StringComparison . OrdinalIgnoreCase , false ) ]
166+ [ InlineData ( "abc" , "ABCdfg" , StringComparison . OrdinalIgnoreCase , true ) ]
167+ [ InlineData ( null , "" , null , true ) ]
168+ [ InlineData ( null , null , null , false ) ]
169+ [ InlineData ( null , "abc" , null , true ) ]
170+ [ InlineData ( "abc" , null , null , true ) ]
171+ public void String_BothNotEquals ( string ? value1 , string ? value2 , StringComparison ? comparison , bool expected )
172+ {
173+ // Arrange
174+ comparison ??= StringComparison . Ordinal ;
175+
176+ // Act
177+ var areEquals = BuildInPredicates . BothNotEqual ( value1 , value2 , comparison . Value ) ;
178+
179+ // Assert
180+ Assert . Equal ( expected , areEquals ) ;
181+ }
182+
183+ [ Theory ]
184+ [ MemberData ( nameof ( Equitable_Data ) ) ]
185+ public void Equitable_BothNotEquals < T > ( T value1 , T value2 , bool notExpected )
186+ where T : IEquatable < T >
187+ {
188+ // Arrange
189+ var expected = ! notExpected ;
190+
191+ // Act
192+ var areEquals = BuildInPredicates . BothNotEqual ( value1 , value2 ) ;
193+
194+ // Assert
195+ Assert . Equal ( expected , areEquals ) ;
196+ }
197+
198+ [ Theory ]
199+ [ InlineData ( null , null , false ) ]
200+ [ InlineData ( 0 , null , true ) ]
201+ [ InlineData ( null , 0 , true ) ]
202+ [ InlineData ( 0 , 0 , false ) ]
203+ public void Equitable_Nulls_BothNotEquals ( int ? value1 , int ? value2 , bool expected )
204+ {
205+ // Arrange
206+ // Act
207+ var areEquals = BuildInPredicates . BothNotEqual ( value1 , value2 ) ;
208+
209+ // Assert
210+ Assert . Equal ( expected , areEquals ) ;
211+ }
212+
213+ public static IEnumerable < object ? [ ] > Equitable_Data ( )
61214 {
62215 yield return [ ( byte ) 1 , ( byte ) 1 , true ] ;
63216 yield return [ ( byte ) 1 , ( byte ) 2 , false ] ;
@@ -75,5 +228,9 @@ public static IEnumerable<object[]> Equitable_Data()
75228 yield return [ 1M , 2M , false ] ;
76229 yield return [ BigInteger . One , BigInteger . One , true ] ;
77230 yield return [ BigInteger . One , BigInteger . Zero , false ] ;
231+ yield return [ ( int ? ) 1 , ( int ? ) 1 , true ] ;
232+ yield return [ ( int ? ) 1 , ( int ? ) 2 , false ] ;
233+ yield return [ ( int ? ) null , ( int ? ) 1 , false ] ;
234+ yield return [ ( int ? ) null , ( int ? ) 0 , true ] ;
78235 }
79236}
0 commit comments