107 lines
3.2 KiB
Go
107 lines
3.2 KiB
Go
package joker
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
"testing"
|
|
)
|
|
|
|
type cardsTestCase struct {
|
|
Cards Cards
|
|
RemovedFirst Cards
|
|
RemovedLast Cards
|
|
Reversed Cards
|
|
Sorted Cards
|
|
Low Card
|
|
High Card
|
|
}
|
|
|
|
var cardsTestCases = []*cardsTestCase{
|
|
{
|
|
Cards: Cards{Card{FaceAce, SuitHearts}, Card{Face4, SuitDiamonds}, Card{Face2, SuitClubs}, Card{Face3, SuitSpades}},
|
|
RemovedFirst: Cards{Card{Face4, SuitDiamonds}, Card{Face2, SuitClubs}, Card{Face3, SuitSpades}},
|
|
RemovedLast: Cards{Card{FaceAce, SuitHearts}, Card{Face4, SuitDiamonds}, Card{Face2, SuitClubs}},
|
|
Reversed: Cards{Card{Face3, SuitSpades}, Card{Face2, SuitClubs}, Card{Face4, SuitDiamonds}, Card{FaceAce, SuitHearts}},
|
|
Sorted: Cards{Card{FaceAce, SuitHearts}, Card{Face2, SuitClubs}, Card{Face3, SuitSpades}, Card{Face4, SuitDiamonds}},
|
|
Low: Card{FaceAce, SuitHearts},
|
|
High: Card{Face4, SuitDiamonds},
|
|
},
|
|
{
|
|
Cards: Cards{Card{Face2, SuitClubs}, Card{Face4, SuitSpades}},
|
|
RemovedFirst: Cards{Card{Face4, SuitSpades}},
|
|
RemovedLast: Cards{Card{Face2, SuitClubs}},
|
|
Reversed: Cards{Card{Face4, SuitSpades}, Card{Face2, SuitClubs}},
|
|
Sorted: Cards{Card{Face2, SuitClubs}, Card{Face4, SuitSpades}},
|
|
Low: Card{Face2, SuitClubs},
|
|
High: Card{Face4, SuitSpades},
|
|
},
|
|
{
|
|
Cards: Cards{Card{FaceQueen, SuitHearts}},
|
|
RemovedFirst: Cards{},
|
|
RemovedLast: Cards{},
|
|
Reversed: Cards{Card{FaceQueen, SuitHearts}},
|
|
Sorted: Cards{Card{FaceQueen, SuitHearts}},
|
|
Low: Card{FaceQueen, SuitHearts},
|
|
High: Card{FaceQueen, SuitHearts},
|
|
},
|
|
}
|
|
|
|
func TestCards(t *testing.T) {
|
|
for _, c := range cardsTestCases {
|
|
copied := c.Cards.Copy()
|
|
if !reflect.DeepEqual(copied, c.Cards) {
|
|
t.Errorf("failed to copy cards: expected %s, got %s", c.Cards, copied)
|
|
}
|
|
|
|
removedFirst := c.Cards.Remove(0)
|
|
if !reflect.DeepEqual(removedFirst, c.RemovedFirst) {
|
|
t.Errorf("failed to remove first card: expected %s, got %s", c.RemovedFirst, removedFirst)
|
|
}
|
|
|
|
removedLast := c.Cards.Remove(len(c.Cards) - 1)
|
|
if !reflect.DeepEqual(removedLast, c.RemovedLast) {
|
|
t.Errorf("failed to remove first card: expected %s, got %s", c.RemovedLast, removedLast)
|
|
}
|
|
|
|
reversed := c.Cards.Reversed()
|
|
if !reflect.DeepEqual(reversed, c.Reversed) {
|
|
t.Errorf("failed to reverse cards: expected %s, got %s", c.Reversed, reversed)
|
|
}
|
|
|
|
sorted := c.Cards.Sorted()
|
|
if !reflect.DeepEqual(sorted, c.Sorted) {
|
|
t.Errorf("failed to sort cards: expected %s, got %s", c.Sorted, sorted)
|
|
}
|
|
|
|
permutations := c.Cards.Permutations()
|
|
if len(permutations) != factorial(len(c.Cards)) {
|
|
t.Errorf("failed to generate permutations: expected %d, got %d: %s", factorial(len(c.Cards)), len(permutations), permutations)
|
|
}
|
|
|
|
low := c.Cards.Low()
|
|
if !low.Equal(c.Low) {
|
|
t.Errorf("failed to get low card: expected %s, got %s", c.Low, low)
|
|
}
|
|
|
|
high := c.Cards.High()
|
|
if !high.Equal(c.High) {
|
|
t.Errorf("failed to get high card: expected %s, got %s", c.High, high)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkCardsSort(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
for _, c := range cardsTestCases {
|
|
sort.Sort(c.Cards)
|
|
}
|
|
}
|
|
}
|
|
|
|
func factorial(i int) int {
|
|
if i <= 1 {
|
|
return 1
|
|
}
|
|
return i * factorial(i-1)
|
|
}
|