#!perl -w

BEGIN {

	print "1..0 # Skip win32 required\n" and exit unless $^O =~ /win32|cygwin/i;

	$| = 1;

}



# $Id: 06_sendkeys.t,v 1.2 2008/10/01 11:10:12 int32 Exp $



use strict;

use Test::More qw(no_plan);



use Win32::GuiTest qw(:ALL);



my $debug = 1;

sub debug { warn "@_\n" if $debug }



sub cmparray

{

	my ( $a, $b) = @_;

	unless ( $#$a == $#$b) {

		debug("array1:@$a\narray2:@$b\n");

		return;

	}

	for ( my $i = 0; $i < @$a; $i++) {

		next if $a->[$i] == $b-> [$i];

		debug("$a->[$i] != $b->[$i]\narray1:@$a\narray2:@$b\n");

		return 0;

	}

	return 1;

}



sub cmpkeysets

{

	my @a = Win32::GuiTest::parse_keys(shift);

	my @b = Win32::GuiTest::parse_keys(shift);

	return cmparray(\@a,\@b);

}



sub cmpkeyset

{

	my @a = Win32::GuiTest::parse_keys(shift);

	return cmparray(\@a,\@_);

}



# string -> raw keys

ok( cmpkeyset('a', 

	ord('A'), 0, 

	ord('A'), KEYEVENTF_KEYUP,

), 'lowercase character key');

ok( cmpkeyset('B', 

	VK_SHIFT, 0, 

	ord('B'), 0, 

	ord('B'), KEYEVENTF_KEYUP,

	VK_SHIFT, KEYEVENTF_KEYUP,

), 'uppercase character key');

ok( cmpkeyset('+c', 

	VK_SHIFT, 0, 

	ord('C'), 0, 

	ord('C'), KEYEVENTF_KEYUP,

	VK_SHIFT, KEYEVENTF_KEYUP,

), 'shift+character key');

ok( cmpkeyset('^9', 

	VK_CONTROL, 0, 

	ord('9'), 0, 

	ord('9'), KEYEVENTF_KEYUP,

	VK_CONTROL, KEYEVENTF_KEYUP,

), 'control+character key');

ok( cmpkeyset('%a', 

	VK_MENU, 0, 

	ord('A'), 0, 

	ord('A'), KEYEVENTF_KEYUP,

	VK_MENU, KEYEVENTF_KEYUP,

), 'alt+character key');



# {} simple character parsing

ok( cmpkeysets('A',    '{A}')    ,        "{char} identity");

ok( cmpkeysets('a',    '{'.ord('A').'}'), "{char} charcode");

ok( cmpkeysets('',     '{A 0}')  ,        "{char} x0");

ok( cmpkeysets('A',    '{A 1}')  ,        "{char} x1");

ok( cmpkeysets('AA',   '{A 2}')  ,        "{char} x2");

ok( cmpkeysets('AAAA', '{A 4}')  ,        "{char} x4");



# modkeys () simple identity

ok( cmpkeysets('+a',    '(+a)')        ,  "grouping identity");

ok( cmpkeysets('+a',    '+(a)')        ,  "shift grouping");

ok( cmpkeysets('+a',    '+((a))')      ,  "shift double grouping");

ok( cmpkeysets('+a',    '+(((a)))')    ,  "shift triple grouping");

ok( cmpkeysets('%(+a)', '%(+(a))')     ,  "twomod identity");



# string -> virtual keys

ok( cmpkeyset('{F10}', 

	VK_F10, 0, 

	VK_F10, KEYEVENTF_KEYUP,

), 'F10');

ok( cmpkeyset('+{DELETE}', 

	VK_SHIFT,  0, 

	VK_DELETE, 0, 

	VK_DELETE, KEYEVENTF_KEYUP,

	VK_SHIFT,  KEYEVENTF_KEYUP,

), 'shift+delete');

ok( cmpkeyset('^{INSERT}', 

	VK_CONTROL,  0, 

	VK_INSERT, 0, 

	VK_INSERT, KEYEVENTF_KEYUP,

	VK_CONTROL,  KEYEVENTF_KEYUP,

), 'control+insert');

ok( cmpkeyset('%{PGDN}', 

	VK_MENU,  0, 

	VK_NEXT, 0, 

	VK_NEXT,  KEYEVENTF_KEYUP,

	VK_MENU,  KEYEVENTF_KEYUP,

), 'alt+pgdn');





# {} simple vkey parsing

ok( cmpkeysets('{TAB}',     '{TAB 1}') ,             "{vkey} identity");

ok( cmpkeysets('{TAB}',     '{' . VK_TAB    . '}') , "{vkey} one-digit numeric");

ok( cmpkeysets('{DELETE}',  '{' . VK_DELETE . '}') , "{vkey} two-digit numeric");

ok( cmpkeysets('{TAB}{TAB}','{TAB 2}') ,             "{vkey} count");

# {} and () and modkeys

ok( cmpkeysets('+{BACK}',  '+({BACK})'),              "vkey shift group 1");

ok( cmpkeysets('+{BACK}',  '(+{BACK})'),              "vkey shift group 2");



sub vkey2key

{

	my $r = VkKeyScan(ord(shift));

	my $v = '0' . ($r & 0xff); # in case of 1-digit code

	my $m = '';

	$m .= '+' if $r & 0x100;

	$m .= '^' if $r & 0x200;

	$m .= '%' if $r & 0x400;

	return "${m}{$v}";

}



# escaped keys

ok( cmpkeysets( "{{}", vkey2key('{')), 'escaped {');

ok( cmpkeysets( "{+}", vkey2key('+')), 'escaped +');

ok( cmpkeysets( "{(}", vkey2key('(')), 'escaped (');

ok( cmpkeysets( "{^}", vkey2key('^')), 'escaped ^');

ok( cmpkeysets( "{%}", vkey2key('%')), 'escaped %');

ok( cmpkeysets( "{~}", vkey2key('~')), 'escaped ~');

ok( cmpkeysets( "{{}{{}", "{{ 2}"),    'escaped {{');



# enter

ok( cmpkeyset('~', 

	VK_RETURN, 0, 

	VK_RETURN, KEYEVENTF_KEYUP,

), 'enter');

ok( cmpkeyset('+~', 

	VK_SHIFT,  0, 

	VK_RETURN, 0, 

	VK_RETURN, KEYEVENTF_KEYUP,

	VK_SHIFT,  KEYEVENTF_KEYUP, 

), 'shift+enter');



# unicode as altkeys

ok( cmpkeyset("\x{101}",

	VK_MENU,   0,

	VK_DOWN,   0,

	VK_DOWN,   KEYEVENTF_KEYUP,

	VK_CLEAR,  0,

	VK_CLEAR,  KEYEVENTF_KEYUP,

	VK_HOME,   0,

	VK_HOME,   KEYEVENTF_KEYUP,

	VK_MENU,   KEYEVENTF_KEYUP,

), 'chr(257)');



ok( cmpkeyset("+(\x{8D1})",

	VK_SHIFT,  0,

	VK_MENU,   0,

	VK_DOWN,   0,

	VK_DOWN,   KEYEVENTF_KEYUP,

	VK_DOWN,   0,

	VK_DOWN,   KEYEVENTF_KEYUP,

	VK_CLEAR,  0,

	VK_CLEAR,  KEYEVENTF_KEYUP,

	VK_HOME,   0,

	VK_HOME,   KEYEVENTF_KEYUP,

	VK_MENU,   KEYEVENTF_KEYUP,

	VK_SHIFT,  KEYEVENTF_KEYUP,

), 'shift+chr(2257)');



# unicode groups

ok( cmpkeysets("\x{100}",         "{\x{100}}"),    "{unicode} identity");

ok( cmpkeysets("\x{101}",         "{\x{101} 1}"),  "{unicode} x1");

ok( cmpkeysets("\x{102}\x{102}",  "{\x{102} 2}"),  "{unicode} x2");





1;

