dicebot
Version:
A simple function which takes a `string` (or `number`) and returns some dice stats
118 lines (81 loc) • 2.84 kB
JavaScript
const roll = require('.')
expect.extend({
toBeBetween (result, min, max) {
const pass = result >= min && result <= max
return {
pass,
message: () => `expected ${result} to be between ${min} and ${max} but it was not`
}
}
})
test('a number', () => {
const result = roll(6)
expect(result.values.length).toBe(1)
expect(result.values[0]).toBeBetween(1, 6)
expect(result.sum).toBeBetween(1, 6)
expect(result.average).toBeBetween(1, 6)
})
test('multiple numbers', () => {
const result = roll('6 6 6')
expect(result.values.length).toBe(3)
expect(result.values[0]).toBeBetween(1, 6)
expect(result.values[1]).toBeBetween(1, 6)
expect(result.values[2]).toBeBetween(1, 6)
expect(result.sum).toBeBetween(1, 3 * 6)
expect(result.average).toBeBetween(1, 3 * 6)
})
test('dY', () => {
const result = roll('D6')
expect(result.values.length).toBe(1)
expect(result.values[0]).toBeBetween(1, 6)
expect(result.sum).toBeBetween(1, 6)
expect(result.average).toBeBetween(1, 6)
})
test('XDY XdY', () => {
const result = roll('4D6 4d6')
expect(result.values.length).toBe(8)
expect(result.values[0]).toBeBetween(1, 6)
expect(result.values[2]).toBeBetween(1, 6)
expect(result.values[3]).toBeBetween(1, 6)
expect(result.values[4]).toBeBetween(1, 6)
expect(result.values[5]).toBeBetween(1, 6)
expect(result.values[6]).toBeBetween(1, 6)
expect(result.values[7]).toBeBetween(1, 6)
expect(result.sum).toBeBetween(8, 8 * 24)
expect(result.average).toBeBetween(1, 8 * 24)
})
test('arithmetic XdY', () => {
const result = roll('10*(4d6+50)')
expect(result.values.length).toBe(1)
expect(result.values[0]).toBeBetween(10 * (4 + 50), 10 * (24 + 50))
expect(result.sum).toBeBetween(10 * (4 + 50), 10 * (24 + 50))
expect(result.average).toBeBetween(10 * (4 + 50), 10 * (24 + 50))
})
test('strings (with ds)', () => {
const result = roll('heads tails')
expect(result.values.length).toBe(1)
expect(['heads', 'tails']).toContain(result.values[0])
expect(result.sum).toBe(0)
expect(result.average).toBe(0)
})
test('strings with d', () => {
const result = roll('a b c d3')
expect(result.values.length).toBe(1)
expect(['a', 'b', 'c', 1, 2, 3]).toContain(result.values[0])
expect(result.sum).toBeBetween(0, 3)
expect(result.average).toBeBetween(0, 3)
})
test('comma delimiter', () => {
const result = roll('a,b, c')
expect(result.values.length).toBe(1)
expect(['a', 'b', 'c']).toContain(result.values[0])
expect(result.sum).toBe(0)
expect(result.average).toBe(0)
})
test('performace 10,000 takes 1-2s 1,000,000 takes ~15s', () => {
const result = roll(' a'.repeat(10000))
expect(result.values.length).toBe(1)
expect(['a', 'b', 'c']).toContain(result.values[0])
expect(result.sum).toBe(0)
expect(result.average).toBe(0)
})