1+ using Moq ;
2+ using Newtonsoft . Json ;
3+ using System ;
4+ using Xunit ;
5+
6+ namespace TensionDev . UUID . Serialization . JsonNet . Tests
7+ {
8+ public class TestUuidJsonNetConverter : IDisposable
9+ {
10+ private bool disposedValue ;
11+
12+ private readonly UuidJsonNetConverter _converter ;
13+
14+ public TestUuidJsonNetConverter ( )
15+ {
16+ _converter = new UuidJsonNetConverter ( ) ;
17+ }
18+
19+ [ Fact ]
20+ public void TestReadJson ( )
21+ {
22+ // Arrange
23+ const string validUuidString = "00000000-0000-0000-0000-000000000000" ;
24+ var readerMock = new Mock < JsonReader > ( MockBehavior . Strict ) ;
25+ readerMock . SetupGet ( r => r . TokenType ) . Returns ( JsonToken . String ) ;
26+ readerMock . SetupGet ( r => r . Value ) . Returns ( ( object ) validUuidString ) ;
27+
28+ var converter = new UuidJsonNetConverter ( ) ;
29+
30+ // existingValue must be non-nullable; obtain an instance via Parse to satisfy parameter constraints.
31+ Uuid existingValue = Uuid . Parse ( validUuidString ) ;
32+ var serializer = new JsonSerializer ( ) ;
33+
34+ // Act
35+ Uuid result = converter . ReadJson ( readerMock . Object , typeof ( Uuid ) , existingValue , hasExistingValue : false , serializer : serializer ) ;
36+
37+ // Assert
38+ Assert . NotNull ( result ) ;
39+ Assert . Equal ( validUuidString , result . ToString ( ) ) ;
40+ }
41+
42+ [ Fact ]
43+ public void TestWriteJson ( )
44+ {
45+ var writerMock = new Mock < JsonWriter > ( MockBehavior . Strict ) ;
46+ object ? capturedValue = null ;
47+ // Setup to accept any object and capture it
48+ writerMock . Setup ( w => w . WriteValue ( It . IsAny < string ? > ( ) ) )
49+ . Callback < string ? > ( v => capturedValue = v )
50+ . Verifiable ( ) ;
51+
52+ var serializerMock = new Mock < JsonSerializer > ( MockBehavior . Loose ) ;
53+
54+ // Attempt to create an instance of the Uuid type.
55+ // This will succeed for structs and for classes with a public parameterless constructor.
56+ // If it fails, mark test inconclusive because we cannot safely fabricate the dependency.
57+ TensionDev . UUID . Uuid value ;
58+ try
59+ {
60+ var instance = Activator . CreateInstance ( typeof ( TensionDev . UUID . Uuid ) ) ;
61+ if ( instance == null )
62+ {
63+ // This can happen if the type is a non-instantiable class (abstract) or Activator returns null.
64+ Assert . Fail ( "Could not create an instance of TensionDev.UUID.Uuid (Activator.CreateInstance returned null). Provide a parameterless constructor or update the test environment." ) ;
65+ return ;
66+ }
67+
68+ value = ( TensionDev . UUID . Uuid ) instance ;
69+ }
70+ catch ( Exception ex )
71+ {
72+ // xUnit does not provide Assert.Inconclusive; use Assert.Fail to report the diagnostic and stop the test.
73+ Assert . Fail ( "Could not create an instance of TensionDev.UUID.Uuid: " + ex . Message ) ;
74+ return ;
75+ }
76+
77+ // Act
78+ _converter . WriteJson ( writerMock . Object , value , serializerMock . Object ) ;
79+
80+ // Assert
81+ writerMock . Verify ( w => w . WriteValue ( It . IsAny < string ? > ( ) ) , Times . Once , "WriteValue should be called exactly once." ) ;
82+ // Ensure the captured value matches the value.ToString() result
83+ var expected = value . ToString ( ) ;
84+ Assert . NotNull ( capturedValue ) ;
85+ Assert . Equal ( expected , capturedValue ? . ToString ( ) ) ;
86+ }
87+
88+ protected virtual void Dispose ( bool disposing )
89+ {
90+ if ( ! disposedValue )
91+ {
92+ if ( disposing )
93+ {
94+ // TODO: dispose managed state (managed objects)
95+ }
96+
97+ // TODO: free unmanaged resources (unmanaged objects) and override finalizer
98+ // TODO: set large fields to null
99+ disposedValue = true ;
100+ }
101+ }
102+
103+ // // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
104+ // ~TestUuidJsonNetConverter()
105+ // {
106+ // // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
107+ // Dispose(disposing: false);
108+ // }
109+
110+ public void Dispose ( )
111+ {
112+ // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
113+ Dispose ( disposing : true ) ;
114+ GC . SuppressFinalize ( this ) ;
115+ }
116+ }
117+ }
0 commit comments