[
{
"name": "credit-weighted: A(3), B+(4), C(3) is 3.12, not the unweighted 3.10",
"args": [
[
{
"grade": "A",
"credits": 3
},
{
"grade": "B+",
"credits": 4
},
{
"grade": "C",
"credits": 3
}
],
null,
"half-up"
],
"expect": {
"gpa": 312,
"qualityPoints": 3120,
"gpaCredits": 10,
"excludedCredits": 0
}
},
{
"name": "a half-hundredth rounds up under half-up: A(1), B+(3) is 3.475",
"args": [
[
{
"grade": "A",
"credits": 1
},
{
"grade": "B+",
"credits": 3
}
],
null,
"half-up"
],
"expect": {
"gpa": 348,
"qualityPoints": 1390,
"gpaCredits": 4,
"excludedCredits": 0
}
},
{
"name": "the same 3.475 truncated to 3.47 under down",
"args": [
[
{
"grade": "A",
"credits": 1
},
{
"grade": "B+",
"credits": 3
}
],
null,
"down"
],
"expect": {
"gpa": 347,
"qualityPoints": 1390,
"gpaCredits": 4,
"excludedCredits": 0
}
},
{
"name": "3.525 goes to the even 3.52 under half-even",
"args": [
[
{
"grade": "B",
"credits": 1
},
{
"grade": "A-",
"credits": 3
}
],
null,
"half-even"
],
"expect": {
"gpa": 352,
"qualityPoints": 1410,
"gpaCredits": 4,
"excludedCredits": 0
}
},
{
"name": "a repeating 3.333... is 3.33 half-up",
"args": [
[
{
"grade": "A",
"credits": 3
},
{
"grade": "B",
"credits": 3
},
{
"grade": "B",
"credits": 3
}
],
null,
"half-up"
],
"expect": {
"gpa": 333,
"qualityPoints": 3000,
"gpaCredits": 9,
"excludedCredits": 0
}
},
{
"name": "and 3.34 rounded up",
"args": [
[
{
"grade": "A",
"credits": 3
},
{
"grade": "B",
"credits": 3
},
{
"grade": "B",
"credits": 3
}
],
null,
"up"
],
"expect": {
"gpa": 334,
"qualityPoints": 3000,
"gpaCredits": 9,
"excludedCredits": 0
}
},
{
"name": "pass and withdrawn grades are left out of both sums",
"args": [
[
{
"grade": "A",
"credits": 3
},
{
"grade": "P",
"credits": 3
},
{
"grade": "W",
"credits": 4
}
],
null,
"half-up"
],
"expect": {
"gpa": 400,
"qualityPoints": 1200,
"gpaCredits": 3,
"excludedCredits": 7
}
},
{
"name": "an F counts its credits at zero points",
"args": [
[
{
"grade": "A",
"credits": 3
},
{
"grade": "F",
"credits": 3
}
],
null,
"half-up"
],
"expect": {
"gpa": 200,
"qualityPoints": 1200,
"gpaCredits": 6,
"excludedCredits": 0
}
},
{
"name": "only pass grades means no GPA, not 0.00",
"args": [
[
{
"grade": "P",
"credits": 3
}
],
null,
"half-up"
],
"expect": {
"gpa": null,
"qualityPoints": 0,
"gpaCredits": 0,
"excludedCredits": 3
}
},
{
"name": "no courses at all means no GPA",
"args": [
[],
null,
"half-up"
],
"expect": {
"gpa": null,
"qualityPoints": 0,
"gpaCredits": 0,
"excludedCredits": 0
}
},
{
"name": "a zero-credit course adds nothing",
"args": [
[
{
"grade": "A",
"credits": 0
},
{
"grade": "B",
"credits": 3
}
],
null,
"half-up"
],
"expect": {
"gpa": 300,
"qualityPoints": 900,
"gpaCredits": 3,
"excludedCredits": 0
}
},
{
"name": "an institution's own table with A+ at 4.33",
"args": [
[
{
"grade": "A+",
"credits": 3
},
{
"grade": "B",
"credits": 3
}
],
[
{
"grade": "A+",
"points": 433
},
{
"grade": "A",
"points": 400
},
{
"grade": "B",
"points": 300
},
{
"grade": "P",
"points": null
}
],
"half-up"
],
"expect": {
"gpa": 367,
"qualityPoints": 2199,
"gpaCredits": 6,
"excludedCredits": 0
}
},
{
"name": "the same, truncated",
"args": [
[
{
"grade": "A+",
"credits": 3
},
{
"grade": "B",
"credits": 3
}
],
[
{
"grade": "A+",
"points": 433
},
{
"grade": "A",
"points": 400
},
{
"grade": "B",
"points": 300
},
{
"grade": "P",
"points": null
}
],
"down"
],
"expect": {
"gpa": 366,
"qualityPoints": 2199,
"gpaCredits": 6,
"excludedCredits": 0
}
},
{
"name": "half credits scaled by ten: A(35), B(10)",
"args": [
[
{
"grade": "A",
"credits": 35
},
{
"grade": "B",
"credits": 10
}
],
null,
"half-up"
],
"expect": {
"gpa": 378,
"qualityPoints": 17000,
"gpaCredits": 45,
"excludedCredits": 0
}
},
{
"name": "a grade not in the table is an error",
"args": [
[
{
"grade": "D-",
"credits": 3
}
],
null,
"half-up"
],
"expectError": "grade \"D-\" is not in the grade-point table"
},
{
"name": "grades match case exactly",
"args": [
[
{
"grade": "a",
"credits": 3
}
],
null,
"half-up"
],
"expectError": "grade \"a\" is not in the grade-point table"
},
{
"name": "negative credits are an error",
"args": [
[
{
"grade": "A",
"credits": -1
}
],
null,
"half-up"
],
"expectError": "credits must be a whole number of 0 or more, received -1"
},
{
"name": "fractional credits are an error",
"args": [
[
{
"grade": "A",
"credits": 1.5
}
],
null,
"half-up"
],
"expectError": "credits must be a whole number of 0 or more, received 1.5"
},
{
"name": "an empty table is an error",
"args": [
[
{
"grade": "A",
"credits": 3
}
],
[],
"half-up"
],
"expectError": "gradePoints must not be empty"
},
{
"name": "a grade twice in the table is an error",
"args": [
[
{
"grade": "A",
"credits": 3
}
],
[
{
"grade": "A",
"points": 400
},
{
"grade": "A",
"points": 370
}
],
"half-up"
],
"expectError": "grade \"A\" appears twice in gradePoints"
},
{
"name": "negative points are an error",
"args": [
[
{
"grade": "A",
"credits": 3
}
],
[
{
"grade": "A",
"points": -10
}
],
"half-up"
],
"expectError": "points must be whole hundredths of 0 or more, received -10 for grade \"A\""
},
{
"name": "an unknown rounding mode is an error",
"args": [
[
{
"grade": "A",
"credits": 3
}
],
null,
"nearest"
],
"expectError": "unknown rounding mode \"nearest\""
}
]