Skip to content

Commit a0d323f

Browse files
authored
[js][student_grades][extract_class] Add example
[js][student_grades][extract_class] Add example
2 parents ab20a00 + bda8872 commit a0d323f

File tree

8 files changed

+6026
-0
lines changed

8 files changed

+6026
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules/
2+
.tmp/
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"presets": ["@babel/preset-env"],
3+
"plugins": ["@babel/plugin-proposal-class-properties"]
4+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
testEnvironment: 'node',
3+
verbose: true,
4+
cacheDirectory: './.tmp/jestCache',
5+
transform: {'^.+\\.js$': 'babel-jest'},
6+
testMatch:[ "**/tests/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)" ],
7+
moduleFileExtensions: ['js']
8+
};

examples/js/js-student_grades-03_extract_class/package-lock.json

Lines changed: 5755 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"name": "student_grades",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "jest"
8+
},
9+
"author": "",
10+
"license": "ISC",
11+
"jest": {
12+
"moduleFileExtensions": [
13+
"js",
14+
"jsx"
15+
],
16+
"moduleDirectories": [
17+
"node_modules",
18+
"src"
19+
]
20+
},
21+
"devDependencies": {
22+
"@babel/core": "^7.11.6",
23+
"@babel/plugin-proposal-class-properties": "^7.10.4",
24+
"@babel/preset-env": "^7.11.5",
25+
"@jest/globals": "^26.4.2",
26+
"jest": "^26.4.2"
27+
}
28+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
export class StudentGradeCalculator {
2+
constructor(yearToCalculate, teachers) {
3+
this.yearToCalculate = yearToCalculate;
4+
this.teachers = teachers;
5+
}
6+
7+
calculate(examGrades, hasReachedMinimumClasses) {
8+
if (examGrades.length !== 0) {
9+
10+
let gradesSum = 0;
11+
let gradesWeightSum = 0;
12+
13+
for (let examGrade of examGrades) {
14+
gradesSum += (examGrade[0] * examGrade[1] / 100);
15+
gradesWeightSum += examGrade[0];
16+
}
17+
18+
if (gradesWeightSum === 100) {
19+
if (hasReachedMinimumClasses) {
20+
if (this.teachers.isThereAnyBenevolent(this.yearToCalculate)) {
21+
return Math.min(10, gradesSum + 1);
22+
} else {
23+
return gradesSum;
24+
}
25+
} else {
26+
return 0;
27+
}
28+
} else if (gradesWeightSum > 100) {
29+
return -1;
30+
} else {
31+
return -2;
32+
}
33+
} else {
34+
return 0;
35+
}
36+
}
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
export class Teachers {
2+
allYearsTeachers = {
3+
2020: [
4+
["Josefina", true],
5+
["Edonisio", true],
6+
["Edufasio", false],
7+
],
8+
2019: [
9+
["Eduarda", false],
10+
["Abelardo", false],
11+
["Francisca", false],
12+
]
13+
};
14+
15+
isThereAnyBenevolent(yearToCalculate) {
16+
let isThereAnyBenevolent = false;
17+
18+
for (let [year, teachers] of Object.entries(this.allYearsTeachers)) {
19+
if (!(yearToCalculate != year)) {
20+
for (let teacher of teachers) {
21+
if (teacher[1] != true) {
22+
continue;
23+
}
24+
25+
isThereAnyBenevolent = true;
26+
}
27+
} else {
28+
continue;
29+
}
30+
}
31+
32+
return isThereAnyBenevolent;
33+
}
34+
}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import {StudentGradeCalculator} from '../src/StudentGradeCalculator';
2+
import {Teachers} from "../src/Teachers";
3+
4+
describe('StudentGradeCalculator should', () => {
5+
it('fail given there are no exams', () => {
6+
const calculator = new StudentGradeCalculator(2019, new Teachers(), new Teachers());
7+
8+
const examsGrades = [];
9+
const hasReachedMinimumClasses = true;
10+
11+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(0);
12+
});
13+
14+
it('calculate same grade given one single exam and attending the minimum classes', () => {
15+
const calculator = new StudentGradeCalculator(2019, new Teachers());
16+
17+
const examsGrades = [[100, 5]];
18+
const hasReachedMinimumClasses = true;
19+
20+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(5);
21+
});
22+
23+
it('calculate average grade given different exam grades and attending the minimum classes', () => {
24+
const calculator = new StudentGradeCalculator(2019, new Teachers());
25+
26+
const examsGrades = [
27+
[10, 4],
28+
[10, 6],
29+
[10, 2],
30+
[10, 8],
31+
[10, 0],
32+
[10, 10],
33+
[10, 0],
34+
[10, 10],
35+
[10, 0],
36+
[10, 10],
37+
];
38+
const hasReachedMinimumClasses = true;
39+
40+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(5);
41+
});
42+
43+
it('round up to 2 decimals given odd exam grades and attending the minimum classes', () => {
44+
const calculator = new StudentGradeCalculator(2019, new Teachers());
45+
46+
const examsGrades = [
47+
[50, 4],
48+
[50, 5]
49+
];
50+
const hasReachedMinimumClasses = true;
51+
52+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(4.5);
53+
});
54+
55+
// hasReachedMinimumClasses
56+
57+
it('fail when there are no exams and has not attended the minimum classes', () => {
58+
const calculator = new StudentGradeCalculator(2019, new Teachers());
59+
60+
const examsGrades = [];
61+
const hasReachedMinimumClasses = false;
62+
63+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(0);
64+
});
65+
66+
it('fail given one single exam but not attending the minimum classes', () => {
67+
const calculator = new StudentGradeCalculator(2019, new Teachers());
68+
69+
const examsGrades = [[100, 5]];
70+
const hasReachedMinimumClasses = false;
71+
72+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(0);
73+
});
74+
75+
it('fail given different exam grades but not attending the minimum classes', () => {
76+
const calculator = new StudentGradeCalculator(2019, new Teachers());
77+
78+
const examsGrades = [
79+
[10, 4],
80+
[10, 6],
81+
[10, 2],
82+
[10, 8],
83+
[10, 0],
84+
[10, 10],
85+
[10, 0],
86+
[10, 10],
87+
[10, 0],
88+
[10, 10],
89+
];
90+
const hasReachedMinimumClasses = false;
91+
92+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(0);
93+
});
94+
95+
it('fail given odd exam grades but not attending the minimum classes', () => {
96+
const calculator = new StudentGradeCalculator(2019, new Teachers());
97+
98+
const examsGrades = [[50, 5], [50, 4]];
99+
const hasReachedMinimumClasses = false;
100+
101+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(0);
102+
});
103+
104+
// Weight
105+
106+
it('validate all exam grades weight below 100', () => {
107+
const calculator = new StudentGradeCalculator(2019, new Teachers());
108+
109+
const examsGrades = [
110+
[10, 4],
111+
[10, 6]
112+
];
113+
const hasReachedMinimumClasses = false;
114+
115+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(-2);
116+
});
117+
118+
it('validate all exam grades weight over 100', () => {
119+
const calculator = new StudentGradeCalculator(2019, new Teachers());
120+
121+
const examsGrades = [
122+
[90, 4],
123+
[20, 6]
124+
];
125+
const hasReachedMinimumClasses = false;
126+
127+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(-1);
128+
});
129+
130+
// hasToRaiseOnePoint
131+
132+
it('not increase one extra point if there is not any benevolent teacher in the year to calculate grades', () => {
133+
const calculator = new StudentGradeCalculator(2019, new Teachers());
134+
135+
const examsGrades = [[100, 9.8]];
136+
const hasReachedMinimumClasses = true;
137+
138+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(9.8);
139+
});
140+
141+
it('increase one extra point if there is any benevolent teacher in the year to calculate grades', () => {
142+
const calculator = new StudentGradeCalculator(2020, new Teachers());
143+
144+
const examsGrades = [[100, 5]];
145+
const hasReachedMinimumClasses = true;
146+
147+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(6);
148+
});
149+
150+
it('maintain 10 as the maximum grade even if increasing one extra point', () => {
151+
const calculator = new StudentGradeCalculator(2020, new Teachers());
152+
153+
const examsGrades = [[100, 9.8]];
154+
const hasReachedMinimumClasses = true;
155+
156+
expect(calculator.calculate(examsGrades, hasReachedMinimumClasses)).toBe(10);
157+
});
158+
});

0 commit comments

Comments
 (0)