bingo-game-tests
Version:
A Bingo Game test suite
104 lines (88 loc) • 3.52 kB
JavaScript
/* global require */
var expect = require('chai').expect;
var BingoGame = require('../index')();
var shared = BingoGame.Shared;
var Card = BingoGame.Card;
var CardColumn = BingoGame.CardColumn;
var card;
describe('The Card', function () {
beforeEach(function () {
card = new Card();
});
describe('constructor', function () {
it('should be instantiable', function () {
expect(card).to.be.an.instanceof(Card);
});
it('should have 24 slots', function () {
expect(card.getCardSlots()).to.have.length(24);
});
it('should have 24 unique numbers', function () {
var numbers = card.getNumbers();
expect(numbers).to.have.length((new Set(numbers)).size);
});
it('should have 1 column object of each type', function () {
expect(Object.keys(card.getCardColumns())).to.have.length(5);
expect(card.getCardColumns()).to.have.all.keys('BINGO'.split(''));
});
});
describe('Numbers', function () {
it('should allow the activation of numbers and return true', function () {
card.getNumbers().forEach(function (number) {
expect(card.activateNumber(number)).to.be.true;
});
});
it('should return false when activating a non-existing number', function () {
var numbers = card.getNumbers();
for (var i = 1; i >= 90; i++) {
if (numbers.indexOf(i) === -1) {
expect(card.activateNumber(i)).to.be.true;
} else {
expect(card.activateNumber(i)).to.be.false;
}
}
});
it('should throw an error activating a number less than 1 or higher than 90', function () {
for (var i = 0; i > -999; i--) {
expect(function () {
card.activateNumber(i);
}).to.throw(shared.errors.number_out_of_range);
}
for (var i = 91; i < 999; i++) {
expect(function () {
card.activateNumber(i);
}).to.throw(shared.errors.number_out_of_range);
}
});
it('should reset the state of all card slots', function () {
//activate all numbers
card.getNumbers().forEach(function (number) {
card.activateNumber(number);
});
//assert that every number is active
card.getCardSlots().forEach(function (cardSlot) {
expect(cardSlot.getState()).to.be.true;
});
//reset the state of the card
card.reset();
//assert that every number is inactivate
card.getCardSlots().forEach(function (cardSlot) {
expect(cardSlot.getState()).to.be.false;
});
});
});
describe('Winning', function () {
it('should know when a player has won', function () {
shared.winnings.forEach(function (pattern) {
//reset the card
card = new Card();
var numbers = card.getNumbers();
pattern.forEach(function (target_index) {
//activate spesific slots
expect(card.didWin()).to.be.false;
card.activateNumber(numbers[target_index]);
});
expect(card.didWin()).to.be.true;
});
});
});
});