timhaley94/holdem

View on GitHub
server/src/domain/purse/index.test.js

Summary

Maintainability
A
3 hrs
Test Coverage
const Purse = require('./index');

describe('Domain.Purse', () => {
  describe('.create()', () => {
    it('can handle bankroll arg', () => {
      const bankroll = Purse.DEFAULT_BANKROLL * 2;

      expect(
        Purse.create(bankroll).bankroll,
      ).toEqual(bankroll);
    });

    it('can use default bankroll', () => {
      expect(
        Purse.create().bankroll,
      ).toEqual(
        Purse.DEFAULT_BANKROLL,
      );
    });
  });

  describe('.bet()', () => {
    it('errors on negative value', () => {
      expect(
        () => {
          Purse.bet(
            Purse.create(),
            -1,
          );
        },
      ).toThrow();
    });

    it('ignores zero bet', () => {
      expect(
        Purse.bet(Purse.create(), 0).wagered,
      ).toEqual(0);
    });

    it('handles normal bet', () => {
      expect(
        Purse.bet(
          Purse.create(),
          1,
        ).wagered,
      ).toEqual(1);
    });

    it('ignores zero bet after normal bet', () => {
      expect(
        Purse.bet(
          Purse.bet(
            Purse.create(),
            1,
          ),
          0,
        ).wagered,
      ).toEqual(1);
    });

    it('handles all in bet', () => {
      expect(
        Purse.bet(
          Purse.create(),
          Purse.DEFAULT_BANKROLL + 1,
        ).wagered,
      ).toEqual(Purse.DEFAULT_BANKROLL);
    });
  });

  describe('.allIn()', () => {
    it('handles all in call', () => {
      expect(
        Purse.allIn(
          Purse.create(),
        ).wagered,
      ).toEqual(Purse.DEFAULT_BANKROLL);
    });

    it('handles second call', () => {
      expect(
        Purse.allIn(
          Purse.allIn(
            Purse.create(),
          ),
        ).wagered,
      ).toEqual(Purse.DEFAULT_BANKROLL);
    });

    it('handles all in call after normal bet', () => {
      expect(
        Purse.allIn(
          Purse.bet(
            Purse.create(),
            1,
          ),
        ).wagered,
      ).toEqual(Purse.DEFAULT_BANKROLL);
    });
  });

  describe('.resolve()', () => {
    const resolve = (bet, winnings) => Purse.resolve(
      Purse.win(
        Purse.bet(
          Purse.create(),
          bet,
        ),
        winnings,
      ),
    );
    it('handles 0 wager', () => {
      expect(
        resolve(0, 0),
      ).toEqual(Purse.DEFAULT_BANKROLL);
    });

    it('handles lost wager', () => {
      expect(
        resolve(1, 0),
      ).toEqual(Purse.DEFAULT_BANKROLL - 1);
    });

    it('handles winnings', () => {
      expect(
        resolve(1, 2),
      ).toEqual(Purse.DEFAULT_BANKROLL + 1);
    });

    it('handles all in', () => {
      expect(
        Purse.resolve(
          Purse.win(
            Purse.allIn(
              Purse.create(),
            ),
            0,
          ),
        ),
      ).toEqual(0);
    });
  });

  describe('.isAllIn()', () => {
    it('returns true if all in', () => {
      const p = Purse.allIn(
        Purse.create(),
      );

      expect(
        Purse.isAllIn(p),
      ).toEqual(true);
    });

    it('returns false if not all in', () => {
      const p = Purse.bet(
        Purse.create(),
        1,
      );

      expect(
        Purse.isAllIn(p),
      ).toEqual(false);
    });

    it('returns false if bankroll is zero', () => {
      const p = Purse.create();
      p.bankroll = 0;

      expect(
        Purse.isAllIn(p),
      ).toEqual(false);
    });
  });

  describe('.isBankrupt()', () => {
    it('returns true if bankroll is zero', () => {
      const p = Purse.create();
      p.bankroll = 0;

      expect(
        Purse.isBankrupt(p),
      ).toEqual(true);
    });

    it('returns false if bankroll is nonzero', () => {
      expect(
        Purse.isBankrupt(Purse.create()),
      ).toEqual(false);
    });
  });
});