The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use Cwd;
use FFI;
use FFI::Library;

plan skip_all => 'Test requires Windows'
  unless $^O =~ /^(MSWin32|cygwin)$/;

plan tests => 10;

my $kernel32 = FFI::Library->new("kernel32");
my $user32   = FFI::Library->new("user32");

ok $kernel32, 'FFI::Library.new(kernel32)';
ok $user32, 'FFI::Library.new(user32)';

my $GetCurrentDirectory = $kernel32->function('GetCurrentDirectoryA', 'sIIp');
my $GetWindowsDirectory = $kernel32->function('GetWindowsDirectoryA', 'sIpI');
my $GetModuleHandle     = $kernel32->function('GetModuleHandleA', 'sII');
my $GetModuleFileName   = $kernel32->function('GetModuleFileNameA', 'sIIpI');

ok $GetCurrentDirectory, 'function GetCurrentDirectoryA';
ok $GetWindowsDirectory, 'function GetWindowsDirectoryA';
ok $GetModuleHandle,     'function GetModuleHandleA';
ok $GetModuleFileName,   'function GetModuleFileNameA';


my $d = ' ' x 200;
my $n = $GetCurrentDirectory->(200, $d);
$d = substr($d, 0, $n);

(my $cwd = cwd) =~ s#/#\\#g;
$cwd = Win32::GetCwd() if $^O eq "cygwin";
is $d, $cwd, "\$d=$cwd";

$d = ' ' x 200;
$n = $GetWindowsDirectory->($d, 200);
$d = substr($d, 0, $n);

ok -d $d, "-d \$d";

my $h = $GetModuleHandle->(0);
ok $h, 'GetModuleHandle';

$d = ' ' x 200;
$n = $GetModuleFileName->($h, $d, 200);
$d = substr($d, 0, $n);
my $exp = $^O eq "MSWin32" ? $^X : Cygwin::posix_to_win_path($^X);
$exp = quotemeta $exp;
like $d, qr{^$exp(\.exe)?$}, "\$ like ^$exp";