8 use lib $Bin, "$Bin/t";
16 name => 'non-headline (missing space)',
17 filter_elements => 'Org::Element::Headline',
25 name => 'non-headline (not on first column)',
26 filter_elements => 'Org::Element::Headline',
34 name => 'non-headline (no title)',
35 filter_elements => 'Org::Element::Headline',
43 name => 'headline basic tests',
44 filter_elements => 'Org::Element::Headline',
48 *** h3 1 :invalid-tag:
56 test_after_parse => sub {
58 my $elems = $args{elements};
59 is($elems->[0]->title->as_string, " h1 1", "0: title not trimmed");
60 is($elems->[0]->level, 1, "0: level");
62 is($elems->[1]->title->as_string, "h2 1", "1: title");
63 is($elems->[1]->level, 2, "1: level");
64 is_deeply($elems->[1]->tags, ['tag1', 'tag2'], "1: tags");
66 is($elems->[2]->title->as_string, "h3 1 :invalid-tag:", "2: title");
67 is($elems->[2]->level, 3, "2: level");
69 is( $elems->[3]->title->as_string, "h3 2", "3: title");
70 is( $elems->[3]->level, 3, "3: level");
71 is( $elems->[3]->is_todo, 1, "3: is_todo");
72 ok(!$elems->[3]->is_done, "3: is_done");
73 is( $elems->[3]->todo_state, "TODO", "3: todo_state");
74 is( $elems->[3]->todo_priority, "A", "3: todo_priority");
76 is($elems->[4]->title->as_string, "h2 2", "4: title");
77 is($elems->[4]->level, 2, "4: level");
78 is($elems->[4]->is_todo, 1, "4: is_todo");
79 is($elems->[4]->is_done, 1, "4: is_done");
80 is($elems->[4]->todo_state, "DONE", "4: todo_state");
81 # XXX default priority
83 is($elems->[5]->title->as_string, "h1 2", "5: title");
84 is($elems->[5]->level, 1, "5: level");
89 name => 'headline levels',
90 filter_elements => 'Org::Element::Headline',
101 test_after_parse => sub {
103 my $elems = $args{elements};
104 is($elems->[1]->parent->title->as_string, "h1", "parent of h2=h1");
105 is($elems->[2]->parent->title->as_string, "h2", "parent of h3=h2");
106 is($elems->[3]->parent->title->as_string, "h3", "parent of h4=h3");
107 is($elems->[4]->parent->title->as_string, "h4", "parent of h5=h4");
108 is($elems->[6]->parent->title->as_string, "h1b", "parent of h3b=h1b");
113 name => 'todo keyword is case sensitive',
114 filter_elements => sub { $_[0]->isa('Org::Element::Headline') &&
126 name => 'todo keyword can be separated by other \W aside from \s',
127 filter_elements => sub { $_[0]->isa('Org::Element::Headline') &&
141 test_after_parse => sub {
143 my $elems = $args{elements};
144 is($elems->[0]->title->as_string, "1", "title 1");
145 is($elems->[1]->title->as_string, "2", "title 2");
146 is($elems->[2]->title->as_string, "+3a", "title 3");
147 is($elems->[3]->title->as_string, "+ 3b", "title 4");
148 is($elems->[4]->title->as_string, "/4a", "title 5");
149 is($elems->[5]->title->as_string, "//4b", "title 6");
154 name => 'inline elements in headline title',
155 filter_elements => 'Org::Element::Headline',
157 * this headline contains timestamp <2011-03-17 > as well as text
160 test_after_parse => sub {
162 my $elems = $args{elements};
163 my $hl = $elems->[0];
164 my $title = $hl->title;
165 isa_ok($title->children->[0], "Org::Element::Text");
166 isa_ok($title->children->[1], "Org::Element::Timestamp");
167 isa_ok($title->children->[2], "Org::Element::Text");
172 name => 'get_tags()',
173 filter_elements => 'Org::Element::Headline',
181 test_after_parse => sub {
183 my $elems = $args{elements};
185 $tags = [$elems->[0]->get_tags];
186 is_deeply($tags, [qw/t3 t1 t2/], "get_tags 0") or diag explain $tags;
187 $tags = [$elems->[1]->get_tags];
188 is_deeply($tags, [qw/t4 t3 t1 t2/], "get_tags 1") or diag explain $tags;
189 $tags = [$elems->[2]->get_tags];
190 is_deeply($tags, [qw/t1 t2/], "get_tags 2") or diag explain $tags;
195 name => 'get_active_timestamp()',
196 filter_elements => 'Org::Element::Headline',
198 * TODO <2011-06-06 > t0
199 * TODO t1 <2011-06-06 >
201 DEADLINE: <2011-06-06 >
202 DEADLINE: <2011-06-07 >
203 * TODO [2011-06-06 ] t3
207 test_after_parse => sub {
209 my $elems = $args{elements};
210 ok( $elems->[0]->get_active_timestamp, "t0 has active timestamp");
211 ok( $elems->[1]->get_active_timestamp, "t1 has active timestamp");
212 ok( $elems->[2]->get_active_timestamp, "t2 has active timestamp");
213 # XXX check only the first timestamp is returned
214 ok(!$elems->[3]->get_active_timestamp,
215 "t3 doesn't have active timestamp");
216 ok(!$elems->[4]->get_active_timestamp,
217 "t4 doesn't have active timestamp");
223 filter_elements => 'Org::Element::Headline',
231 test_after_parse => sub {
233 my $elems = $args{elements};
234 ok(!$elems->[0]->is_leaf, "a is not leaf");
235 ok(!$elems->[1]->is_leaf, "b is not leaf");
236 ok( $elems->[2]->is_leaf, "c is leaf");
237 ok( $elems->[3]->is_leaf, "d is leaf");
242 name => 'promote_node() 1',
243 filter_elements => 'Org::Element::Headline',
250 test_after_parse => sub {
252 my $doc = $args{result};
253 my $elems = $args{elements};
254 my ($h1, $h2, $h3) = @$elems;
257 is($h1->level, 1, "level 1 won't be promoted further");
260 is($h2->level, 1, "level 2 becomes level 1 after being promoted");
261 is($h2->as_string, "* h2\n", "_str reset after being promoted");
262 is($h2->prev_sibling, $h1, "parent becomes sibling (1)");
263 is($h2->next_sibling, $h3, "parent becomes sibling (2)");
267 name => 'promote_node() 2',
268 filter_elements => 'Org::Element::Headline',
275 test_after_parse => sub {
277 my $elems = $args{elements};
278 my ($h1, $h2, $h3) = @$elems;
281 ok(!$h2->next_sibling, "no more sibling after promote (2)")
282 or diag explain $h2->next_sibling->as_string;
283 is($h2->children->[0], $h3, "sibling becomes child");
287 name => 'promote_node() 3',
288 filter_elements => 'Org::Element::Headline',
293 test_after_parse => sub {
295 my $elems = $args{elements};
298 $h1->promote_node(2);
299 is($h1->level, 1, "promote with argument, level 3 -> 1");
304 name => 'demote_node() 1',
305 filter_elements => 'Org::Element::Headline',
312 test_after_parse => sub {
314 my $doc = $args{result};
315 my $elems = $args{elements};
316 my ($h1, $h2, $h3) = @$elems;
319 is($h2->level, 2, "level 1 becomes level 2");
320 is($h2->parent, $h1, "prev_sibling becomes parent");
321 is($h1->next_sibling, $h3, "h1's next_sibling becomes h3");
322 is($h3->prev_sibling, $h1, "h3's prev_sibling becomes h1");
326 name => 'demote_node() 2',
327 filter_elements => 'Org::Element::Headline',
332 test_after_parse => sub {
334 my $elems = $args{elements};
338 is($h1->level, 4, "demote 3 means level 1 becomes 4");
343 name => 'promote_branch()',
344 filter_elements => 'Org::Element::Headline',
353 test_after_parse => sub {
355 my $doc = $args{result};
356 my $elems = $args{elements};
357 my ($h1, $h2, $h3, $h4, $h5) = @$elems;
360 is($h1->level, 1, "h1 becomes level 1");
361 is($h2->level, 2, "h2 becomes level 2");
362 is($h3->level, 3, "h3 becomes level 3");
363 is($h4->level, 2, "h4 becomes level 2");
364 is($h5->level, 2, "h5 stays at level 2");
369 name => 'demote_branch()',
370 filter_elements => 'Org::Element::Headline',
379 test_after_parse => sub {
381 my $doc = $args{result};
382 my $elems = $args{elements};
383 my ($h1, $h2, $h3, $h4, $h5) = @$elems;
386 is($h1->level, 3, "h1 becomes level 3");
387 is($h2->level, 4, "h2 becomes level 4");
388 is($h3->level, 5, "h3 becomes level 5");
389 is($h4->level, 4, "h4 becomes level 4");
390 is($h5->level, 2, "h5 stays at level 2");