@@ -5,6 +5,36 @@ namespace FrameworkTests.Utils
5
5
[ TestFixture ]
6
6
public class RunLengthEncodingRunTests
7
7
{
8
+ [ Test ]
9
+ public void EqualityTest ( )
10
+ {
11
+ var runA = new Run ( 1 , 4 ) ;
12
+ var runB = new Run ( 1 , 4 ) ;
13
+
14
+ Assert . That ( runA , Is . EqualTo ( runB ) ) ;
15
+ Assert . That ( runA == runB ) ;
16
+ }
17
+
18
+ [ Test ]
19
+ public void InequalityTest1 ( )
20
+ {
21
+ var runA = new Run ( 1 , 4 ) ;
22
+ var runB = new Run ( 1 , 5 ) ;
23
+
24
+ Assert . That ( runA , Is . Not . EqualTo ( runB ) ) ;
25
+ Assert . That ( runA != runB ) ;
26
+ }
27
+
28
+ [ Test ]
29
+ public void InequalityTest2 ( )
30
+ {
31
+ var runA = new Run ( 1 , 4 ) ;
32
+ var runB = new Run ( 2 , 4 ) ;
33
+
34
+ Assert . That ( runA , Is . Not . EqualTo ( runB ) ) ;
35
+ Assert . That ( runA != runB ) ;
36
+ }
37
+
8
38
[ Test ]
9
39
[ Combinatorial ]
10
40
public void RunIncludes (
@@ -31,23 +61,58 @@ public void RunIncludes(
31
61
}
32
62
33
63
[ Test ]
34
- public void RunExpandToInclude ( )
64
+ public void RunExpandThrowsWhenIndexNotAdjacent ( )
35
65
{
36
66
var run = new Run ( 2 , 3 ) ;
67
+ Assert . That ( ! run . Includes ( 1 ) ) ;
37
68
Assert . That ( run . Includes ( 2 ) ) ;
38
69
Assert . That ( run . Includes ( 4 ) ) ;
39
70
Assert . That ( ! run . Includes ( 5 ) ) ;
40
71
41
- Assert . That ( run . ExpandToInclude ( 1 ) , Is . False ) ;
42
- Assert . That ( run . ExpandToInclude ( 2 ) , Is . False ) ;
43
- Assert . That ( run . ExpandToInclude ( 4 ) , Is . False ) ;
44
- Assert . That ( run . ExpandToInclude ( 6 ) , Is . False ) ;
72
+ Assert . That ( ( ) => run . ExpandToInclude ( 0 ) , Throws . TypeOf < Exception > ( ) ) ;
73
+ Assert . That ( ( ) => run . ExpandToInclude ( 6 ) , Throws . TypeOf < Exception > ( ) ) ;
74
+ }
75
+
76
+ [ Test ]
77
+ public void RunExpandThrowsWhenIndexAlreadyIncluded ( )
78
+ {
79
+ var run = new Run ( 2 , 3 ) ;
80
+ Assert . That ( ! run . Includes ( 1 ) ) ;
81
+ Assert . That ( run . Includes ( 2 ) ) ;
82
+ Assert . That ( run . Includes ( 4 ) ) ;
83
+ Assert . That ( ! run . Includes ( 5 ) ) ;
45
84
46
- Assert . That ( run . ExpandToInclude ( 5 ) , Is . True ) ;
85
+ Assert . That ( ( ) => run . ExpandToInclude ( 2 ) , Throws . TypeOf < Exception > ( ) ) ;
86
+ Assert . That ( ( ) => run . ExpandToInclude ( 3 ) , Throws . TypeOf < Exception > ( ) ) ;
87
+ }
88
+
89
+ [ Test ]
90
+ public void RunExpandToIncludeAfter ( )
91
+ {
92
+ var run = new Run ( 2 , 3 ) ;
93
+ var update = run . ExpandToInclude ( 5 ) ;
94
+ Assert . That ( update , Is . Not . Null ) ;
95
+ Assert . That ( update . NewRuns . Length , Is . EqualTo ( 0 ) ) ;
96
+ Assert . That ( update . RemoveRuns . Length , Is . EqualTo ( 0 ) ) ;
47
97
Assert . That ( run . Includes ( 5 ) ) ;
48
98
Assert . That ( ! run . Includes ( 6 ) ) ;
49
99
}
50
100
101
+ [ Test ]
102
+ public void RunExpandToIncludeBefore ( )
103
+ {
104
+ var run = new Run ( 2 , 3 ) ;
105
+ var update = run . ExpandToInclude ( 1 ) ;
106
+
107
+ Assert . That ( update , Is . Not . Null ) ;
108
+ Assert . That ( update . NewRuns . Length , Is . EqualTo ( 1 ) ) ;
109
+ Assert . That ( update . RemoveRuns . Length , Is . EqualTo ( 1 ) ) ;
110
+
111
+ Assert . That ( update . RemoveRuns [ 0 ] , Is . SameAs ( run ) ) ;
112
+ Assert . That ( update . NewRuns [ 0 ] . Start , Is . EqualTo ( 1 ) ) ;
113
+ Assert . That ( update . NewRuns [ 0 ] . Length , Is . EqualTo ( 4 ) ) ;
114
+ }
115
+
51
116
[ Test ]
52
117
public void RunCanUnsetLastIndex ( )
53
118
{
@@ -98,7 +163,7 @@ public void CanIterateIndices()
98
163
{
99
164
var run = new Run ( 2 , 4 ) ;
100
165
var seen = new List < int > ( ) ;
101
- run . Iterate ( i => seen . Add ( i ) ) ;
166
+ run . Iterate ( seen . Add ) ;
102
167
103
168
CollectionAssert . AreEqual ( new [ ] { 2 , 3 , 4 , 5 } , seen ) ;
104
169
}
@@ -120,14 +185,22 @@ public bool Includes(int index)
120
185
return index >= Start && index < ( Start + Length ) ;
121
186
}
122
187
123
- public bool ExpandToInclude ( int index )
188
+ public RunUpdate ExpandToInclude ( int index )
124
189
{
190
+ if ( Includes ( index ) ) throw new Exception ( "Run already includes this index. Run: {ToString()} index: {index}" ) ;
125
191
if ( index == ( Start + Length ) )
126
192
{
127
193
Length ++ ;
128
- return true ;
194
+ return new RunUpdate ( ) ;
129
195
}
130
- return false ;
196
+ if ( index == ( Start - 1 ) )
197
+ {
198
+ return new RunUpdate (
199
+ newRuns : [ new Run ( Start - 1 , Length + 1 ) ] ,
200
+ removeRuns : [ this ]
201
+ ) ;
202
+ }
203
+ throw new Exception ( $ "Run cannot expand to include index. Run: { ToString ( ) } index: { index } ") ;
131
204
}
132
205
133
206
public RunUpdate Unset ( int index )
@@ -145,8 +218,8 @@ public RunUpdate Unset(int index)
145
218
return new RunUpdate ( Array . Empty < Run > ( ) , new [ ] { this } ) ;
146
219
}
147
220
return new RunUpdate (
148
- newRuns : new [ ] { new Run ( Start + 1 , Length - 1 ) } ,
149
- removeRuns : new [ ] { this }
221
+ newRuns : [ new Run ( Start + 1 , Length - 1 ) ] ,
222
+ removeRuns : [ this ]
150
223
) ;
151
224
}
152
225
@@ -160,7 +233,10 @@ public RunUpdate Unset(int index)
160
233
// Split:
161
234
var newRunLength = ( Start + Length - 1 ) - index ;
162
235
Length = index - Start ;
163
- return new RunUpdate ( new [ ] { new Run ( index + 1 , newRunLength ) } , Array . Empty < Run > ( ) ) ;
236
+ return new RunUpdate (
237
+ newRuns : [ new Run ( index + 1 , newRunLength ) ] ,
238
+ removeRuns : Array . Empty < Run > ( )
239
+ ) ;
164
240
}
165
241
166
242
public void Iterate ( Action < int > action )
@@ -170,6 +246,32 @@ public void Iterate(Action<int> action)
170
246
action ( Start + i ) ;
171
247
}
172
248
}
249
+
250
+ public override string ToString ( )
251
+ {
252
+ return $ "[{ Start } ,{ Length } ]";
253
+ }
254
+
255
+ public override bool Equals ( object ? obj )
256
+ {
257
+ return obj is Run run &&
258
+ Start == run . Start &&
259
+ Length == run . Length ;
260
+ }
261
+
262
+ public override int GetHashCode ( )
263
+ {
264
+ return HashCode . Combine ( Start , Length ) ;
265
+ }
266
+
267
+ public static bool operator == ( Run ? obj1 , Run ? obj2 )
268
+ {
269
+ if ( ReferenceEquals ( obj1 , obj2 ) ) return true ;
270
+ if ( ReferenceEquals ( obj1 , null ) ) return false ;
271
+ if ( ReferenceEquals ( obj2 , null ) ) return false ;
272
+ return obj1 . Equals ( obj2 ) ;
273
+ }
274
+ public static bool operator != ( Run ? obj1 , Run ? obj2 ) => ! ( obj1 == obj2 ) ;
173
275
}
174
276
175
277
public class RunUpdate
0 commit comments