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