[DOC PATCH] Re: [BUG] sort pragma not working ?
[p5sagit/p5-mst-13.2.git] / lib / Tie / File / t / 20_cache_full.t
CommitLineData
b3fe5a4c 1#!/usr/bin/perl
2#
3# Tests for various caching errors
4#
5
6my $file = "tf$$.txt";
7$: = Tie::File::_default_recsep();
8my $data = join $:, "record0" .. "record9", "";
9my $V = $ENV{INTEGRITY}; # Verbose integrity checking?
10
11print "1..111\n";
12
13my $N = 1;
14use Tie::File;
15print "ok $N\n"; $N++;
16
17open F, "> $file" or die $!;
18binmode F;
19print F $data;
20close F;
21
22# Limit cache size to 30 bytes
23my $MAX = 30;
24# -- that's enough space for 3 records, but not 4, on both \n and \r\n systems
25my $o = tie @a, 'Tie::File', $file, memory => $MAX;
26print $o ? "ok $N\n" : "not ok $N\n";
27$N++;
28
29# (3-5) Let's see if data was properly expired from the cache
30my @z = @a; # force cache to contain all ten records
31# It should now contain only the *last* three records, 7, 8, and 9
32{
33 my $x = "7 8 9";
34 my $a = join " ", sort keys %{$o->{cache}};
35 if ($a eq $x) { print "ok $N\n" }
36 else { print "not ok $N # cache keys were <$a>; expected <$x>\n" }
37 $N++;
38}
39check();
40
41# Here we redo *all* the splice tests, with populate()
42# calls before each one, to make sure that splice() does not botch the cache.
43
44# (6-25) splicing at the beginning
45splice(@a, 0, 0, "rec4");
46check();
47splice(@a, 0, 1, "rec5"); # same length
48check();
49splice(@a, 0, 1, "record5"); # longer
50check();
51splice(@a, 0, 1, "r5"); # shorter
52check();
53splice(@a, 0, 1); # removal
54check();
55splice(@a, 0, 0); # no-op
56check();
57
58splice(@a, 0, 0, 'r7', 'rec8'); # insert more than one
59check();
60splice(@a, 0, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
61check();
62splice(@a, 0, 3, 'record9', 'rec10'); # delete more than insert
63check();
64splice(@a, 0, 2); # delete more than one
65check();
66
67
68# (26-45) splicing in the middle
69splice(@a, 1, 0, "rec4");
70check();
71splice(@a, 1, 1, "rec5"); # same length
72check();
73splice(@a, 1, 1, "record5"); # longer
74check();
75splice(@a, 1, 1, "r5"); # shorter
76check();
77splice(@a, 1, 1); # removal
78check();
79splice(@a, 1, 0); # no-op
80check();
81
82splice(@a, 1, 0, 'r7', 'rec8'); # insert more than one
83check();
84splice(@a, 1, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
85check();
86splice(@a, 1, 3, 'record9', 'rec10'); # delete more than insert
87check();
88splice(@a, 1, 2); # delete more than one
89check();
90
91# (46-65) splicing at the end
92splice(@a, 3, 0, "rec4");
93check();
94splice(@a, 3, 1, "rec5"); # same length
95check();
96splice(@a, 3, 1, "record5"); # longer
97check();
98splice(@a, 3, 1, "r5"); # shorter
99check();
100splice(@a, 3, 1); # removal
101check();
102splice(@a, 3, 0); # no-op
103check();
104
105splice(@a, 3, 0, 'r7', 'rec8'); # insert more than one
106check();
107splice(@a, 3, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
108check();
109splice(@a, 3, 3, 'record9', 'rec10'); # delete more than insert
110check();
111splice(@a, 3, 2); # delete more than one
112check();
113
114# (66-85) splicing with negative subscript
115splice(@a, -1, 0, "rec4");
116check();
117splice(@a, -1, 1, "rec5"); # same length
118check();
119splice(@a, -1, 1, "record5"); # longer
120check();
121splice(@a, -1, 1, "r5"); # shorter
122check();
123splice(@a, -1, 1); # removal
124check();
125splice(@a, -1, 0); # no-op
126check();
127
128splice(@a, -1, 0, 'r7', 'rec8'); # insert more than one
129check();
130splice(@a, -1, 2, 'rec7', 'record8', 'rec9'); # insert more than delete
131check();
132splice(@a, -3, 3, 'record9', 'rec10'); # delete more than insert
133check();
134splice(@a, -4, 3); # delete more than one
135check();
136
137# (86-87) scrub it all out
138splice(@a, 0, 3);
139check();
140
141# (88-89) put some back in
142splice(@a, 0, 0, "rec0", "rec1");
143check();
144
145# (90-91) what if we remove too many records?
146splice(@a, 0, 17);
147check();
148
149# (92-95) In the past, splicing past the end was not correctly detected
150# (1.14)
151splice(@a, 89, 3);
152check();
153splice(@a, @a, 3);
154check();
155
156# (96-99) Also we did not emulate splice's freaky behavior when inserting
157# past the end of the array (1.14)
158splice(@a, 89, 0, "I", "like", "pie");
159check();
160splice(@a, 89, 0, "pie pie pie");
161check();
162
163# (100-105) Test default arguments
164splice @a, 0, 0, (0..11);
165check();
166splice @a, 4;
167check();
168splice @a;
169check();
170
171# (106-111) One last set of tests. I don't know what state the cache
172# is in now. But if I read any three records, those three records are
173# what should be in the cache, and nothing else.
174@a = "record0" .. "record9";
175check(); # In 0.18 #107 fails here--STORE was not flushing the cache when
176 # replacing an old cached record with a longer one
177for (5, 6, 1) { my $z = $a[$_] }
178{
179 my $x = "5 6 1";
180 my $a = join " ", @{$o->{lru}};
181 if ($a eq $x) { print "ok $N\n" }
182 else { print "not ok $N # LRU was <$a>; expected <$x>\n" }
183 $N++;
184 $x = "1 5 6";
185 $a = join " ", sort keys %{$o->{cache}};
186 if ($a eq $x) { print "ok $N\n" }
187 else { print "not ok $N # cache keys were <$a>; expected <$x>\n" }
188 $N++;
189}
190check();
191
192
193sub init_file {
194 my $data = shift;
195 open F, "> $file" or die $!;
196 binmode F;
197 print F $data;
198 close F;
199}
200
201sub check {
202 my $integrity = $o->_check_integrity($file, $ENV{INTEGRITY});
203 print $integrity ? "ok $N\n" : "not ok $N\n";
204 $N++;
205
206 print $o->{cached} <= $MAX
207 ? "ok $N\n"
208 : "not ok $N # $o->{cached} bytes cached, should be <= $MAX\n";
209 $N++;
210}
211
212
213sub ctrlfix {
214 for (@_) {
215 s/\n/\\n/g;
216 s/\r/\\r/g;
217 }
218}
219
220END {
221 undef $o;
222 untie @a;
223 1 while unlink $file;
224}
225
226
227