public void Uninitialized_state_contains_no_head_nor_tails()
    {
        var state = LinkState.Uninitialized();

        Assert.IsNull(state.HeadSession);
        Assert.IsNull(state.TailSession);
    }
    public void Epoch_number_is_1_for_freshly_initialized_link_state()
    {
        var state = LinkState.Uninitialized();

        state = state.Initialize("Head", "Tail", 10);

        Assert.AreEqual(1, state.Epoch);
    }
    public void Tail_table_range_is_initialized()
    {
        var state = LinkState.Uninitialized();

        state = state.Initialize("Head", "Tail", 10);

        Assert.AreEqual(0, state.TailSession.Lo);
        Assert.AreEqual(10, state.TailSession.Hi);
        Assert.AreEqual("Tail", state.TailSession.Table);
    }
    public void Advancing_epoch_switches_head_and_tail_tables()
    {
        var state = LinkState.Uninitialized();

        state = state.Initialize("Head", "Tail", 10);

        state = state.Advance(15);

        Assert.AreEqual(20, state.HeadSession.Lo);
        Assert.AreEqual(35, state.HeadSession.Hi);
        Assert.AreEqual("Tail", state.HeadSession.Table);

        Assert.AreEqual(10, state.TailSession.Lo);
        Assert.AreEqual(20, state.TailSession.Hi);
        Assert.AreEqual("Head", state.TailSession.Table);
    }