diff --git a/parsers.js b/parsers.js index 15c1a7d..71decf5 100644 --- a/parsers.js +++ b/parsers.js @@ -81,5 +81,17 @@ })); } - return { parseStudyLoadTable, parseProfilePage, parseOfferedCourses }; + function filterStudyLoadCourses(courses) { + return (courses || []).filter( + (c) => String(c.status || '').trim().toUpperCase() !== 'DISSOLVED' + ); + } + + function sumUnits(courses) { + return (courses || []) + .reduce((sum, c) => sum + (parseFloat(c.units) || 0), 0) + .toFixed(2); + } + + return { parseStudyLoadTable, parseProfilePage, parseOfferedCourses, filterStudyLoadCourses, sumUnits }; }); diff --git a/test/parsers.test.js b/test/parsers.test.js index 340277f..fdc034c 100644 --- a/test/parsers.test.js +++ b/test/parsers.test.js @@ -73,3 +73,25 @@ test('parseOfferedCourses strips group suffix from code', () => { const it3206n = courses.find(c => c.courseCode === 'IT 3206N'); assert.ok(it3206n, 'should find IT 3206N'); }); + +const { filterStudyLoadCourses, sumUnits } = require('../parsers.js'); + +test('filterStudyLoadCourses excludes DISSOLVED courses', () => { + const courses = [ + { courseCode: 'CS 5105', status: 'DISSOLVED', units: '3.00' }, + { courseCode: 'IT 3206', status: 'PARALLEL', units: '3.00' }, + { courseCode: 'IT 4102N', status: 'REGULAR', units: '3.00' } + ]; + const filtered = filterStudyLoadCourses(courses); + assert.deepStrictEqual(filtered.map((c) => c.courseCode), ['IT 3206', 'IT 4102N']); +}); + +test('filterStudyLoadCourses handles missing status', () => { + const filtered = filterStudyLoadCourses([{ courseCode: 'X', status: '', units: '1' }]); + assert.strictEqual(filtered.length, 1); +}); + +test('sumUnits computes total from course units', () => { + const courses = [{ units: '3.00' }, { units: '3.00' }, { units: '2.00' }]; + assert.strictEqual(sumUnits(courses), '8.00'); +});