164 lines
2.7 KiB
TypeScript
164 lines
2.7 KiB
TypeScript
import {Module} from "@/interfaces";
|
|
import { LevelScore } from "@/constants/ielts";
|
|
|
|
type Type = "academic" | "general";
|
|
|
|
export const writingReverseMarking: {[key: number]: number} = {
|
|
9: 90,
|
|
8.5: 85,
|
|
8: 80,
|
|
7.5: 75,
|
|
7: 70,
|
|
6.5: 65,
|
|
6: 60,
|
|
5.5: 55,
|
|
5: 50,
|
|
4.5: 45,
|
|
4: 40,
|
|
3.5: 35,
|
|
3: 30,
|
|
2.5: 25,
|
|
2: 20,
|
|
1.5: 15,
|
|
1: 10,
|
|
0.5: 5,
|
|
0: 0,
|
|
};
|
|
|
|
export const speakingReverseMarking: {[key: number]: number} = {
|
|
9: 90,
|
|
8.5: 85,
|
|
8: 80,
|
|
7.5: 75,
|
|
7: 70,
|
|
6.5: 65,
|
|
6: 60,
|
|
5.5: 55,
|
|
5: 50,
|
|
4.5: 45,
|
|
4: 40,
|
|
3.5: 35,
|
|
3: 30,
|
|
2.5: 25,
|
|
2: 20,
|
|
1.5: 15,
|
|
1: 10,
|
|
0.5: 5,
|
|
0: 0,
|
|
};
|
|
|
|
export const writingMarking: {[key: number]: number} = {
|
|
90: 9,
|
|
80: 8,
|
|
70: 7,
|
|
60: 6,
|
|
50: 5,
|
|
40: 4,
|
|
30: 3,
|
|
20: 2,
|
|
10: 1,
|
|
0: 0,
|
|
};
|
|
|
|
const readingGeneralMarking: {[key: number]: number} = {
|
|
100: 9,
|
|
97.5: 8.5,
|
|
92.5: 8,
|
|
90: 7.5,
|
|
85: 7,
|
|
80: 6.5,
|
|
75: 6,
|
|
67.5: 5.5,
|
|
57.5: 5,
|
|
45.5: 4.5,
|
|
37.5: 4,
|
|
30: 3.5,
|
|
22.5: 3,
|
|
15: 2.5,
|
|
};
|
|
|
|
const academicMarking: {[key: number]: number} = {
|
|
97.5: 9,
|
|
92.5: 8.5,
|
|
87.5: 8,
|
|
80: 7.5,
|
|
75: 7,
|
|
65: 6.5,
|
|
57.5: 6,
|
|
45: 5.5,
|
|
40: 5,
|
|
32.5: 4.5,
|
|
25: 4,
|
|
20: 3.5,
|
|
15: 3,
|
|
10: 2.5,
|
|
};
|
|
|
|
const levelMarking: {[key: number]: number} = {
|
|
88: 9, // Advanced
|
|
64: 8 , // Upper-Intermediate
|
|
52: 6, // Intermediate
|
|
32: 4, // Pre-Intermediate
|
|
16: 2, // Elementary
|
|
0: 0, // Beginner
|
|
};
|
|
|
|
const moduleMarkings: {[key in Module]: {[key in Type]: {[key: number]: number}}} = {
|
|
reading: {
|
|
academic: academicMarking,
|
|
general: readingGeneralMarking,
|
|
},
|
|
listening: {
|
|
academic: academicMarking,
|
|
general: academicMarking,
|
|
},
|
|
writing: {
|
|
academic: writingMarking,
|
|
general: writingMarking,
|
|
},
|
|
speaking: {
|
|
academic: writingMarking,
|
|
general: writingMarking,
|
|
},
|
|
level: {
|
|
academic: levelMarking,
|
|
general: levelMarking,
|
|
},
|
|
};
|
|
|
|
export const calculateBandScore = (correct: number, total: number, module: Module, type: Type) => {
|
|
const marking = moduleMarkings[module][type];
|
|
const percentage = (correct * 100) / total;
|
|
|
|
for (const value of Object.keys(marking)
|
|
.map((x) => parseFloat(x))
|
|
.sort((a, b) => b - a)) {
|
|
if (percentage >= value) {
|
|
return marking[value];
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
export const calculateAverageLevel = (levels: {[key in Module]: number}) => {
|
|
return Object.keys(levels).reduce((accumulator, current) => levels[current as Module] + accumulator, 0) / 4;
|
|
};
|
|
|
|
export const getLevelScore = (level: number) => {
|
|
switch(level) {
|
|
case 0:
|
|
return ['Beginner', 'Low A1'];
|
|
case 2:
|
|
return ['Elementary', 'High A1/Low A2'];
|
|
case 4:
|
|
return ['Pre-Intermediate', 'High A2/Low B1'];
|
|
case 6:
|
|
return ['Intermediate', 'High B1/Low B2'];
|
|
case 8:
|
|
return ['Upper-Intermediate', 'High B2/Low C1'];
|
|
case 9:
|
|
return ['Advanced', 'C1'];
|
|
default: return [];
|
|
}
|
|
} |