package main

import "testing"

func TestClocks(t *testing.T) {
	a, b := Vector{1, 0}, Vector{0, 2}
	if before(a, b) || before(b, a) || before(a, a) {
		t.Fatal("concurrent/equal vectors ordered")
	}
	if !before(a, receive(b, a, 1)) {
		t.Fatal("lost causal edge")
	}
}
func TestHistories(t *testing.T) {
	cases := []struct {
		name     string
		h        []Op
		seq, lin bool
	}{
		{"stale after completion", []Op{{"A", 1, 2, true, 1}, {"B", 3, 4, false, 0}}, true, false},
		{"overlap may read old", []Op{{"A", 1, 4, true, 1}, {"B", 2, 3, false, 0}}, true, true},
		{"same client cannot go back", []Op{{"A", 1, 2, true, 1}, {"A", 3, 4, false, 0}}, false, false},
		{"fresh read", []Op{{"A", 1, 2, true, 1}, {"B", 3, 4, false, 1}}, true, true},
	}
	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			if validHistory(c.h, false) != c.seq || validHistory(c.h, true) != c.lin {
				t.Fatal(c.name)
			}
		})
	}
}
