]> Sergey Matveev's repositories - public-inbox.git/blob - t/thread-cycle.t
thread: last Reference always wins
[public-inbox.git] / t / thread-cycle.t
1 # Copyright (C) 2016 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3 use strict;
4 use warnings;
5 use Test::More;
6 use_ok('PublicInbox::SearchMsg');
7 use_ok('PublicInbox::SearchThread');
8 use Email::Simple;
9 my $mt = eval {
10         require Mail::Thread;
11         no warnings 'once';
12         $Mail::Thread::nosubject = 1;
13         $Mail::Thread::noprune = 1;
14 };
15 my @check;
16 my @msgs = map {
17         my $msg = $_;
18         $msg->{references} =~ s/\s+/ /sg if $msg->{references};
19         my $simple = Email::Simple->create(header => [
20                 'Message-Id' => "<$msg->{mid}>",
21                 'References' => $msg->{references},
22         ]);
23         push @check, $simple;
24         bless $msg, 'PublicInbox::SearchMsg'
25 } (
26
27 # data from t/testbox-6 in Mail::Thread 2.55:
28         { mid => '20021124145312.GA1759@nlin.net' },
29         { mid => 'slrnau448m.7l4.markj+0111@cloaked.freeserve.co.uk',
30           references => '<20021124145312.GA1759@nlin.net>',
31         },
32         { mid => '15842.10677.577458.656565@jupiter.akutech-local.de',
33           references => '<20021124145312.GA1759@nlin.net>
34                         <slrnau448m.7l4.markj+0111@cloaked.freeserve.co.uk>',
35         },
36         { mid => '20021125171807.GK8236@somanetworks.com',
37           references => '<20021124145312.GA1759@nlin.net>
38                         <slrnau448m.7l4.markj+0111@cloaked.freeserve.co.uk>
39                         <15842.10677.577458.656565@jupiter.akutech-local.de>',
40         },
41         { mid => '15843.12163.554914.469248@jupiter.akutech-local.de',
42           references => '<20021124145312.GA1759@nlin.net>
43                         <slrnau448m.7l4.markj+0111@cloaked.freeserve.co.uk>
44                         <15842.10677.577458.656565@jupiter.akutech-local.de>
45                         <E18GPHf-0000zp-00@cloaked.freeserve.co.uk>',
46         },
47         { mid => 'E18GPHf-0000zp-00@cloaked.freeserve.co.uk',
48           references => '<20021124145312.GA1759@nlin.net>
49                         <slrnau448m.7l4.markj+0111@cloaked.freeserve.co.uk>
50                         <15842.10677.577458.656565@jupiter.akutech-local.de>'
51         }
52 );
53
54 my $st = thread_to_s(\@msgs);
55
56 SKIP: {
57         skip 'Mail::Thread missing', 1 unless $mt;
58         $mt = Mail::Thread->new(@check);
59         $mt->thread;
60         $mt->order(sub { sort { $a->messageid cmp $b->messageid } @_ });
61         my $check = '';
62
63         my @q = map { (0, $_) } $mt->rootset;
64         while (@q) {
65                 my $level = shift @q;
66                 my $node = shift @q or next;
67                 $check .= (" "x$level) . $node->messageid . "\n";
68                 unshift @q, $level + 1, $node->child, $level, $node->next;
69         }
70         is($check, $st, 'Mail::Thread output matches');
71 }
72
73 done_testing();
74
75 sub thread_to_s {
76         my $th = PublicInbox::SearchThread->new(shift);
77         $th->thread;
78         $th->order(sub { [ sort { $a->{id} cmp $b->{id} } @{$_[0]} ] });
79         my $st = '';
80         my @q = map { (0, $_) } @{$th->{rootset}};
81         while (@q) {
82                 my $level = shift @q;
83                 my $node = shift @q or next;
84                 $st .= (" "x$level). "$node->{id}\n";
85                 my $cl = $level + 1;
86                 unshift @q, map { ($cl, $_) } @{$node->{children}};
87         }
88         $st;
89 }