Skip to content

Commit 7c59339

Browse files
committed
correct cloning of concurrentbag<>
1 parent 85ec8b2 commit 7c59339

6 files changed

Lines changed: 763 additions & 229 deletions

File tree

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
using System.Collections.Concurrent;
2+
3+
namespace FastCloner.Tests;
4+
5+
[TestFixture]
6+
public class CollectionTests
7+
{
8+
[Test]
9+
public void PriorityQueue_Should_Be_Deep_Cloned_Correctly()
10+
{
11+
var original = new PriorityQueue<string, int>();
12+
original.Enqueue("Low", 10);
13+
original.Enqueue("High", 1);
14+
original.Enqueue("Medium", 5);
15+
16+
var clone = original.DeepClone();
17+
18+
Assert.That(clone, Is.Not.SameAs(original));
19+
Assert.That(clone.Count, Is.EqualTo(3));
20+
21+
// Verify order
22+
Assert.That(clone.Dequeue(), Is.EqualTo("High"));
23+
Assert.That(clone.Dequeue(), Is.EqualTo("Medium"));
24+
Assert.That(clone.Dequeue(), Is.EqualTo("Low"));
25+
26+
// Original should remain untouched
27+
Assert.That(original.Count, Is.EqualTo(3));
28+
Assert.That(original.Dequeue(), Is.EqualTo("High"));
29+
}
30+
31+
[Test]
32+
public void Stack_Should_Be_Deep_Cloned_Correctly()
33+
{
34+
var original = new Stack<int>();
35+
original.Push(1);
36+
original.Push(2);
37+
original.Push(3);
38+
39+
var clone = original.DeepClone();
40+
41+
Assert.That(clone, Is.Not.SameAs(original));
42+
Assert.That(clone.Count, Is.EqualTo(3));
43+
44+
// Verify order (LIFO)
45+
Assert.That(clone.Pop(), Is.EqualTo(3));
46+
Assert.That(clone.Pop(), Is.EqualTo(2));
47+
Assert.That(clone.Pop(), Is.EqualTo(1));
48+
49+
// Original should remain untouched
50+
Assert.That(original.Count, Is.EqualTo(3));
51+
Assert.That(original.Peek(), Is.EqualTo(3));
52+
}
53+
54+
[Test]
55+
public void Queue_Should_Be_Deep_Cloned_Correctly()
56+
{
57+
var original = new Queue<int>();
58+
original.Enqueue(1);
59+
original.Enqueue(2);
60+
original.Enqueue(3);
61+
62+
var clone = original.DeepClone();
63+
64+
Assert.That(clone, Is.Not.SameAs(original));
65+
Assert.That(clone.Count, Is.EqualTo(3));
66+
67+
// Verify order (FIFO)
68+
Assert.That(clone.Dequeue(), Is.EqualTo(1));
69+
Assert.That(clone.Dequeue(), Is.EqualTo(2));
70+
Assert.That(clone.Dequeue(), Is.EqualTo(3));
71+
72+
// Original should remain untouched
73+
Assert.That(original.Count, Is.EqualTo(3));
74+
Assert.That(original.Peek(), Is.EqualTo(1));
75+
}
76+
77+
[Test]
78+
public void ConcurrentStack_Should_Be_Deep_Cloned_Correctly()
79+
{
80+
var original = new ConcurrentStack<int>();
81+
original.Push(1);
82+
original.Push(2);
83+
original.Push(3);
84+
85+
var clone = original.DeepClone();
86+
87+
Assert.That(clone, Is.Not.SameAs(original));
88+
Assert.That(clone.Count, Is.EqualTo(3));
89+
90+
// Verify order (LIFO)
91+
int result;
92+
Assert.That(clone.TryPop(out result), Is.True);
93+
Assert.That(result, Is.EqualTo(3));
94+
95+
Assert.That(clone.TryPop(out result), Is.True);
96+
Assert.That(result, Is.EqualTo(2));
97+
98+
Assert.That(clone.TryPop(out result), Is.True);
99+
Assert.That(result, Is.EqualTo(1));
100+
101+
// Original should remain untouched
102+
Assert.That(original.Count, Is.EqualTo(3));
103+
Assert.That(original.TryPeek(out result), Is.True);
104+
Assert.That(result, Is.EqualTo(3));
105+
}
106+
107+
[Test]
108+
public void ConcurrentQueue_Should_Be_Deep_Cloned_Correctly()
109+
{
110+
var original = new ConcurrentQueue<int>();
111+
original.Enqueue(1);
112+
original.Enqueue(2);
113+
original.Enqueue(3);
114+
115+
var clone = original.DeepClone();
116+
117+
Assert.That(clone, Is.Not.SameAs(original));
118+
Assert.That(clone.Count, Is.EqualTo(3));
119+
120+
// Verify order (FIFO)
121+
int result;
122+
Assert.That(clone.TryDequeue(out result), Is.True);
123+
Assert.That(result, Is.EqualTo(1));
124+
125+
Assert.That(clone.TryDequeue(out result), Is.True);
126+
Assert.That(result, Is.EqualTo(2));
127+
128+
Assert.That(clone.TryDequeue(out result), Is.True);
129+
Assert.That(result, Is.EqualTo(3));
130+
131+
// Original should remain untouched
132+
Assert.That(original.Count, Is.EqualTo(3));
133+
Assert.That(original.TryPeek(out result), Is.True);
134+
Assert.That(result, Is.EqualTo(1));
135+
}
136+
137+
[Test]
138+
public void BlockingCollection_Should_Be_Deep_Cloned_Correctly()
139+
{
140+
var original = new BlockingCollection<int>();
141+
original.Add(1);
142+
original.Add(2);
143+
original.Add(3);
144+
145+
var clone = original.DeepClone();
146+
147+
Assert.That(clone, Is.Not.SameAs(original));
148+
Assert.That(clone.Count, Is.EqualTo(3));
149+
150+
// Verify order (FIFO by default)
151+
Assert.That(clone.Take(), Is.EqualTo(1));
152+
Assert.That(clone.Take(), Is.EqualTo(2));
153+
Assert.That(clone.Take(), Is.EqualTo(3));
154+
155+
// Original should remain untouched
156+
Assert.That(original.Count, Is.EqualTo(3));
157+
}
158+
159+
[Test]
160+
public void LinkedList_Should_Be_Deep_Cloned_Correctly()
161+
{
162+
var original = new LinkedList<int>();
163+
original.AddLast(1);
164+
original.AddLast(2);
165+
original.AddLast(3);
166+
167+
var clone = original.DeepClone();
168+
169+
Assert.That(clone, Is.Not.SameAs(original));
170+
Assert.That(clone.Count, Is.EqualTo(3));
171+
172+
// Verify order
173+
Assert.That(clone.First.Value, Is.EqualTo(1));
174+
Assert.That(clone.First.Next.Value, Is.EqualTo(2));
175+
Assert.That(clone.Last.Value, Is.EqualTo(3));
176+
177+
// Original should remain untouched
178+
Assert.That(original.Count, Is.EqualTo(3));
179+
}
180+
}
181+

0 commit comments

Comments
 (0)