def test_is_k_longer_than_length():
    ll = LinkedList()
    ll.append_node(1)
    ll.append_node(2)
    ll.append_node(3)
    with pytest.raises(IndexError):
        ll.find_kth_value_from_end(4)
def test_negative_input():
    ll = LinkedList()
    ll.append_node(1)
    ll.append_node(2)
    ll.append_node(3)
    # test will pass if code in block causes expected ERROR
    with pytest.raises(ValueError):
        ll.find_kth_value_from_end(-1)
def test_k_in_middle():
    ll = LinkedList()
    ll.append_node("a")
    ll.append_node(3)
    ll.append_node("3")
    actual = ll.find_kth_value_from_end(1)
    expected = 3
    assert actual == expected
def test_is_k_same_as_length():
    ll = LinkedList()
    ll.append_node("a")
    ll.append_node("b")
    ll.append_node("c")
    actual = ll.find_kth_value_from_end(2)
    expected = "a"
    assert actual == expected
def test_single_node_ll():
    ll = LinkedList()
    ll.insert("a")
    actual = ll.find_kth_value_from_end(0)
    expected = "a"
    assert actual == expected