You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
7.4 KiB
221 lines
7.4 KiB
15 years ago
|
#!/usr/bin/php
|
||
|
<?
|
||
|
|
||
|
// Description:
|
||
|
// This program starts karm and simulates keypresses to do a real life-test of karm.
|
||
|
// This program returns zero if all tests went ok, else an error code.
|
||
|
// You need a US or DE keyboard to run this.
|
||
|
|
||
|
// for those who do not know php:
|
||
|
// for a tutorial about php, check out www.usegroup.de
|
||
|
// for a reference about php, surf to www.php.net
|
||
|
|
||
|
// TODO
|
||
|
// prepare Windows-port
|
||
|
|
||
|
function createplannerexample()
|
||
|
{
|
||
|
$handle=fopen("/tmp/example.planner","w");
|
||
|
fwrite($handle,
|
||
|
'<?xml version="1.0"?>
|
||
|
<project name="" company="" manager="" phase="" project-start="20041101T000000Z" mrproject-version="2" calendar="1">
|
||
|
<properties>
|
||
|
<property name="cost" type="cost" owner="resource" label="Cost" description="standard cost for a resource"/>
|
||
|
</properties>
|
||
|
<phases/>
|
||
|
<calendars>
|
||
|
<day-types>
|
||
|
<day-type id="0" name="Working" description="Ein Vorgabe-Arbeitstag"/>
|
||
|
<day-type id="1" name="Nonworking" description="Ein Vorgabetag, an dem nicht gearbeitet wird"/>
|
||
|
<day-type id="2" name="Basis verwenden" description="Use day from base calendar"/>
|
||
|
</day-types>
|
||
|
<calendar id="1" name="Vorgabe">
|
||
|
<default-week mon="0" tue="0" wed="0" thu="0" fri="0" sat="1" sun="1"/>
|
||
|
<overridden-day-types>
|
||
|
<overridden-day-type id="0">
|
||
|
<interval start="0800" end="1200"/>
|
||
|
<interval start="1300" end="1700"/>
|
||
|
</overridden-day-type>
|
||
|
</overridden-day-types>
|
||
|
<days/>
|
||
|
</calendar>
|
||
|
</calendars>
|
||
|
<tasks>
|
||
|
<task id="1" name="task 1" note="" work="28800" start="20041101T000000Z" end="20041101T170000Z" percent-complete="0" priority="0" type="normal" scheduling="fixed-work"/>
|
||
|
<task id="2" name="task 2" note="" work="28800" start="20041101T000000Z" end="20041101T170000Z" percent-complete="0" priority="0" type="normal" scheduling="fixed-work">
|
||
|
<task id="3" name="subtask 1-1" note="" work="28800" start="20041101T000000Z" end="20041101T170000Z" percent-complete="0" priority="0" type="normal" scheduling="fixed-work"/>
|
||
|
<task id="4" name="subtask 1-2" note="" work="28800" start="20041101T000000Z" end="20041101T170000Z" percent-complete="0" priority="0" type="normal" scheduling="fixed-work"/>
|
||
|
</task>
|
||
|
</tasks>
|
||
|
<resource-groups/>
|
||
|
<resources/>
|
||
|
<allocations/>
|
||
|
</project>
|
||
|
');
|
||
|
fclose($handle);
|
||
|
};
|
||
|
|
||
|
function simkey($s)
|
||
|
// This function simulates keypresses that form the string $s, e.g. for $s==hallo, it simulates the keypress of h, then a, then l and so on.
|
||
|
// find a useful list of keycodes under /usr/include/X11/keysymdef.h
|
||
|
{
|
||
|
for ($i=0; $i<strlen($s); $i++)
|
||
|
{
|
||
|
usleep(10000); # this is just for the user to see what happens
|
||
|
if ($s[$i]=="/") system("xte 'key KP_Divide'");
|
||
|
else system("xte 'key ".$s[$i]."'");
|
||
|
usleep(10000);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function keysim($s)
|
||
|
// remove everything that makes you have to think twice!!
|
||
|
{
|
||
|
simkey($s);
|
||
|
}
|
||
|
|
||
|
function funkeysim($s, $count=1)
|
||
|
// same as keysim, but interprets $s as function key name to be used by xte and expects a $count to indicate how often key is to be pressed
|
||
|
{
|
||
|
for ($i=1; $i<=$count; $i++)
|
||
|
{
|
||
|
usleep(10000);
|
||
|
$rc=exec("xte 'key $s'");
|
||
|
usleep(10000);
|
||
|
}
|
||
|
return $rc;
|
||
|
}
|
||
|
|
||
|
// int main()
|
||
|
if ($argv[1]!="--batch")
|
||
|
{
|
||
|
echo "\nThis is lifetest.php, a program to test karm by starting it and simulating keypresses.\n";
|
||
|
echo "It is intended for developers who do changes to karm's sourcecode.\n";
|
||
|
echo "Before publishing these changes, they should\n";
|
||
|
echo "(a) resolve all conflicts with the latest karm sourcecode (cvs up)\n";
|
||
|
echo "(b) make sure the code still builds (make)\n";
|
||
|
echo "(c) run automated test routines like this (make check)\n\n";
|
||
|
|
||
|
echo "This program simulates keypresses, so please leave the keyboard alone during the test. Please use a us or de keyboardlayout (setxkbmap us). This must be run in X environment.\n
|
||
|
You must have XAutomation installed to run this.";
|
||
|
system("xte -h 2&>/dev/null",$rc);
|
||
|
if ($rc==0) echo " You have.\n";
|
||
|
if ($rc==127) echo " You do not have, please get it from http://hoopajoo.net/projects/xautomation.html .\n";
|
||
|
echo "This program will test karm by issueing karm, so, make sure, this calls the version you want to test (make install).\n\n";
|
||
|
|
||
|
echo "This program will now stop unless you give the parameter --batch (confirming that you do not touch the keyboard)\n";
|
||
|
|
||
|
$err="";
|
||
|
$exit=0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( system( "which xte 2> /dev/null" ) == "" ) {
|
||
|
echo "xte not found\n";
|
||
|
exit(0);
|
||
|
}
|
||
|
switch (funkeysim("Alt_L"))
|
||
|
{
|
||
|
case 1:
|
||
|
$err.="this must be run in an X environment\n";
|
||
|
break;
|
||
|
case 127:
|
||
|
$err.="you do not have XAutomation installed, get it from http://hoopajoo.net/projects/xautomation.html\n";
|
||
|
break;
|
||
|
}
|
||
|
// the following is the same as 'if file_exist(...) unlink(...)', but atomic
|
||
|
@unlink ("/tmp/karmtest.ics");
|
||
|
@unlink ("/tmp/example.planner");
|
||
|
if ($err=="")
|
||
|
{
|
||
|
// start and wait till mainwindow is up
|
||
|
// the mouse can be in the way, so, move it out. This here even works with "focus strictly under mouse".
|
||
|
system("xte 'mousemove 1 1'");
|
||
|
echo "\nStarting karm";
|
||
|
$process=popen("karm --geometry 200x100+0+0 /tmp/karmtest.ics >/dev/null 2>&1", 'w');
|
||
|
$rc=1;
|
||
|
while ($rc==1) system("dcop `dcop 2>/dev/null | grep karm` KarmDCOPIface version",$rc);
|
||
|
echo "mainwindow is ready";
|
||
|
sleep (1);
|
||
|
|
||
|
funkeysim("Alt_L");
|
||
|
|
||
|
funkeysim("Right",3);
|
||
|
funkeysim("Down",2);
|
||
|
funkeysim("Return");
|
||
|
sleep (1);
|
||
|
funkeysim("Down",2);
|
||
|
funkeysim("Tab",5);
|
||
|
simkey("/tmp/karmtest.ics");
|
||
|
sleep (1);
|
||
|
funkeysim("Return");
|
||
|
sleep (1);
|
||
|
funkeysim("Return");
|
||
|
sleep (1);
|
||
|
|
||
|
# add a new task
|
||
|
funkeysim("Alt_L");
|
||
|
funkeysim("Right",2);
|
||
|
funkeysim("Down");
|
||
|
sleep (1);
|
||
|
funkeysim("Return");
|
||
|
sleep (1);
|
||
|
simkey("example 1");
|
||
|
funkeysim("Return");
|
||
|
sleep (1);
|
||
|
|
||
|
echo "\nCreating a planner project file...";
|
||
|
createplannerexample();
|
||
|
|
||
|
# import planner project file
|
||
|
funkeysim("Alt_L");
|
||
|
funkeysim("Down",5);
|
||
|
funkeysim("Right");
|
||
|
funkeysim("Down");
|
||
|
funkeysim("Return");
|
||
|
sleep (2);
|
||
|
keysim("/tmp/example.planner");
|
||
|
sleep (1);
|
||
|
funkeysim("Return");
|
||
|
sleep (1);
|
||
|
|
||
|
# export to CSV file
|
||
|
funkeysim("Alt_L");
|
||
|
funkeysim("Down",5);
|
||
|
funkeysim("Right");
|
||
|
funkeysim("Down",2);
|
||
|
funkeysim("Return");
|
||
|
sleep(2);
|
||
|
keysim("/tmp/exporttest.csv");
|
||
|
sleep(1);
|
||
|
funkeysim("Tab",6);
|
||
|
system ("xte 'keydown Alt_L'");
|
||
|
system ("xte 'key m'");
|
||
|
system ("xte 'keyup Alt_L'");
|
||
|
sleep(1);
|
||
|
funkeysim("Return");
|
||
|
|
||
|
# send CTRL_Q
|
||
|
sleep (2);
|
||
|
echo "\nsending CTRL_Q...\n";
|
||
|
system ("xte 'keydown Control_L'");
|
||
|
system ("xte 'key Q'");
|
||
|
system ("xte 'keyup Control_L'");
|
||
|
|
||
|
$content=file_get_contents("/tmp/karmtest.ics");
|
||
|
$lines=explode("\n",$content);
|
||
|
if (!preg_match("/DTSTAMP:[0-9]{1,8}T[0-9]{1,6}Z/", $lines[4])) $err.="iCal file: wrong dtstamp";
|
||
|
if ($lines[12]<>"SUMMARY:example 1") $err.="iCal file: wrong task, should be example 1, but is $lines[12]";
|
||
|
if ($lines[16]<>"END:VTODO") $err.="iCal file: wrong end of vtodo";
|
||
|
$content=file_get_contents("/tmp/exporttest.csv");
|
||
|
$lines=explode("\n",$content);
|
||
|
if (!preg_match("/\"example 1\",,0[,|.]00,0[,|.]00,0[,|.]00,0[,|.]00/", $lines[0])) $err.="csv export is wrong";
|
||
|
pclose($process);
|
||
|
if ($err == "") @unlink ("/tmp/karmtest.ics");
|
||
|
@unlink ("/tmp/example.planner");
|
||
|
if ($err == "") @unlink ("/tmp/exporttest.csv");
|
||
|
}
|
||
|
}
|
||
|
echo $err;
|
||
|
if ($err!="") exit(1);
|
||
|
?>
|