#!perl
use Cassandane::Tiny;

sub test_oldname
    :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, "ENABLE IMAP4rev2";
    my $res = $talk->_imap_cmd('ENABLE', 0, "enabled", "IMAP4rev2");
    $self->assert_num_equals(1, $res->{imap4rev2});

    my @results = ();
    my %handlers =
    (
        list => sub
        {
            my (undef, $list) = @_;
            push(@results, $list);
        },
    );

    xlog $self, "Create a mailbox with denormalized mailbox name";
    $res = $talk->_imap_cmd('CREATE', 0, \%handlers, "INBOX.Å");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that LIST response is returned with OLDNAME";
    $self->assert_str_equals("INBOX.Å", $results[0][2]);
    $self->assert_str_equals('OLDNAME', $results[0][3][0]);
    $self->assert_str_equals('INBOX.Å', $results[0][3][1][0]);

    xlog $self, "Create a child mailbox with normalized mailbox name";
    @results = ();
    $res = $talk->_imap_cmd('CREATE', 0, \%handlers, "INBOX.Å.B");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that there is no LIST response";
    $self->assert_null($results[0]);

    xlog $self, "Append to mailbox with denormalized mailbox name";
    my $MsgTxt = <<EOF;
From: blah\@xyz.com
To: whoever\@whereever.com

Hello
EOF
    $MsgTxt =~ s/\n/\015\012/g;
    @results = ();
    $res = $talk->_imap_cmd('APPEND', 0, \%handlers, "INBOX.Å", { Literal => $MsgTxt });
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that LIST response is returned with OLDNAME";
    $self->assert_str_equals("INBOX.Å", $results[0][2]);
    $self->assert_str_equals('OLDNAME', $results[0][3][0]);
    $self->assert_str_equals('INBOX.Å', $results[0][3][1][0]);

    xlog $self, "EXAMINE mailbox with denormalized mailbox name";
    @results = ();
    $res = $talk->_imap_cmd('EXAMINE', 0, \%handlers, "INBOX.Å");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that LIST response is returned with OLDNAME";
    $self->assert_str_equals("INBOX.Å", $results[0][2]);
    $self->assert_str_equals('OLDNAME', $results[0][3][0]);
    $self->assert_str_equals('INBOX.Å', $results[0][3][1][0]);

    $talk->unselect();

    xlog $self, "RENAME mailbox with denormalized mailbox names";
    @results = ();
    $res = $talk->_imap_cmd('RENAME', 0, \%handlers, "INBOX.Å", "INBOX.Ω");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that LIST responses are returned with OLDNAMEs";
    $self->assert_str_equals("\\NonExistent", $results[0][0][0]);
    $self->assert_str_equals("INBOX.Å", $results[0][2]);
    $self->assert_str_equals('OLDNAME', $results[0][3][0]);
    $self->assert_str_equals('INBOX.Å', $results[0][3][1][0]);
    $self->assert_str_equals("\\HasChildren", $results[1][0][0]);
    $self->assert_str_equals("INBOX.Ω", $results[1][2]);
    $self->assert_str_equals('OLDNAME', $results[1][3][0]);
    $self->assert_str_equals('INBOX.Ω', $results[1][3][1][0]);

    xlog $self, "LIST renamed mailbox";
    @results = ();
    $res = $talk->_imap_cmd('LIST', 0, \%handlers, "", "INBOX.Ω");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that OLDNAME appears in LIST response";
    $self->assert_str_equals('OLDNAME', $results[0][3][0]);
    $self->assert_str_equals('INBOX.Å', $results[0][3][1][0]);

    xlog $self, "DELETE a child mailbox with normalized mailbox name";
    @results = ();
    $res = $talk->_imap_cmd('DELETE', 0, \%handlers, "INBOX.Ω.B");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that there is no LIST response";
    $self->assert_null($results[0]);

    xlog $self, "DELETE mailbox with denormalized mailbox name";
    @results = ();
    $res = $talk->_imap_cmd('DELETE', 0, \%handlers, "INBOX.Ω");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Verify that LIST response is returned with OLDNAME";
    $self->assert_str_equals("\\NonExistent", $results[0][0][0]);
    $self->assert_str_equals("INBOX.Ω", $results[0][2]);
    $self->assert_str_equals('OLDNAME', $results[0][3][0]);
    $self->assert_str_equals('INBOX.Ω', $results[0][3][1][0]);
}
