mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-06-30 18:43:42 +02:00
fn: reimplement internals of either, add tests
This commit is contained in:
139
fn/either_test.go
Normal file
139
fn/either_test.go
Normal file
@ -0,0 +1,139 @@
|
||||
package fn
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"testing/quick"
|
||||
)
|
||||
|
||||
func TestPropConstructorEliminatorDuality(t *testing.T) {
|
||||
f := func(i int, s string, isRight bool) bool {
|
||||
Len := func(s string) int { return len(s) } // smh
|
||||
if isRight {
|
||||
v := ElimEither(
|
||||
Iden[int],
|
||||
Len,
|
||||
NewRight[int, string](s),
|
||||
)
|
||||
return v == Len(s)
|
||||
}
|
||||
|
||||
v := ElimEither(
|
||||
Iden[int],
|
||||
Len,
|
||||
NewLeft[int, string](i),
|
||||
)
|
||||
return v == i
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPropWhenClauseExclusivity(t *testing.T) {
|
||||
f := func(i int, isRight bool) bool {
|
||||
var e Either[int, int]
|
||||
if isRight {
|
||||
e = NewRight[int, int](i)
|
||||
} else {
|
||||
e = NewLeft[int, int](i)
|
||||
}
|
||||
z := 0
|
||||
e.WhenLeft(func(x int) { z += x })
|
||||
e.WhenRight(func(x int) { z += x })
|
||||
|
||||
return z != 2*i && e.IsLeft() != e.IsRight()
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPropSwapEitherSelfInverting(t *testing.T) {
|
||||
f := func(i int, s string, isRight bool) bool {
|
||||
var e Either[int, string]
|
||||
if isRight {
|
||||
e = NewRight[int, string](s)
|
||||
} else {
|
||||
e = NewLeft[int, string](i)
|
||||
}
|
||||
return e.Swap().Swap() == e
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPropMapLeftIdentity(t *testing.T) {
|
||||
f := func(i int, s string, isRight bool) bool {
|
||||
var e Either[int, string]
|
||||
if isRight {
|
||||
e = NewRight[int, string](s)
|
||||
} else {
|
||||
e = NewLeft[int, string](i)
|
||||
}
|
||||
return MapLeft[int, string, int](Iden[int])(e) == e
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPropMapRightIdentity(t *testing.T) {
|
||||
f := func(i int, s string, isRight bool) bool {
|
||||
var e Either[int, string]
|
||||
if isRight {
|
||||
e = NewRight[int, string](s)
|
||||
} else {
|
||||
e = NewLeft[int, string](i)
|
||||
}
|
||||
return MapRight[int, string, string](Iden[string])(e) == e
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPropToOptionIdentities(t *testing.T) {
|
||||
f := func(i int, s string, isRight bool) bool {
|
||||
var e Either[int, string]
|
||||
if isRight {
|
||||
e = NewRight[int, string](s)
|
||||
|
||||
r2O := e.RightToOption() == Some(s)
|
||||
o2R := e == OptionToRight[string, int, string](
|
||||
Some(s), i,
|
||||
)
|
||||
l2O := e.LeftToOption() == None[int]()
|
||||
|
||||
return r2O && o2R && l2O
|
||||
} else {
|
||||
e = NewLeft[int, string](i)
|
||||
l2O := e.LeftToOption() == Some(i)
|
||||
o2L := e == OptionToLeft[int, int](Some(i), s)
|
||||
r2O := e.RightToOption() == None[string]()
|
||||
|
||||
return l2O && o2L && r2O
|
||||
}
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPropUnwrapIdentities(t *testing.T) {
|
||||
f := func(i int, s string, isRight bool) bool {
|
||||
var e Either[int, string]
|
||||
if isRight {
|
||||
e = NewRight[int, string](s)
|
||||
return e.UnwrapRightOr("") == s &&
|
||||
e.UnwrapLeftOr(0) == 0
|
||||
} else {
|
||||
e = NewLeft[int, string](i)
|
||||
return e.UnwrapLeftOr(0) == i &&
|
||||
e.UnwrapRightOr("") == ""
|
||||
}
|
||||
}
|
||||
if err := quick.Check(f, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user