The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use 5.010;
use strict;
use warnings;
use experimental 'smartmatch';

use FindBin '$Bin';
use lib $Bin, "$Bin/t";

use Org::Parser;
use Test::More 0.96;
require "testlib.pl";

test_parse(
    name => 'non-setting (missing +)',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#TODO: A B | C
_
    num => 0,
);

test_parse(
    name => 'non-setting (not on first column)',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
 #+TODO: A B | C
_
    num => 0,
);

test_parse(
    name => 'syntax error (missing colon, becomes comment)',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#+TODO A B | C
_
    dies => 0,
    num => 0,
);

test_parse(
    name => 'unknown setting',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#+FOO: bar
_
    dies => 1,
);

test_parse(
    name => 'FILETAGS: argument syntax error',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#+FILETAGS: a:
_
    dies => 1,
);

test_parse(
    name => 'FILETAGS: basic tests',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#+FILETAGS:  :tag1:tag2:tag3:
_
    num  => 1,
    test_after_parse => sub {
        my %args = @_;
        my $doc = $args{result};
        my $elems = $args{elements};
        is($elems->[0]->name, "FILETAGS", "name");
        is($elems->[0]->args->[0], ":tag1:tag2:tag3:", "args[0]");
    },
);

test_parse(
    name => 'PRIORITIES: basic tests',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#+PRIORITIES: A1 A2 B1 B2 C1 C2
_
    num  => 1,
    test_after_parse => sub {
        my %args = @_;
        my $doc = $args{result};
        my $elems = $args{elements};
        is($elems->[0]->name, "PRIORITIES", "name");
        is_deeply($elems->[0]->args, [qw/A1 A2 B1 B2 C1 C2/],
                  "args");
        is_deeply($doc->priorities, [qw/A1 A2 B1 B2 C1 C2/],
                  "document's priorities attribute");
    },
);

test_parse(
    name => 'DRAWERS: basic tests',
    filter_elements => 'Org::Element::Setting',
    doc  => <<'_',
#+DRAWERS: D1 D2
_
    num  => 1,
    test_after_parse => sub {
        my %args = @_;
        my $doc = $args{result};
        my $elems = $args{elements};
        is($elems->[0]->name, "DRAWERS", "name");
        ok("D1"    ~~ @{$doc->drawer_names},
           "D1 added to list of known drawers");
        ok("D2"    ~~ @{$doc->drawer_names},
           "D2 added to list of known drawers");
        ok("CLOCK" ~~ @{$doc->drawer_names},
           "default drawers still known");
    },
);

test_parse(
    name => 'indentable_elements (not indentable)',
    filter_elements => 'Org::Element::Setting',
    doc => <<'_',
#+TODO: A | B C
 #+TODO: D E | F
_
    num => 1,
);
test_parse(
    name => 'indentable_elements (not indentable, test text)',
    filter_elements => 'Org::Element::Text',
    doc => <<'_',
#+TODO: A | B C
 #+TODO: D E | F
_
    num => 1,
    test_after_parse => sub {
        my (%args) = @_;
        my $elems = $args{elements};
        is($elems->[0]->as_string, " #+TODO: D E | F\n", "text");
    },
);

test_parse(
    name => 'indentable_elements (indentable)',
    filter_elements => 'Org::Element::Setting',
    doc => <<'_',
#+TBLFM: @2$1=@1$1
 #+tblfm: @3$1=@1$1
_
    num => 2,
    test_after_parse => sub {
        my (%args) = @_;
        my $elems = $args{elements};
        is($elems->[1]->indent, " ", "indent attribute");
    },
);

done_testing();