Added regedit unit test, a couple minor changes to regedit.
[wine] / dlls / kernel / tests / atom.pl
1 ################################################################
2 # Tests for atom API calls
3 #
4 # Copyright 2001 Alexandre Julliard
5 #
6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Lesser General Public
8 # License as published by the Free Software Foundation; either
9 # version 2.1 of the License, or (at your option) any later version.
10 #
11 # This library is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # Lesser General Public License for more details.
15 #
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 #
20
21 use wine;
22 use winerror;
23 use kernel32;
24
25 my $name = "foobar";
26
27 ################################################################
28 # GlobalAddAtom/GlobalFindAtom
29
30 # Add an atom
31 my $atom = GlobalAddAtomA( $name );
32 ok( ($atom >= 0xc000) && ($atom <= 0xffff) && !defined($wine::err) );
33
34 # Verify that it can be found (or not) appropriately
35 ok( GlobalFindAtomA($name) == $atom );
36 ok( GlobalFindAtomA(uc $name) == $atom );
37 ok( !GlobalFindAtomA( "_" . $name ) );
38
39 # Add the same atom, specifying string as unicode; should
40 # find the first one, not add a new one
41 my $w_atom = GlobalAddAtomW( wc($name) );
42 ok( $w_atom == $atom && !defined($wine::err) );
43
44 # Verify that it can be found (or not) appropriately via
45 # unicode name
46 ok( GlobalFindAtomW( wc($name)) == $atom );
47 ok( GlobalFindAtomW( wc(uc($name)) ) == $atom );
48 ok( !GlobalFindAtomW( wc("_" . $name) ) );
49
50 # Test integer atoms
51 #
52 # (0x0000 .. 0xbfff) should be valid;
53 # (0xc000 .. 0xffff) should be invalid
54
55 # test limits
56 todo_wine
57 {
58     ok( GlobalAddAtomA(0) == 0 && !defined($wine::err) );
59     ok( GlobalAddAtomW(0) == 0 && !defined($wine::err) );
60 };
61 ok( GlobalAddAtomA(1) == 1 && !defined($wine::err) );
62 ok( GlobalAddAtomW(1) == 1 && !defined($wine::err) );
63 ok( GlobalAddAtomA(0xbfff) == 0xbfff && !defined($wine::err) );
64 ok( GlobalAddAtomW(0xbfff) == 0xbfff && !defined($wine::err) );
65 ok( !GlobalAddAtomA(0xc000) && ($wine::err == ERROR_INVALID_PARAMETER) );
66 ok( !GlobalAddAtomW(0xc000) && ($wine::err == ERROR_INVALID_PARAMETER) );
67 ok( !GlobalAddAtomA(0xffff) && ($wine::err == ERROR_INVALID_PARAMETER) );
68 ok( !GlobalAddAtomW(0xffff) && ($wine::err == ERROR_INVALID_PARAMETER) );
69
70 # test some in between
71 for ($i = 0x0001; ($i <= 0xbfff); $i += 27)
72 {
73     ok( GlobalAddAtomA($i) && !defined($wine::err) );
74     ok( GlobalAddAtomW($i) && !defined($wine::err) );
75 }
76 for ($i = 0xc000; ($i <= 0xffff); $i += 29)
77 {
78     ok( !GlobalAddAtomA($i) && ($wine::err == ERROR_INVALID_PARAMETER) );
79     ok( !GlobalAddAtomW($i) && ($wine::err == ERROR_INVALID_PARAMETER) );
80 }
81
82
83 ################################################################
84 # GlobalGetAtomName
85
86 # Get the name of the atom we added above
87 my $buf = "." x 20;
88 my $len = GlobalGetAtomNameA( $atom, \$buf, length ($buf) );
89 ok( $len == length ($name) );
90 ok( $buf eq ($name . "\x00" . ("." x (length ($buf) - length ($name) - 1))) );
91 $buf = "." x 20;
92 ok( !GlobalGetAtomNameA( $atom, \$buf, 3 ) );
93
94 # Repeat, unicode-style
95 $buf = wc("." x 20);
96 $len = GlobalGetAtomNameW( $atom, \$buf, length ($buf) / 2 );
97 ok( $len == wclen (wc ($name)) );
98 todo_wine
99 {
100     ok( $buf eq (wc ($name) . "\x00\x00" . ("." x (20 - 2 * (wclen (wc ($name)) + 1) ))) );
101 };
102 $buf = wc("." x 20);
103 ok( !GlobalGetAtomNameW( $atom, \$buf, 3 ) );
104
105 # Check error code returns
106 ok( !GlobalGetAtomNameA( $atom, $buf,  0 ) && $wine::err == ERROR_MORE_DATA );
107 ok( !GlobalGetAtomNameA( $atom, $buf, -1 ) && $wine::err == ERROR_MORE_DATA );
108 ok( !GlobalGetAtomNameW( $atom, $buf,  0 ) && $wine::err == ERROR_MORE_DATA );
109 ok( !GlobalGetAtomNameW( $atom, $buf, -1 ) && $wine::err == ERROR_MORE_DATA );
110
111 # Test integer atoms
112 $buf = "a" x 10;
113 for ($i = 0; ($i <= 0xbfff); $i += 37)
114 {
115     $len = GlobalGetAtomNameA( $i, \$buf, length ($buf) );
116     if ($i)
117     {
118         ok( ($len > 1) && ($len < 7) );
119         ok( $buf eq ("#$i\x00" . "a" x (10 - $len - 1) ));
120     }
121     else
122     {
123         todo_wine
124         {
125             ok( ($len > 1) && ($len < 7) );
126             ok( $buf eq ("#$i\x00" . "a" x (10 - $len - 1) ));
127         };
128     }
129 }
130
131 ################################################################
132 # GlobalDeleteAtom
133
134 $name = "barkbar";
135 $n = 5;
136
137 # First make sure it doesn't exist
138 $atom = GlobalAddAtomA( $name );
139 while (!GlobalDeleteAtom( $atom )) { }
140
141 # Now add it a number of times
142 for (1 .. $n) { $atom = GlobalAddAtomA( $name ); }
143
144 # Make sure it's here
145 ok( GlobalFindAtomA( $name ));
146 ok( GlobalFindAtomW( wc($name) ));
147
148 # That many deletions should succeed
149 for (1 .. $n) { ok( !GlobalDeleteAtom( $atom ) ); }
150
151 # It should be gone now
152 ok( !GlobalFindAtomA($name) );
153 ok( !GlobalFindAtomW( wc($name) ));
154
155 # So this one should fail
156 ok( GlobalDeleteAtom( $atom ) == $atom && $wine::err == ERROR_INVALID_HANDLE );
157
158
159 ################################################################
160 # Test error handling
161
162 # ASCII
163 ok( ($atom = GlobalAddAtomA("a" x 255)) );
164 ok( !GlobalDeleteAtom($atom) );
165 ok( !GlobalAddAtomA( "a" x 256 ) && $wine::err == ERROR_INVALID_PARAMETER );
166 ok( !GlobalFindAtomA( "b" x 256 ) && $wine::err == ERROR_INVALID_PARAMETER );
167
168 # Unicode
169 ok( ($atom = GlobalAddAtomW( wc("a" x 255) )) );
170 ok( !GlobalDeleteAtom($atom) );
171 ok( !GlobalAddAtomW( wc("a" x 256) ) && $wine::err == ERROR_INVALID_PARAMETER );
172 ok( !GlobalFindAtomW( wc("b" x 256) ) && $wine::err == ERROR_INVALID_PARAMETER );