diff --git a/config/default.ts b/config/default.ts index 9d9be3d8..3b2a8243 100644 --- a/config/default.ts +++ b/config/default.ts @@ -1,5 +1,3 @@ -// tslint:disable:no-default-export -// tslint:disable:no-magic-numbers import { SCAboutPageContentType, SCConfigFile, @@ -13,21 +11,31 @@ import {readFileSync} from 'fs'; import path from 'path'; /** - * Evaluates if a number is within the given range + * Generates a range of numbers that represent consecutive calendric months * - * @param number_ The number that should be checked - * @param range Array of two numbers representing a range (inclusive interval) + * @param startMonth The month to start with (inclusive) + * @param endMonth The month to end with (inclusive) */ -export function inRangeInclusive(number_: number, range: number[]): boolean { - return number_ >= range[0] && number_ <= range[1]; +export function yearSlice(startMonth: number, endMonth: number) { + let months = [...Array.from({length: 13}).keys()].slice(1); + months = [...months, ...months]; + if (!months.includes(startMonth) || !months.includes(endMonth)) { + throw new Error(`Given months not part of a year! Check ${startMonth} or ${endMonth}!`); + } + + const startIndex = months.indexOf(startMonth); + const endIndex = + months.indexOf(endMonth) <= startIndex ? months.lastIndexOf(endMonth) : months.indexOf(endMonth); + + return months.slice(startIndex, endIndex + 1); } -const sommerRange = [4, 1]; -const winterRange = [10, 1]; +const sommerRange = yearSlice(3, 8); +const winterRange = yearSlice(9, 2); const month = new Date().getMonth(); const year = new Date().getFullYear(); const winterYearOffset = month < winterRange[0] ? -1 : 0; -const sommerYear = year + (month <= winterRange[1] ? -1 : 0); +const sommerYear = year + (month <= winterRange[winterRange.length] ? -1 : 0); const winterYear = `${year + winterYearOffset}/${(year + 1 + winterYearOffset).toString().slice(-2)}`; const wsAcronymShort = `WS ${winterYear}`; @@ -643,10 +651,10 @@ const config: SCConfigFile = { factor: 1, fields: { 'academicTerms.acronym': { - [ssAcronymShort]: inRangeInclusive(month, sommerRange) ? 1.1 : 1.05, - [wsAcronymShort]: inRangeInclusive(month, winterRange) ? 1.1 : 1.05, - [ssAcronymLong]: inRangeInclusive(month, sommerRange) ? 1.1 : 1.05, - [wsAcronymLong]: inRangeInclusive(month, winterRange) ? 1.1 : 1.05, + [ssAcronymShort]: sommerRange.includes(month) ? 1.1 : 1.05, + [wsAcronymShort]: winterRange.includes(month) ? 1.1 : 1.05, + [ssAcronymLong]: sommerRange.includes(month) ? 1.1 : 1.05, + [wsAcronymLong]: winterRange.includes(month) ? 1.1 : 1.05, }, }, type: SCThingType.AcademicEvent, diff --git a/test/common.spec.ts b/test/common.spec.ts index df3272c5..2ec57754 100644 --- a/test/common.spec.ts +++ b/test/common.spec.ts @@ -13,21 +13,21 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import {inRangeInclusive} from '../config/default'; +import {yearSlice} from '../config/default'; import {expect} from 'chai'; describe('Common', function () { - describe('inRangeInclusive', function () { - it('should provide true if the given number is in the range', function () { - expect(inRangeInclusive(1, [1, 3])).to.be.true; - expect(inRangeInclusive(2, [1, 3])).to.be.true; - expect(inRangeInclusive(1.1, [1, 3])).to.be.true; - expect(inRangeInclusive(3, [1, 3])).to.be.true; + describe('yearSlice', function () { + it('should provide correct ascending month number ranges', function () { + expect(yearSlice(1, 12)).to.eql([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); }); - it('should provide false if the given number is not in the range', function () { - expect(inRangeInclusive(3.1, [1, 3])).to.be.false; - expect(inRangeInclusive(0, [1, 3])).to.be.false; + it('should provide correct month number ranges for year rollovers', function () { + expect(yearSlice(12, 1)).to.eql([12, 1]); + }); + + it('should provide correct month number ranges for a whole year', function () { + expect(yearSlice(12, 12)).to.eql([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); }); }); });