[ { "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\"" } ]