#!/usr/bin/env perl use strict; use warnings; use 5.010; use autodie qw/:all/; use Cwd; use GD qw/:DEFAULT :cmp/; use Test::More tests => 42; use Time::HiRes qw/sleep/; use X11::GUITest qw/:ALL/; my ($pid_xnest, $pid_twm); my $win; my ($width, $height); my $pwd = getcwd(); my $test_id = 0; $ENV{HOME} = 'test'; sub waitfor(&) { my ($sub) = @_; my $out; for (1 .. 10) { sleep(0.05); $out = &{$sub}; if ($out) { return $out; } } return 0; } sub feh_start { my ($opts, $files) = @_; my $id; $opts //= q{}; $files //= 'test/ok/png'; StartApp("feh ${opts} ${files}"); ($id) = WaitWindowViewable(qr{^feh}); if (not $id) { BAIL_OUT("Unable to start feh ${opts} ${files}"); } if (not SetInputFocus($id)) { BAIL_OUT("Unable to focus window"); } return $id; } sub feh_stop { SendKeys('{ESC}'); if (not waitfor { not FindWindowLike(qr{^feh}) }) { BAIL_OUT("Unclosed feh window still open, cannot continue"); } } sub same_files { my ($one, $two) = @_; my $img_one = GD::Image->new($one); my $img_two = GD::Image->new($two); if (not defined $img_one or not defined $img_two) { return 0; } return( ! ($img_one->compare($img_two) & GD_CMP_IMAGE)); } sub check_scr { my ($file) = @_; system("import -silent -window root /tmp/feh_${$}.png"); return same_files("test/scr/${file}", "/tmp/feh_${$}.png"); } sub test_scr { my ($file) = @_; my $msg = "X root window is test/scr/${file}"; $test_id++; if (waitfor { check_scr($file) }) { pass($msg); } else { fail($msg); rename("/tmp/feh_${$}.png", "/tmp/feh_${$}_${test_id}_${file}.png"); } } if (FindWindowLike(qr{^feh})) { BAIL_OUT('It appears you have an open feh window. Please close it.'); } feh_start( "--draw-actions --draw-filename --info 'echo foo; echo bar' " . '--action quux --action5 baz --action8 "nrm \'%f\'"', 'test/bg/exact/in test/bg/large/w/in test/bg/large/h/in' ); test_scr('draw_all_multi'); feh_stop(); feh_start( "--draw-actions --draw-filename --info 'echo foo; echo bar' " . '--action quux --action5 baz --action8 "nrm \'%f\'"', 'test/bg/exact/in' ); test_scr('draw_all_one'); feh_stop(); feh_start( '--fullscreen', 'test/bg/large/w/in' ); test_scr('feh_full_lwi'); feh_stop(); feh_start( q{}, 'test/bg/large/w/in' ); test_scr('feh_lwi'); SendKeys('^({RIG})'); test_scr('feh_lwi_scroll_r'); SendKeys('^({DOW})'); test_scr('feh_lwi_scroll_rd'); SendKeys('^({RIG})'); test_scr('feh_lwi_scroll_rdr'); SendKeys('^({UP})'); test_scr('feh_lwi_scroll_rdru'); SendKeys('^({LEF})'); test_scr('feh_lwi_scroll_rdrul'); feh_stop(); feh_start( '--scale-down', 'test/bg/large/w/in' ); test_scr('feh_scaledown_lwi'); feh_stop(); feh_start( '--thumbnails', 'test/ok/gif test/ok/jpg test/ok/png test/ok/pnm' ); test_scr('thumbnail_default'); feh_stop(); feh_start( '--caption-path .tc', 'test/bg/exact/in' ); test_scr('caption_none'); SendKeys('c'); test_scr('caption_new'); SendKeys('Picknick im Zenit metaphysischen Wiederscheins der astralen Kuhglocke'); test_scr('caption_while'); SendKeys('~'); test_scr('caption_done'); SendKeys('c'); test_scr('caption_while'); SendKeys('{BKS}' x 80); test_scr('caption_new'); SendKeys('~'); test_scr('caption_none'); SendKeys('cfoobar{ESC}'); test_scr('caption_none'); feh_stop(); feh_start( '--draw-actions --action8 "nrm \'%f\'"', 'test/bg/exact/in' ); test_scr('draw_action'); feh_stop(); feh_start( '--draw-filename', 'test/bg/exact/in' ); test_scr('draw_filename'); feh_stop(); feh_start( '--draw-filename --draw-actions --action8 "nrm \'%f\'"', 'test/bg/exact/in' ); test_scr('draw_filename_action'); feh_stop(); feh_start( '--action8 "nrm \'%f\'"', 'test/bg/exact/in' ); test_scr('draw_nothing'); SendKeys('d'); test_scr('draw_filename'); SendKeys('da'); test_scr('draw_action'); SendKeys('d'); test_scr('draw_filename_action'); SendKeys('da'); test_scr('draw_nothing'); feh_stop(); feh_start(q{}, 'test/bg/large/h/in'); test_scr('feh_lhi'); SendKeys('{UP}'); test_scr('feh_lhi_i'); SendKeys('{UP}'); test_scr('feh_lhi_ii'); SendKeys('^({RIG})'); test_scr('feh_lhi_iir'); SendKeys('^({RIG})'); test_scr('feh_lhi_iirr'); SendKeys('{UP}'); test_scr('feh_lhi_iirri'); SendKeys('{DOW}'); test_scr('feh_lhi_iirrio'); feh_stop(); feh_start(q{}, 'test/bg/large/h/in'); test_scr('feh_lhi'); SendKeys('{DOW}'); test_scr('feh_lhi_o'); SendKeys('{DOW}'); test_scr('feh_lhi_oo'); SendKeys('{DOW}'); test_scr('feh_lhi_ooo'); feh_stop(); feh_start(q{}, 'test/bg/transparency'); test_scr('feh_ibg_default'); feh_stop(); feh_start('--image-bg default', 'test/bg/transparency'); test_scr('feh_ibg_default'); feh_stop(); feh_start('--image-bg black', 'test/bg/transparency'); test_scr('feh_ibg_black'); feh_stop(); feh_start('--image-bg white', 'test/bg/transparency'); test_scr('feh_ibg_white'); feh_stop(); unlink('test/bg/exact/.tc/in.txt'); rmdir('test/bg/exact/.tc'); unlink("/tmp/feh_${$}.png");