The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

use strict;

my @tests = (
	"EnumProcesses",
	"EnumProcessModules",
	"GetLastProcessStatusError",
	"GetModuleBaseName",
	"GetModuleFileNameEx",
	"GetModuleInformation",
	"SetLastProcessStatusError"
);

sub speak { printf "\n%-70s", @_; }
sub croak { printf "\n%-70s", @_; }

use Test;
speak "plan tests: "; plan tests => scalar @tests + 1;

use Win32API::ProcessStatus ':All';
speak "test use Win32API::ProcessStatus ':All': "; ok 1;

my $result = 1;
foreach my $test (@tests) {
	speak "test $test: ";
	if (eval "Test$test") {
		ok 1;
	} else {
		croak "  GetLastProcessStatusError() returned \"" . GetLastProcessStatusError . "\"";
		ok 0;
		$result = 0;
	}
}
speak "summarize tests: "; print $result ? "success" : "failure", "\n";


sub TestEnumProcesses {
	my ($result, $IDs);

	$result = EnumProcesses($IDs);
	croak "  EnumProcesses(\$IDs) returned \"$result\"";
	if (!$result) { return 0; }

	1
}


sub TestEnumProcessModules {
	my ($result, $handle, $handles, $result2);

	use Win32API::Process ':All';

	$handle = OpenProcess(PROCESS_ALL_ACCESS, 0, $$);
	croak "  OpenProcess(PROCESS_ALL_ACCESS, 0, $$) returned \"$handle\"";
	if ($handle == 0) { return 0; }

	$result = EnumProcessModules($handle, $handles);
	croak "  EnumProcessModules($handle, \$handles) returned \"$result\"";
	if (!$result) { goto EXIT; }
EXIT:
	$result2 = CloseProcess($handle);
	croak "  CloseProcess($handle) returned \"$result2\"";
	if (!$result2) { return 0; }

	$result
}


sub TestGetLastProcessStatusError {
	my ($result, $IDs, $error, $handles);

	SetLastProcessStatusError(0);
	croak "  SetLastProcessStatusError(0) called";

	$result = EnumProcesses($IDs);
	croak "  EnumProcesses(\$IDs) returned \"$result\"";
	if (!$result) { return 0; }

	$error = GetLastProcessStatusError();
	croak "  GetLastProcessStatusError() returned \"$error\"";
	if ($error != 0) { return 0; }

	$result = EnumProcessModules(0, $handles);
	croak "  EnumProcessModules(0, \$handles) returned \"$result\"";
	if ($result) { return 0; }

	$error = GetLastProcessStatusError();
	croak "  GetLastProcessStatusError() returned \"$error\"";
	if ($error == 0) { return 0; }

	1
}


sub TestGetModuleBaseName {
	my ($result, $handle, $handles, $name, $result2);

	use Win32API::Process ':All';

	$handle = OpenProcess(PROCESS_ALL_ACCESS, 0, $$);
	croak "  OpenProcess(PROCESS_ALL_ACCESS, 0, $$) returned \"$handle\"";
	if ($handle == 0) { return 0; }

	$result = EnumProcessModules($handle, $handles);
	croak "  EnumProcessModules($handle, \$handles) returned \"$result\"";
	if (!$result) { goto EXIT; }

	$result = GetModuleBaseName($handle, $$handles[0], $name);
	croak "  GetModuleBaseName($handle, $$handles[0], \$name) returned \"$result\"";
	if (!$result) { return 0; }
EXIT:
	$result2 = CloseProcess($handle);
	croak "  CloseProcess($handle) returned \"$result2\"";
	if (!$result2) { return 0; }

	$result
}


sub TestGetModuleFileNameEx {
	my ($result, $handle, $handles, $name, $result2);

	use Win32API::Process ':All';

	$handle = OpenProcess(PROCESS_ALL_ACCESS, 0, $$);
	croak "  OpenProcess(PROCESS_ALL_ACCESS, 0, $$) returned \"$handle\"";
	if ($handle == 0) { return 0; }

	$result = EnumProcessModules($handle, $handles);
	croak "  EnumProcessModules($handle, \$handles) returned \"$result\"";
	if (!$result) { goto EXIT; }

	$result = GetModuleFileNameEx($handle, $$handles[0], $name);
	croak "  GetModuleFileNameEx($handle, $$handles[0], \$name) returned \"$result\"";
	if (!$result) { return 0; }
EXIT:
	$result2 = CloseProcess($handle);
	croak "  CloseProcess($handle) returned \"$result2\"";
	if (!$result2) { return 0; }

	$result
}


sub TestGetModuleInformation {
	my ($result, $handle, $handles, $modinfo, $result2);

	use Win32API::Process ':All';

	$handle = OpenProcess(PROCESS_ALL_ACCESS, 0, $$);
	croak "  OpenProcess(PROCESS_ALL_ACCESS, 0, $$) returned \"$handle\"";
	if ($handle == 0) { return 0; }

	$result = EnumProcessModules($handle, $handles);
	croak "  EnumProcessModules($handle, \$handles) returned \"$result\"";
	if (!$result) { goto EXIT; }

	$result = GetModuleInformation($handle, $$handles[0], $modinfo);
	croak "  GetModuleInformation($handle, $$handles[0], \$modinfo) returned \"$result\"";
	if (!$result) { return 0; }
EXIT:
	$result2 = CloseProcess($handle);
	croak "  CloseProcess($handle) returned \"$result2\"";
	if (!$result2) { return 0; }

	$result
}


sub TestSetLastProcessStatusError {
	my ($error);

	SetLastProcessStatusError(0);
	croak "  SetLastProcessStatusError(0) called";

	$error = GetLastProcessStatusError();
	croak "  GetLastProcessStatusError() returned \"$error\"";
	if ($error != 0) { return 0; }

	SetLastProcessStatusError(18);
	croak "  SetLastProcessStatusError(18) called";

	$error = GetLastProcessStatusError();
	croak "  GetLastProcessStatusError() returned \"$error\"";
	if ($error != 18) { return 0; }

	1
}