⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 41_heap.t

📁 source of perl for linux application,
💻 T
字号:
#!/usr/bin/perl## Unit tests for heap implementation## Test the following methods:# new# is_empty# empty# insert# remove# popheap# promote# lookup# set_val# rekey# expire_order# Finish these later.# They're nonurgent because the important heap stuff is extensively# tested by tests 19, 20, 24, 30, 32, 33, and 40, as well as by pretty# much everything else.print "1..1\n";my ($N, @R, $Q, $ar) = (1);use Tie::File;print "ok $N\n";$N++;exit;__END__my @HEAP_MOVE;sub Fake::Cache::_heap_move { push @HEAP_MOVE, @_ }my $h = Tie::File::Heap->new(bless [] => 'Fake::Cache');print "ok $N\n";$N++;# (3) Are all the methods there?{  my $good = 1;  for my $meth (qw(new is_empty empty lookup insert remove popheap                   promote set_val rekey expire_order)) {    unless ($h->can($meth)) {      print STDERR "# Method '$meth' is missing.\n";      $good = 0;    }  }  print $good ? "ok $N\n" : "not ok $N\n";  $N++;}# (4) Straight insert and removal FIFO test$ar = 'a0';for (1..10) {  $h->insert($_, $ar++);}for (1..10) {  push @R, $h->popheap;}$iota = iota('a',9);print "@R" eq $iota  ? "ok $N\n" : "not ok $N \# expected ($iota), got (@R)\n";$N++;# (5) Remove from empty heap$n = $h->popheap;print ! defined $n ? "ok $N\n" : "not ok $N \# expected UNDEF, got $n";$N++;# (6) Interleaved insert and removal$Q = 0;@R = ();for my $i (1..4) {  for my $j (1..$i) {    $h->insert($Q, "b$Q");    $Q++;  }  for my $j (1..$i) {    push @R, $h->popheap;  }}$iota = iota('b', 9);print "@R" eq $iota ? "ok $N\n" : "not ok $N \# expected ($iota), got (@R)\n";$N++;# (7) It should be empty nowprint $h->is_empty ? "ok $N\n" : "not ok $N\n";$N++;# (8) Insert and delete$Q = 1;for (1..10) {  $h->insert($_, "c$Q");  $Q++;}for (2, 4, 6, 8, 10) {  $h->remove($_);}@R = ();push @R, $n while defined ($n = $h->popheap);print "@R" eq "c1 c3 c5 c7 c9" ?   "ok $N\n" : "not ok $N \# expected (c1 c3 c5 c7 c9), got (@R)\n";$N++;# (9) Interleaved insert and delete$Q = 1; my $QQ = 1;@R = ();for my $i (1..4) {  for my $j (1..$i) {    $h->insert($Q, "d$Q");    $Q++;  }  for my $j (1..$i) {    $h->remove($QQ) if $QQ % 2 == 0;    $QQ++;  }}push @R, $n while defined ($n = $h->popheap);print "@R" eq "d1 d3 d5 d7 d9" ?   "ok $N\n" : "not ok $N \# expected (d1 d3 d5 d7 d9), got (@R)\n";$N++;# (10) Promote$Q = 1;for (1..10) {  $h->insert($_, "e$Q");  $Q++;}for (2, 4, 6, 8, 10) {  $h->promote($_);}@R = ();push @R, $n while defined ($n = $h->popheap);print "@R" eq "e1 e3 e5 e7 e9 e2 e4 e6 e8 e10" ?   "ok $N\n" :   "not ok $N \# expected (e1 e3 e5 e7 e9 e2 e4 e6 e8 e10), got (@R)\n";$N++;# (11-15) Lookup$Q = 1;for (1..10) {  $h->insert($_, "f$Q");  $Q++;}for (2, 4, 6, 4, 8) {  my $r = $h->lookup($_);  print $r eq "f$_" ? "ok $N\n" : "not ok $N \# expected f$_, got $r\n";  $N++;}# (16) It shouldn't be emptyprint ! $h->is_empty ? "ok $N\n" : "not ok $N\n";$N++;# (17) Lookup should have promoted the looked-up records@R = ();push @R, $n while defined ($n = $h->popheap);print "@R" eq "f1 f3 f5 f7 f9 f10 f2 f6 f4 f8" ?  "ok $N\n" :   "not ok $N \# expected (f1 f3 f5 f7 f9 f10 f2 f6 f4 f8), got (@R)\n";$N++;# (18-19) Typical 'rekey' operation$Q = 1;for (1..10) {  $h->insert($_, "g$Q");  $Q++;}$h->rekey([6,7,8,9,10], [8,9,10,11,12]);my %x = qw(1 g1 2 g2  3 g3  4 g4  5 g5           8 g6 9 g7 10 g8 11 g9 12 g10);{  my $good = 1;  for my $k (keys %x) {    my $v = $h->lookup($k);    $v = "UNDEF" unless defined $v;    unless ($v eq $x{$k}) {      print "# looked up $k, got $v, expected $x{$k}\n";      $good = 0;    }  }  print $good ? "ok $N\n" : "not ok $N\n";  $N++;}{  my $good = 1;  for my $k (6, 7) {    my $v = $h->lookup($k);    if (defined $v) {      print "# looked up $k, got $v, should have been undef\n";      $good = 0;    }  }  print $good ? "ok $N\n" : "not ok $N\n";  $N++;}# (20) keys@R = sort { $a <=> $b } $h->keys;print "@R" eq "1 2 3 4 5 8 9 10 11 12" ?  "ok $N\n" :   "not ok $N \# expected (1 2 3 4 5 8 9 10 11 12) got (@R)\n";$N++;# (21) updatefor (1..5, 8..12) {  $h->update($_, "h$_");}@R = ();for (sort { $a <=> $b } $h->keys) {  push @R, $h->lookup($_);}print "@R" eq "h1 h2 h3 h4 h5 h8 h9 h10 h11 h12" ?  "ok $N\n" :   "not ok $N \# expected (h1 h2 h3 h4 h5 h8 h9 h10 h11 h12) got (@R)\n";$N++;# (22-23) bytesmy $B;$B = $h->bytes;print $B == 23 ? "ok $N\n" : "not ok $N \# expected 23, got $B\n";$N++;$h->update('12', "yobgorgle");$B = $h->bytes;print $B == 29 ? "ok $N\n" : "not ok $N \# expected 29, got $B\n";$N++;# (24-25) empty$h->empty;print $h->is_empty ? "ok $N\n" : "not ok $N\n";$N++;$n = $h->popheap;print ! defined $n ? "ok $N\n" : "not ok $N \# expected UNDEF, got $n";$N++;# (26) very weak testing of DESTROYundef $h;# are we still alive?print "ok $N\n";$N++;sub iota {  my ($p, $n) = @_;  my $r;  my $i = 0;  while ($i <= $n) {    $r .= "$p$i ";    $i++;  }  chop $r;  $r;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -