1- using NLightning . Domain . Protocol . ValueObjects ;
2-
31namespace NLightning . Domain . Tests . ValueObjects ;
42
53using Domain . Protocol . Constants ;
4+ using Domain . Protocol . ValueObjects ;
65
76public class BitcoinNetworkTests
87{
@@ -60,7 +59,7 @@ public void Given_NetworkInstance_When_ChainHashAccessed_Then_ReturnsCorrectHash
6059 NetworkConstants . Mainnet => ChainConstants . Main ,
6160 NetworkConstants . Testnet => ChainConstants . Testnet ,
6261 NetworkConstants . Regtest => ChainConstants . Regtest ,
63- _ => throw new Exception ( "Chain not supported." )
62+ _ => throw new InvalidOperationException ( "Chain not supported." )
6463 } ;
6564
6665 // When
@@ -77,7 +76,7 @@ public void Given_UnsupportedNetworkName_When_ChainHashAccessed_Then_ThrowsExcep
7776 var network = new BitcoinNetwork ( "unsupported" ) ;
7877
7978 // When & Then
80- Assert . Throws < Exception > ( ( ) => network . ChainHash ) ;
79+ Assert . Throws < InvalidOperationException > ( ( ) => network . ChainHash ) ;
8180 }
8281
8382 [ Fact ]
@@ -120,4 +119,132 @@ public void Given_TwoDifferentNetworkInstances_When_Compared_Then_AreNotEqual()
120119 Assert . False ( network1 . Equals ( network2 ) ) ;
121120 Assert . False ( network2 . Equals ( network1 ) ) ;
122121 }
122+
123+ [ Fact ]
124+ public void Builtin_Networks_ChainHash_Matches ( )
125+ {
126+ Assert . Equal ( ChainConstants . Main , BitcoinNetwork . Mainnet . ChainHash ) ;
127+ Assert . Equal ( ChainConstants . Testnet , BitcoinNetwork . Testnet . ChainHash ) ;
128+ Assert . Equal ( ChainConstants . Regtest , BitcoinNetwork . Regtest . ChainHash ) ;
129+ }
130+
131+ [ Fact ]
132+ public void Unregistered_CustomNetwork_Throws ( )
133+ {
134+ var net = new BitcoinNetwork ( "mycustomnet" ) ;
135+ Assert . Throws < InvalidOperationException > ( ( ) =>
136+ {
137+ var _ = net . ChainHash ;
138+ } ) ;
139+ }
140+
141+ [ Fact ]
142+ public void RegisterCustomNetwork_ReturnsExpectedChainHash ( )
143+ {
144+ var customChainHash = DummyChainHash ( 0x42 ) ;
145+ // Register
146+ var tmpNet = new BitcoinNetwork ( "mycustomnet" ) ;
147+ tmpNet . Register ( "mycustomnet" , customChainHash ) ;
148+
149+ var net = new BitcoinNetwork ( "mycustomnet" ) ;
150+ Assert . Equal ( customChainHash , net . ChainHash ) ;
151+ }
152+
153+ [ Fact ]
154+ public void Register_IsCaseInsensitive ( )
155+ {
156+ var customChainHash = DummyChainHash ( 0xDD ) ;
157+ var lower = "lowercase" ;
158+ var upper = "LOWERCASE" ;
159+
160+ var tmpNet = new BitcoinNetwork ( lower ) ;
161+ tmpNet . Register ( upper , customChainHash ) ;
162+
163+ var net1 = new BitcoinNetwork ( lower ) ;
164+ var net2 = new BitcoinNetwork ( upper ) ;
165+ Assert . Equal ( customChainHash , net1 . ChainHash ) ;
166+ Assert . Equal ( customChainHash , net2 . ChainHash ) ;
167+ }
168+
169+ [ Fact ]
170+ public void Unregister_RemovesChainHash ( )
171+ {
172+ var customChainHash = DummyChainHash ( 0xAB ) ;
173+ var name = "toRemove" ;
174+ var net = new BitcoinNetwork ( name ) ;
175+ net . Register ( name , customChainHash ) ;
176+
177+ var useNet = new BitcoinNetwork ( name ) ;
178+ Assert . Equal ( customChainHash , useNet . ChainHash ) ;
179+
180+ BitcoinNetwork . Unregister ( name ) ;
181+
182+ var afterRemove = new BitcoinNetwork ( name ) ;
183+ Assert . Throws < InvalidOperationException > ( ( ) =>
184+ {
185+ var _ = afterRemove . ChainHash ;
186+ } ) ;
187+ }
188+
189+ [ Fact ]
190+ public void ToString_And_Conversions_Work_For_Custom ( )
191+ {
192+ var customChainHash = DummyChainHash ( 0x5A ) ;
193+ var name = "foo_bar" ;
194+ var bnet = new BitcoinNetwork ( name ) ;
195+ bnet . Register ( name , customChainHash ) ;
196+
197+ Assert . Equal ( name , bnet . ToString ( ) ) ;
198+
199+ string str = bnet ;
200+ Assert . Equal ( name . ToLowerInvariant ( ) , str ) ;
201+
202+ BitcoinNetwork net2 = name ;
203+ Assert . Equal ( name , net2 . Name ) ;
204+ Assert . Equal ( customChainHash , net2 . ChainHash ) ;
205+ }
206+
207+ [ Fact ]
208+ public void Register_Throws_For_AlreadyExistingCustomNetwork ( )
209+ {
210+ var chainHash1 = DummyChainHash ( 0x13 ) ;
211+ var chainHash2 = DummyChainHash ( 0x53 ) ;
212+ var name = "networkdup" ;
213+
214+ // Ensure clean slate
215+ BitcoinNetwork . Unregister ( name ) ;
216+
217+ var net = new BitcoinNetwork ( name ) ;
218+ net . Register ( name , chainHash1 ) ;
219+
220+ // Attempting to add again (any value) must throw
221+ var ex = Assert . Throws < InvalidOperationException > ( ( ) => net . Register ( name , chainHash2 ) ) ;
222+ Assert . Contains ( "already registered" , ex . Message , StringComparison . OrdinalIgnoreCase ) ;
223+
224+ // Clean up for other tests
225+ BitcoinNetwork . Unregister ( name ) ;
226+ }
227+
228+ [ Fact ]
229+ public void Register_Throws_For_Null_Or_Whitespace_Name ( )
230+ {
231+ var net = new BitcoinNetwork ( "foo" ) ;
232+ var ch = DummyChainHash ( 0x77 ) ;
233+
234+ Assert . Throws < ArgumentNullException > ( ( ) => net . Register ( null , ch ) ) ;
235+ Assert . Throws < ArgumentNullException > ( ( ) => net . Register ( "" , ch ) ) ;
236+ Assert . Throws < ArgumentNullException > ( ( ) => net . Register ( " " , ch ) ) ;
237+ }
238+
239+ private static ChainHash DummyChainHash ( byte fill )
240+ {
241+ // Create a 32-byte chainhash with a pattern to differentiate
242+ return new ChainHash ( new [ ]
243+ {
244+ fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill ,
245+ fill , fill ,
246+ fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill , fill ,
247+ fill , fill
248+ } ) ;
249+ }
123250}
0 commit comments