Skip to content

Commit

Permalink
Added alert for maximum number of credits
Browse files Browse the repository at this point in the history
  • Loading branch information
Joana Sesinando committed Feb 10, 2021
1 parent 6edb60c commit 167b378
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 56 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "gerador-horarios-ist",
"version": "1.0.0",
"version": "1.0.3",
"scripts": {
"ng": "ng",
"start": "ng serve",
Expand Down
12 changes: 9 additions & 3 deletions src/app/_domain/Course/Course.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export class Course {
private _id: number,
private _name: string,
private _acronym: string,
private _credits: number,
private _semester: number,
private _types?: ClassType[],
private _campus?: string[],
Expand All @@ -26,6 +27,9 @@ export class Course {
get acronym(): string { return this._acronym; }
set acronym(value: string) { this._acronym = value; }

get credits(): number { return this._credits; }
set credits(value: number) { this._credits = value; }

get semester(): number { return this._semester; }
set semester(value: number) { this._semester = value; }

Expand Down Expand Up @@ -67,6 +71,7 @@ export const courseConverter = {
id: course.id,
name: course.name,
acronym: course.acronym,
credits: course.credits,
semester: course.semester
};
},
Expand All @@ -83,9 +88,10 @@ export const courseConverter = {
}
shifts.push(new Shift(shift.name, shift.type, lessons, shift.campus));
}
// tslint:disable-next-line:max-line-length
return new Course(parseInt(data.id, 10), data.name, data.acronym, parseInt(data.semester, 10), data.types, data.campus, shifts, data.courseLoads);
return new Course(parseInt(data.id, 10), data.name, data.acronym, parseFloat(data.credits),
parseInt(data.semester, 10), data.types, data.campus, shifts, data.courseLoads);
}
return new Course(parseInt(data.id, 10), data.name, data.acronym, parseInt(data.semester, 10));
return new Course(parseInt(data.id, 10), data.name, data.acronym, parseFloat(data.credits),
parseInt(data.semester, 10));
}
};
53 changes: 36 additions & 17 deletions src/app/_services/fenix/fenix.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,15 @@ describe('FenixService', () => {
});

it('should parse course basic info correctly', () => {
const course1 = service.parseCourseBasicInfo({id: 123, name: 'Course Name', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'});
const course2 = service.parseCourseBasicInfo({id: '123', name: 'Course Name', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'});
const course1 = service.parseCourseBasicInfo({id: 123, name: 'Course Name', acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'});
const course2 = service.parseCourseBasicInfo({id: '123', name: 'Course Name', acronym: 'CS01', credits: '4.5', academicTerm: '1º Semestre 2010/2011'});

for (const course of [course1, course2]) {
expect(course).toBeTruthy();
expect(course.id).toBe(123);
expect(course.name).toBe('Course Name');
expect(course.acronym).toBe('CS01');
expect(course.credits).toBe(4.5);
expect(course.semester).toBe(1);
}
});
Expand All @@ -123,62 +124,77 @@ describe('FenixService', () => {
const parameters = [
{
description: 'should parse course basic info: no ID',
input: {name: 'Course Name', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
input: {name: 'Course Name', acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No ID found for course')
},
{
description: 'should parse course basic info: null ID',
input: {id: null, name: 'Course Name', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
input: {id: null, name: 'Course Name', acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No ID found for course')
},
{
description: 'should parse course basic info: zero ID',
input: {id: 0, name: 'Course Name', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
input: {id: 0, name: 'Course Name', acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No ID found for course')
},
{
description: 'should parse course basic info: no name',
input: {id: 123, acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
input: {id: 123, acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No name found for course 123')
},
{
description: 'should parse course basic info: null name',
input: {id: 123, name: null, acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
input: {id: 123, name: null, acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No name found for course 123')
},
{
description: 'should parse course basic info: empty name',
input: {id: 123, name: '', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
input: {id: 123, name: '', acronym: 'CS01', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No name found for course 123')
},
{
description: 'should parse course basic info: no acronym',
input: {id: 123, name: 'Course Name', academicTerm: '1º Semestre 2010/2011'},
input: {id: 123, name: 'Course Name', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No acronym found for course 123')
},
{
description: 'should parse course basic info: null acronym',
input: {id: 123, name: 'Course Name', acronym: null, academicTerm: '1º Semestre 2010/2011'},
input: {id: 123, name: 'Course Name', acronym: null, credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No acronym found for course 123')
},
{
description: 'should parse course basic info: empty acronym',
input: {id: 123, name: 'Course Name', acronym: '', academicTerm: '1º Semestre 2010/2011'},
input: {id: 123, name: 'Course Name', acronym: '', credits: 4.5, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No acronym found for course 123')
},
{
description: 'should parse course basic info: no credits',
input: {id: 123, name: 'Course Name', acronym: 'CS01', academicTerm: '1º Semestre 2010/2011'},
error: new Error('No credits found for course 123')
},
{
description: 'should parse course basic info: null credits',
input: {id: 123, name: 'Course Name', acronym: 'CS01', credits: null, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No credits found for course 123')
},
{
description: 'should parse course basic info: zero credits',
input: {id: 123, name: 'Course Name', acronym: 'CS01', credits: 0, academicTerm: '1º Semestre 2010/2011'},
error: new Error('No credits found for course 123')
},
{
description: 'should parse course basic info: no academicTerm',
input: {id: 123, name: 'Course Name', acronym: 'CS01'},
input: {id: 123, name: 'Course Name', acronym: 'CS01', credits: 4.5},
error: new Error('No academic term found for course 123')
},
{
description: 'should parse course basic info: null academicTerm',
input: {id: 123, name: 'Course Name', acronym: 'CS01', academicTerm: null},
input: {id: 123, name: 'Course Name', acronym: 'CS01', credits: 4.5, academicTerm: null},
error: new Error('No academic term found for course 123')
},
{
description: 'should parse course basic info: empty academicTerm',
input: {id: 123, name: 'Course Name', acronym: 'CS01', academicTerm: ''},
input: {id: 123, name: 'Course Name', acronym: 'CS01', credits: 4.5, academicTerm: ''},
error: new Error('No academic term found for course 123')
},
];
Expand Down Expand Up @@ -341,17 +357,17 @@ describe('FenixService', () => {
}

it('should fill course missing info: no campus', () => {
const course = new Course(123, 'C1', 'C01', 1, [ClassType.THEORY_PT], [], [new MockShift()]);
const course = new Course(123, 'C1', 'C01', 4.5, 1, [ClassType.THEORY_PT], [], [new MockShift()]);
expect(service.fillMissingInfo(course).campus).toBe(null);
});

it('should fill course missing info: no types', () => {
const course = new Course(123, 'C1', 'C01', 1, [], ['A'], [new MockShift()]);
const course = new Course(123, 'C1', 'C01', 4.5, 1, [], ['A'], [new MockShift()]);
expect(service.fillMissingInfo(course).types).toEqual([ClassType.NONE]);
});

it('should throw an error if there are no shifts', () => {
const course = new Course(123, 'C1', 'C01', 1, [ClassType.THEORY_PT], ['A'], []);
const course = new Course(123, 'C1', 'C01', 4.5, 1, [ClassType.THEORY_PT], ['A'], []);
expect(() => service.fillMissingInfo(course))
.toThrow(new Error('No shifts found. Impossible to generate schedules for course: ' + course.name));
});
Expand Down Expand Up @@ -406,6 +422,7 @@ describe('FenixService', () => {
expect(course.id).toBeTruthy();
expect(course.name).toBeTruthy();
expect(course.acronym).toBeTruthy();
expect(course.credits).toBeTruthy();
expect(course.semester).toBeTruthy();
expect(course.acronym[0] === 'O' && course.acronym[1] >= '0' && course.acronym[1] <= '9').toBeFalse();

Expand All @@ -424,6 +441,7 @@ describe('FenixService', () => {
if (course.id === 846035542878562) {
expect(course.name).toBe('Bases de Dados');
expect(course.acronym).toBe('BD225179577');
expect(course.credits).toBe(6);
expect(course.semester).toBe(1);
break;
}
Expand Down Expand Up @@ -486,6 +504,7 @@ describe('FenixService', () => {
// expect(course.id).toBeTruthy();
// expect(course.name).toBeTruthy();
// expect(course.acronym).toBeTruthy();
// expect(course.credits).toBeTruthy();
// expect(course.semester).toBeTruthy();
// expect(course.acronym[0] === 'O' && course.acronym[1] >= '0' && course.acronym[1] <= '9').toBeFalse();
//
Expand Down
4 changes: 3 additions & 1 deletion src/app/_services/fenix/fenix.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,11 @@ export class FenixService {
if (!course.id) throw new Error('No ID found for course');
if (!course.name) throw new Error('No name found for course ' + course.id);
if (!course.acronym) throw new Error('No acronym found for course ' + course.id);
if (!course.credits) throw new Error('No credits found for course ' + course.id);
if (!course.academicTerm) throw new Error('No academic term found for course ' + course.id);

return new Course(parseInt(course.id, 10), course.name, course.acronym, parseInt(course.academicTerm[0], 10));
return new Course(parseInt(course.id, 10), course.name, course.acronym, parseFloat(course.credits),
parseInt(course.academicTerm[0], 10));
}

parseCourseMissingInfo(scheduleJson): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ describe('SchedulesGenerationService', () => {

beforeEach(() => {
course = new Course(
1, 'Course #1', 'C1', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
1, 'Course #1', 'C1', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-07 09:30'), new Date('2020-09-07 11:00'), 'R1', 'Alameda')
Expand Down Expand Up @@ -314,7 +314,7 @@ describe('SchedulesGenerationService', () => {
beforeEach(() => {
courses = [
new Course(
1, 'Course #1', 'C1', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
1, 'Course #1', 'C1', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-07 09:30'), new Date('2020-09-07 11:00'), 'R1', 'Alameda')
Expand All @@ -327,7 +327,7 @@ describe('SchedulesGenerationService', () => {
], 'Alameda')
], { TEORICA: 1.5, LABORATORIAL: 1.5 }),
new Course(
2, 'Course #2', 'C2', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Taguspark'],
2, 'Course #2', 'C2', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Taguspark'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-09 09:30'), new Date('2020-09-09 11:00'), 'R3', 'Taguspark')
Expand Down Expand Up @@ -436,7 +436,7 @@ describe('SchedulesGenerationService', () => {
describe('Calculate schedule info', () => {
const courses = [
new Course(
1, 'Course #1', 'C1', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
1, 'Course #1', 'C1', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
[
new Shift('L01', ClassType.LAB_PT, [
new Lesson(new Date('2020-09-07 12:00'), new Date('2020-09-07 13:30'), 'R2', 'Alameda')
Expand All @@ -447,14 +447,14 @@ describe('SchedulesGenerationService', () => {
], 'Alameda')
], { TEORICA: 1.5, LABORATORIAL: 1.5 }),
new Course(
2, 'Course #2', 'C2', 1, [ClassType.THEORY_PT], ['Taguspark'],
2, 'Course #2', 'C2', 4.5, 1, [ClassType.THEORY_PT], ['Taguspark'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-09 09:30'), new Date('2020-09-09 11:00'), 'R3', 'Taguspark')
], 'Taguspark')
], { TEORICA: 1.5 }),
new Course(
3, 'Course #3', 'C3', 1, [ClassType.THEORY_PT], ['Alameda'],
3, 'Course #3', 'C3', 4.5, 1, [ClassType.THEORY_PT], ['Alameda'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-09 11:00'), new Date('2020-09-09 12:30'), 'R3', 'Taguspark'),
Expand Down Expand Up @@ -563,7 +563,7 @@ describe('SchedulesGenerationService', () => {
it('should generate schedules successfully: no overlaps', () => {
const courses = [
new Course(
1, 'Course #1', 'C1', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
1, 'Course #1', 'C1', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-07 09:30'), new Date('2020-09-07 11:00'), 'R1', 'Alameda')
Expand All @@ -582,7 +582,7 @@ describe('SchedulesGenerationService', () => {
], 'Alameda')
], { TEORICA: 1.5, LABORATORIAL: 1.5 }),
new Course(
2, 'Course #2', 'C2', 1, [ClassType.THEORY_PT], ['Taguspark'],
2, 'Course #2', 'C2', 4.5, 1, [ClassType.THEORY_PT], ['Taguspark'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-09 09:30'), new Date('2020-09-09 11:00'), 'R3', 'Taguspark')
Expand All @@ -603,7 +603,7 @@ describe('SchedulesGenerationService', () => {
it('should generate schedules successfully: with overlaps', () => {
const courses = [
new Course(
1, 'Course #1', 'C1', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
1, 'Course #1', 'C1', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-07 09:30'), new Date('2020-09-07 11:00'), 'R1', 'Alameda')
Expand All @@ -622,7 +622,7 @@ describe('SchedulesGenerationService', () => {
], 'Alameda')
], { TEORICA: 1.5, LABORATORIAL: 1.5 }),
new Course(
2, 'Course #2', 'C2', 1, [ClassType.THEORY_PT], ['Taguspark'],
2, 'Course #2', 'C2', 4.5, 1, [ClassType.THEORY_PT], ['Taguspark'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-09 09:30'), new Date('2020-09-09 11:00'), 'R3', 'Taguspark')
Expand All @@ -643,7 +643,7 @@ describe('SchedulesGenerationService', () => {
it('should generate schedules successfully: they all overlap', () => {
const courses = [
new Course(
1, 'Course #1', 'C1', 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
1, 'Course #1', 'C1', 4.5, 1, [ClassType.THEORY_PT, ClassType.LAB_PT], ['Alameda'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-07 09:30'), new Date('2020-09-07 11:00'), 'R1', 'Alameda')
Expand All @@ -662,7 +662,7 @@ describe('SchedulesGenerationService', () => {
], 'Alameda')
], { TEORICA: 1.5, LABORATORIAL: 1.5 }),
new Course(
2, 'Course #2', 'C2', 1, [ClassType.THEORY_PT], ['Taguspark'],
2, 'Course #2', 'C2', 4.5, 1, [ClassType.THEORY_PT], ['Taguspark'],
[
new Shift('T01', ClassType.THEORY_PT, [
new Lesson(new Date('2020-09-07 09:30'), new Date('2020-09-07 11:00'), 'R3', 'Taguspark')
Expand Down
Loading

0 comments on commit 167b378

Please sign in to comment.