poker_test.go (6079B)
1 package poker 2 3 import ( 4 "dkforest/pkg/database" 5 "dkforest/pkg/utils/rwmtx" 6 "github.com/stretchr/testify/assert" 7 "testing" 8 ) 9 10 func n(v uint64) rwmtx.RWMtxUInt64[database.PokerChip] { 11 return rwmtx.RWMtxUInt64[database.PokerChip]{rwmtx.New(database.PokerChip(v))} 12 } 13 14 func Test_sortGameResults(t *testing.T) { 15 p1 := &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p1"}, gameBet: 10} 16 p2 := &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p2"}, gameBet: 20} 17 p3 := &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p3"}, gameBet: 30} 18 p4 := &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p4"}, gameBet: 100} 19 arr := []gameResult{ 20 {1, []*PokerPlayer{p2, p4, p1, p3}}, 21 } 22 sortGameResults(arr) 23 assert.Equal(t, database.Username("p1"), arr[0].players[0].username) 24 assert.Equal(t, database.Username("p2"), arr[0].players[1].username) 25 assert.Equal(t, database.Username("p3"), arr[0].players[2].username) 26 assert.Equal(t, database.Username("p4"), arr[0].players[3].username) 27 } 28 29 func Test_processPot(t *testing.T) { 30 var p1, p2, p3, p4 *PokerPlayer 31 var arr []gameResult 32 var res []PlayerGain 33 34 p1 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p1"}, gameBet: 100, allInMaxGain: 400} 35 p2 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p2"}, gameBet: 200, allInMaxGain: 700} 36 p3 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p3"}, gameBet: 300, allInMaxGain: 900} 37 p4 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p4"}, gameBet: 400} 38 arr = []gameResult{ 39 {1, []*PokerPlayer{p2, p4, p1, p3}}, 40 } 41 sortGameResults(arr) 42 res, _ = processPot(arr, 1000, 20, false, 4) 43 assert.Equal(t, database.PokerChip(250), res[0].Gain) 44 assert.Equal(t, database.PokerChip(250), res[1].Gain) 45 assert.Equal(t, database.PokerChip(250), res[2].Gain) 46 assert.Equal(t, database.PokerChip(250), res[3].Gain) 47 48 p1 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p1"}, gameBet: 10, allInMaxGain: 40} 49 p2 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p2"}, gameBet: 20, allInMaxGain: 70} 50 p3 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p3"}, gameBet: 300, allInMaxGain: 630} 51 p4 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p4"}, gameBet: 400} 52 arr = []gameResult{ 53 {1, []*PokerPlayer{p2, p4, p1, p3}}, 54 } 55 sortGameResults(arr) 56 res, _ = processPot(arr, 1000, 20, false, 4) 57 assert.Equal(t, database.PokerChip(40), res[0].Gain) 58 assert.Equal(t, database.PokerChip(70), res[1].Gain) 59 assert.Equal(t, database.PokerChip(445), res[2].Gain) 60 assert.Equal(t, database.PokerChip(445), res[3].Gain) 61 62 p1 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p1"}, gameBet: 500} 63 p2 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p2"}, gameBet: 500, allInMaxGain: 1000} 64 arr = []gameResult{ 65 {1, []*PokerPlayer{p2}}, 66 {2, []*PokerPlayer{p1}}, 67 } 68 sortGameResults(arr) 69 res, _ = processPot(arr, 1000, 20, false, 2) 70 assert.Equal(t, 1, len(res)) 71 assert.Equal(t, database.Username("p2"), res[0].Player.username) 72 assert.Equal(t, database.PokerChip(1000), res[0].Gain) 73 74 p1 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p1"}, gameBet: 5} 75 p2 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p2"}, gameBet: 5} 76 p3 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p3"}, gameBet: 5} 77 p4 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p4"}, gameBet: 5} 78 //p5 = &PokerPlayer{Cash: 1, GameBet: 3, Folded: true, Username: "p5"} 79 arr = []gameResult{ 80 {1, []*PokerPlayer{p1, p2, p3}}, 81 {2, []*PokerPlayer{p4}}, 82 } 83 sortGameResults(arr) 84 res, _ = processPot(arr, 23, 20, false, 4) 85 assert.Equal(t, 3, len(res)) 86 assert.Equal(t, database.PokerChip(8), res[0].Gain) 87 assert.Equal(t, database.PokerChip(8), res[1].Gain) 88 assert.Equal(t, database.PokerChip(7), res[2].Gain) 89 90 p1 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p1"}, gameBet: 900, allInMaxGain: 1560} 91 p2 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(0), username: "p2"}, gameBet: 640, allInMaxGain: 1300} 92 arr = []gameResult{ 93 {1, []*PokerPlayer{p2}}, 94 {2, []*PokerPlayer{p1}}, 95 } 96 sortGameResults(arr) 97 res, _ = processPot(arr, 1560, 20, false, 2) 98 assert.Equal(t, 2, len(res)) 99 assert.Equal(t, database.PokerChip(1300), res[0].Gain) 100 assert.Equal(t, database.PokerChip(260), res[1].Gain) 101 102 p1 = &PokerPlayer{seatedPlayer: &seatedPlayer{cash: n(1), username: "p1"}, gameBet: 500} 103 arr = []gameResult{ 104 {2, []*PokerPlayer{p1}}, 105 } 106 sortGameResults(arr) 107 res, _ = processPot(arr, 1000, 20, false, 2) 108 assert.Equal(t, 1, len(res)) 109 assert.Equal(t, database.Username("p1"), res[0].Player.username) 110 assert.Equal(t, database.PokerChip(1000), res[0].Gain) 111 assert.Equal(t, "Only player alive", res[0].HandStr) 112 } 113 114 func Test_isRoundSettled(t *testing.T) { 115 type args struct { 116 players []*PokerPlayer 117 } 118 tests := []struct { 119 name string 120 args args 121 want bool 122 }{ 123 {"1", args{players: []*PokerPlayer{ 124 {bet: n(10), seatedPlayer: &seatedPlayer{cash: n(0)}}, 125 {bet: n(20), seatedPlayer: &seatedPlayer{cash: n(0)}}, 126 {bet: n(30), seatedPlayer: &seatedPlayer{cash: n(1)}}, 127 {bet: n(30), seatedPlayer: &seatedPlayer{cash: n(1)}}}}, true}, 128 {"2", args{players: []*PokerPlayer{ 129 {bet: n(100), seatedPlayer: &seatedPlayer{cash: n(0)}}, 130 {bet: n(20), seatedPlayer: &seatedPlayer{cash: n(0)}}, 131 {bet: n(30), seatedPlayer: &seatedPlayer{cash: n(1)}}, 132 {bet: n(30), seatedPlayer: &seatedPlayer{cash: n(1)}}}}, false}, 133 {"3", args{players: []*PokerPlayer{ 134 {bet: n(10), seatedPlayer: &seatedPlayer{cash: n(0)}}, 135 {bet: n(200), seatedPlayer: &seatedPlayer{cash: n(0)}}, 136 {bet: n(30), seatedPlayer: &seatedPlayer{cash: n(1)}}, 137 {bet: n(30), seatedPlayer: &seatedPlayer{cash: n(1)}}}}, false}, 138 // TODO: Add test cases. 139 } 140 for _, tt := range tests { 141 t.Run(tt.name, func(t *testing.T) { 142 assert.Equalf(t, tt.want, isRoundSettled(tt.args.players), "isRoundSettled(%v)", tt.args.players) 143 }) 144 } 145 }