Skip to content

Commit 72e265f

Browse files
committed
Add core C tests and minor code cleanups
Added detailed unit tests for WinDepends.Core C components. Improved forward module error handling in MainForm #39
1 parent 6b0a753 commit 72e265f

File tree

10 files changed

+116
-17
lines changed

10 files changed

+116
-17
lines changed

src/WinDepends.Core/tests/tests.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#include <assert.h>
2+
#include <stdio.h>
3+
#include <wchar.h>
4+
#include "../src/WinDepends.Core/cmd.h"
5+
#include "../src/WinDepends.Core/mlist.h"
6+
7+
void test_cmd_entry_parsing(void) {
8+
assert(get_command_entry(L"open") == ce_open);
9+
assert(get_command_entry(L"close") == ce_close);
10+
assert(get_command_entry(L"imports") == ce_imports);
11+
assert(get_command_entry(L"exports") == ce_exports);
12+
assert(get_command_entry(L"headers") == ce_headers);
13+
assert(get_command_entry(L"datadirs") == ce_datadirs);
14+
assert(get_command_entry(L"shutdown") == ce_shutdown);
15+
assert(get_command_entry(L"exit") == ce_exit);
16+
assert(get_command_entry(L"knowndlls") == ce_knowndlls);
17+
assert(get_command_entry(L"apisetresolve") == ce_apisetresolve);
18+
assert(get_command_entry(L"apisetmapsrc") == ce_apisetmapsrc);
19+
assert(get_command_entry(L"apisetnsinfo") == ce_apisetnsinfo);
20+
assert(get_command_entry(L"callstats") == ce_callstats);
21+
assert(get_command_entry(L"notacommand") == ce_unknown);
22+
}
23+
24+
void test_mlist_add_and_traverse(void) {
25+
LIST_ENTRY head;
26+
PLIST_ENTRY entry;
27+
message_node* node;
28+
size_t count;
29+
const wchar_t* msg1 = L"msg1";
30+
const wchar_t* msg2 = L"some much longer message to check allocation";
31+
size_t len1 = wcslen(msg1);
32+
size_t len2 = wcslen(msg2);
33+
34+
InitializeListHead(&head);
35+
36+
assert(mlist_add(&head, msg1, len1) == TRUE);
37+
assert(mlist_add(&head, msg2, len2) == TRUE);
38+
39+
count = 0;
40+
for (entry = head.Flink; entry != &head; entry = entry->Flink) {
41+
node = CONTAINING_RECORD(entry, message_node, ListEntry);
42+
assert(node->message != NULL);
43+
count++;
44+
}
45+
assert(count == 2);
46+
}
47+
48+
void test_mlist_add_empty_and_failure(void) {
49+
LIST_ENTRY head;
50+
InitializeListHead(&head);
51+
52+
assert(mlist_add(&head, L"", 0) == TRUE);
53+
assert(mlist_add(NULL, L"test", 4) == FALSE);
54+
}
55+
56+
void test_mlist_traverse_send_and_cleanup(void) {
57+
LIST_ENTRY head;
58+
message_node* node;
59+
PLIST_ENTRY entry, next;
60+
InitializeListHead(&head);
61+
62+
mlist_add(&head, L"abc", 3);
63+
mlist_add(&head, L"defgh", 5);
64+
65+
entry = head.Flink;
66+
while (entry != &head) {
67+
next = entry->Flink;
68+
node = CONTAINING_RECORD(entry, message_node, ListEntry);
69+
if (!node->isStaticBuffer && node->message) {
70+
heap_free(GetProcessHeap(), node->message);
71+
}
72+
heap_free(GetProcessHeap(), node);
73+
entry = next;
74+
}
75+
InitializeListHead(&head);
76+
}
77+
78+
void test_cmd_unknown_command_handler(void) {
79+
SOCKET fake_sock = 0;
80+
cmd_unknown_command(fake_sock);
81+
}
82+
83+
int main(void) {
84+
test_cmd_entry_parsing();
85+
test_mlist_add_and_traverse();
86+
test_mlist_add_empty_and_failure();
87+
test_mlist_traverse_send_and_cleanup();
88+
test_cmd_unknown_command_handler();
89+
90+
printf("All detailed WinDepends.Core tests passed.\n");
91+
return 0;
92+
}

src/WinDepends/CCoreClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public class CCoreClient : IDisposable
178178
private NetworkStream _dataStream;
179179
private readonly AddLogMessageCallback _addLogMessage;
180180
private string _serverApplication;
181-
181+
182182
/// <summary>
183183
/// Gets the TCP client connection to the server.
184184
/// </summary>
@@ -193,7 +193,7 @@ public class CCoreClient : IDisposable
193193
/// Gets or sets the port number used for server communication.
194194
/// </summary>
195195
public int Port { get; set; }
196-
196+
197197
private readonly Dictionary<Type, DataContractJsonSerializer> _serializerCache;
198198

199199
private const int CORE_CONNECTION_TIMEOUT = 3000;

src/WinDepends/CMRUList.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,12 @@ private void LoadInitialFiles(IEnumerable<string> initialFiles)
9999

100100
private void AddFileInternal(string filePath)
101101
{
102-
if (string.IsNullOrEmpty(filePath))
102+
if (string.IsNullOrEmpty(filePath))
103103
return;
104104

105105
lock (_syncRoot)
106106
{
107-
if (!File.Exists(filePath))
107+
if (!File.Exists(filePath))
108108
return;
109109

110110
FileInfo fi;
@@ -118,8 +118,8 @@ PathTooLongException or
118118
System.Security.SecurityException or
119119
UnauthorizedAccessException or
120120
NotSupportedException)
121-
{
122-
return;
121+
{
122+
return;
123123
}
124124

125125
string fullPath = fi.FullName;
@@ -316,7 +316,7 @@ private void HandleMouseLeave(object sender, EventArgs e)
316316

317317
public void Dispose()
318318
{
319-
if (_disposed)
319+
if (_disposed)
320320
return;
321321

322322
_disposed = true;

src/WinDepends/CModule.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* VERSION: 1.00
88
*
9-
* DATE: 25 Nov 2025
9+
* DATE: 25 Dec 2025
1010
*
1111
* Implementation of base CModule and CModuleComparer classes.
1212
*
@@ -719,8 +719,7 @@ public CModuleData()
719719
/// <param name="other">The <see cref="CModuleData"/> object to copy from.</param>
720720
public CModuleData(CModuleData other)
721721
{
722-
if (other == null)
723-
throw new ArgumentNullException(nameof(other));
722+
ArgumentNullException.ThrowIfNull(other);
724723

725724
FileTimeStamp = other.FileTimeStamp;
726725
LinkTimeStamp = other.LinkTimeStamp;

src/WinDepends/CUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ public static Rectangle GetAdjustedBounds(Rectangle originalBounds)
928928
public static bool IsPointVisible(Point pt)
929929
{
930930
return Screen.AllScreens.Any(screen => screen.WorkingArea.Contains(pt));
931-
}
931+
}
932932
}
933933

934934
public static class PeExceptionHelper

src/WinDepends/ConfigurationForm.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,11 +603,10 @@ private void ConfigOK_Click(object sender, EventArgs e)
603603

604604
// Track if ApiSet configuration changed
605605
bool apiSetConfigChanged = false;
606-
string newApiSetFile = string.Empty;
607606

608607
if (_config.UseApiSetSchemaFile && (!string.IsNullOrEmpty(apisetTextBox.Text)))
609608
{
610-
newApiSetFile = apisetTextBox.Text;
609+
var newApiSetFile = apisetTextBox.Text;
611610
if (!newApiSetFile.Equals(_config.ApiSetSchemaFile, StringComparison.OrdinalIgnoreCase))
612611
{
613612
apiSetConfigChanged = true;

src/WinDepends/MainForm.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* VERSION: 1.00
88
*
9-
* DATE: 22 Dec 2025
9+
* DATE: 27 Dec 2025
1010
*
1111
* Codename: VasilEk
1212
*
@@ -16,7 +16,6 @@
1616
* PARTICULAR PURPOSE.
1717
*
1818
*******************************************************************************/
19-
using Microsoft.Win32;
2019
using System.Diagnostics;
2120
using System.Reflection.PortableExecutable;
2221
using System.Text;
@@ -665,6 +664,15 @@ private TreeNode AddModuleEntryCore(
665664
moduleDisplayName = moduleDisplayName.ToUpperInvariant();
666665
}
667666

667+
// Mark forward user as red if there is no forward module.
668+
if (module.IsForward && module.FileNotFound && parentNode?.Tag is CModule parent)
669+
{
670+
parent.OtherErrorsPresent = true;
671+
parent.ModuleImageIndex = parent.GetIconIndexForModule();
672+
parentNode.ImageIndex = parent.ModuleImageIndex;
673+
parentNode.SelectedImageIndex = parent.ModuleImageIndex;
674+
}
675+
668676
// 5. Create the tree node
669677
module.ModuleImageIndex = module.GetIconIndexForModule();
670678
TreeNode tvNode = new(moduleDisplayName)

src/WinDepends/Properties/PublishProfiles/FolderProfile.pubxml.user

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
44
-->
55
<Project>
66
<PropertyGroup>
7-
<History>True|2025-11-30T11:21:39.7666479Z||;True|2025-11-28T20:51:53.6631706-08:00||;True|2025-11-28T20:41:17.1713664-08:00||;True|2025-10-10T03:44:17.6796929-07:00||;True|2025-08-15T02:39:06.6012701-07:00||;True|2025-08-14T23:56:07.2876067-07:00||;True|2025-08-08T01:04:45.8262060-07:00||;True|2025-06-26T20:01:46.1674068-07:00||;True|2025-06-26T19:50:18.1091549-07:00||;True|2025-06-23T19:47:49.7890487-07:00||;True|2025-06-23T08:16:59.1089939-07:00||;True|2025-06-23T08:09:49.5979506-07:00||;True|2025-06-10T23:41:09.4782815-07:00||;True|2025-06-10T09:04:58.8706168-07:00||;True|2025-06-09T22:01:13.5430290-07:00||;True|2025-06-09T21:51:57.5699082-07:00||;True|2025-06-08T05:12:03.7168458-07:00||;True|2025-06-08T05:10:06.7758760-07:00||;True|2025-06-08T05:01:45.4429757-07:00||;True|2025-06-08T04:07:45.6012939-07:00||;True|2025-06-05T07:08:01.2632010-07:00||;True|2025-06-02T18:43:10.8332935-07:00||;True|2025-05-30T21:39:49.8162671-07:00||;True|2025-05-30T21:35:38.0562160-07:00||;True|2025-05-30T20:19:21.7215736-07:00||;True|2025-05-30T20:18:16.4837076-07:00||;True|2025-05-30T20:16:46.6774966-07:00||;True|2025-05-30T03:32:36.2094928-07:00||;True|2025-04-24T17:39:42.2118227-07:00||;True|2025-04-19T08:48:10.9167514-07:00||;True|2025-04-14T05:38:08.8797607-07:00||;True|2025-04-14T05:34:40.1440417-07:00||;True|2025-04-11T21:50:25.4454756-07:00||;True|2025-04-11T21:43:06.9776140-07:00||;True|2025-04-11T21:37:23.2237292-07:00||;True|2025-04-11T09:33:39.2273731-07:00||;True|2025-04-11T09:32:22.0245993-07:00||;True|2025-04-11T09:29:59.8385856-07:00||;True|2025-04-11T09:29:21.5595071-07:00||;True|2025-04-11T09:28:39.9691117-07:00||;True|2025-04-11T09:24:23.2904958-07:00||;True|2025-04-11T09:03:26.9933844-07:00||;True|2025-04-11T08:49:28.3231653-07:00||;True|2025-04-11T06:58:06.3004021-07:00||;True|2025-04-11T06:32:08.3402211-07:00||;True|2025-04-11T06:23:35.2650927-07:00||;True|2025-04-10T17:00:46.2273886-07:00||;True|2025-04-10T16:59:25.4169666-07:00||;True|2025-04-10T16:52:38.1459652-07:00||;True|2025-04-10T16:51:28.3431757-07:00||;True|2025-03-29T09:00:27.2192073-07:00||;True|2025-03-21T10:49:57.4986186-07:00||;True|2025-03-21T10:13:01.8804030-07:00||;True|2025-03-21T08:26:38.9125796-07:00||;True|2025-03-19T06:45:01.2597636-07:00||;True|2025-03-17T21:37:28.0777693-07:00||;True|2025-03-16T04:01:57.1197703-07:00||;True|2025-03-09T06:22:58.8950106-07:00||;True|2025-03-04T18:27:02.8845826-08:00||;True|2025-03-03T05:28:22.4510556-08:00||;True|2025-03-03T05:25:23.7044595-08:00||;True|2025-02-28T06:32:46.5499153-08:00||;True|2025-02-27T03:25:45.7874589-08:00||;True|2025-02-23T00:02:57.4171611-08:00||;True|2025-02-23T00:00:21.8872849-08:00||;True|2025-02-22T06:19:28.3974860-08:00||;True|2025-02-21T20:04:29.9471680-08:00||;True|2025-02-14T20:08:02.7450731-08:00||;True|2025-02-14T19:35:55.3474613-08:00||;True|2025-02-04T22:35:54.9164108-08:00||;True|2025-01-29T15:44:19.1444832-08:00||;True|2024-12-29T21:05:55.1380625-08:00||;True|2024-12-28T19:40:27.4554865-08:00||;True|2024-12-24T16:16:06.9953935-08:00||;True|2024-12-22T07:14:19.9098212-08:00||;True|2024-12-21T05:32:49.4722311-08:00||;True|2024-12-20T20:25:45.4977084-08:00||;True|2024-12-13T18:23:33.2765539-08:00||;True|2024-12-07T09:23:19.6036517-08:00||;True|2024-12-07T09:08:16.6395525-08:00||;True|2024-12-06T23:47:46.9656057-08:00||;True|2024-12-02T05:05:52.9412726-08:00||;True|2024-12-02T05:05:41.6547252-08:00||;True|2024-12-02T05:04:44.4169742-08:00||;True|2024-11-26T15:43:58.3541482-08:00||;True|2024-11-26T06:02:17.8059017-08:00||;True|2024-11-26T06:02:07.5179055-08:00||;True|2024-11-26T06:00:12.7155374-08:00||;True|2024-11-26T05:55:41.1692015-08:00||;True|2024-11-25T05:35:34.9394890-08:00||;True|2024-11-22T07:55:41.1362760-08:00||;True|2024-11-22T07:46:55.2795817-08:00||;True|2024-11-18T06:40:00.8682842-08:00||;True|2024-11-15T19:56:00.5747446-08:00||;True|2024-11-15T07:47:42.3366975-08:00||;True|2024-11-15T07:08:01.7585082-08:00||;True|2024-11-14T16:05:14.7860695-08:00||;True|2024-11-09T00:48:02.7322468-08:00||;True|2024-10-19T08:04:04.0346007-07:00||;True|2024-10-19T08:01:09.9689406-07:00||;</History>
7+
<History>True|2025-12-27T05:53:37.0025443Z||;True|2025-11-30T03:21:39.7666479-08:00||;True|2025-11-28T20:51:53.6631706-08:00||;True|2025-11-28T20:41:17.1713664-08:00||;True|2025-10-10T03:44:17.6796929-07:00||;True|2025-08-15T02:39:06.6012701-07:00||;True|2025-08-14T23:56:07.2876067-07:00||;True|2025-08-08T01:04:45.8262060-07:00||;True|2025-06-26T20:01:46.1674068-07:00||;True|2025-06-26T19:50:18.1091549-07:00||;True|2025-06-23T19:47:49.7890487-07:00||;True|2025-06-23T08:16:59.1089939-07:00||;True|2025-06-23T08:09:49.5979506-07:00||;True|2025-06-10T23:41:09.4782815-07:00||;True|2025-06-10T09:04:58.8706168-07:00||;True|2025-06-09T22:01:13.5430290-07:00||;True|2025-06-09T21:51:57.5699082-07:00||;True|2025-06-08T05:12:03.7168458-07:00||;True|2025-06-08T05:10:06.7758760-07:00||;True|2025-06-08T05:01:45.4429757-07:00||;True|2025-06-08T04:07:45.6012939-07:00||;True|2025-06-05T07:08:01.2632010-07:00||;True|2025-06-02T18:43:10.8332935-07:00||;True|2025-05-30T21:39:49.8162671-07:00||;True|2025-05-30T21:35:38.0562160-07:00||;True|2025-05-30T20:19:21.7215736-07:00||;True|2025-05-30T20:18:16.4837076-07:00||;True|2025-05-30T20:16:46.6774966-07:00||;True|2025-05-30T03:32:36.2094928-07:00||;True|2025-04-24T17:39:42.2118227-07:00||;True|2025-04-19T08:48:10.9167514-07:00||;True|2025-04-14T05:38:08.8797607-07:00||;True|2025-04-14T05:34:40.1440417-07:00||;True|2025-04-11T21:50:25.4454756-07:00||;True|2025-04-11T21:43:06.9776140-07:00||;True|2025-04-11T21:37:23.2237292-07:00||;True|2025-04-11T09:33:39.2273731-07:00||;True|2025-04-11T09:32:22.0245993-07:00||;True|2025-04-11T09:29:59.8385856-07:00||;True|2025-04-11T09:29:21.5595071-07:00||;True|2025-04-11T09:28:39.9691117-07:00||;True|2025-04-11T09:24:23.2904958-07:00||;True|2025-04-11T09:03:26.9933844-07:00||;True|2025-04-11T08:49:28.3231653-07:00||;True|2025-04-11T06:58:06.3004021-07:00||;True|2025-04-11T06:32:08.3402211-07:00||;True|2025-04-11T06:23:35.2650927-07:00||;True|2025-04-10T17:00:46.2273886-07:00||;True|2025-04-10T16:59:25.4169666-07:00||;True|2025-04-10T16:52:38.1459652-07:00||;True|2025-04-10T16:51:28.3431757-07:00||;True|2025-03-29T09:00:27.2192073-07:00||;True|2025-03-21T10:49:57.4986186-07:00||;True|2025-03-21T10:13:01.8804030-07:00||;True|2025-03-21T08:26:38.9125796-07:00||;True|2025-03-19T06:45:01.2597636-07:00||;True|2025-03-17T21:37:28.0777693-07:00||;True|2025-03-16T04:01:57.1197703-07:00||;True|2025-03-09T06:22:58.8950106-07:00||;True|2025-03-04T18:27:02.8845826-08:00||;True|2025-03-03T05:28:22.4510556-08:00||;True|2025-03-03T05:25:23.7044595-08:00||;True|2025-02-28T06:32:46.5499153-08:00||;True|2025-02-27T03:25:45.7874589-08:00||;True|2025-02-23T00:02:57.4171611-08:00||;True|2025-02-23T00:00:21.8872849-08:00||;True|2025-02-22T06:19:28.3974860-08:00||;True|2025-02-21T20:04:29.9471680-08:00||;True|2025-02-14T20:08:02.7450731-08:00||;True|2025-02-14T19:35:55.3474613-08:00||;True|2025-02-04T22:35:54.9164108-08:00||;True|2025-01-29T15:44:19.1444832-08:00||;True|2024-12-29T21:05:55.1380625-08:00||;True|2024-12-28T19:40:27.4554865-08:00||;True|2024-12-24T16:16:06.9953935-08:00||;True|2024-12-22T07:14:19.9098212-08:00||;True|2024-12-21T05:32:49.4722311-08:00||;True|2024-12-20T20:25:45.4977084-08:00||;True|2024-12-13T18:23:33.2765539-08:00||;True|2024-12-07T09:23:19.6036517-08:00||;True|2024-12-07T09:08:16.6395525-08:00||;True|2024-12-06T23:47:46.9656057-08:00||;True|2024-12-02T05:05:52.9412726-08:00||;True|2024-12-02T05:05:41.6547252-08:00||;True|2024-12-02T05:04:44.4169742-08:00||;True|2024-11-26T15:43:58.3541482-08:00||;True|2024-11-26T06:02:17.8059017-08:00||;True|2024-11-26T06:02:07.5179055-08:00||;True|2024-11-26T06:00:12.7155374-08:00||;True|2024-11-26T05:55:41.1692015-08:00||;True|2024-11-25T05:35:34.9394890-08:00||;True|2024-11-22T07:55:41.1362760-08:00||;True|2024-11-22T07:46:55.2795817-08:00||;True|2024-11-18T06:40:00.8682842-08:00||;True|2024-11-15T19:56:00.5747446-08:00||;True|2024-11-15T07:47:42.3366975-08:00||;True|2024-11-15T07:08:01.7585082-08:00||;True|2024-11-14T16:05:14.7860695-08:00||;True|2024-11-09T00:48:02.7322468-08:00||;True|2024-10-19T08:04:04.0346007-07:00||;</History>
88
<LastFailureDetails />
99
</PropertyGroup>
1010
</Project>

src/WinDepends/SysInfoDialogForm.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*
1616
*******************************************************************************/
1717
namespace WinDepends;
18+
1819
public partial class SysInfoDialogForm : Form
1920
{
2021
readonly List<PropertyElement> m_SysInfo;

src/WinDepends/res/BuildDate.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Thu 12/25/2025 0:36:30.46
1+
Fri 12/26/2025 21:53:31.64

0 commit comments

Comments
 (0)