The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use 5.010;
use strict;
use warnings;
use autodie;
use Exobrain;
use Exobrain::Test;
use Exobrain::Message::Raw;
use Test::More;
use JSON::Any;

my $j = JSON::Any->new;

my $exobrain = Exobrain->new;

my $data = { 
    mailbox => 'INBOX',
    count => 42,
    server => 'imap.example.com',
    user  => 'pjf',
};

my $summary = "Test msg";

my $namespace = 'TEST';
my $source    = 'TEST';

my $msg = $exobrain->message(
    namespace => $namespace,
    source    => $source,
    data      => $data,
    raw       => $data,
    summary   => $summary,
);

# Testing the 'off the wire' build by frames syntax.
# This should probably be invoked somehow other than a flat 'new'

my $raw_msg = Exobrain::Message::Raw->new( [
    'EXOBRAIN_TEST_TESTING',
    $j->encode( { time => time() } ),
    $summary,
    $j->encode( $data ),
    $j->encode( $data ),
] );

foreach my $m ($msg, $raw_msg) {

    isa_ok($msg, 'Exobrain::Message::Raw');
    ok($msg->DOES('Exobrain::Message'), 'does Exobrain::Message');

    is_deeply($msg->data, $data, "data preserved");
    is_deeply($msg->raw,  $data, "raw  preserved");

    is($msg->summary,  $summary, "summay preserved");
    is($msg->namespace, $namespace, 'namespace preserved');
    is($msg->source, $source, 'source preserved');

}

# Convert to a class.

my $mailbox = $msg->to_class('Measurement::Mailbox');

isa_ok($mailbox, 'Exobrain::Measurement::Mailbox');
is($mailbox->count, 42, 'mailbox count');


done_testing;