File size: 1,837 Bytes
9438a57 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | import pytest
from solution import Gradebook, GradeError, letter, weighted_average
@pytest.mark.parametrize("score,expected", [
(100, "AA"), (90, "AA"), (89.99, "BA"), (85, "BA"), (80, "BB"), (75, "CB"),
(70, "CC"), (60, "DC"), (50, "DD"), (49.5, "FF"), (0, "FF"),
])
def test_letter_thresholds_are_inclusive(score, expected):
assert letter(score) == expected
@pytest.mark.parametrize("score", [-1, 100.5])
def test_letter_out_of_range(score):
with pytest.raises(GradeError):
letter(score)
def test_weighted_average_normalizes_weights():
assert weighted_average([80, 100], [1, 3]) == 95.0
assert weighted_average([70, 80, 90], [0.2, 0.3, 0.5]) == 83.0
def test_weighted_average_rounds_to_two_decimals():
assert weighted_average([1, 2, 2], [1, 1, 1]) == 1.67
def test_weighted_average_errors():
with pytest.raises(GradeError):
weighted_average([1, 2], [1])
with pytest.raises(GradeError):
weighted_average([], [])
with pytest.raises(GradeError):
weighted_average([50, 60], [0, 0])
def test_add_and_average():
g = Gradebook([0.4, 0.6])
g.add("Ali", [50, 100])
assert g.average("Ali") == 80.0
def test_add_rejects_duplicates_and_wrong_length():
g = Gradebook([0.5, 0.5])
g.add("Ali", [1, 2])
with pytest.raises(GradeError):
g.add("Ali", [3, 4])
with pytest.raises(GradeError):
g.add("Veli", [3])
def test_ranking_descending_with_alphabetical_ties():
g = Gradebook([1])
g.add("Zeynep", [70])
g.add("Can", [90])
g.add("Ayşe", [70])
assert g.ranking() == ["Can", "Ayşe", "Zeynep"]
def test_passed_includes_threshold():
g = Gradebook([1])
g.add("A", [50])
g.add("B", [49.99])
g.add("C", [80])
assert g.passed() == ["C", "A"]
assert g.passed(threshold=80) == ["C"]
|