fix: ics calendar export dates (#535)
* feat: academicCalendars object * feat: seemingly working start, end, and until dates * feat: seemingly working everything * style: removed unnecessary deps, reorganized code * style: code comments yay * chore: old version of pnpm? * ci: force github actions to rerun * feat: list instructors in ics string, basic tests * feat: testable code for ICS, tests for ICS, filter excluded dates * style: eslint autofix * test: check for graceful handling of errors in ICS * fix: actually use scheduleToIcsString * chore: eslint didn't include a space where it should've * fix: ensure tz everywhere * refactor: move string util to string util file * feat: em dash in calendar event title * feat: academic calendars 22-23 and 23-24 * fix: en dash instead of em dash
This commit is contained in:
@@ -48,3 +48,22 @@ export const ellipsify = (input: string, chars: number): string => {
|
||||
}
|
||||
return ellipisifed;
|
||||
};
|
||||
|
||||
/**
|
||||
* Stringifies a list of items in English format.
|
||||
*
|
||||
* @param items - The list of items to stringify.
|
||||
* @returns A string representation of the list in English format.
|
||||
* @example
|
||||
* englishStringifyList([]) // ''
|
||||
* englishStringifyList(['Alice']) // 'Alice'
|
||||
* englishStringifyList(['Alice', 'Bob']) // 'Alice and Bob'
|
||||
* englishStringifyList(['Alice', 'Bob', 'Charlie']) // 'Alice, Bob, and Charlie'
|
||||
*/
|
||||
export const englishStringifyList = (items: readonly string[]): string => {
|
||||
if (items.length === 0) return '';
|
||||
if (items.length === 1) return items[0]!;
|
||||
if (items.length === 2) return `${items[0]} and ${items[1]}`;
|
||||
|
||||
return `${items.slice(0, -1).join(', ')}, and ${items.at(-1)}`;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { capitalize, capitalizeFirstLetter, ellipsify } from '@shared/util/string';
|
||||
import { capitalize, capitalizeFirstLetter, ellipsify, englishStringifyList } from '@shared/util/string';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
// TODO: Fix `string.ts` and `string.test.ts` to make the tests pass
|
||||
@@ -54,3 +54,49 @@ describe('ellipsify', () => {
|
||||
expect(ellipsify('', 5)).toBe('');
|
||||
});
|
||||
});
|
||||
|
||||
describe('englishStringifyList', () => {
|
||||
it('should handle an empty array', () => {
|
||||
const data = [] satisfies string[];
|
||||
const result = englishStringifyList(data);
|
||||
const expected = '';
|
||||
expect(result).toBe(expected);
|
||||
});
|
||||
|
||||
it('should handle 1 element', () => {
|
||||
const data = ['Alice'] satisfies string[];
|
||||
const result = englishStringifyList(data);
|
||||
const expected = 'Alice';
|
||||
expect(result).toBe(expected);
|
||||
});
|
||||
|
||||
it('should handle 2 elements', () => {
|
||||
const data = ['Alice', 'Bob'] satisfies string[];
|
||||
const result = englishStringifyList(data);
|
||||
const expected = 'Alice and Bob';
|
||||
expect(result).toBe(expected);
|
||||
});
|
||||
|
||||
it('should handle 3 elements', () => {
|
||||
const data = ['Alice', 'Bob', 'Charlie'] satisfies string[];
|
||||
const result = englishStringifyList(data);
|
||||
const expected = 'Alice, Bob, and Charlie';
|
||||
expect(result).toBe(expected);
|
||||
});
|
||||
|
||||
it('should handle n elements', () => {
|
||||
const testcases = [
|
||||
{ data: [], expected: '' },
|
||||
{ data: ['foo'], expected: 'foo' },
|
||||
{ data: ['foo', 'bar'], expected: 'foo and bar' },
|
||||
{ data: ['foo', 'bar', 'baz'], expected: 'foo, bar, and baz' },
|
||||
{ data: ['a', 'b', 'c', 'd'], expected: 'a, b, c, and d' },
|
||||
{ data: 'abcdefghijk'.split(''), expected: 'a, b, c, d, e, f, g, h, i, j, and k' },
|
||||
] satisfies { data: string[]; expected: string }[];
|
||||
|
||||
for (const { data, expected } of testcases) {
|
||||
const result = englishStringifyList(data);
|
||||
expect(result).toBe(expected);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user