Skip to content

Commit 06c06dd

Browse files
kalimagYoshiRulz
authored andcommitted
Add some tests for MemoryCallbackSystem
1 parent 3d442bc commit 06c06dd

File tree

1 file changed

+285
-0
lines changed

1 file changed

+285
-0
lines changed
Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
using BizHawk.Client.Common;
8+
using BizHawk.Emulation.Common;
9+
10+
using Microsoft.VisualStudio.TestTools.UnitTesting;
11+
12+
namespace BizHawk.Tests.Emulation.Common
13+
{
14+
[TestClass]
15+
public class MemoryCallbackSystemTests
16+
{
17+
private const string ScopeA = "Scope A";
18+
19+
private const string ScopeB = "Scope B";
20+
21+
private MemoryCallbackSystem _memoryCallbackSystem = null!;
22+
23+
private TestCallbackHolder _testCallbacks = null!;
24+
25+
[TestInitialize]
26+
public void TestInitialize()
27+
{
28+
_memoryCallbackSystem = new(new[] { ScopeA, ScopeB });
29+
_testCallbacks = new();
30+
}
31+
32+
[TestMethod]
33+
public void TestAddRemoveEvents()
34+
{
35+
MemoryCallback callback1 = new(ScopeA, MemoryCallbackType.Read, "Callback 1", _testCallbacks.Callback1, null, null);
36+
MemoryCallback callback2 = new(ScopeA, MemoryCallbackType.Read, "Callback 2", _testCallbacks.Callback2, null, null);
37+
MemoryCallback callback3 = new(ScopeA, MemoryCallbackType.Read, "Callback 3", _testCallbacks.Callback3, null, null);
38+
39+
List<IMemoryCallback> callbackAddedRaised = new();
40+
List<IMemoryCallback> callbackRemovedRaised = new();
41+
42+
_memoryCallbackSystem.CallbackAdded += callback => callbackAddedRaised.Add(callback);
43+
_memoryCallbackSystem.CallbackRemoved += callback => callbackRemovedRaised.Add(callback);
44+
45+
_memoryCallbackSystem.Add(callback1);
46+
_memoryCallbackSystem.Add(callback2);
47+
_memoryCallbackSystem.Add(callback3);
48+
49+
CollectionAssert.AreEqual(
50+
new[] { callback1, callback2, callback3 },
51+
callbackAddedRaised,
52+
"CallbackAdded events not raised correctly");
53+
54+
_memoryCallbackSystem.Remove(callback3.Callback);
55+
_memoryCallbackSystem.Remove(callback1.Callback);
56+
_memoryCallbackSystem.Remove(callback2.Callback);
57+
58+
CollectionAssert.AreEqual(
59+
new[] { callback3, callback1, callback2 },
60+
callbackRemovedRaised,
61+
"CallbackRemoved events not raised correctly");
62+
}
63+
64+
[TestMethod]
65+
public void TestActiveChangedEvent()
66+
{
67+
MemoryCallback readCallback = new(ScopeA, MemoryCallbackType.Read, "Callback 1", _testCallbacks.Callback1, null, null);
68+
MemoryCallback writeCallback = new(ScopeA, MemoryCallbackType.Write, "Callback 2", _testCallbacks.Callback2, null, null);
69+
MemoryCallback execCallback = new(ScopeA, MemoryCallbackType.Execute, "Callback 3", _testCallbacks.Callback3, null, null);
70+
71+
var activeChangedInvoked = false;
72+
_memoryCallbackSystem.ActiveChanged += () => activeChangedInvoked = true;
73+
74+
Assert.IsFalse(_memoryCallbackSystem.HasReads);
75+
Assert.IsFalse(_memoryCallbackSystem.HasWrites);
76+
Assert.IsFalse(_memoryCallbackSystem.HasExecutes);
77+
78+
_memoryCallbackSystem.Add(readCallback);
79+
Assert.IsTrue(activeChangedInvoked);
80+
Assert.IsTrue(_memoryCallbackSystem.HasReads);
81+
Assert.IsFalse(_memoryCallbackSystem.HasWrites);
82+
Assert.IsFalse(_memoryCallbackSystem.HasExecutes);
83+
84+
activeChangedInvoked = false;
85+
_memoryCallbackSystem.Add(writeCallback);
86+
Assert.IsTrue(activeChangedInvoked);
87+
Assert.IsTrue(_memoryCallbackSystem.HasReads);
88+
Assert.IsTrue(_memoryCallbackSystem.HasWrites);
89+
Assert.IsFalse(_memoryCallbackSystem.HasExecutes);
90+
91+
activeChangedInvoked = false;
92+
_memoryCallbackSystem.Add(execCallback);
93+
Assert.IsTrue(activeChangedInvoked);
94+
Assert.IsTrue(_memoryCallbackSystem.HasReads);
95+
Assert.IsTrue(_memoryCallbackSystem.HasWrites);
96+
Assert.IsTrue(_memoryCallbackSystem.HasExecutes);
97+
98+
activeChangedInvoked = false;
99+
_memoryCallbackSystem.Remove(execCallback.Callback);
100+
Assert.IsTrue(activeChangedInvoked);
101+
Assert.IsTrue(_memoryCallbackSystem.HasReads);
102+
Assert.IsTrue(_memoryCallbackSystem.HasWrites);
103+
Assert.IsFalse(_memoryCallbackSystem.HasExecutes);
104+
105+
activeChangedInvoked = false;
106+
_memoryCallbackSystem.RemoveAll(new[] { writeCallback.Callback });
107+
Assert.IsTrue(activeChangedInvoked);
108+
Assert.IsTrue(_memoryCallbackSystem.HasReads);
109+
Assert.IsFalse(_memoryCallbackSystem.HasWrites);
110+
Assert.IsFalse(_memoryCallbackSystem.HasExecutes);
111+
112+
activeChangedInvoked = false;
113+
_memoryCallbackSystem.Clear();
114+
Assert.IsTrue(activeChangedInvoked);
115+
Assert.IsFalse(_memoryCallbackSystem.HasReads);
116+
Assert.IsFalse(_memoryCallbackSystem.HasWrites);
117+
Assert.IsFalse(_memoryCallbackSystem.HasExecutes);
118+
}
119+
120+
[TestMethod]
121+
public void TestReadCallbacks()
122+
{
123+
MemoryCallback callback1 = new(ScopeA, MemoryCallbackType.Read, "Callback 1", _testCallbacks.Callback1, 0x12345678, null);
124+
MemoryCallback callback2 = new(ScopeA, MemoryCallbackType.Write, "Callback 2", _testCallbacks.Callback2, 0x12345678, null);
125+
MemoryCallback callback3 = new(ScopeA, MemoryCallbackType.Execute, "Callback 3", _testCallbacks.Callback3, 0x12345678, null);
126+
127+
_memoryCallbackSystem.Add(callback1);
128+
_memoryCallbackSystem.Add(callback2);
129+
_memoryCallbackSystem.Add(callback3);
130+
131+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 1, (uint) MemoryCallbackFlags.AccessRead, ScopeA);
132+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 2, (uint) MemoryCallbackFlags.AccessRead, ScopeA);
133+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 3, (uint) MemoryCallbackFlags.AccessRead, ScopeB);
134+
_memoryCallbackSystem.CallMemoryCallbacks(0x23456789, 4, (uint) MemoryCallbackFlags.AccessRead, ScopeA);
135+
136+
CollectionAssert.AreEqual(
137+
new[]
138+
{
139+
(0x12345678U, 1U, (uint) MemoryCallbackFlags.AccessRead),
140+
(0x12345678U, 2U, (uint) MemoryCallbackFlags.AccessRead),
141+
},
142+
_testCallbacks.Callback1Invocations,
143+
"Read callbacks not invoked correctly");
144+
Assert.AreEqual(0, _testCallbacks.Callback2Invocations.Count, "Write callback invoked unexpectedly");
145+
Assert.AreEqual(0, _testCallbacks.Callback3Invocations.Count, "Exec callback invoked unexpectedly");
146+
}
147+
148+
[TestMethod]
149+
public void TestWriteCallbacks()
150+
{
151+
MemoryCallback callback1 = new(ScopeA, MemoryCallbackType.Read, "Callback 1", _testCallbacks.Callback1, 0x12345678, null);
152+
MemoryCallback callback2 = new(ScopeA, MemoryCallbackType.Write, "Callback 2", _testCallbacks.Callback2, 0x12345678, null);
153+
MemoryCallback callback3 = new(ScopeA, MemoryCallbackType.Execute, "Callback 3", _testCallbacks.Callback3, 0x12345678, null);
154+
155+
_memoryCallbackSystem.Add(callback1);
156+
_memoryCallbackSystem.Add(callback2);
157+
_memoryCallbackSystem.Add(callback3);
158+
159+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 1, (uint) MemoryCallbackFlags.AccessWrite, ScopeA);
160+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 2, (uint) MemoryCallbackFlags.AccessWrite, ScopeA);
161+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 3, (uint) MemoryCallbackFlags.AccessWrite, ScopeB);
162+
_memoryCallbackSystem.CallMemoryCallbacks(0x23456789, 4, (uint) MemoryCallbackFlags.AccessWrite, ScopeA);
163+
164+
CollectionAssert.AreEqual(
165+
new[]
166+
{
167+
(0x12345678U, 1U, (uint) MemoryCallbackFlags.AccessWrite),
168+
(0x12345678U, 2U, (uint) MemoryCallbackFlags.AccessWrite),
169+
},
170+
_testCallbacks.Callback2Invocations,
171+
"Write callbacks not invoked correctly");
172+
Assert.AreEqual(0, _testCallbacks.Callback1Invocations.Count, "Read callback invoked unexpectedly");
173+
Assert.AreEqual(0, _testCallbacks.Callback3Invocations.Count, "Exec callback invoked unexpectedly");
174+
}
175+
176+
[TestMethod]
177+
public void TestExecCallbacks()
178+
{
179+
MemoryCallback callback1 = new(ScopeA, MemoryCallbackType.Read, "Callback 1", _testCallbacks.Callback1, 0x12345678, null);
180+
MemoryCallback callback2 = new(ScopeA, MemoryCallbackType.Write, "Callback 2", _testCallbacks.Callback2, 0x12345678, null);
181+
MemoryCallback callback3 = new(ScopeA, MemoryCallbackType.Execute, "Callback 3", _testCallbacks.Callback3, 0x12345678, null);
182+
183+
_memoryCallbackSystem.Add(callback1);
184+
_memoryCallbackSystem.Add(callback2);
185+
_memoryCallbackSystem.Add(callback3);
186+
187+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 1, (uint) MemoryCallbackFlags.AccessExecute, ScopeA);
188+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 2, (uint) MemoryCallbackFlags.AccessExecute, ScopeA);
189+
_memoryCallbackSystem.CallMemoryCallbacks(0x12345678, 3, (uint) MemoryCallbackFlags.AccessExecute, ScopeB);
190+
_memoryCallbackSystem.CallMemoryCallbacks(0x23456789, 4, (uint) MemoryCallbackFlags.AccessExecute, ScopeA);
191+
192+
CollectionAssert.AreEqual(
193+
new[]
194+
{
195+
(0x12345678U, 1U, (uint) MemoryCallbackFlags.AccessExecute),
196+
(0x12345678U, 2U, (uint) MemoryCallbackFlags.AccessExecute),
197+
},
198+
_testCallbacks.Callback3Invocations,
199+
"Exec callbacks not invoked correctly");
200+
Assert.AreEqual(0, _testCallbacks.Callback1Invocations.Count, "Read callback invoked unexpectedly");
201+
Assert.AreEqual(0, _testCallbacks.Callback2Invocations.Count, "Write callback invoked unexpectedly");
202+
}
203+
204+
[TestMethod]
205+
public void TestAddingCallbackWithinCallback()
206+
{
207+
MemoryCallback callback2 = new(ScopeA, MemoryCallbackType.Read, "Callback 2", _testCallbacks.Callback2, null, null);
208+
MemoryCallback callback3 = new(ScopeA, MemoryCallbackType.Read, "Callback 3", _testCallbacks.Callback3, null, null);
209+
210+
var callback1invoked = false;
211+
MemoryCallbackDelegate callback = (_, _, _) =>
212+
{
213+
callback1invoked = true;
214+
_memoryCallbackSystem.Add(callback2);
215+
_memoryCallbackSystem.Add(callback3);
216+
};
217+
218+
MemoryCallback callback1 = new(ScopeA, MemoryCallbackType.Read, "Callback 1", callback, null, null);
219+
220+
_memoryCallbackSystem.Add(callback1);
221+
_memoryCallbackSystem.CallMemoryCallbacks(0, 0, (uint) MemoryCallbackFlags.AccessRead, ScopeA);
222+
223+
Assert.IsTrue(callback1invoked, "Callback 1 not invoked");
224+
CollectionAssert.AreEqual(
225+
new[] { callback1, callback2, callback3 },
226+
_memoryCallbackSystem.ToList(),
227+
"Callback list is incorrect");
228+
}
229+
230+
[TestMethod]
231+
public void TestRemovingCallbackWithinCallback()
232+
{
233+
MemoryCallback callback1 = new(ScopeA, MemoryCallbackType.Read, "Callback 1", _testCallbacks.Callback1, null, null);
234+
235+
var callback2invoked = false;
236+
MemoryCallbackDelegate callback = (_, _, _) =>
237+
{
238+
callback2invoked = true;
239+
_memoryCallbackSystem.Remove(callback1.Callback);
240+
};
241+
242+
MemoryCallback callback2 = new(ScopeA, MemoryCallbackType.Read, "Callback 2", callback, null, null);
243+
MemoryCallback callback3 = new(ScopeA, MemoryCallbackType.Read, "Callback 3", _testCallbacks.Callback3, null, null);
244+
245+
_memoryCallbackSystem.Add(callback1);
246+
_memoryCallbackSystem.Add(callback2);
247+
_memoryCallbackSystem.Add(callback3);
248+
249+
_memoryCallbackSystem.CallMemoryCallbacks(0, 0, (uint) MemoryCallbackFlags.AccessRead, ScopeA);
250+
251+
Assert.AreEqual(1, _testCallbacks.Callback1Invocations.Count, "Callback 1 not invoked correctly");
252+
Assert.IsTrue(callback2invoked, "Callback 2 not invoked");
253+
Assert.AreEqual(1, _testCallbacks.Callback3Invocations.Count, "Callback 3 not invoked correctly");
254+
CollectionAssert.AreEqual(
255+
new[] { callback2, callback3 },
256+
_memoryCallbackSystem.ToList(),
257+
"Callback list is incorrect");
258+
}
259+
260+
private sealed class TestCallbackHolder
261+
{
262+
public List<(uint Address, uint Value, uint Flags)> Callback1Invocations { get; } = new();
263+
264+
public List<(uint Address, uint Value, uint Flags)> Callback2Invocations { get; } = new();
265+
266+
public List<(uint Address, uint Value, uint Flags)> Callback3Invocations { get; } = new();
267+
268+
public void Callback1(uint address, uint value, uint flags)
269+
=> Callback1Invocations.Add((address, value, flags));
270+
271+
public void Callback2(uint address, uint value, uint flags)
272+
=> Callback2Invocations.Add((address, value, flags));
273+
274+
public void Callback3(uint address, uint value, uint flags)
275+
=> Callback3Invocations.Add((address, value, flags));
276+
277+
public void Clear()
278+
{
279+
Callback1Invocations.Clear();
280+
Callback2Invocations.Clear();
281+
Callback3Invocations.Clear();
282+
}
283+
}
284+
}
285+
}

0 commit comments

Comments
 (0)