def run(merge_bookings):
    cases = [
        ([{"room": "A", "start": 9, "end": 11}, {"room": "A", "start": 10, "end": 12}], {"A": [(9, 12)]}),
        ([{"room": "A", "start": 13, "end": 14}, {"room": "A", "start": 9, "end": 10}], {"A": [(9, 10), (13, 14)]}),
        ([{"room": "A", "start": 9, "end": 11}, {"room": "A", "start": 11, "end": 12}], {"A": [(9, 12)]}),
        ([{"room": "A", "start": 9, "end": 15}, {"room": "A", "start": 10, "end": 11}], {"A": [(9, 15)]}),
        ([{"room": "A", "start": 9, "end": 9}, {"room": "A", "start": 12, "end": 10}], {"A": []}),
        ([{"room": "B", "start": 8, "end": 9}, {"room": "A", "start": 8, "end": 9}], {"A": [(8, 9)], "B": [(8, 9)]}),
        ([{"room": "A", "start": 14, "end": 16}, {"room": "A", "start": 9, "end": 10}, {"room": "A", "start": 10, "end": 14}], {"A": [(9, 16)]}),
        ([], {}),
    ]
    passed = 0
    for inp, exp in cases:
        try:
            got = merge_bookings([dict(x) for x in inp])
            got = {k: [tuple(r) for r in v] for k, v in got.items()}
            # 只含无效预订的房间：返回空列表或不返回该房间都算对（题面未规定）
            got = {k: v for k, v in got.items() if v}
            exp = {k: v for k, v in exp.items() if v}
            if got == exp:
                passed += 1
        except Exception:
            pass
    return passed, len(cases)
