전송 속도와 대역폭 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""전송 지연과 전파 지연 계산 검증.

문서: 05.전송 속도와 대역폭 (예시, 비트 폭, 카드 C2·C4)
정의:
  전송 지연 d_trans = L / R   (L: 비트 수, R: 전송률 bps)
  전파 지연 d_prop  = 거리 / 전파 속도
주장: 전송률 R을 바꾸면 전송 지연만 바뀌고 전파 지연은 그대로다.
단위: 1 kbps = 10^3 bps, 1 Mbps = 10^6 bps, 1 Gbps = 10^9 bps, 1바이트 = 8비트.
"""
from fractions import Fraction as F


def d_trans(bits: int, rate_bps: int) -> F:
    return F(bits, rate_bps)


def d_prop(distance_m: int, speed_mps: int) -> F:
    return F(distance_m, speed_mps)


def main() -> None:
    # 예시: 1,500바이트 패킷
    L = 1_500 * 8
    assert L == 12_000
    assert d_trans(L, 100_000_000) == F(120, 1_000_000)  # 100 Mbps -> 120 us
    assert d_trans(L, 1_000_000_000) == F(12, 1_000_000)  # 1 Gbps -> 12 us
    # 400 km 광케이블, 신호 속도 2 x 10^8 m/s -> 2 ms (전송률과 무관)
    assert d_prop(400_000, 200_000_000) == F(2, 1000)
    print("[OK] 예시: 12,000비트, 100 Mbps -> 120 us, 1 Gbps -> 12 us, 400 km -> 2 ms")

    # 예제: 100 m 케이블 -> 0.5 us, 정지 궤도 36,000 km (진공 3 x 10^8 m/s) -> 0.12 s
    assert d_prop(100, 200_000_000) == F(5, 10_000_000)
    assert d_prop(36_000_000, 300_000_000) == F(12, 100)
    print("[OK] 예제: 100 m -> 0.5 us, 36,000 km -> 0.12 s")

    # 카드 rate-and-bandwidth#C2
    L = 1_250 * 8
    t10 = d_trans(L, 10_000_000)
    t100 = d_trans(L, 100_000_000)
    p = d_prop(3_000_000, 200_000_000)
    assert L == 10_000 and t10 == F(1, 1000) and t100 == F(1, 10_000) and p == F(15, 1000)
    print(f"[OK] 카드 C2: 전송 {float(t10) * 1e3:g} ms -> {float(t100) * 1e3:g} ms, 전파 {float(p) * 1e3:g} ms (그대로)")

    # 비트 폭 = 1 / R: 1 Mbps -> 1 us, 2 Mbps -> 0.5 us (문서 예시)
    assert F(1, 1_000_000) == F(1, 10**6) and F(1, 2_000_000) == F(5, 10**7)
    # 예제: 100 m 광케이블 -> 0.5 us
    assert d_prop(100, 200_000_000) == F(5, 10**7)
    print("[OK] 비트 폭: 1 Mbps 1 us, 2 Mbps 0.5 us")

    # 카드 rate-and-bandwidth#C4: 1 KB (2^10 바이트)를 1 kbps로
    bits = 2**10 * 8
    assert bits == 8_192 and d_trans(bits, 1_000) == F(8192, 1000)
    print("[OK] 카드 C4: 8,192비트 / 1,000 bps = 8.192초")

    # 주장: R을 k배 하면 전송 지연은 1/k배, 전파 지연은 R과 무관
    for k in (2, 10, 1000):
        assert d_trans(L, 10_000_000 * k) == t10 / k
    print("ALL CHECKS PASSED")


if __name__ == "__main__":
    main()