UNPKG

@astrodraw/astrochart

Version:

A free and open-source JavaScript library for generating SVG charts to display planets in astrology.

180 lines (139 loc) 8.14 kB
import { LocatedPoint, Points } from './radix'; import default_settings, { Settings } from './settings'; import { getPointPosition, isCollision, comparePoints, placePointsInCollision, assemble } from './utils' describe('getPointPosition', () => { test.each([ [10, 10, 10, 0, {x:0, y:10}], [10, 10, 10, 90, {x:10, y:20}], [10, 10, 10, 180, {x:20, y:10}], [10, 10, 10, 270, {x:10, y:0}], [10, 10, 10, 360, {x:0, y:10}], [10, 10, 10, 450, {x:10, y:20}], ])('should return position for angle', (cx, cy, radius, angle, expected) => { const position = getPointPosition(cx, cy, radius, angle, default_settings) expect(position.x).toBeCloseTo(expected.x) expect(position.y).toBeCloseTo(expected.y) }) }); describe('isCollision', () => { test.each([ [{x:10, y:10, r:5}, {x:10, y:10, r:5}, true], [{x:10, y:10, r:5}, {x:21, y:10, r:5}, false], [{x:10, y:10, r:5}, {x:10, y:20, r:5}, true], [{x:10, y:10, r:5}, {x:10, y:21, r:5}, false], [{x:10, y:10, r:5}, {x:20, y:10, r:10}, true] ])('should return if circles are in collision', (circle1, circle2, expected) => { expect(isCollision(circle1, circle2)).toBe(expected) }) }) describe('comparePoints', () => { test.each([ [ 10, 20, -10], [ 20, 20, 0], [ 30, 20, 10], [ 0, 1, -1], [259.99, 0, 259.99], ])('should return if circles are in collision', (angle1, angle2, expected) => { expect(comparePoints({angle: angle1}, {angle: angle2})).toBe(expected) }) }) describe('placePointsInCollision', () => { test('should place correctly planets', () => { let p1 = {name:'Sun', pointer:1, angle:1, x:1, y:1, r:1}; let p2 = {name:'Mercury', pointer:359, angle:1, x:1, y:1, r:1}; placePointsInCollision(p1, p2); expect(p1).toStrictEqual({name:'Sun', pointer:1, angle:2, x:1, y:1, r:1}); expect(p2).toStrictEqual({name:'Mercury', pointer:359, angle:0, x:1, y:1, r:1}); }) test('should place correctly planets when passing in other order', () => { let p1 = {name:'Mercury', pointer:359, angle:1, x:1, y:1, r:1}; let p2 = {name:'Sun', pointer:1, angle:1, x:1, y:1, r:1}; placePointsInCollision(p1, p2); expect(p1).toStrictEqual({name:'Mercury', pointer:359, angle:0, x:1, y:1, r:1}); expect(p2).toStrictEqual({name:'Sun', pointer:1, angle:2, x:1, y:1, r:1}); }) test('should place correctly planets when in collision', () => { let p1 = {name:'Sun', pointer:10, angle:10, x:1, y:1, r:1}; let p2 = {name:'Mercury', pointer:20, angle:10, x:1, y:1, r:1}; placePointsInCollision(p1, p2); expect(p1).toStrictEqual({name:'Sun', pointer:10, angle:9, x:1, y:1, r:1}); expect(p2).toStrictEqual({name:'Mercury', pointer:20, angle:11, x:1, y:1, r:1}); }) }) describe('assemble', () => { test('assemble', () => { let locatedPoints: LocatedPoint[] = []; const universe = {cx:0, cy:0, r:100} const planetRadius = 10 const settings: Settings = {...default_settings, COLLISION_RADIUS: planetRadius} let point: LocatedPoint = {name:"Point1", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point2", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point3", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point4", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point5", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point6", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point7", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point8", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point9", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); point = {name:"Point10", x:100, y:0, r:planetRadius, angle:180} locatedPoints = assemble(locatedPoints, point, universe, settings); expect( locatedPoints ).toHaveLength( 10 ); }) test('assemble2', () => { const universe = {cx:0, cy:0, r:100}; const collisionRadius = 10; let angle, planetPosition, sun, mercury, venus, result, locatedPoints; angle = 0; planetPosition = getPointPosition(universe.cx, universe.cy, universe.r, angle, default_settings); sun = {name:"Sun", x:planetPosition.x, y:planetPosition.y, r:collisionRadius, angle:angle}; expect(assemble([], sun, universe, default_settings)).toStrictEqual([sun]); angle = 90; planetPosition = getPointPosition(universe.cx, universe.cy, universe.r, angle, default_settings); mercury = {name:"Mercury", x:planetPosition.x, y:planetPosition.y, r:collisionRadius, angle:angle}; locatedPoints = assemble([sun], mercury, universe, default_settings); expect(locatedPoints[0].angle).toBe(0); expect(locatedPoints[1].angle).toBe(90); angle = 2; planetPosition = getPointPosition(universe.cx, universe.cy, universe.r, angle, default_settings); mercury = {name:"Mercury", x:planetPosition.x, y:planetPosition.y, r:collisionRadius, angle:angle}; locatedPoints = assemble([sun], mercury, universe, default_settings); expect(locatedPoints[0].angle).toBe(7); expect(locatedPoints[1].angle).toBe(355); expect(locatedPoints).toHaveLength(2); angle = 1; planetPosition = getPointPosition(universe.cx, universe.cy, universe.r, angle, default_settings); venus = {name:"Venus", x:planetPosition.x, y:planetPosition.y, r:collisionRadius, angle:angle}; locatedPoints = assemble([sun, mercury], venus, universe, default_settings); expect( locatedPoints[0].name ).toBe("Venus"); expect( locatedPoints[0].angle ).toBe(1); expect( locatedPoints[1].name ).toBe("Mercury"); expect( locatedPoints[1].angle ).toBe(13); expect( locatedPoints[2].name ).toBe("Sun"); expect( locatedPoints[2].angle ).toBe(349); expect(locatedPoints).toHaveLength(3); }) test('assemble should not change planet position when planet are in collision', () => { const shift = 344.07396032340205; const universe = {cx:300, cy:300, r:185.125}; const collisionRadius = 10; let angle, planetPosition, sun, mercury, venus, result let locatedPoints: LocatedPoint[] = []; const planets: Points = {"Sun": [264.7071707108],"Mercury": [283.248841516],"Saturn": [283.8137792332],"Uranus": [274.8367919812],"Neptune": [281.4462451253]} for(var planet in planets){ planetPosition = getPointPosition(universe.cx, universe.cy, universe.r, planets[planet][0]+shift, default_settings); const planetObject = {name:planet, x:planetPosition.x, y:planetPosition.y, r:collisionRadius, angle:planets[planet][0]+shift,pointer:planets[planet][0]+shift}; locatedPoints = assemble(locatedPoints, planetObject, universe, default_settings); } var expectedPlanetOrder = ["Sun", "Uranus", "Neptune", "Mercury", "Saturn"]; expect(locatedPoints.map(lp => lp.name)).toStrictEqual(expectedPlanetOrder); }) })