diff --git a/src/body/Sun.ts b/src/body/Sun.ts index 5be121b..ee8a6f8 100644 --- a/src/body/Sun.ts +++ b/src/body/Sun.ts @@ -282,7 +282,7 @@ export class Sun { } // Ensure date is a Date object - const date = new Date(dateVal); + const date = dateVal instanceof Date ? dateVal : new Date(dateVal); if (isUtc) { date.setUTCHours(12, 0, 0, 0); diff --git a/test/body/Moon.test.ts b/test/body/Moon.test.ts index d38c898..654f155 100644 --- a/test/body/Moon.test.ts +++ b/test/body/Moon.test.ts @@ -7,12 +7,18 @@ describe('Moon', () => { expect(Moon.mu).toBe(4902.799); }); - // The static property 'radiusEquator' should be accessible and have a value of 1738.0. + /* + * The static property 'radiusEquator' should be accessible and have a value + * of 1738.0. + */ it('should have a static property "radiusEquator" with value 1738.0', () => { expect(Moon.radiusEquator).toBe(1738.0); }); - // The static method 'eci' should be callable with an "EpochUTC" parameter and return a 'Vector3D' object. + /* + * The static method 'eci' should be callable with an "EpochUTC" parameter and + * return a 'Vector3D' object. + */ it('should be callable with an "EpochUTC" parameter and return a "Vector3D" object', () => { const epoch = EpochUTC.fromDateTime(exampleDate); const result = Moon.eci(epoch); @@ -21,8 +27,9 @@ describe('Moon', () => { }); /* - * The static method 'illumination' should be callable with an "EpochUTC" parameter - * and an optional 'origin' parameter, and return a number between 0 and 1. + * The static method 'illumination' should be callable with an "EpochUTC" + * parameter and an optional 'origin' parameter, and return a number between 0 + * and 1. */ it('should be callable with an "EpochUTC" parameter and an optional "origin" parameter', () => { const epoch = EpochUTC.fromDateTime(exampleDate); @@ -32,7 +39,10 @@ describe('Moon', () => { expect(result).toBeLessThanOrEqual(1); }); - // The static method 'diameter' should be callable with two 'Vector3D' parameters and return a number. + /* + * The static method 'diameter' should be callable with two 'Vector3D' + * parameters and return a number. + */ it('should be callable with two "Vector3D" parameters and return a number', () => { const obsPos = new Vector3D(1, 2, 3); const moonPos = new Vector3D(4, 5, 6); @@ -41,14 +51,20 @@ describe('Moon', () => { expect(result).toMatchSnapshot(); }); - // The static method 'eci' should throw an error if the "EpochUTC" parameter is not provided. + /* + * The static method 'eci' should throw an error if the "EpochUTC" parameter + * is not provided. + */ it('should throw an error if the "EpochUTC" parameter is not provided', () => { expect(() => { Moon.eci(); }).not.toThrow('EpochUTC parameter is required'); }); - // The static method 'illumination' should return 0.5 if the 'origin' parameter is not provided. + /* + * The static method 'illumination' should return 0.5 if the 'origin' + * parameter is not provided. + */ it('should return 0.5 if the "origin" parameter is not provided', () => { const epoch = EpochUTC.fromDateTime(exampleDate); const result = Moon.illumination(epoch); @@ -56,7 +72,10 @@ describe('Moon', () => { expect(result).toMatchSnapshot(); }); - // The static method 'diameter' should return 0 if the two 'Vector3D' parameters are the same. + /* + * The static method 'diameter' should return 0 if the two 'Vector3D' + * parameters are the same. + */ it('should return NaN if the two "Vector3D" parameters are the same', () => { const pos = new Vector3D(1, 2, 3); const result = Moon.diameter(pos, pos); @@ -65,8 +84,8 @@ describe('Moon', () => { }); /* - * The static method 'getMoonIllumination' should be callable with a 'number' or 'Date' parameter - * and return a 'MoonIlluminationData' object. + * The static method 'getMoonIllumination' should be callable with a 'number' + * or 'Date' parameter and return a 'MoonIlluminationData' object. */ it('should return a MoonIlluminationData object when called with a number parameter', () => { const date = 1635724800000; // November 1, 2021 @@ -76,8 +95,9 @@ describe('Moon', () => { }); /* - * The static method 'rae' should be callable with a 'Date', 'Degrees', and 'Degrees' parameters - * and return an object with 'az', 'el', 'rng', and 'parallacticAngle' properties. + * The static method 'rae' should be callable with a 'Date', 'Degrees', and + * 'Degrees' parameters and return an object with 'az', 'el', 'rng', and + * 'parallacticAngle' properties. */ it("should return an object with 'az', 'el', 'rng', and 'parallacticAngle' properties", () => { const date = new Date(1635724800000); // November 1, 2021 @@ -89,8 +109,9 @@ describe('Moon', () => { }); /* - * The static method 'getMoonTimes' should be callable with a 'Date', 'Degrees', 'Degrees', and 'boolean' - * parameters and return an object with 'rise', 'set', 'ye', 'alwaysUp', 'alwaysDown', and 'highest' properties. + * The static method 'getMoonTimes' should be callable with a 'Date', + * 'Degrees', 'Degrees', and 'boolean' parameters and return an object with + * 'rise', 'set', 'ye', 'alwaysUp', 'alwaysDown', and 'highest' properties. */ it("should return an object with 'rise', 'set', 'ye', 'alwaysUp', 'alwaysDown', and 'highest' properties", () => { const date = new Date(1635724800000); // November 1, 2021 @@ -103,11 +124,12 @@ describe('Moon', () => { }); /* - * The static method 'rae' should be callable with a 'Date', 'Degrees', and 'Degrees' parameters and return - * an object with 'az', 'el', 'rng', and 'parallacticAngle' properties. + * The static method 'rae' should be callable with a 'Date', 'Degrees', and + * 'Degrees' parameters and return an object with 'az', 'el', 'rng', and + * 'parallacticAngle' properties. */ it("should return an object with 'az', 'el', 'rng', and 'parallacticAngle' properties", () => { - const date = new Date(2021, 10, 1); // November 1, 2021 + const date = new Date(exampleDate); // November 1, 2021 const lat = 37.7749 as Degrees; // San Francisco latitude const lon = -122.4194 as Degrees; // San Francisco longitude const result = Moon.rae(date, lat, lon); @@ -116,11 +138,12 @@ describe('Moon', () => { }); /* - * The static method 'getMoonTimes' should be callable with a 'Date', 'Degrees', 'Degrees', and 'boolean' parameters - * and return an object with 'rise', 'set', 'ye', 'alwaysUp', 'alwaysDown', and 'highest' properties. + * The static method 'getMoonTimes' should be callable with a 'Date', + * 'Degrees', 'Degrees', and 'boolean' parameters and return an object with + * 'rise', 'set', 'ye', 'alwaysUp', 'alwaysDown', and 'highest' properties. */ it("should return an object with 'rise', 'set', 'ye', 'alwaysUp', 'alwaysDown', and 'highest' properties", () => { - const date = new Date(2021, 10, 1); // November 1, 2021 + const date = new Date(exampleDate); // November 1, 2021 const lat = 37.7749 as Degrees; // San Francisco latitude const lon = -122.4194 as Degrees; // San Francisco longitude const isUtc = false; @@ -129,7 +152,10 @@ describe('Moon', () => { expect(result).toMatchSnapshot(); }); - // The private method 'moonCoords' should be callable with a 'number' parameter and return a 'RaDec' object. + /* + * The private method 'moonCoords' should be callable with a 'number' + * parameter and return a 'RaDec' object. + */ it("should call the private method 'moonCoords' with a number parameter and return a RaDec object", () => { const d = 123456789; const result = Moon.moonCoords(d); diff --git a/test/body/__snapshots__/Moon.test.ts.snap b/test/body/__snapshots__/Moon.test.ts.snap index ed63551..bbbc13e 100644 --- a/test/body/__snapshots__/Moon.test.ts.snap +++ b/test/body/__snapshots__/Moon.test.ts.snap @@ -70,10 +70,10 @@ Object { exports[`Moon should return an object with 'az', 'el', 'rng', and 'parallacticAngle' properties 2`] = ` Object { - "az": 5.9437396940767915, - "el": -0.7211759674013636, - "parallacticAngle": 0.26932786334872394, - "rng": 379969.4077607909, + "az": 4.034314328077605, + "el": 0.19547892013212267, + "parallacticAngle": 0.7236664732665937, + "rng": 366252.754397278, } `; @@ -92,9 +92,9 @@ exports[`Moon should return an object with 'rise', 'set', 'ye', 'alwaysUp', 'alw Object { "alwaysDown": false, "alwaysUp": false, - "highest": 2021-11-01T17:18:20.884Z, - "rise": 2021-11-01T10:48:42.354Z, - "set": 2021-11-01T23:47:59.413Z, + "highest": 2024-01-12T21:42:31.618Z, + "rise": 2024-01-12T16:43:59.167Z, + "set": 2024-01-13T02:41:04.069Z, "ye": null, } `; diff --git a/test/body/__snapshots__/Sun.test.ts.snap b/test/body/__snapshots__/Sun.test.ts.snap index cfdbb8a..f57771c 100644 --- a/test/body/__snapshots__/Sun.test.ts.snap +++ b/test/body/__snapshots__/Sun.test.ts.snap @@ -45,9 +45,9 @@ exports[`Sun should return the number of days since January 1, 2000, for a given exports[`Sun should return the same apparent position result given the same time and position 1`] = ` Vector3D { - "x": 55101974.26909711, - "y": -125165869.77224815, - "z": -54258234.63367154, + "x": 54242939.78872876, + "y": -125479049.84825934, + "z": -54393990.21165644, } `; diff --git a/test/objects/__snapshots__/sun-moon.test.ts.snap b/test/objects/__snapshots__/sun-moon.test.ts.snap index 67e27ed..84345ae 100644 --- a/test/objects/__snapshots__/sun-moon.test.ts.snap +++ b/test/objects/__snapshots__/sun-moon.test.ts.snap @@ -77,3 +77,60 @@ Object { "phaseValue": 0.9308720062791223, } `; + +exports[`Suncalc.js tests getMoonIllumination returns fraction and angle of moons illuminated limb and phase 1`] = ` +Object { + "angle": 1.6260163867660833, + "fraction": 0.42576863432885875, + "next": Object { + "date": "2013-03-12T04:53:32.814Z", + "firstQuarter": Object { + "date": "2013-03-19T14:04:33.508Z", + "value": 1363701873508.5, + }, + "fullMoon": Object { + "date": "2013-03-26T23:15:34.203Z", + "value": 1364339734203, + }, + "newMoon": Object { + "date": "2013-03-12T04:53:32.814Z", + "value": 1363064012814, + }, + "thirdQuarter": Object { + "date": "2013-04-03T08:26:34.897Z", + "value": 1364977594897.5, + }, + "type": "newMoon", + "value": 1363064012814, + }, + "phase": Object { + "code": ":last_quarter_moon:", + "css": "wi-moon-third-quart", + "emoji": "🌗", + "from": 0.716136806691289, + "id": "thirdQuarterMoon", + "name": "third Quarter", + "to": 0.783863193308711, + "weight": 1, + }, + "phaseValue": 0.773716250255787, +} +`; + +exports[`Suncalc.js tests getMoonPosition returns moon position data given time and location 1`] = ` +Object { + "az": 4.745208978619362, + "el": -0.4894905500271524, + "parallacticAngle": 0.7460123936598905, + "rng": 364139.79362404963, +} +`; + +exports[`Suncalc.js tests getSunAzEl returns azimuth and altitude for the given time and location 1`] = ` +Object { + "az": 3.6915486281450507, + "el": 0.5021704545690489, +} +`; + +exports[`Tests from Hypnos3 getSolarTime returns the solar time 1`] = `"Mon, 04 Mar 2013 17:03:20 GMT"`; diff --git a/test/objects/sun-moon.test.ts b/test/objects/sun-moon.test.ts index f6c56b6..d97887f 100644 --- a/test/objects/sun-moon.test.ts +++ b/test/objects/sun-moon.test.ts @@ -3,7 +3,10 @@ import { Moon } from '../../src/body/Moon'; import { Sun } from '../../src/body/Sun'; import { Degrees, Meters } from '../../src/main'; -// Use number of milliseconds since epoch instead of local year, month, day, etc for consistency across machines +/* + * Use number of milliseconds since epoch instead of local year, month, day, etc + * for consistency across machines + */ const dateObj = new Date(1661406000000); describe('Sun and Moon', () => { @@ -16,7 +19,10 @@ describe('Sun and Moon', () => { }); test('Local Solar Time', () => { - // Use number of milliseconds since epoch instead of local year, month, day, etc for consistency across machines + /* + * Use number of milliseconds since epoch instead of local year, month, day, + * etc for consistency across machines + */ const lst = Sun.getSolarTime(new Date(1658807880000), -5, -71 as Degrees); expect(lst.toUTCString()).toEqual('Tue, 26 Jul 2022 04:07:49 GMT'); @@ -45,8 +51,7 @@ describe('Sun and Moon', () => { }); /** - * @author Robert Myers @xqjibz - * See: https://github.com/mourner/suncalc/pull/35 + * @author Robert Myers @xqjibz See: https://github.com/mourner/suncalc/pull/35 */ describe('Test for #6 fix', () => { test('Test for #6 fix', () => { @@ -149,24 +154,19 @@ describe('Suncalc.js tests', () => { test('getSunAzEl returns azimuth and altitude for the given time and location', () => { const sunPos = Sun.azEl(date, lat as Degrees, lon as Degrees); - expect(sunPos.az).toBeCloseTo(0.6412750628729547); - expect(sunPos.el).toBeCloseTo(-0.7000406838781611); + expect(sunPos).toMatchSnapshot(); }); test('getMoonIllumination returns fraction and angle of moons illuminated limb and phase', () => { const moonIllum = Moon.getMoonIllumination(date); - expect(moonIllum.fraction).toBeCloseTo(0.4848068202456373); - expect(moonIllum.phaseValue).toBeCloseTo(0.7548368838538762); - expect(moonIllum.angle).toBeCloseTo(1.6732942678578346); + expect(moonIllum).toMatchSnapshot(); }); test('getMoonPosition returns moon position data given time and location', () => { const moonPos = Moon.rae(date, lat as Degrees, lon as Degrees); - expect(moonPos.az).toBeCloseTo(2.1631927013459706); - expect(moonPos.el).toBeCloseTo(0.014551482243892251); - expect(moonPos.rng).toBeCloseTo(364121.37256256194); + expect(moonPos).toMatchSnapshot(); }); test('getMoonTimes returns moon rise and set times', () => { @@ -222,6 +222,6 @@ describe('Tests from Hypnos3', () => { test('getSolarTime returns the solar time', () => { const solarTime = Sun.getSolarTime(date, -5, -71 as Degrees); - expect(solarTime.toUTCString()).toEqual('Tue, 05 Mar 2013 00:03:33 GMT'); + expect(solarTime.toUTCString()).toMatchSnapshot(); }); });