bracket-generator
Version:
Generate a tournament bracket.
237 lines (215 loc) • 7.93 kB
JavaScript
/* eslint-env mocha */
var BracketGenerator = require('../index')
var assert = require('assert')
var year = '2013'
var sport = 'ncaam'
var chalk = 'MW185463721432121W185463721432121S185463721432121E185463721432121FFMWSMW'
var upsets = 'MW16912131114101516131415161516W16912131114101516131415161516S16912131114101516131415161516E16912131114101516131415161516FFWEE'
var BracketValidator = require('bracket-validator')
var bd = require('bracket-data')
var bracketData = bd({year: year, sport: sport})
var finalGames = bracketData.constants.REGION_COUNT - 1
var firstRoundGames = bracketData.order.length - 1
var _ = require('lodash')
var intToBinary = function (i, length) {
typeof i === 'undefined' && (i = _.random(0, Math.pow(2, length)))
return _.padStart((i).toString(2), length, '0')
}
var intToRegionBinary = _.partialRight(intToBinary, firstRoundGames)
var intToFinalBinary = _.partialRight(intToBinary, finalGames)
// Creates a bracket with one defined region and everything else random
var fullBracketBinary = function (i) {
return [intToRegionBinary(i), intToRegionBinary(), intToRegionBinary(), intToRegionBinary(), intToFinalBinary()].join('')
}
describe('Bracket generator', function () {
it('generates a flat string bracket', function () {
var generator = new BracketGenerator({year: year, sport: sport})
assert.equal(true, typeof generator.generate() === 'string')
})
it('generates an all lower seeded bracket', function () {
var generator = new BracketGenerator({year: year, sport: sport, winners: 'lower'})
assert.equal(generator.generate(), chalk)
})
it('generates an all higher seeded bracket', function () {
var generator = new BracketGenerator({year: year, sport: sport, winners: 'higher'})
assert.equal(generator.generate(), upsets)
})
it('generates a bracket from a binary string', function () {
var generator = new BracketGenerator({year: year, sport: sport, winners: fullBracketBinary(4044)})
var bracket = generator.generate()
var validator = new BracketValidator({
year: year,
sport: sport,
testOnly: true,
allowEmpty: false,
flatBracket: bracket
})
var validated = validator.validate()
assert.equal(false, validated instanceof Error)
})
it('Can be reset', function () {
var generator = new BracketGenerator({year: year, sport: sport})
assert.equal(generator.generate('higher'), upsets)
assert.equal(generator.generate('lower'), chalk)
assert.notEqual(generator.generate('random'), chalk)
assert.notEqual(generator.generate('random'), upsets)
})
it('Can be validated', function () {
var generator = new BracketGenerator({year: year, sport: sport})
var validator = new BracketValidator({
year: year,
sport: sport,
testOnly: true,
allowEmpty: false
})
assert.equal(false, validator.validate(generator.generate('lower')) instanceof Error)
assert.equal(false, validator.validate(generator.generate('higher')) instanceof Error)
})
it('Random binary brackets can be validated', function () {
var iterations = 2000
var start = Math.max(0, Math.pow(2, firstRoundGames) - iterations)
var stop = start + iterations
for (var i = start, m = stop; i < m; i++) {
(function (i) {
var generator = new BracketGenerator({year: year, sport: sport, winners: fullBracketBinary(i)})
var bracket = generator.generate()
var validator = new BracketValidator({
year: year,
sport: sport,
testOnly: true,
allowEmpty: false,
flatBracket: bracket
})
var validated = validator.validate()
assert.equal(false, validated instanceof Error)
})(i)
}
})
it('Random brackets can be validated', function () {
var iterations = 2000
var start = Math.max(0, Math.pow(2, firstRoundGames) - iterations)
var stop = start + iterations
for (var i = start, m = stop; i < m; i++) {
(function () {
var generator = new BracketGenerator({year: year, sport: sport, winners: 'random'})
var bracket = generator.generate()
var validator = new BracketValidator({
year: year,
sport: sport,
testOnly: true,
allowEmpty: false,
flatBracket: bracket
})
var validated = validator.validate()
assert.equal(false, validated instanceof Error)
})(i)
}
})
})
describe('NBA', function () {
it('NBA brackets can be validated with bestof', function () {
for (var i = 0, m = 1000; i < m; i++) {
(function () {
var generator = new BracketGenerator({year: '2016', sport: 'nba', winners: 'random'})
var bracket = generator.generate()
var testValidator = new BracketValidator({
year: '2016',
sport: 'nba',
testOnly: true,
allowEmpty: false,
flatBracket: bracket
}).validate()
var bracketValidator = new BracketValidator({
year: '2016',
sport: 'nba',
allowEmpty: false,
flatBracket: bracket
}).validate()
assert.equal(false, testValidator instanceof Error)
assert.equal(bracket, testValidator)
_.each(bracketValidator, function (b) {
_.each(b.rounds, function (r, i) {
if (i > 0) {
_.each(r, function (g) {
assert.ok(g.winsIn)
assert.equal(typeof g.winsIn, 'number')
})
}
})
})
})(i)
}
})
})
describe('NHL', function () {
it('NHL brackets can be validated with bestof', function () {
for (var i = 0, m = 1000; i < m; i++) {
(function () {
var generator = new BracketGenerator({year: '2016', sport: 'nhl', winners: 'random'})
var bracket = generator.generate()
var testValidator = new BracketValidator({
year: '2016',
sport: 'nhl',
testOnly: true,
allowEmpty: false,
flatBracket: bracket
}).validate()
var bracketValidator = new BracketValidator({
year: '2016',
sport: 'nhl',
allowEmpty: false,
flatBracket: bracket
}).validate()
assert.equal(false, testValidator instanceof Error)
assert.equal(bracket, testValidator)
_.each(bracketValidator, function (b) {
_.each(b.rounds, function (r, i) {
if (i > 0) {
_.each(r, function (g) {
assert.ok(g.winsIn)
assert.equal(typeof g.winsIn, 'number')
})
}
})
})
})(i)
}
})
})
describe('World Cup', function () {
it('wc brackets can be validated with bestof', function () {
for (var i = 0, m = 1000; i < m; i++) {
(function () {
var generator = new BracketGenerator({year: '2018', sport: 'wcm', winners: 'random'})
var bracket = generator.generate()
var testValidator = new BracketValidator({
year: '2018',
sport: 'wcm',
testOnly: true,
allowEmpty: false,
flatBracket: bracket
}).validate()
var bracketValidator = new BracketValidator({
year: '2018',
sport: 'wcm',
allowEmpty: false,
flatBracket: bracket
}).validate()
assert.equal(false, testValidator instanceof Error)
assert.equal(bracket, testValidator)
_.each(bracketValidator, function (b) {
_.each(b.rounds, function (r, i) {
if (i > 0) {
_.each(r, function (g) {
assert.ok(g.winsIn)
assert.equal(typeof g.winsIn, 'number')
assert.ok(g.winsIn >= 1)
assert.ok(g.winsIn <= 3)
})
}
})
})
})(i)
}
})
})