1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- var test = require('tap').test;
- var dimensions = 2;
- var Body = require('../lib/codeGenerators/generateCreateBody')(dimensions);
- var integrate = require('../lib/codeGenerators/generateIntegrator')(dimensions);
- test('Body preserves velocity without forces', function (t) {
- var body = new Body();
- var timeStep = 1;
- body.mass = 1; body.velocity.x = 1;
- integrate([body], timeStep);
- t.equal(body.pos.x, 1, 'Should move by 1 pixel on first iteration');
- timeStep = 2; // let's increase time step:
- integrate([body], timeStep);
- t.equal(body.pos.x, 3, 'Should move by 2 pixel on second iteration');
- t.end();
- });
- test('Body gains velocity under force', function (t) {
- var body = new Body();
- var timeStep = 1;
- body.mass = 1; body.force.x = 0.1;
- // F = m * a;
- // since mass = 1 => F = a = y';
- integrate([body], timeStep);
- t.equal(body.velocity.x, 0.1, 'Should increase velocity');
- integrate([body], timeStep);
- t.equal(body.velocity.x, 0.2, 'Should increase velocity');
- // floating point math:
- t.ok(0.29 < body.pos.x && body.pos.x < 0.31, 'Position should be at 0.3 now');
- t.end();
- });
- test('No bodies yield 0 movement', function (t) {
- var movement = integrate([], 2);
- t.equal(movement, 0, 'Nothing has moved');
- t.end();
- });
- test('Body does not move faster than 1px', function (t) {
- var body = new Body();
- var timeStep = 1;
- body.mass = 1; body.force.x = 2;
- integrate([body], timeStep);
- t.ok(body.velocity.x <= 1, 'Velocity should be within speed limit');
- integrate([body], timeStep);
- t.ok(body.velocity.x <= 1, 'Velocity should be within speed limit');
- t.end();
- });
- test('Can get total system movement', function (t) {
- var body = new Body();
- var timeStep = 1;
- body.mass = 1; body.velocity.x = 0.2;
- var movement = integrate([body], timeStep);
- // to improve performance, integrator does not take square root, thus
- // total movement is .2 * .2 = 0.04;
- t.ok(0.04 <= movement && movement <= 0.041, 'System should travel by 0.2 pixels');
- t.end();
- });
|