### ----------------------------------------------------
### -- Cro::Core
### -- Licenses: Artistic-2.0
### -- Authors: Jonathan Worthington <jnthn@jnthn.net>
### -- File: t/message-with-body.rakutest
### ----------------------------------------------------
use Cro::BodyParserSelector;
use Cro::BodySerializerSelector;
use Cro::Message;
use Cro::MessageWithBody;
use Test;

ok Cro::MessageWithBody ~~ Cro::Message, 'Cro::MessageWithBody is a Cro::Message';

my class TestBodyA does Cro::MessageWithBody {
    method body-parser-selector() { die X::Cro::BodyParserSelector::NoneApplicable.new }
    method body-serializer-selector() { die X::Cro::BodySerializerSelector::NoneApplicable.new }
}

my $testBodyA = TestBodyA.new;
$testBodyA.set-body-byte-stream: supply {
    emit Blob.new(0x63, 0x72, 0x6f, 0x20, 0x62);
    emit Blob.new(0x6f, 0x64, 0x79);
}
given await $testBodyA.body-blob -> $blob {
    ok $blob ~~ Blob, 'body-blob method gives a Blob';
    is $blob.decode('ascii'), 'cro body', 'Blob has correct contents';
}

throws-like { await(TestBodyA.new.body-text) }, X::Cro::BodyNotText,
    'By default, asking for body-text gets an exception';

my class TestBodyB does Cro::MessageWithBody {
    method body-text-encoding(Blob $body) { 'ascii' }
    method body-parser-selector() { die X::Cro::BodyParserSelector::NoneApplicable.new }
    method body-serializer-selector() { die X::Cro::BodySerializerSelector::NoneApplicable.new }
}

my $testBodyB = TestBodyB.new;
$testBodyB.set-body-byte-stream: supply {
    emit Blob.new(0x63, 0x72, 0x6f, 0x20, 0x62);
    emit Blob.new(0x6f, 0x64, 0x79);
}
given await $testBodyB.body-text -> $str {
    ok $str ~~ Str, 'body-text method gives a Str';
    is $str, 'cro body', 'Str has correct value';
}

done-testing;


