#!perl
use Cassandane::Tiny;

sub test_basic
    :NoAltNameSpace :min_version_3_7
    ($self)
{
    xlog $self, "Make some messages";
    my $uid = 1;
    my %msgs;
    for (1..20)
    {
        $msgs{$uid} = $self->make_message("Message $uid");
        $msgs{$uid}->set_attribute('uid', $uid);
        $uid++;
    }

    my $talk = $self->{store}->get_client();
    $talk->unselect();

    xlog $self, "Create mailbox with mUTF7 encoded name";
    my $res = $talk->_imap_cmd('CREATE', 0, "", "INBOX.&JgA-");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "ENABLE IMAP4rev2";
    $res = $talk->_imap_cmd('ENABLE', 0, "enabled", "IMAP4rev2");
    $self->assert_num_equals(1, $res->{imap4rev2});

    xlog $self, "Verify that LIST responses use UTF8 mailbox names";
    $res = $talk->list("", "*");
    $self->assert_mailbox_structure($res, '.', {
        'INBOX'    => [qw( \\HasChildren )],
        "INBOX.☀" => [qw( \\HasNoChildren )],
    });

    xlog $self, "EXAMINE mailbox with UTF8 mailbox name";
    $res = $talk->_imap_cmd('EXAMINE', 0, "", "INBOX.☀");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that LIST response is returned with UTF8 mailbox name";
    my @list = $talk->get_response_code('list');
    $self->assert_str_equals("INBOX.☀", $list[0][0][2]);

    xlog $self, "Mark some messages \\Deleted";
    $talk->select('INBOX');
    $res = $talk->store('5:9', '+flags', '(\\Deleted)');

    xlog $self, "Verify that FETCH responses include UID";
    $self->assert_str_equals("5", $res->{5}->{uid});
    $self->assert_str_equals("6", $res->{6}->{uid});
    $self->assert_str_equals("7", $res->{7}->{uid});
    $self->assert_str_equals("8", $res->{8}->{uid});
    $self->assert_str_equals("9", $res->{9}->{uid});

    xlog $self, "Check STATUS (DELETED)";
    $res = $talk->status('INBOX', [ 'deleted' ]);
    $self->assert_str_equals('ok', $talk->get_last_completion_response());
    $self->assert_str_equals("5", $res->{deleted});

    xlog $self, "SEARCH DELETED";
    my @results = ();
    my %handlers =
    (
        esearch => sub
        {
            my (undef, $esearch) = @_;
            push(@results, $esearch);
        },
    );
    $res = $talk->_imap_cmd('SEARCH', 0, \%handlers, 'DELETED');
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that ESEARCH response is returned";
    $self->assert_num_equals(1, scalar @results);
    $self->assert_str_equals('5:9', $results[0][2]);

    xlog $self, "COPY a deleted message to mailbox with UTF8 name";
    $res = $talk->_imap_cmd('COPY', 0, "", '5', "INBOX.☀");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "ESEARCH IN (PERSONAL) DELETED";
    @results = ();
    $res = $talk->_imap_cmd('ESEARCH', 0, \%handlers,
                            'IN', '(PERSONAL)', 'DELETED');

    xlog $self, "Verify that ESEARCH response uses UTF8 mailbox name";
    $self->assert_str_equals('ok', $talk->get_last_completion_response());
    $self->assert_num_equals(2, scalar @results);
    $self->assert_str_equals("INBOX", $results[0][0][3]);
    $self->assert_str_equals('5:9', $results[0][3]);
    $self->assert_str_equals("INBOX.☀", $results[1][0][3]);
    $self->assert_str_equals('1', $results[1][3]);
}
