The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Box2D;
use Test::More;

my $gravity = Box2D::b2Vec2->new( 0.0, 0.0 );
my $world = Box2D::b2World->new( $gravity, 1 );

my ( $xA, $yA, $xB, $yB ) = ( 10.0, 20.0, 30.0, 40.0 );

my $bodyDefA = Box2D::b2BodyDef->new();
$bodyDefA->position->Set( $xA, $yA );
my $bodyA   = $world->CreateBody($bodyDefA);
my $circleA = Box2D::b2CircleShape->new();
$circleA->m_radius(50.0);
$bodyA->CreateFixture( $circleA, 0.0 );

my $bodyDefB = Box2D::b2BodyDef->new();
$bodyDefB->position->Set( $xB, $yB );
$bodyDefB->type(Box2D::b2_dynamicBody);
my $bodyB   = $world->CreateBody($bodyDefB);
my $circleB = Box2D::b2CircleShape->new();
$circleB->m_radius(50.0);
$bodyB->CreateFixture( $circleB, 1.0 );

my $jointDef = Box2D::b2MouseJointDef->new();
ok( $jointDef, "new" );
isa_ok( $jointDef, "Box2D::b2MouseJointDef" );

$jointDef->bodyA($bodyA);
$jointDef->bodyB($bodyB);

my $target
    = Box2D::b2Vec2->new( $bodyA->GetPosition->x, $bodyA->GetPosition->y );
my $maxForce     = 3.0;
my $frequencyHz  = 4.0;
my $dampingRatio = 5.0;

$jointDef->target($target);
pass("set target");

$jointDef->maxForce($maxForce);
pass("set maxForce");

$jointDef->frequencyHz($frequencyHz);
pass("set frequencyHz");

$jointDef->dampingRatio($dampingRatio);
pass("set dampingRatio");

is( $jointDef->target->x,    $target->x,    "get target->x" );
is( $jointDef->target->y,    $target->y,    "get target->y" );
is( $jointDef->maxForce,     $maxForce,     "get maxForce" );
is( $jointDef->frequencyHz,  $frequencyHz,  "get frequencyHz" );
is( $jointDef->dampingRatio, $dampingRatio, "get dampingRatio" );

my $joint = $world->CreateJoint($jointDef);
ok( $joint, "new" );
isa_ok( $joint, "Box2D::b2Joint" );

bless $joint, "Box2D::b2MouseJoint";
isa_ok( $joint, "Box2D::b2MouseJoint" );

is( $joint->GetTarget->x,    $target->x,    "get GetTarget->x" );
is( $joint->GetTarget->y,    $target->y,    "get GetTarget->y" );
is( $joint->GetMaxForce,     $maxForce,     "get GetMaxForce" );
is( $joint->GetFrequency,    $frequencyHz,  "get GetFrequency" );
is( $joint->GetDampingRatio, $dampingRatio, "get GetDampingRatio" );

$target       = Box2D::b2Vec2->new( 1.0, 2.0 );
$maxForce     = 4.0;
$frequencyHz  = 5.0;
$dampingRatio = 6.0;

$joint->SetTarget($target);
$joint->SetMaxForce($maxForce);
$joint->SetFrequency($frequencyHz);
$joint->SetDampingRatio($dampingRatio);

is( $joint->GetTarget->x,    $target->x,    "set GetTarget->x" );
is( $joint->GetTarget->y,    $target->y,    "set GetTarget->y" );
is( $joint->GetMaxForce,     $maxForce,     "set GetMaxForce" );
is( $joint->GetFrequency,    $frequencyHz,  "set GetFrequency" );
is( $joint->GetDampingRatio, $dampingRatio, "set GetDampingRatio" );

done_testing;