planck-js
Version:
2D physics engine for JavaScript/HTML5 game development
139 lines (100 loc) • 4.11 kB
JavaScript
var expect = require('./testutil/expect');
var sinon = require('sinon');
var Vec2 = require('../lib/common/Vec2');
var AABB = require('../lib/collision/AABB');
var DynamicTree = require('../lib/collision/DynamicTree');
var BroadPhase = require('../lib/collision/BroadPhase');
describe('Collision', function() {
it('AABB', function() {
var r, o = AABB();
expect(o.IsValid()).be(true);
o.upperBound.Set(10, 6);
o.lowerBound.Set(6, 4);
r = o.GetCenter();
expect(r.x).be(8);
expect(r.y).be(5);
r = o.GetExtents();
expect(r.x).be(2);
expect(r.y).be(1);
r = o.GetPerimeter();
expect(r).be(12);
o.Combine(AABB(Vec2(7, 4), Vec2(9, 6)));
expect(o.upperBound.x).be(10);
expect(o.upperBound.y).be(6);
expect(o.lowerBound.x).be(6);
expect(o.lowerBound.y).be(4);
o.Combine(AABB(Vec2(5, 3), Vec2(11, 7)));
expect(o.upperBound.x).be(11);
expect(o.upperBound.y).be(7);
expect(o.lowerBound.x).be(5);
expect(o.lowerBound.y).be(3);
expect(o.Contains(AABB(Vec2(5, 3), Vec2(11, 7)))).be(true);
expect(o.Contains(AABB(Vec2(5, 2), Vec2(11, 7)))).be(false);
expect(o.Contains(AABB(Vec2(4, 2), Vec2(11, 7)))).be(false);
expect(o.Contains(AABB(Vec2(5, 3), Vec2(11, 8)))).be(false);
expect(o.Contains(AABB(Vec2(5, 3), Vec2(12, 7)))).be(false);
// RayCast
});
it('DynamicTree', function() {
var tree = new DynamicTree();
var foo = tree.CreateProxy(AABB(Vec2(0, 0), Vec2(1, 1)), 'foo');
var bar = tree.CreateProxy(AABB(Vec2(1, 1), Vec2(2, 2)), 'bar');
var baz = tree.CreateProxy(AABB(Vec2(2, 2), Vec2(3, 3)), 'baz');
expect(tree.GetHeight()).be(2);
expect(tree.GetUserData(foo)).be('foo');
expect(tree.GetUserData(bar)).be('bar');
expect(tree.GetUserData(baz)).be('baz');
expect(tree.GetFatAABB(foo).upperBound.x).be.above(1);
expect(tree.GetFatAABB(foo).upperBound.y).be.above(1);
expect(tree.GetFatAABB(foo).lowerBound.x).be.below(0);
expect(tree.GetFatAABB(foo).lowerBound.y).be.below(0);
var QueryCallback = sinon.spy();
var callback = {
QueryCallback : QueryCallback
};
tree.Query(callback, AABB(Vec2(1, 1), Vec2(2, 2)));
expect(QueryCallback.calledWith(foo)).be(true);
expect(QueryCallback.calledWith(bar)).be(true);
expect(QueryCallback.calledWith(baz)).be(true);
tree.Query(callback, AABB(Vec2(0.3, 0.3), Vec2(0.7, 0.7)));
expect(QueryCallback.lastCall.calledWith(foo)).be(true);
tree.Query(callback, AABB(Vec2(1.3, 1.3), Vec2(1.7, 1.7)));
expect(QueryCallback.lastCall.calledWith(bar)).be(true);
tree.Query(callback, AABB(Vec2(2.3, 2.3), Vec2(2.7, 2.7)));
expect(QueryCallback.lastCall.calledWith(baz)).be(true);
expect(tree.MoveProxy(foo, AABB(Vec2(0, 0), Vec2(1, 1)), Vec2(0.01, 0.01)))
.be(false);
expect(tree.MoveProxy(baz, AABB(Vec2(3, 3), Vec2(4, 4)), Vec2(0, 0))).be(
true);
tree.Query(callback, AABB(Vec2(3.3, 3.3), Vec2(3.7, 3.7)));
expect(QueryCallback.lastCall.calledWith(baz)).be(true);
tree.DestroyProxy(foo);
expect(tree.GetHeight()).be(1);
tree.DestroyProxy(bar);
expect(tree.GetHeight()).be(0);
tree.DestroyProxy(baz);
expect(tree.GetHeight()).be(0);
});
it('BroadPhase', function() {
var bp = new BroadPhase();
var AddPair = sinon.spy();
var callback = {
AddPair : AddPair
};
var foo = bp.CreateProxy(AABB(Vec2(0, 0), Vec2(1, 1)), 'foo');
var bar = bp.CreateProxy(AABB(Vec2(2, 2), Vec2(3, 3)), 'bar');
bp.UpdatePairs(callback);
expect(AddPair.callCount).be(0);
var baz = bp.CreateProxy(AABB(Vec2(1, 1), Vec2(2, 2)), 'baz');
AddPair.reset();
bp.UpdatePairs(callback);
expect(AddPair.callCount).be(2);
expect(AddPair.calledWith('bar', 'baz')).be(true);
expect(AddPair.calledWith('foo', 'baz')).be(true);
bp.MoveProxy(baz, AABB(Vec2(0.5, 0.5), Vec2(1.5, 1.5)), Vec2());
AddPair.reset();
bp.UpdatePairs(callback);
expect(AddPair.callCount).be(1);
expect(AddPair.calledWith('foo', 'baz')).be(true);
});
});