@@ -39,4 +39,159 @@ public void Contains_Negative(string prefixText, int length, string addressText)
39
39
var network = new IPNetwork ( IPAddress . Parse ( prefixText ) , length ) ;
40
40
Assert . False ( network . Contains ( IPAddress . Parse ( addressText ) ) ) ;
41
41
}
42
+
43
+ [ Theory ]
44
+ [ InlineData ( "192.168.1.1" , 0 ) ]
45
+ [ InlineData ( "192.168.1.1" , 32 ) ]
46
+ [ InlineData ( "2001:db8:3c4d::1" , 0 ) ]
47
+ [ InlineData ( "2001:db8:3c4d::1" , 128 ) ]
48
+ public void Ctor_WithValidFormat_IsSuccessfullyCreated ( string prefixText , int prefixLength )
49
+ {
50
+ // Arrange
51
+ var address = IPAddress . Parse ( prefixText ) ;
52
+
53
+ // Act
54
+ var network = new IPNetwork ( address , prefixLength ) ;
55
+
56
+ // Assert
57
+ Assert . Equal ( prefixText , network . Prefix . ToString ( ) ) ;
58
+ Assert . Equal ( prefixLength , network . PrefixLength ) ;
59
+ }
60
+
61
+ [ Theory ]
62
+ [ InlineData ( "192.168.1.1" , - 1 ) ]
63
+ [ InlineData ( "192.168.1.1" , 33 ) ]
64
+ [ InlineData ( "2001:db8:3c4d::1" , - 1 ) ]
65
+ [ InlineData ( "2001:db8:3c4d::1" , 129 ) ]
66
+ public void Ctor_WithPrefixLengthOutOfRange_ThrowsArgumentOutOfRangeException ( string prefixText , int prefixLength )
67
+ {
68
+ // Arrange
69
+ var address = IPAddress . Parse ( prefixText ) ;
70
+
71
+ // Act
72
+ var ex = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => new IPNetwork ( address , prefixLength ) ) ;
73
+
74
+ // Assert
75
+ Assert . StartsWith ( "The prefix length was out of range." , ex . Message ) ;
76
+ }
77
+
78
+ [ Theory ]
79
+ [ MemberData ( nameof ( ValidPrefixWithPrefixLengthData ) ) ]
80
+ public void Parse_WithValidFormat_ParsedCorrectly ( string input , string expectedPrefix , int expectedPrefixLength )
81
+ {
82
+ // Act
83
+ var network = IPNetwork . Parse ( input ) ;
84
+
85
+ // Assert
86
+ Assert . Equal ( expectedPrefix , network . Prefix . ToString ( ) ) ;
87
+ Assert . Equal ( expectedPrefixLength , network . PrefixLength ) ;
88
+ }
89
+
90
+ [ Theory ]
91
+ [ InlineData ( null ) ]
92
+ [ MemberData ( nameof ( InvalidPrefixOrPrefixLengthData ) ) ]
93
+ public void Parse_WithInvalidFormat_ThrowsFormatException ( string input )
94
+ {
95
+ // Arrange & Act & Assert
96
+ var ex = Assert . Throws < FormatException > ( ( ) => IPNetwork . Parse ( input ) ) ;
97
+ Assert . Equal ( "An invalid IP address or prefix length was specified." , ex . Message ) ;
98
+ }
99
+
100
+ [ Theory ]
101
+ [ MemberData ( nameof ( PrefixLengthOutOfRangeData ) ) ]
102
+ public void Parse_WithOutOfRangePrefixLength_ThrowsArgumentOutOfRangeException ( string input )
103
+ {
104
+ // Arrange & Act & Assert
105
+ var ex = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => IPNetwork . Parse ( input ) ) ;
106
+ Assert . StartsWith ( "The prefix length was out of range." , ex . Message ) ;
107
+ }
108
+
109
+ [ Theory ]
110
+ [ MemberData ( nameof ( ValidPrefixWithPrefixLengthData ) ) ]
111
+ public void TryParse_WithValidFormat_ParsedCorrectly ( string input , string expectedPrefix , int expectedPrefixLength )
112
+ {
113
+ // Act
114
+ var result = IPNetwork . TryParse ( input , out var network ) ;
115
+
116
+ // Assert
117
+ Assert . True ( result ) ;
118
+ Assert . NotNull ( network ) ;
119
+ Assert . Equal ( expectedPrefix , network . Prefix . ToString ( ) ) ;
120
+ Assert . Equal ( expectedPrefixLength , network . PrefixLength ) ;
121
+ }
122
+
123
+ [ Theory ]
124
+ [ InlineData ( null ) ]
125
+ [ MemberData ( nameof ( InvalidPrefixOrPrefixLengthData ) ) ]
126
+ [ MemberData ( nameof ( PrefixLengthOutOfRangeData ) ) ]
127
+ public void TryParse_WithInvalidFormat_ReturnsFalse ( string input )
128
+ {
129
+ // Act
130
+ var result = IPNetwork . TryParse ( input , out var network ) ;
131
+
132
+ // Assert
133
+ Assert . False ( result ) ;
134
+ Assert . Null ( network ) ;
135
+ }
136
+
137
+ public static TheoryData < string , string , int > ValidPrefixWithPrefixLengthData ( ) => new ( )
138
+ {
139
+ // IPv4
140
+ { "10.1.0.0/16" , "10.1.0.0" , 16 } ,
141
+ { "10.1.1.0/8" , "10.1.1.0" , 8 } ,
142
+ { "174.0.0.0/7" , "174.0.0.0" , 7 } ,
143
+ { "10.174.0.0/15" , "10.174.0.0" , 15 } ,
144
+ { "10.168.0.0/14" , "10.168.0.0" , 14 } ,
145
+ { "192.168.0.1/31" , "192.168.0.1" , 31 } ,
146
+ { "192.168.0.1/31" , "192.168.0.1" , 31 } ,
147
+ { "192.168.0.1/32" , "192.168.0.1" , 32 } ,
148
+ { "192.168.1.1/0" , "192.168.1.1" , 0 } ,
149
+ { "192.168.1.1/0" , "192.168.1.1" , 0 } ,
150
+
151
+ // IPv6
152
+ { "2001:db8:3c4d::/127" , "2001:db8:3c4d::" , 127 } ,
153
+ { "2001:db8:3c4d::1/128" , "2001:db8:3c4d::1" , 128 } ,
154
+ { "2001:db8:3c4d::1/0" , "2001:db8:3c4d::1" , 0 } ,
155
+ { "2001:db8:3c4d::1/0" , "2001:db8:3c4d::1" , 0 }
156
+ } ;
157
+
158
+ public static TheoryData < string > InvalidPrefixOrPrefixLengthData ( ) => new ( )
159
+ {
160
+ string . Empty ,
161
+ "abcdefg" ,
162
+
163
+ // Missing forward slash
164
+ "10.1.0.016" ,
165
+ "2001:db8:3c4d::1127" ,
166
+
167
+ // Invalid prefix
168
+ "/16" ,
169
+ "10.1./16" ,
170
+ "10.1.0./16" ,
171
+ "10.1.ABC.0/16" ,
172
+ "200123:db8:3c4d::/127" ,
173
+ ":db8:3c4d::/127" ,
174
+ "2001:?:3c4d::1/0" ,
175
+
176
+ // Invalid prefix length
177
+ "10.1.0.0/" ,
178
+ "10.1.0.0/16-" ,
179
+ "10.1.0.0/ABC" ,
180
+ "2001:db8:3c4d::/" ,
181
+ "2001:db8:3c4d::1/128-" ,
182
+ "2001:db8:3c4d::1/ABC"
183
+ } ;
184
+
185
+ public static TheoryData < string > PrefixLengthOutOfRangeData ( ) => new ( )
186
+ {
187
+ // Negative prefix length
188
+ "10.1.0.0/-16" ,
189
+ "2001:db8:3c4d::/-127" ,
190
+
191
+ // Prefix length out of range (IPv4)
192
+ "10.1.0.0/33" ,
193
+
194
+ // Prefix length out of range (IPv6)
195
+ "2001:db8:3c4d::/129"
196
+ } ;
42
197
}
0 commit comments