@@ -276,10 +276,157 @@ public void RenderField_Should_Handle_Empty_Renderer_Collection()
276276 // Should return unsupported field type message
277277 }
278278
279+ [ Fact ]
280+ public void RenderField_Should_Detect_Correct_Type_For_Simple_MemberExpression ( )
281+ {
282+ // Arrange
283+ var model = new TestModel { Name = "Test" } ;
284+ var field = new FieldConfiguration < TestModel , string ? > ( x => x . Name ) ;
285+ var wrapper = new FieldConfigurationWrapper < TestModel , string ? > ( field ) ;
286+ Type ? detectedType = null ;
287+
288+ var mockRenderer = A . Fake < IFieldRenderer > ( ) ;
289+ A . CallTo ( ( ) => mockRenderer . CanRender ( A < Type > . _ , A < IFieldConfiguration < object , object > > . _ ) )
290+ . ReturnsLazily ( ( Type type , IFieldConfiguration < object , object > _ ) =>
291+ {
292+ detectedType = type ;
293+ return true ;
294+ } ) ;
295+ A . CallTo ( ( ) => mockRenderer . Render ( A < IFieldRenderContext < TestModel > > . _ ) )
296+ . Returns ( builder => builder . AddContent ( 0 , "Test" ) ) ;
297+
298+ var service = new FieldRendererService ( new [ ] { mockRenderer } , _serviceProvider ) ;
299+ var onValueChanged = EventCallback . Factory . Create < object ? > ( this , _ => { } ) ;
300+ var onDependencyChanged = EventCallback . Factory . Create ( this , ( ) => { } ) ;
301+
302+ // Act
303+ service . RenderField ( model , wrapper , onValueChanged , onDependencyChanged ) ;
304+
305+ // Assert
306+ // The GetActualFieldType method in FieldRendererService handles UnaryExpression
307+ // and returns the underlying property type
308+ detectedType . ShouldBe ( typeof ( string ) ) ;
309+ }
310+
311+
312+ [ Fact ]
313+ public void RenderField_Should_Detect_Correct_Type_For_Value_Type_MemberExpression ( )
314+ {
315+ // Arrange
316+ var model = new TestModel { Value = 42 } ;
317+ var field = new FieldConfiguration < TestModel , int > ( x => x . Value ) ;
318+ var wrapper = new FieldConfigurationWrapper < TestModel , int > ( field ) ;
319+ Type ? detectedType = null ;
320+
321+ var mockRenderer = A . Fake < IFieldRenderer > ( ) ;
322+ A . CallTo ( ( ) => mockRenderer . CanRender ( A < Type > . _ , A < IFieldConfiguration < object , object > > . _ ) )
323+ . ReturnsLazily ( ( Type type , IFieldConfiguration < object , object > _ ) =>
324+ {
325+ detectedType = type ;
326+ return true ;
327+ } ) ;
328+ A . CallTo ( ( ) => mockRenderer . Render ( A < IFieldRenderContext < TestModel > > . _ ) )
329+ . Returns ( builder => builder . AddContent ( 0 , "Test" ) ) ;
330+
331+ var service = new FieldRendererService ( new [ ] { mockRenderer } , _serviceProvider ) ;
332+ var onValueChanged = EventCallback . Factory . Create < object ? > ( this , _ => { } ) ;
333+ var onDependencyChanged = EventCallback . Factory . Create ( this , ( ) => { } ) ;
334+
335+ // Act
336+ service . RenderField ( model , wrapper , onValueChanged , onDependencyChanged ) ;
337+
338+ // Assert
339+ // The GetActualFieldType method detects int from the UnaryExpression
340+ detectedType . ShouldBe ( typeof ( int ) ) ;
341+ }
342+
343+ [ Fact ]
344+ public void RenderField_Should_Detect_Correct_Type_For_Nullable_Type ( )
345+ {
346+ // Arrange
347+ var model = new TestModel { NullableValue = 42 } ;
348+ var field = new FieldConfiguration < TestModel , int ? > ( x => x . NullableValue ) ;
349+ var wrapper = new FieldConfigurationWrapper < TestModel , int ? > ( field ) ;
350+ Type ? detectedType = null ;
351+
352+ var mockRenderer = A . Fake < IFieldRenderer > ( ) ;
353+ A . CallTo ( ( ) => mockRenderer . CanRender ( A < Type > . _ , A < IFieldConfiguration < object , object > > . _ ) )
354+ . ReturnsLazily ( ( Type type , IFieldConfiguration < object , object > _ ) =>
355+ {
356+ detectedType = type ;
357+ return true ;
358+ } ) ;
359+ A . CallTo ( ( ) => mockRenderer . Render ( A < IFieldRenderContext < TestModel > > . _ ) )
360+ . Returns ( builder => builder . AddContent ( 0 , "Test" ) ) ;
361+
362+ var service = new FieldRendererService ( new [ ] { mockRenderer } , _serviceProvider ) ;
363+ var onValueChanged = EventCallback . Factory . Create < object ? > ( this , _ => { } ) ;
364+ var onDependencyChanged = EventCallback . Factory . Create ( this , ( ) => { } ) ;
365+
366+ // Act
367+ service . RenderField ( model , wrapper , onValueChanged , onDependencyChanged ) ;
368+
369+ // Assert
370+ detectedType . ShouldBe ( typeof ( int ? ) ) ;
371+ }
372+
373+
374+ [ Fact ]
375+ public void RenderField_Should_Use_Correct_ActualFieldType_In_Context ( )
376+ {
377+ // Arrange
378+ var model = new TestModel { DateCreated = DateTime . Now } ;
379+ var field = new FieldConfiguration < TestModel , DateTime > ( x => x . DateCreated ) ;
380+ var wrapper = new FieldConfigurationWrapper < TestModel , DateTime > ( field ) ;
381+ IFieldRenderContext < TestModel > ? capturedContext = null ;
382+
383+ var mockRenderer = A . Fake < IFieldRenderer > ( ) ;
384+ A . CallTo ( ( ) => mockRenderer . CanRender ( typeof ( DateTime ) , A < IFieldConfiguration < object , object > > . _ ) )
385+ . Returns ( true ) ;
386+ A . CallTo ( ( ) => mockRenderer . Render ( A < IFieldRenderContext < TestModel > > . _ ) )
387+ . ReturnsLazily ( ( IFieldRenderContext < TestModel > ctx ) =>
388+ {
389+ capturedContext = ctx ;
390+ return builder => builder . AddContent ( 0 , "Test" ) ;
391+ } ) ;
392+
393+ var service = new FieldRendererService ( new [ ] { mockRenderer } , _serviceProvider ) ;
394+ var onValueChanged = EventCallback . Factory . Create < object ? > ( this , _ => { } ) ;
395+ var onDependencyChanged = EventCallback . Factory . Create ( this , ( ) => { } ) ;
396+
397+ // Act
398+ service . RenderField ( model , wrapper , onValueChanged , onDependencyChanged ) ;
399+
400+ // Assert
401+ capturedContext . ShouldNotBeNull ( ) ;
402+ capturedContext . ActualFieldType . ShouldBe ( typeof ( DateTime ) ) ;
403+ }
404+
405+
406+ public enum TestEnum
407+ {
408+ Active ,
409+ Inactive ,
410+ Pending
411+ }
412+
413+ public class NestedModel
414+ {
415+ public string NestedProperty { get ; set ; } = string . Empty ;
416+ }
417+
279418 public class TestModel
280419 {
281420 public string ? Name { get ; set ; }
282421 public int Value { get ; set ; }
422+ public int ? NullableValue { get ; set ; }
423+ public DateTime DateCreated { get ; set ; }
424+ public DateTime ? DateModified { get ; set ; }
425+ public TestEnum Status { get ; set ; }
426+ public bool IsActive { get ; set ; }
427+ public decimal Price { get ; set ; }
428+ public List < string > Tags { get ; set ; } = new ( ) ;
429+ public NestedModel NestedModel { get ; set ; } = new ( ) ;
283430 }
284431
285432 private class FakeCustomRenderer : ICustomFieldRenderer < string >
0 commit comments