The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- perl -*-
use Test::More tests => 33;

use strict;
use warnings;

BEGIN { 
        use_ok('Net::DBus::Binding::Iterator');
        use_ok('Net::DBus::Binding::Message::Signal');
        use_ok('Net::DBus::Binding::Message::MethodCall');
        use_ok('Net::DBus::Binding::Message::MethodReturn');
        use_ok('Net::DBus::Binding::Message::Error');
	};


my $msg = Net::DBus::Binding::Message::Signal->new(object_path => "/foo/bar/Wizz",	
	interface => "com.blah.Example",
        signal_name => "Eeek");

my $iter = $msg->iterator(1);
$iter->append_boolean(1);
$iter->append_byte(43);
$iter->append_int16(123);
$iter->append_uint16(456);
$iter->append_int32(123);
$iter->append_uint32(456);
$iter->append_int64("12345645645");
$iter->append_uint64("12312312312");
$iter->append_int64("12345645645123456");
$iter->append_uint64("12312312312123456");
$iter->append_string("Hello world");
$iter->append_double(1.424141);

$iter->append_array(["one", "two", "three"], [&Net::DBus::Binding::Message::TYPE_STRING]);

$iter->append_dict({ "one" => "foo", "two" => "bar"}, [&Net::DBus::Binding::Message::TYPE_STRING,
						       &Net::DBus::Binding::Message::TYPE_STRING]);

$iter = $msg->iterator();
ok($iter->get_boolean() == 1, "boolean");
ok($iter->next(), "next");
ok($iter->get_byte() == 43, "byte");
ok($iter->next(), "next");

ok($iter->get_int16() == 123, "int16");
ok($iter->next(), "next");
ok($iter->get_uint16() == 456, "uint16");
ok($iter->next(), "next");

ok($iter->get_int32() == 123, "int32");
ok($iter->next(), "next");
ok($iter->get_uint32() == 456, "uint32");
ok($iter->next(), "next");

ok($iter->get_int64() == "12345645645", "int64");
ok($iter->next(), "next");
ok($iter->get_uint64() == "12312312312", "uint64");
ok($iter->next(), "next");

ok($iter->get_int64() == "12345645645123456", "int64");
ok($iter->next(), "next");
ok($iter->get_uint64() == "12312312312123456", "uint64");
ok($iter->next(), "next");

ok($iter->get_string() eq "Hello world", "string");
ok($iter->next(), "next");
# Don't test precise equality, because floating point arithmetic
# is not an exact science. (see RT #37707)
my $d = $iter->get_double();
ok($d > 1.424100 && $d < 1.424200, "double");

ok($iter->next(), "next");
is_deeply($iter->get_array(&Net::DBus::Binding::Message::TYPE_STRING), ["one", "two", "three"], "array");

ok($iter->next(), "next");
is_deeply($iter->get_dict(), {"one" => "foo", "two" => "bar"}, "dict");

ok(!$iter->next(), "next");