1+ using  System . Text . Json ; 
2+ using  ModelContextProtocol . Protocol ; 
3+ 
4+ namespace  ModelContextProtocol . Tests . Protocol ; 
5+ 
6+ public  class  ContentBlockTests 
7+ { 
8+     [ Fact ] 
9+     public  void  ResourceLinkBlock_SerializationRoundTrip_PreservesAllProperties ( ) 
10+     { 
11+         // Arrange 
12+         var  original  =  new  ResourceLinkBlock 
13+         { 
14+             Uri  =  "https://example.com/resource" , 
15+             Name  =  "Test Resource" , 
16+             Description  =  "A test resource for validation" , 
17+             MimeType  =  "text/plain" , 
18+             Size  =  1024 
19+         } ; 
20+ 
21+         // Act - Serialize to JSON 
22+         string  json  =  JsonSerializer . Serialize ( original ,  McpJsonUtilities . DefaultOptions ) ; 
23+         
24+         // Act - Deserialize back from JSON 
25+         var  deserialized  =  JsonSerializer . Deserialize < ContentBlock > ( json ,  McpJsonUtilities . DefaultOptions ) ; 
26+ 
27+         // Assert 
28+         Assert . NotNull ( deserialized ) ; 
29+         var  resourceLink  =  Assert . IsType < ResourceLinkBlock > ( deserialized ) ; 
30+         
31+         Assert . Equal ( original . Uri ,  resourceLink . Uri ) ; 
32+         Assert . Equal ( original . Name ,  resourceLink . Name ) ; 
33+         Assert . Equal ( original . Description ,  resourceLink . Description ) ; 
34+         Assert . Equal ( original . MimeType ,  resourceLink . MimeType ) ; 
35+         Assert . Equal ( original . Size ,  resourceLink . Size ) ; 
36+         Assert . Equal ( "resource_link" ,  resourceLink . Type ) ; 
37+     } 
38+ 
39+     [ Fact ] 
40+     public  void  ResourceLinkBlock_DeserializationWithMinimalProperties_Succeeds ( ) 
41+     { 
42+         // Arrange - JSON with only required properties 
43+         const  string  Json  =  """ 
44+             { 
45+                 "type": "resource_link", 
46+                 "uri": "https://example.com/minimal", 
47+                 "name": "Minimal Resource" 
48+             } 
49+             """ ; 
50+ 
51+         // Act 
52+         var  deserialized  =  JsonSerializer . Deserialize < ContentBlock > ( Json ,  McpJsonUtilities . DefaultOptions ) ; 
53+ 
54+         // Assert 
55+         Assert . NotNull ( deserialized ) ; 
56+         var  resourceLink  =  Assert . IsType < ResourceLinkBlock > ( deserialized ) ; 
57+         
58+         Assert . Equal ( "https://example.com/minimal" ,  resourceLink . Uri ) ; 
59+         Assert . Equal ( "Minimal Resource" ,  resourceLink . Name ) ; 
60+         Assert . Null ( resourceLink . Description ) ; 
61+         Assert . Null ( resourceLink . MimeType ) ; 
62+         Assert . Null ( resourceLink . Size ) ; 
63+         Assert . Equal ( "resource_link" ,  resourceLink . Type ) ; 
64+     } 
65+ 
66+     [ Fact ] 
67+     public  void  ResourceLinkBlock_DeserializationWithoutName_ThrowsJsonException ( ) 
68+     { 
69+         // Arrange - JSON missing the required "name" property 
70+         const  string  Json  =  """ 
71+             { 
72+                 "type": "resource_link", 
73+                 "uri": "https://example.com/missing-name" 
74+             } 
75+             """ ; 
76+ 
77+         // Act & Assert 
78+         var  exception  =  Assert . Throws < JsonException > ( ( )  => 
79+             JsonSerializer . Deserialize < ContentBlock > ( Json ,  McpJsonUtilities . DefaultOptions ) ) ; 
80+         
81+         Assert . Contains ( "Name must be provided for 'resource_link' type" ,  exception . Message ) ; 
82+     } 
83+ } 
0 commit comments