@@ -61,9 +61,61 @@ public int Run()
6161 Flat_equal_nested_lambdas_with_captures_are_structurally_equal_and_hash_equal ( ) ;
6262 Flat_standalone_parameters_use_name_in_structural_equality ( ) ;
6363 Flat_structural_hash_supports_dictionary_lookup ( ) ;
64+ Can_compile_nullable_boolean_and ( ) ;
6465 Can_compile_shifts_with_nullable_shift_count ( ) ;
6566
66- return 45 ;
67+ return 46 ;
68+ }
69+
70+ private static int AndInts ( int left , int right ) => left & right ;
71+
72+ public void Can_compile_nullable_boolean_and ( )
73+ {
74+ var left = Parameter ( typeof ( bool ? ) , "left" ) ;
75+ var right = Parameter ( typeof ( bool ? ) , "right" ) ;
76+ var and = And ( left , right ) ;
77+ Asserts . AreEqual ( typeof ( bool ? ) , and . Type ) ;
78+
79+ var lambda = Lambda < Func < bool ? , bool ? , bool ? > > ( and , left , right ) ;
80+ var fast = lambda . CompileFast ( true ) ;
81+ Asserts . IsNotNull ( fast ) ;
82+ var sys = lambda . CompileSys ( ) ;
83+
84+ void AssertResult ( bool ? leftValue , bool ? rightValue , bool ? expected )
85+ {
86+ var sysResult = sys ( leftValue , rightValue ) ;
87+ Asserts . AreEqual ( expected , sysResult ) ;
88+ Asserts . AreEqual ( sysResult , fast ( leftValue , rightValue ) ) ;
89+ }
90+
91+ AssertResult ( true , true , true ) ;
92+ AssertResult ( true , false , false ) ;
93+ AssertResult ( false , true , false ) ;
94+ AssertResult ( false , false , false ) ;
95+ AssertResult ( true , null , null ) ;
96+ AssertResult ( false , null , false ) ;
97+ AssertResult ( null , true , null ) ;
98+ AssertResult ( null , false , false ) ;
99+ AssertResult ( null , null , null ) ;
100+
101+ var andWithNullMethod = And ( left , right , ( MethodInfo ) null ) ;
102+ Asserts . AreEqual ( typeof ( bool ? ) , andWithNullMethod . Type ) ;
103+ var nullMethodLambda = Lambda < Func < bool ? , bool ? , bool ? > > ( andWithNullMethod , left , right ) ;
104+ var nullMethodFast = nullMethodLambda . CompileFast ( true ) ;
105+ Asserts . IsNotNull ( nullMethodFast ) ;
106+ var nullMethodSys = nullMethodLambda . CompileSys ( ) ;
107+ Asserts . AreEqual ( nullMethodSys ( false , null ) , nullMethodFast ( false , null ) ) ;
108+
109+ var nonNullableLeft = Parameter ( typeof ( bool ) , "nonNullableLeft" ) ;
110+ Asserts . Throws < InvalidOperationException > ( ( ) =>
111+ And ( nonNullableLeft , right , ( MethodInfo ) null ) ) ;
112+ Asserts . Throws < InvalidOperationException > ( ( ) =>
113+ And ( left , Parameter ( typeof ( int ? ) , "unrelatedRight" ) , ( MethodInfo ) null ) ) ;
114+
115+ var incompatibleMethod = typeof ( LightExpressionTests ) . GetMethod (
116+ nameof ( AndInts ) , BindingFlags . Static | BindingFlags . NonPublic ) ;
117+ Asserts . IsNotNull ( incompatibleMethod ) ;
118+ Asserts . Throws < InvalidOperationException > ( ( ) => And ( left , right , incompatibleMethod ) ) ;
67119 }
68120
69121 public void Can_compile_shifts_with_nullable_shift_count ( )
@@ -72,10 +124,15 @@ public void Can_compile_shifts_with_nullable_shift_count()
72124
73125 var leftShift = LeftShift ( Constant ( 16 ) , shift ) ;
74126 Asserts . AreEqual ( typeof ( int ? ) , leftShift . Type ) ;
75- var leftShiftFunc = Lambda < Func < int ? , int ? > > ( leftShift , shift ) . CompileFast ( true ) ;
76- Asserts . IsNotNull ( leftShiftFunc ) ;
77- Asserts . AreEqual ( 64 , leftShiftFunc ( 2 ) ) ;
78- Asserts . AreEqual ( null , leftShiftFunc ( null ) ) ;
127+ var lambda = Lambda < Func < int ? , int ? > > ( leftShift , shift ) ;
128+ var fast = lambda . CompileFast ( true ) ;
129+ Asserts . IsNotNull ( fast ) ;
130+ var sys = lambda . CompileSys ( ) ;
131+
132+ Asserts . AreEqual ( 64 , fast ( 2 ) ) ;
133+ Asserts . AreEqual ( 64 , sys ( 2 ) ) ;
134+ Asserts . AreEqual ( null , fast ( null ) ) ;
135+ Asserts . AreEqual ( null , sys ( null ) ) ;
79136 }
80137
81138 public void Can_compile_lambda_without_converting_to_expression ( )
0 commit comments