use strict; use Tk; my use Tk; use strict; my $mw = MainWindow->new; my $f = $mw->Frame-> pack(-padx => 5, -pady => 5); my $message = $f->Label-> grid(-columnspan => 2, -sticky => 'ew'); my $userEntry = $f->Entry; $f->Label(-text => "User:")-> grid($userEntry, -sticky => 'e'); my $passwdEntry = $f->Entry(-show => '*'); $f->Label(-text => "Password:")-> grid($passwdEntry, -sticky => 'e'); my $button = $f->Button( -text => "Login", -command => [\&login, $userEntry, $passwdEntry, $message] )->grid(-columnspan => 2, -pady => 3); MainLoop; sub login { my ($userE, $passE, $msg) = @_; if ($userE->get ne "eric" || $passE->get ne "stigisdead") { $userE->delete(0, 'end'); $passE->delete(0, 'end'); $msg->configure(-text => "Login Failed!"); } else { $msg->configure(-text => "Login Successful"); } } #### package AuthService; sub login { my ($user, $password) = @_; return (defined($user) && defined($password) && $user eq "eric" && $password eq "swordfish"); } 1; package main; use Test::More tests => 7; ok(AuthService::login("eric", "swordfish"), "good user/password combo"); ok(!AuthService::login("", "swordfish"), "no user, good passwd"); ok(!AuthService::login(undef, "swordfish"), "undef user, good passwd"); ok(!AuthService::login("eric", ""), "good user, undef password"); ok(!AuthService::login("eric", undef), "good user, no password"); ok(!AuthService::login("", ""), "Empty user/passord"); ok(!AuthService::login(), "undef user/password"); #### ## LoginForm.pm package LoginForm; use strict; use base qw(Tk::Frame); Tk::Widget->Construct('LoginForm'); sub Populate { my ($cw, $args) = @_; $cw->SUPER::Populate($args); my $f = $cw->Frame->pack; my $msg = $f->Label-> grid(qw/-columnspan 2 -sticky ew/); my $userE = $f->Entry; $f->Label(-text => "User:")-> grid($userE, -sticky => 'e'); my $passE = $f->Entry(-show => '*'); $f->Label(-text => "Password:")-> grid($passE, -sticky => 'e'); my $button = $f->Button( -text => 'Login', -command => [Login => $cw] )->grid(qw/-columnspan 2 -pady 4/); $cw->Advertise(Message => $msg); $cw->Advertise(UserEntry => $userE); $cw->Advertise(PassEntry => $passE); $cw->Advertise(LoginButton => $button); } sub Login { my $cw = shift; my $user = $cw->Subwidget('UserEntry')->get; my $pass = $cw->Subwidget('PassEntry')->get; print "$user/$pass\n"; } 1; ## login.pl use Tk; use LoginForm; my $mw = MainWindow->new; $mw->LoginForm->pack; MainLoop; #### package LoginForm; use strict; use base qw(Tk::Frame); sub Populate { my ($cw, $args) = @_; $cw->SUPER::Populate($args); my $f = $cw->Frame->pack; my $msg = $f->Label-> grid(qw/-columnspan 2 -sticky ew/); my $userE = $f->Entry; $f->Label(-text => "User:")-> grid($userE, -sticky => 'e'); my $passE = $f->Entry(-show => '*'); $f->Label(-text => "Password:")-> grid($passE, -sticky => 'e'); my $button = $f->Button( -text => 'Login', -command => [Login => $cw] )->grid(qw/-columnspan 2 -pady 4/); $cw->Advertise(Message => $msg); $cw->Advertise(UserEntry => $userE); $cw->Advertise(PassEntry => $passE); $cw->Advertise(LoginButton => $button); $cw->ConfigSpecs(-logincmd => [qw/CALLBACK/]); } sub Login { my $cw = shift; my $user = $cw->Subwidget('UserEntry')->get; my $pass = $cw->Subwidget('PassEntry')->get; my $msgL = $cw->Subwidget('Message'); if ($cw->cget(-logincmd) && $cw->Callback(-logincmd => $user, $pass)) { $msgL->configure(-text => "Login Successful"); } else { $msgL->configure(-text => "Login Failed!"); } } 1; #### package AuthService; sub login { my ($user, $password) = @_; return (defined($user) && defined($password) && $user eq "eric" && $password eq "swordfish"); } 1; use Test::More tests => 4; use Tk; use strict; use LoginForm; my $mw = MainWindow->new; my $lf = LoginForm->new($mw, -logincmd => \&AuthService::login )->pack; my $msg = $lf->Subwidget('Message'); ##################################### ## No Parameters Set ##################################### $lf->Login; is($msg->cget(-text), "Login Failed!", "No user or password set"); ##################################### ## Good credentials ##################################### setUserPassword($lf, "eric", "swordfish"); $lf->Login; is($msg->cget(-text), "Login Successful", "Valid credentials set"); ##################################### ## No username set, good password ##################################### setUserPassword($lf, "", "swordfish"); $lf->Login; is($msg->cget(-text), "Login Failed!", "User not set, Password set"); ##################################### ## Correct User set, no password ##################################### setUserPassword($lf, "eric", ""); $lf->Login; is($msg->cget(-text), "Login Failed!", "User set, no password"); $mw->destroy; ############################################### ## Convenience routines ############################################### sub setUserPassword { my ($lf, $user, $pass) = @_; clearLoginForm($lf); $lf->Subwidget('UserEntry')->insert(0, $user); $lf->Subwidget('PassEntry')->insert(0, $pass); } sub clearLoginForm { my $lf = shift; $lf->Subwidget('Message')->configure(-text => ""); $lf->Subwidget('UserEntry')->delete(0, 'end'); $lf->Subwidget('PassEntry')->delete(0, 'end'); } #### package AuthService; sub login { my ($user, $password) = @_; return (defined($user) && defined($password) && $user eq "eric" && $password eq "swordfish"); } 1; package main; use strict; use LoginForm; use Test::More tests => 4; use Tk; my $mw = MainWindow->new; my $lf = LoginForm->new($mw, -logincmd => \&AuthService::login )->pack; my $msg = $lf->Subwidget('Message'); ##################################### ## No Parameters Set ##################################### $lf->Login; is($msg->cget(-text), "Login Failed!", "No user or password set"); ##################################### ## Good credentials ##################################### simulateLogin($lf, "eric", "swordfish"); is($msg->cget(-text), "Login Successful", "Valid credentials set"); ##################################### ## No username set, good password ##################################### simulateLogin($lf, "", "swordfish"); is($msg->cget(-text), "Login Failed!", "User not set, Password set"); ##################################### ## Correct User set, no password ##################################### simulateLogin($lf, "eric", ""); is($msg->cget(-text), "Login Failed!", "User set, no password"); sub simulateLogin { my ($lf, $user, $pass) = @_; clearLoginForm($lf); my $userE = $lf->Subwidget('UserEntry'); my $passE = $lf->Subwidget('PassEntry'); my $button = $lf->Subwidget('LoginButton'); $lf->update; $userE->focusForce; setEntry($userE, $user); $userE->eventGenerate(''); setEntry($passE, $pass); $userE->eventGenerate(''); $button->eventGenerate(''); } sub clearLoginForm { my $lf = shift; $lf->Subwidget('Message')->configure(-text => ""); $lf->Subwidget('UserEntry')->delete(0, 'end'); $lf->Subwidget('PassEntry')->delete(0, 'end'); } sub setEntry { my ($entry, $text) = @_; foreach my $ch (split(//, $text)) { $entry->eventGenerate('', -keysym => $ch); } } #### package AuthService; sub login { my ($user, $password) = @_; return (defined($user) && defined($password) && $user eq "eric" && $password eq "swordfish"); } 1; package main; use strict; use LoginForm; use Test::More tests => 4; use Tk; use Win32::GuiTest qw(SendKeys SetForegroundWindow); my $mw = MainWindow->new; my $lf = LoginForm->new($mw, -logincmd => \&AuthService::login )->pack; my $msg = $lf->Subwidget('Message'); $mw->update; SetForegroundWindow(oct($mw->id)); ##################################### ## No Parameters Set ##################################### simulateLogin($lf, "", ""); is($msg->cget(-text), "Login Failed!", "No user or password set"); ##################################### ## Good credentials ##################################### simulateLogin($lf, "eric", "swordfish"); is($msg->cget(-text), "Login Successful", "Valid credentials set"); ##################################### ## No username set, good password ##################################### simulateLogin($lf, "", "swordfish"); is($msg->cget(-text), "Login Failed!", "User not set, Password set"); ##################################### ## Correct User set, no password ##################################### simulateLogin($lf, "eric", ""); is($msg->cget(-text), "Login Failed!", "User set, no password"); sub simulateLogin { my ($lf, $user, $pass) = @_; clearLoginForm($lf); my $userH = oct($lf->Subwidget('UserEntry')->id); my $passH = oct($lf->Subwidget('PassEntry')->id); my $butH = oct($lf->Subwidget('LoginButton')->id); SendKeys("{TAB}"); SendKeys($user) if $user ne ""; SendKeys("{TAB}"); SendKeys($pass) if $user ne ""; SendKeys("{TAB}"); SendKeys("{ENTER}"); $lf->update; } sub clearLoginForm { my $lf = shift; $lf->Subwidget('Message')->configure(-text => ""); $lf->Subwidget('UserEntry')->delete(0, 'end'); $lf->Subwidget('PassEntry')->delete(0, 'end'); }