File: create.t

package info (click to toggle)
perl-tk 1%3A804.036%2Bdfsg1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 35,284 kB
  • sloc: ansic: 349,560; perl: 52,292; sh: 12,678; makefile: 5,700; asm: 3,565; ada: 1,681; pascal: 1,082; cpp: 1,006; yacc: 883; cs: 879
file content (216 lines) | stat: -rw-r--r-- 5,009 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# -*- perl -*-
BEGIN { $|=1; $^W=1; }
use strict;
use Test::More;
BEGIN {
    # Test::More::note not available in older Test::More
    if (!defined &note) {
	*note = sub { diag @_ };
    }
}
##
## Almost all widget classes:  load module, create, pack, and
## destory an instance.
##
## Menu stuff not tested up to now
##

use vars '@class';

BEGIN
  {
    @class = (
	# Tk core widgets
	qw(
		Frame
		Toplevel

		Label
		Button
		Checkbutton
		Radiobutton

		Entry
		Spinbox

		Listbox

		Scale
		Scrollbar

		Labelframe
		Panedwindow

		Canvas
		Text
	),
	# Tix core widgets
	qw(
		HList
		InputO
		NoteBook
		TList
		TixGrid
		Optionmenu
	),
	# Tixish composites
	qw(
		BrowseEntry
		Tree
		DirTree
	),
	# perl/Tk composites
	($^O eq 'MSWin32') ? () : qw(ColorEditor),
	qw(
		LabEntry
		LabFrame
		Optionmenu
		ROText
		Table
		Tiler
		TextUndo
		TextEdit
		Dialog
		DialogBox
		FileSelect
	),
	# Tclish composites
	qw(
		FBox
		IconList
	),
   );

   require Tk if ($^O eq 'cygwin');
   @class = grep(!/InputO/,@class) if ($^O eq 'MSWin32' or
			    ($^O eq 'cygwin' and defined($Tk::platform)
					     and $Tk::platform eq 'MSWin32'));

   plan tests => (15*@class+4);

  };

if (!defined &diag)
 {
  *diag = sub { print "# $_[0]\n" };
 }

eval { require Tk; };
is($@, "", "loading Tk module");

my $mw;
eval {$mw = Tk::MainWindow->new();};
is($@, "", "No error while creating MainWindow");
ok(Tk::Exists($mw), "MainWindow creation OK");
eval { $mw->geometry('+10+10'); };  # This works for mwm and interactivePlacement

eval { Tk::MainWindow::Create() };
isnt($@, '', "no segfault for Tk::MainWindow::Create without args, but an error message");

my $w;
foreach my $class (@class)
  {
    note "Testing $class";
    undef($w);

    eval "require Tk::$class;";
    is($@, "", "No error loading Tk::$class");
 SKIP: {
	skip "Test::More too old for isa_ok class check", 1
	    if $Test::More::VERSION < 0.88;
	isa_ok("Tk::$class", 'Tk::Widget');
    }

    eval { $w = $mw->$class(); };
    is($@, "", "Can create $class widget");
    ok(Tk::Exists($w), "$class instance exists");

 SKIP: {
        skip "Window cannot be created", 6
	  if !Tk::Exists($w);

        is($w->class,$class,"Window class matches");

        if ($w->isa('Tk::Wm'))
          {
	    # KDE-beta4 wm with policies:
	    #     'interactive placement'
	    #		 okay with geometry and positionfrom
	    #     'manual placement'
	    #		geometry and positionfrom do not help
	    eval { $w->positionfrom('user'); };
            #eval { $w->geometry('+10+10'); };
	    is ($@, "", 'No problem set postitionform to user');

            eval { $w->Popup; };
	    is ($@, "", "Can Popup a $class widget")
          }
        else
          {
	    pass("dummy for positionfrom test for non-Wm widgets");
            eval { $w->pack; };
	    is ($@, "", "Can pack a $class widget")
          }
        note "$class update";
        eval { $mw->update; };
        is ($@, "", "No error during 'update' for $class widget");

        my @dummy;
        note "$class configure list";
        eval { @dummy = $w->configure; };
        is ($@, "", "No error while getting configure as list for $class");
        my $dummy;
        note "$class configure scalar";
        eval { $dummy = $w->configure; };
        is ($@, "", "No error while getting configure as scalar for $class");
        is (scalar(@dummy),scalar(@$dummy), "Error: scalar config != list config");

        $@ = "";
        my %skip = (-class => 1);
        foreach my $opt ($w->CreateOptions)
         {
          $skip{$opt} = 1;
         }
        foreach my $opt (@dummy)
         {
          my @val = @$opt;
          if (@val != 2 && !exists($skip{$val[0]}) )
           {
            eval { $w->configure($val[0],$val[-1]) };
            if ($@)
             {
              diag "$class @val:$@";
              last;
             }
           }
         }
        is($@,"","Re-configure $class");

        note "$class update post-configure";
        eval { $mw->update; };
        is ($@, "", "'update' after configure for $class widget");

        note "$class destroy";
        eval { $w->destroy; };
        is($@, "", "can destroy $class widget");
        ok(!Tk::Exists($w), "$class: widget is really destroyed");

        # XXX: destroy-destroy test disabled because nobody vote for this feature
	# Nick Ing-Simmmons wrote:
	# The only way to make test pass, is when Tk800 would fail, to specifcally look
	# and see if method is 'destroy', and ignore it. Can be done but is it worth it?
	# Note I cannot call tk's internal destroy as I have no way of relating
	# (now destroy has happened) the object back to interp/MainWindow that it used
	# to be associated with, and hence cannot create the args I need to pass
	# to the core.

        # since Tk8.0 a destroy on an already destroyed widget should
        # not complain
        #eval { $w->destroy; };
        #ok($@, "", "Ooops, destroying a destroyed widget should not complain");

      }
  }

1;
__END__