using System.Linq; using System.Threading; using SysThread = System.Threading.Thread; using WhiteMagic; using WhiteMagic.Native; using WhiteMagic.Thread; using Xunit; namespace WhiteMagicTest.Thread; /// /// Tests for enumeration and main-thread selection. /// public sealed class ThreadFactoryTests { [Fact] public void Enumerate_returns_only_target_threads() { using var magic = Magic.OpenInProcess(); var factory = new ThreadFactory(magic.Memory); int currentOsId = (int)NativeMethods.GetCurrentThreadId(); var ids = factory.Enumerate().Select(t => t.Id).ToList(); Assert.True(ids.Count > 0); Assert.Contains(currentOsId, ids); } [Fact] public void GetThreadById_returns_matching_thread() { using var magic = Magic.OpenInProcess(); var factory = new ThreadFactory(magic.Memory); int currentOsId = (int)NativeMethods.GetCurrentThreadId(); using RemoteThread thread = factory.GetThreadById(currentOsId); Assert.Equal(currentOsId, thread.Id); } [Fact] public void GetThreadById_throws_for_nonexistent_thread() { using var magic = Magic.OpenInProcess(); var factory = new ThreadFactory(magic.Memory); Assert.Throws(() => factory.GetThreadById(0x7FFFFFFF)); } [Fact] public void MainThread_returns_a_thread_belonging_to_the_target() { using var magic = Magic.OpenInProcess(); var factory = new ThreadFactory(magic.Memory); using RemoteThread main = factory.MainThread; Assert.NotNull(main); var ids = factory.Enumerate().Select(t => t.Id).ToList(); Assert.Contains(main.Id, ids); } }