UNPKG

handranker-latest

Version:
273 lines (215 loc) 12.3 kB
'use strict'; var assert = require("assert"); var should = require('should'); var Card = require('../lib/card'); var HandRanking = require('../lib/hand-ranking'); var Ranker = require('../lib/ranker'); describe('Ranker', function(){ describe('input', function(){ it('should except cards in regular format', function(){ var cards = ['As', 'Ks', 'Qs', 'Js', 'Ts']; var result = Ranker.getHand(cards); result.ranking.should.eql(HandRanking.ROYAL_FLUSH); }); it('should except cards in hand board format', function(){ var cards = ['As', 'Ks']; var board = ['Qs', 'Js', 'Ts']; var result = Ranker.getHand(cards, board); result.ranking.should.eql(HandRanking.ROYAL_FLUSH); }); }); describe('evaluation', function(){ it('should find Royal Flush for As Ks Qs Js Ts', function(){ var cards = ['As', 'Ks', 'Qs', 'Js', 'Ts']; var result = Ranker.getHand(cards); result.ranking.should.eql(HandRanking.ROYAL_FLUSH); }); it('should find Straight Flush for Ks Qs Js Ts 9s', function(){ var cards = ['Ks', 'Qs', 'Js', 'Ts', '9s']; var result = Ranker.getHand(cards); result.ranking.should.eql(HandRanking.STRAIGHT_FLUSH); }); it('should find Two Pair for Ks Kc Ts Tc 9s', function(){ var cards = ['Ks', 'Kc', 'Ts', 'Tc', '9s']; var result = Ranker.getHand(cards); result.ranking.should.eql(HandRanking.TWO_PAIR); }); it('should find Two Pair for Ks Kc Ts Tc 9s As', function(){ var cards = ['Ks', 'Kc', 'Ts', 'Tc', '9s', 'As']; var result = Ranker.getHand(cards); result.playingCards[0].rank.should.eql('K'); result.playingCards[1].rank.should.eql('K'); result.playingCards[2].rank.should.eql('T'); result.playingCards[3].rank.should.eql('T'); result.playingCards[4].rank.should.eql('A'); }); it('should find Straight for Ks Kc Qs Qc Jd Td 9d 3s', function(){ var cards = ['Ks', 'Kc', 'Qs', 'Qc', 'Jd', 'Td', '9d']; var result = Ranker.getHand(cards); result.ranking.should.eql(HandRanking.STRAIGHT); }); it('should order hands correctly', function(){ var hand1 = {id: 1,cards: ['As', 'Ks', 'Qs', 'Js', 'Ts', '3h', '2h']}; var hand2 = {id: 2,cards: ['As', 'Ks', 'Qs', 'Js', '9c', '3h', '2h']}; var hand3 = {id: 3,cards: ['4s', '4c', '4h', '2s', '2h', '3h', '2h']}; var hand4 = {id: 4,cards: ['Ks', 'Kd', 'Kc', 'Kh', 'Ts', '3h', '2h']}; var results = Ranker.orderHands([hand1, hand2, hand3, hand4]); results[0][0].id.should.eql(1); results[1][0].id.should.eql(4); results[2][0].id.should.eql(3); results[3][0].id.should.eql(2); }); it('should tying hands together', function(){ var hand1 = {id: 1, cards: ['Ac', '5c']}; // tie var hand2 = {id: 2, cards: ['Ad', '8d']}; // tie var hand3 = {id: 3, cards: ['Kh', 'Jc']}; // win var board = ['Th', '9h', 'Tc', '6c', 'Jh']; var hands = [hand1, hand2, hand3]; var results = Ranker.orderHands(hands, board); results[0][0].id.should.eql(3); [1, 2].should.include(results[1][0].id); [1, 2].should.include(results[1][1].id); }); it('should group tying hands together', function(){ var hand1 = {id: 1, cards: ['Ac', 'Ah', 'Kd', '7d']}; // tie var hand2 = {id: 2, cards: ['Ad', 'As', 'Js', '5s']}; // tie var hand3 = {id: 3, cards: ['Tc', '9c', '3s', '2s']}; // win var board = ['Th', '9h', 'Tc', '6c', 'Jh']; var hands = [hand1, hand2, hand3]; var results = Ranker.orderHands(hands, board, Ranker.OMAHA_HI); results[0][0].id.should.eql(3); [1, 2].should.include(results[1][0].id); [1, 2].should.include(results[1][1].id); }); }); describe('options', function(){ describe('omaha', function(){ it('should evaluate omaha correctly', function(){ var cards = ['4c', '4s', '5h', '5c']; var board = ['Ts', '9s', '8s', '3h', '2h']; var result = Ranker.getHand(cards, board, Ranker.OMAHA_HI); result.ranking.should.eql(HandRanking.PAIR); }); it('should evaluate omaha correctly', function(){ var cards = ['As', 'Ks', 'Qs', 'Js']; var board = ['Ts', '9s', '8s']; var result = Ranker.getHand(cards, board, Ranker.OMAHA_HI); result.ranking.should.eql(HandRanking.STRAIGHT_FLUSH); }); it('should order omaha hands correctly', function(){ var board = ['Ts', '9s', '8s', '3h', '2h']; var hand1 = {id: 1, cards: ['As', 'Ks', 'Qs', 'Js']}; var hand2 = {id: 2, cards: ['2s', '2c', '9c', '8c']}; var hand3 = {id: 3, cards: ['4c', '4s', '5h', '5c']}; var hand4 = {id: 4, cards: ['7s', '6s', '3c', '2c']}; var hands = [hand1, hand2, hand3, hand4]; var results = Ranker.orderHands(hands, board, Ranker.OMAHA_HI); results[0][0].id.should.eql(1); results[1][0].id.should.eql(4); results[2][0].id.should.eql(2); results[3][0].id.should.eql(3); }); }); describe('win type', function(){ it('should evaluate razz hands correctly', function(){ var hand1 = {id: 1, cards: ['3d', '6d', '7s', '2d', '8h', '9h', '5c']}; var hand2 = {id: 2, cards: ['3c', '2c', '6c', '7h', '2h', '8s', '6s']}; var results = Ranker.orderHands([hand1, hand2], Ranker.RAZZ); results[0][0].id.should.eql(1); results[0][0].playingCards[0].rank.should.eql(Card.RANK_SEVEN); results[1][0].id.should.eql(2); results[1][0].playingCards[0].rank.should.eql(Card.RANK_EIGHT); }); it('should evaluate omahah hi/lo hands correctly', function(){ var board = ['Kh', '3d', '4d', '8s', '2d']; var hand1 = {id: 1, cards: ['Ah', '2s', 'Qd', 'Ks']}; var hand2 = {id: 2, cards: ['6h', '7h', 'Td', 'Jd']}; var results = Ranker.orderHands([hand1, hand2], board, Ranker.OMAHA_HI_LO); results[Ranker.HIGH][0][0].id.should.eql(2); results[Ranker.HIGH][1][0].id.should.eql(1); results[Ranker.LOW][0][0].id.should.eql(2); results[Ranker.LOW][0][0].playingCards[0].rank.should.eql(Card.RANK_SEVEN); results[Ranker.LOW][0][0].playingCards[1].rank.should.eql(Card.RANK_SIX); results[Ranker.LOW][0][0].playingCards[2].rank.should.eql(Card.RANK_FOUR); results[Ranker.LOW][0][0].playingCards[3].rank.should.eql(Card.RANK_THREE); results[Ranker.LOW][0][0].playingCards[4].rank.should.eql(Card.RANK_TWO); results[Ranker.LOW][1][0].id.should.eql(1); results[Ranker.LOW][1][0].playingCards[0].rank.should.eql(Card.RANK_EIGHT); results[Ranker.LOW][1][0].playingCards[1].rank.should.eql(Card.RANK_FOUR); results[Ranker.LOW][1][0].playingCards[2].rank.should.eql(Card.RANK_THREE); results[Ranker.LOW][1][0].playingCards[3].rank.should.eql(Card.RANK_TWO); results[Ranker.LOW][1][0].playingCards[4].rank.should.eql(Card.RANK_ACE); }); it('should evaluate seven card hi-lo correctly', function(){ var hand1 = {id: 1, cards: ['Ah', '2s', 'Kh', 'Ks', '3c', '4h', '5d']}; var hand2 = {id: 2, cards: ['As', '3s', 'Qh', 'Qd', 'Qs', '3h', '5c']}; var results = Ranker.orderHands([hand1, hand2], Ranker.STUD_HI_LO); results[Ranker.HIGH][0][0].id.should.eql(2); results[Ranker.HIGH][1][0].id.should.eql(1); results[Ranker.LOW][0][0].id.should.eql(1); results[Ranker.LOW].length.should.eql(1); }); }); describe('only pairs count', function(){ it('should evaluate 6s 5s 4s 3s 2s as a six high for DEUCE_TO_SIX', function(){ var hand = ['6s', '5s', '4s', '3s', '2s']; var result = Ranker.getHand(hand, Ranker.DEUCE_TO_SIX); result.ranking.should.eql(HandRanking.HIGH_CARD); }); it('should evaluate As 5s 4s 3s 2s as ace high for DEUCE_TO_SIX', function(){ var hand = ['As', '5s', '4s', '3s', '2s']; var result = Ranker.getHand(hand, Ranker.DEUCE_TO_SIX); result.ranking.should.eql(HandRanking.HIGH_CARD); result.playingCards[0].rank.should.eql(Card.RANK_ACE); }); it('should evaluate 5s 4s 3s 2s As as a straight flush for ACE_TO_SIX', function(){ var hand = ['5s', '4s', '3s', '2s', 'As']; var result = Ranker.getHand(hand, Ranker.ACE_TO_SIX); result.ranking.should.eql(HandRanking.STRAIGHT_FLUSH); result.playingCards[0].rank.should.eql(Card.RANK_FIVE); }); }); describe('ace low', function(){ it('should evaluate 5s 4s 3s 2s As as a five high for CALIFORNIA_LOWBALL', function(){ var hand = ['5s', '4s', '3s', '2s', 'As']; var result = Ranker.getHand(hand, Ranker.CALIFORNIA_LOWBALL); result.ranking.should.eql(HandRanking.HIGH_CARD); result.playingCards[0].rank.should.eql(Card.RANK_FIVE); }); it('should order CALIFORNIA_LOWBALL hands correctly', function(){ var hand1 = {id: 1, cards: ['As', '6c', '4s', '3s', '2s']}; // win var hand2 = {id: 2, cards: ['7s', '5d', '4d', '3d', '2d']}; // lose var results = Ranker.orderHands([hand1, hand2], Ranker.CALIFORNIA_LOWBALL); results[0][0].id.should.eql(1); results[1][0].id.should.eql(2); }); }); describe('complex hands', function(){ it('should evaluate omaha hi/lo hands correctly', function(){ var board = ['7c', '6c', '2d', '5h', 'Ah']; var hand1 = {id: 1, cards: ['Jd', 'Js', 'Qd', 'Qs']}; var hand2 = {id: 2, cards: ['Ad', '6h', 'Jc', '9c']}; var hand3 = {id: 3, cards: ['7d', 'Qh', 'As', '2c']}; var hand4 = {id: 4, cards: ['Tc', 'Kh', '9s', '9d']}; var hands = [hand1, hand2, hand3, hand4]; var results = Ranker.orderHands(hands, board, Ranker.OMAHA_HI_LO); results[Ranker.HIGH][0][0].id.should.eql(3); [2 , 3].should.include(results[Ranker.LOW][0][0].id); [2 , 3].should.include(results[Ranker.LOW][0][1].id); }); it('should evaluate seven card stud hi/lo hands correctly', function(){ var hand1 = {id: 1, cards: ['Js', '7d', '4c', '3c', 'Qc', '3s', 'Td']}; var hand2 = {id: 2, cards: ['7h', '6h', 'Th', '9s', 'Ks', 'Kc', '4d']}; var hand3 = {id: 3, cards: ['2s', 'Ah', '2d', '2c', '6s', 'Ts', 'Qd']}; var hand4 = {id: 4, cards: ['5c', '4s', 'Ac', '3d', '8d', 'Jd', 'Jc']}; var hand5 = {id: 5, cards: ['8h', 'Ad', '5h', '4h', '3h', '8c', '8s']}; var hand6 = {id: 6, cards: ['As', 'Qs', 'Tc', 'Kh', 'Jh', '2h', '5s']}; var hands = [hand1, hand2, hand3, hand4, hand5, hand6]; var results = Ranker.orderHands(hands, Ranker.STUD_HI_LO); results[Ranker.HIGH][0][0].id.should.eql(6); [4 , 5].should.include(results[Ranker.LOW][0][0].id); [4 , 5].should.include(results[Ranker.LOW][0][1].id); }); }); }); });