# The empty quorum commits "everything". This is useful for its use in joint
# quorums.
committed
----
<empty majority quorum>∞



# A single voter quorum is not final when no index is known.
committed cfg=(1) idx=(_)
----
     idx
?      0    (id=1)
0

# When an index is known, that's the committed index, and that's final.
committed cfg=(1) idx=(12)
----
     idx
>     12    (id=1)
12




# With two nodes, start out similarly.
committed cfg=(1, 2) idx=(_,_)
----
      idx
?       0    (id=1)
?       0    (id=2)
0

# The first committed index becomes known (for n1). Nothing changes in the
# output because idx=12 is not known to be on a quorum (which is both nodes).
committed cfg=(1, 2) idx=(12,_)
----
      idx
x>     12    (id=1)
?       0    (id=2)
0

# The second index comes in and finalize the decision. The result will be the
# smaller of the two indexes.
committed cfg=(1,2) idx=(12,5)
----
      idx
x>     12    (id=1)
>       5    (id=2)
5




# No surprises for three nodes.
committed cfg=(1,2,3) idx=(_,_,_)
----
       idx
?        0    (id=1)
?        0    (id=2)
?        0    (id=3)
0

committed cfg=(1,2,3) idx=(12,_,_)
----
       idx
xx>     12    (id=1)
?        0    (id=2)
?        0    (id=3)
0

# We see a committed index, but a higher committed index for the last pending
# votes could change (increment) the outcome, so not final yet.
committed cfg=(1,2,3) idx=(12,5,_)
----
       idx
xx>     12    (id=1)
x>       5    (id=2)
?        0    (id=3)
5

# a) the case in which it does:
committed cfg=(1,2,3) idx=(12,5,6)
----
       idx
xx>     12    (id=1)
>        5    (id=2)
x>       6    (id=3)
6

# b) the case in which it does not:
committed cfg=(1,2,3) idx=(12,5,4)
----
       idx
xx>     12    (id=1)
x>       5    (id=2)
>        4    (id=3)
5

# c) a different case in which the last index is pending but it has no chance of
# swaying the outcome (because nobody in the current quorum agrees on anything
# higher than the candidate):
committed cfg=(1,2,3) idx=(5,5,_)
----
       idx
x>       5    (id=1)
>        5    (id=2)
?        0    (id=3)
5

# c) continued: Doesn't matter what shows up last. The result is final.
committed cfg=(1,2,3) idx=(5,5,12)
----
       idx
>        5    (id=1)
>        5    (id=2)
xx>     12    (id=3)
5

# With all committed idx known, the result is final.
committed cfg=(1, 2, 3) idx=(100, 101, 103)
----
       idx
>      100    (id=1)
x>     101    (id=2)
xx>    103    (id=3)
101



# Some more complicated examples. Similar to case c) above. The result is
# already final because no index higher than 103 is one short of quorum.
committed cfg=(1, 2, 3, 4, 5) idx=(101, 104, 103, 103,_)
----
         idx
x>       101    (id=1)
xxxx>    104    (id=2)
xx>      103    (id=3)
>        103    (id=4)
?          0    (id=5)
103

# A similar case which is not final because another vote for >= 103 would change
# the outcome.
committed cfg=(1, 2, 3, 4, 5) idx=(101, 102, 103, 103,_)
----
         idx
x>       101    (id=1)
xx>      102    (id=2)
xxx>     103    (id=3)
>        103    (id=4)
?          0    (id=5)
102
