#!/usr/bin/perl use strict; use warnings; use inc::testplan(1, 7); use test_inc::loginit; use constant { D => 0 }; use Wx; use Wx::Event qw( EVT_IDLE EVT_TREE_SEL_CHANGED EVT_TREE_SEL_CHANGING EVT_TREE_ITEM_EXPANDED ); #BEGIN { #use inc::loginit; #} my $package = require("./client/app.pl"); # NOTE: crash will typically happen here. If it does, we're dead in # the water (probably a syntax error.) my $app = eval {$package->new(); }; ok((not $@), "$package constructor") or BAIL_OUT("error: " . join('\n', split(/\n+/, $@))); local $SIG{__WARN__}; my $main_frame = $package->_main_frame; $main_frame->set_TESTING(1); my $first = sub { $main_frame->sidebar->select_item('libraries'); my $tr = $main_frame->sidebar->libraries; $tr->SetFocus(); my $id = $tr->GetRootItem; $tr->Expand($id); D and warn "$id children:", $tr->GetChildrenCount($id), " (", $tr->GetChildrenCount($id,0), ")\n"; ($id) = $tr->GetFirstChild($id); # My Libraries $tr->Expand($id); D and warn "$id children:", $tr->GetChildrenCount($id), " (", $tr->GetChildrenCount($id,0), ")\n"; ($id) = $tr->GetFirstChild($id); # SQLLite test library $tr->Expand($id); D and warn "$id children:", $tr->GetChildrenCount($id), " (", $tr->GetChildrenCount($id,0), ")\n"; D and warn "tr is ", $tr->GetId, "\n"; D and warn "text: ", $tr->GetItemText($id), "\n"; D and warn "data is ", $tr->GetPlData($id); $tr->SelectItem($id); # BSD Book }; # first my @evt_subs = ( $first, ); my $shim_type = ref($main_frame->bv_manager->htmlwidget); $shim_type =~ s/dtRdr::HTMLShim:://; my @checklist = (qw( activate book_open ), ($shim_type eq 'WxMozilla' ? 'html_loaded' : 'skip1'), ); my %ok = map({$_ => 0} @checklist); # our evt_sub will trigger this EVT_TREE_SEL_CHANGED($main_frame, $main_frame->sidebar->libraries, sub { my ($fr, $event) = @_; $fr->sidebar->libraries->item_activated($event); my $foc = Wx::Window::FindFocus(); D and warn "focus is on $foc (", join(", ", $fr, $fr->sidebar->contents, $fr->sidebar), ")"; my $tb = $fr->sidebar->contents; if(not(defined($foc)) or ($foc eq $fr->sidebar->contents)) { $ok{activate}++; D and warn "that's good"; my $id = $tb->GetRootItem; $tb->UnselectAll; $tb->IsExpanded($id) and $tb->Collapse($id); $tb->Expand($id); $tb->SelectItem($id); } }); EVT_TREE_ITEM_EXPANDED($main_frame, $main_frame->sidebar->contents, sub { my ($fr, $event) = @_; D and warn "event fired: ", $event->GetItem; $ok{book_open}++; $fr->sidebar->contents->item_activated($event); }); if($shim_type eq 'WxMozilla') { # check the widget require Wx::Mozilla::Event; Wx::Mozilla::Event->import(qw( EVT_MOZILLA_LOAD_COMPLETE )); EVT_MOZILLA_LOAD_COMPLETE($main_frame->bv_manager->htmlwidget, -1, sub { D and warn "load complete"; $ok{html_loaded}++; }); } else { $ok{skip1} = 1; } # setup the IDLE event my $idle_ok = 0; my $timer = Wx::Timer->new($main_frame); Wx::Event::EVT_TIMER($main_frame, -1, sub { D and warn "hit timer"; EVT_IDLE($app, sub {}); $timer->Stop; $app->ExitMainLoop; }); my $switch = {in => 0}; EVT_IDLE($app, sub { $switch->{in} and return; # prevent piling-on local $switch->{in} = 1; D and warn "\n idle ", time(), "\n"; $evt_subs[$idle_ok] and $evt_subs[$idle_ok]->(); $idle_ok or $timer->Start(1 * 1000); $idle_ok++; # XXX we occasionally some oddities here # hmm, depending on the number of annotations? #($idle_ok >= 1) and $app->ExitMainLoop; ($idle_ok >= 12) and $app->ExitMainLoop; scalar(grep({!$ok{$_}} @checklist)) or $app->ExitMainLoop; Wx::WakeUpIdle(); 1; }); # MainLoop only reacts to events, but we'll wrap it anyway. eval { $app->MainLoop(); }; ok((not $@), "MainLoop done") or BAIL_OUT("error: " . join('\n', split(/\n+/, $@))); # MeinLeap does not have a useful return value? ok(1, 'MainLoop'); foreach my $item (@checklist) { ok($ok{$item}, $item); } D and warn "idled $idle_ok times"; ok($idle_ok, 'exit'); done; # vim:ts=2:sw=2:et:sta