UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

408 lines (330 loc) 14 kB
var QuadraticBezier = require('../../src/curves/QuadraticBezierCurve'); var Vector2 = require('../../src/math/Vector2'); describe('QuadraticBezier', function () { describe('constructor', function () { it('should create a curve with Vector2 points', function () { var p0 = new Vector2(0, 0); var p1 = new Vector2(50, 100); var p2 = new Vector2(100, 0); var curve = new QuadraticBezier(p0, p1, p2); expect(curve.p0).toBe(p0); expect(curve.p1).toBe(p1); expect(curve.p2).toBe(p2); }); it('should create a curve from an array of point pairs', function () { var curve = new QuadraticBezier([ 0, 0, 50, 100, 100, 0 ]); expect(curve.p0.x).toBe(0); expect(curve.p0.y).toBe(0); expect(curve.p1.x).toBe(50); expect(curve.p1.y).toBe(100); expect(curve.p2.x).toBe(100); expect(curve.p2.y).toBe(0); }); it('should set the curve type to QuadraticBezierCurve', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 50), new Vector2(100, 0)); expect(curve.type).toBe('QuadraticBezierCurve'); }); it('should create a curve with negative coordinates', function () { var p0 = new Vector2(-100, -100); var p1 = new Vector2(0, 0); var p2 = new Vector2(100, 100); var curve = new QuadraticBezier(p0, p1, p2); expect(curve.p0.x).toBe(-100); expect(curve.p0.y).toBe(-100); expect(curve.p2.x).toBe(100); expect(curve.p2.y).toBe(100); }); it('should create a curve with floating point coordinates', function () { var p0 = new Vector2(0.5, 1.5); var p1 = new Vector2(25.75, 50.25); var p2 = new Vector2(99.9, 0.1); var curve = new QuadraticBezier(p0, p1, p2); expect(curve.p0.x).toBeCloseTo(0.5); expect(curve.p1.x).toBeCloseTo(25.75); expect(curve.p2.x).toBeCloseTo(99.9); }); }); describe('getStartPoint', function () { it('should return the start point p0', function () { var p0 = new Vector2(10, 20); var curve = new QuadraticBezier(p0, new Vector2(50, 100), new Vector2(100, 0)); var result = curve.getStartPoint(); expect(result.x).toBe(10); expect(result.y).toBe(20); }); it('should create a new Vector2 if no out parameter is given', function () { var curve = new QuadraticBezier(new Vector2(5, 15), new Vector2(50, 50), new Vector2(100, 0)); var result = curve.getStartPoint(); expect(result).toBeInstanceOf(Vector2); expect(result.x).toBe(5); expect(result.y).toBe(15); }); it('should store result in provided out object', function () { var curve = new QuadraticBezier(new Vector2(7, 3), new Vector2(50, 50), new Vector2(100, 0)); var out = new Vector2(); var result = curve.getStartPoint(out); expect(result).toBe(out); expect(out.x).toBe(7); expect(out.y).toBe(3); }); it('should return zero coordinates when p0 is at origin', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 50), new Vector2(100, 0)); var result = curve.getStartPoint(); expect(result.x).toBe(0); expect(result.y).toBe(0); }); }); describe('getResolution', function () { it('should return the divisions value unchanged', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); expect(curve.getResolution(10)).toBe(10); }); it('should return 32 when passed 32', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); expect(curve.getResolution(32)).toBe(32); }); it('should return 1 when passed 1', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); expect(curve.getResolution(1)).toBe(1); }); it('should return 0 when passed 0', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); expect(curve.getResolution(0)).toBe(0); }); }); describe('getPoint', function () { it('should return the start point at t=0', function () { var p0 = new Vector2(0, 0); var p1 = new Vector2(50, 100); var p2 = new Vector2(100, 0); var curve = new QuadraticBezier(p0, p1, p2); var result = curve.getPoint(0); expect(result.x).toBeCloseTo(0); expect(result.y).toBeCloseTo(0); }); it('should return the end point at t=1', function () { var p0 = new Vector2(0, 0); var p1 = new Vector2(50, 100); var p2 = new Vector2(100, 0); var curve = new QuadraticBezier(p0, p1, p2); var result = curve.getPoint(1); expect(result.x).toBeCloseTo(100); expect(result.y).toBeCloseTo(0); }); it('should return the midpoint at t=0.5 for a symmetric curve', function () { var p0 = new Vector2(0, 0); var p1 = new Vector2(50, 100); var p2 = new Vector2(100, 0); var curve = new QuadraticBezier(p0, p1, p2); var result = curve.getPoint(0.5); expect(result.x).toBeCloseTo(50); expect(result.y).toBeCloseTo(50); }); it('should create a new Vector2 if no out parameter is given', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var result = curve.getPoint(0.5); expect(result).toBeInstanceOf(Vector2); }); it('should store result in provided out object', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var out = new Vector2(); var result = curve.getPoint(0.5, out); expect(result).toBe(out); }); it('should return a point between start and end for t between 0 and 1', function () { var p0 = new Vector2(0, 0); var p1 = new Vector2(50, 100); var p2 = new Vector2(100, 0); var curve = new QuadraticBezier(p0, p1, p2); var result = curve.getPoint(0.25); expect(result.x).toBeGreaterThan(0); expect(result.x).toBeLessThan(100); }); it('should work with a straight line (collinear points)', function () { var p0 = new Vector2(0, 0); var p1 = new Vector2(50, 0); var p2 = new Vector2(100, 0); var curve = new QuadraticBezier(p0, p1, p2); var result = curve.getPoint(0.5); expect(result.x).toBeCloseTo(50); expect(result.y).toBeCloseTo(0); }); it('should work with negative coordinates', function () { var p0 = new Vector2(-100, -100); var p1 = new Vector2(0, 0); var p2 = new Vector2(100, 100); var curve = new QuadraticBezier(p0, p1, p2); var result = curve.getPoint(0.5); expect(result.x).toBeCloseTo(0); expect(result.y).toBeCloseTo(0); }); }); describe('draw', function () { it('should call graphics methods and return the graphics object', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var graphics = { beginPath: function () {}, moveTo: function () {}, lineTo: function () {}, strokePath: function () {} }; var result = curve.draw(graphics); expect(result).toBe(graphics); }); it('should use 32 points by default', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var lineToCount = 0; var graphics = { beginPath: function () {}, moveTo: function () {}, lineTo: function () { lineToCount++; }, strokePath: function () {} }; curve.draw(graphics); expect(lineToCount).toBe(32); }); it('should use the specified number of points', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var lineToCount = 0; var graphics = { beginPath: function () {}, moveTo: function () {}, lineTo: function () { lineToCount++; }, strokePath: function () {} }; curve.draw(graphics, 16); expect(lineToCount).toBe(16); }); it('should call beginPath once', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var beginPathCount = 0; var graphics = { beginPath: function () { beginPathCount++; }, moveTo: function () {}, lineTo: function () {}, strokePath: function () {} }; curve.draw(graphics); expect(beginPathCount).toBe(1); }); it('should call strokePath once', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var strokePathCount = 0; var graphics = { beginPath: function () {}, moveTo: function () {}, lineTo: function () {}, strokePath: function () { strokePathCount++; } }; curve.draw(graphics); expect(strokePathCount).toBe(1); }); }); describe('toJSON', function () { it('should return an object with type and points', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var json = curve.toJSON(); expect(json).toHaveProperty('type'); expect(json).toHaveProperty('points'); }); it('should return the correct type string', function () { var curve = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var json = curve.toJSON(); expect(json.type).toBe('QuadraticBezierCurve'); }); it('should return correct points array with 6 values', function () { var curve = new QuadraticBezier(new Vector2(10, 20), new Vector2(50, 100), new Vector2(90, 30)); var json = curve.toJSON(); expect(json.points.length).toBe(6); expect(json.points[0]).toBe(10); expect(json.points[1]).toBe(20); expect(json.points[2]).toBe(50); expect(json.points[3]).toBe(100); expect(json.points[4]).toBe(90); expect(json.points[5]).toBe(30); }); it('should preserve negative coordinate values', function () { var curve = new QuadraticBezier(new Vector2(-10, -20), new Vector2(0, 0), new Vector2(10, 20)); var json = curve.toJSON(); expect(json.points[0]).toBe(-10); expect(json.points[1]).toBe(-20); }); }); describe('fromJSON', function () { it('should create a curve from a JSON object', function () { var json = { type: 'QuadraticBezierCurve', points: [ 0, 0, 50, 100, 100, 0 ] }; var curve = QuadraticBezier.fromJSON(json); expect(curve).toBeInstanceOf(QuadraticBezier); expect(curve.p0.x).toBe(0); expect(curve.p0.y).toBe(0); expect(curve.p1.x).toBe(50); expect(curve.p1.y).toBe(100); expect(curve.p2.x).toBe(100); expect(curve.p2.y).toBe(0); }); it('should round-trip through toJSON and fromJSON', function () { var original = new QuadraticBezier(new Vector2(10, 20), new Vector2(55, 80), new Vector2(90, 15)); var json = original.toJSON(); var restored = QuadraticBezier.fromJSON(json); expect(restored.p0.x).toBe(original.p0.x); expect(restored.p0.y).toBe(original.p0.y); expect(restored.p1.x).toBe(original.p1.x); expect(restored.p1.y).toBe(original.p1.y); expect(restored.p2.x).toBe(original.p2.x); expect(restored.p2.y).toBe(original.p2.y); }); it('should produce a curve that returns the same points as the original', function () { var original = new QuadraticBezier(new Vector2(0, 0), new Vector2(50, 100), new Vector2(100, 0)); var json = original.toJSON(); var restored = QuadraticBezier.fromJSON(json); var origPoint = original.getPoint(0.5); var restPoint = restored.getPoint(0.5); expect(restPoint.x).toBeCloseTo(origPoint.x); expect(restPoint.y).toBeCloseTo(origPoint.y); }); }); });