A semilattice is defined as a specialized semigroup, basically it's commutative and idempotent, i.e. x |+| y |+| y = x |+| y and x |+| x |+| y = x |+| y
A meet semilattice is completely equivalent to a semilattice, except that its operation is called "meet".
A join semilattice is completely equivalent to a semilattice, except that its operation is called "join".
A lattice is both a meet and join semilattice (that's why we define join and meet semilattices)
Think of it the same way as a ring: it has both an additive and multiplicative monoid inside, but they are not the same, so Ring[A] does not directly inherit from Monoid[A], but rather AdditiveMonoid[A] (or actually AdditiveGroup[A]), and MultiplicativeMonoid[A]
(the additive monoid in a ring is always commutative, and the multiplicative monoid can be commutative if it is a commutative ring; a field is actually a multiplicative group over nonzero elements, but you get the spirit)
So I suggest, for the tests, to write them in the same way for the semilattice stuff and the ring stuff