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"]