You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
8.0 KiB
299 lines
8.0 KiB
4 weeks ago
|
import test from 'ava'
|
||
|
import Chance from '../chance.js'
|
||
|
import _ from 'lodash'
|
||
|
|
||
|
const chance = new Chance()
|
||
|
|
||
|
// chance.coin()
|
||
|
test('coin() returns a coin', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/(heads|tails)/.test(chance.coin()))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d4()
|
||
|
test('d4() returns a properly bounded d4', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d4()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 4)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d6()
|
||
|
test('d6() returns a properly bounded d6', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d6()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 6)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d8()
|
||
|
test('d8() returns a properly bounded d8', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d8()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 8)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d10()
|
||
|
test('d10() returns a properly bounded d10', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d10()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 10)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d12()
|
||
|
test('d12() returns a properly bounded d12', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d12()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 12)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d20()
|
||
|
test('d20() returns a properly bounded d20', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d20()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 20)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d30()
|
||
|
test('d30() returns a properly bounded d30', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d30()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 30)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.d100()
|
||
|
test('d100() returns a properly bounded d100', t => {
|
||
|
_.times(1000, () => {
|
||
|
let die = chance.d100()
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 100)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
|
||
|
// chance.emotion()
|
||
|
test('emotion() returns a random emotion', t => {
|
||
|
_.times(1000, () => {
|
||
|
let emotion = chance.emotion()
|
||
|
t.true(_.isString(emotion))
|
||
|
t.true(emotion.length >= 2)
|
||
|
t.true(emotion.length <= 30)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.guid()
|
||
|
test('guid() returns a proper guid', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){8}(-([0-9a-fA-F]){4}){3}-([0-9a-fA-F]){12}/.test(chance.guid()))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('guid() returns a proper version 1 guid', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-1([0-9a-fA-F]){3}-([ab89])([0-9a-fA-F]){3}-([0-9a-fA-F]){12}/.test(chance.guid({ version: 1 })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('guid() returns a proper version 2 guid', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-2([0-9a-fA-F]){3}-([ab89])([0-9a-fA-F]){3}-([0-9a-fA-F]){12}/.test(chance.guid({ version: 2 })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('guid() returns a proper version 3 guid', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-3([0-9a-fA-F]){3}-([ab89])([0-9a-fA-F]){3}-([0-9a-fA-F]){12}/.test(chance.guid({ version: 3 })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('guid() returns a proper version 4 guid', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-4([0-9a-fA-F]){3}-([ab89])([0-9a-fA-F]){3}-([0-9a-fA-F]){12}/.test(chance.guid({ version: 4 })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('guid() returns a proper version 5 guid', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-5([0-9a-fA-F]){3}-([ab89])([0-9a-fA-F]){3}-([0-9a-fA-F]){12}/.test(chance.guid({ version: 5 })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.hash()
|
||
|
test('hash() returns a proper hash', t => {
|
||
|
_.times(1000, () => {
|
||
|
let hash = chance.hash()
|
||
|
t.true(/([0-9a-f]){40}/.test(hash))
|
||
|
t.is(hash.length, 40)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('hash() obeys length, if supplied', t => {
|
||
|
_.times(1000, () => {
|
||
|
let length = chance.natural({ min: 1, max: 64 })
|
||
|
let hash = chance.hash({ length: length })
|
||
|
t.is(hash.length, length)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.mac_address()
|
||
|
test('mac_address() returns a proper mac address', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}/.test(chance.mac_address()))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('mac_address() returns a proper colon separated mac address', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}:([0-9a-fA-F]){2}/.test(chance.mac_address({ separator: ':' })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('mac_address() returns a proper hyphen separated mac address', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){2}-([0-9a-fA-F]){2}-([0-9a-fA-F]){2}-([0-9a-fA-F]){2}-([0-9a-fA-F]){2}-([0-9a-fA-F]){2}/.test(chance.mac_address({ separator: '-' })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('mac_address() returns a proper network version mac address', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(/([0-9a-fA-F]){4}.([0-9a-fA-F]){4}.([0-9a-fA-F]){4}/.test(chance.mac_address({ networkVersion: true })))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.mixin()
|
||
|
test('mixin() works with a simple function', t => {
|
||
|
chance.mixin({
|
||
|
user: () => {
|
||
|
return {
|
||
|
first: chance.first(),
|
||
|
last: chance.last(),
|
||
|
email: chance.email()
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
t.truthy(chance.user)
|
||
|
_.times(1000, () => {
|
||
|
let user = chance.user()
|
||
|
t.truthy(user)
|
||
|
t.truthy(user.first)
|
||
|
t.true(_.isString(user.last))
|
||
|
t.true(_.isString(user.email))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('mixin() multiple work, we can call previously defined mixins', t => {
|
||
|
chance.mixin({
|
||
|
user: () => {
|
||
|
return {
|
||
|
first: chance.first(),
|
||
|
last: chance.last(),
|
||
|
email: chance.email()
|
||
|
}
|
||
|
},
|
||
|
social_user: () => {
|
||
|
let user = chance.user()
|
||
|
user.network = chance.pick(['facebook', 'twitter'])
|
||
|
return user
|
||
|
}
|
||
|
})
|
||
|
t.truthy(chance.user)
|
||
|
t.truthy(chance.social_user)
|
||
|
_.times(1000, () => {
|
||
|
let social_user = chance.social_user()
|
||
|
t.truthy(social_user)
|
||
|
t.truthy(social_user.first)
|
||
|
t.truthy(social_user.network)
|
||
|
t.true(social_user.network === 'facebook' ||
|
||
|
social_user.network === 'twitter')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.radio()
|
||
|
test('radio() works as expected', t => {
|
||
|
_.times(1000, () => {
|
||
|
let radio = chance.radio()
|
||
|
t.true(_.isString(radio))
|
||
|
t.is(radio.length, 4)
|
||
|
t.true(/^[KW][A-Z][A-Z][A-Z]/.test(radio))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('radio() accepts east', t => {
|
||
|
_.times(1000, () => {
|
||
|
let radio = chance.radio({ side: 'east' })
|
||
|
t.true(_.isString(radio))
|
||
|
t.is(radio.length, 4)
|
||
|
t.true(/^[W][A-Z][A-Z][A-Z]/.test(radio))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('radio() accepts west', t => {
|
||
|
_.times(1000, () => {
|
||
|
let radio = chance.radio({ side: 'west' })
|
||
|
t.true(_.isString(radio))
|
||
|
t.is(radio.length, 4)
|
||
|
t.true(/^[K][A-Z][A-Z][A-Z]/.test(radio))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.rpg()
|
||
|
test('rpg() appears to work as expected', t => {
|
||
|
_.times(1000, () => {
|
||
|
let dice = chance.rpg('5d20')
|
||
|
t.true(_.isArray(dice))
|
||
|
t.is(dice.length, 5)
|
||
|
dice.map((die) => {
|
||
|
t.true(die >= 1)
|
||
|
t.true(die <= 20)
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('rpg() without a die roll throws an error', t => {
|
||
|
t.throws(() => chance.rpg(), 'Chance: A type of die roll must be included')
|
||
|
})
|
||
|
|
||
|
test('rpg() throws errors where it should', t => {
|
||
|
const errorFns = [
|
||
|
() => chance.rpg('3'),
|
||
|
() => chance.rpg('hd23'),
|
||
|
() => chance.rpg('3d23d2'),
|
||
|
() => chance.rpg('d20')
|
||
|
]
|
||
|
errorFns.map((fn) => {
|
||
|
t.throws(fn, 'Chance: Invalid format provided. Please provide #d# where the first # is the number of dice to roll, the second # is the max of each die')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('rpg() will take and obey a sum', t => {
|
||
|
_.times(1000, () => {
|
||
|
let rpg = chance.rpg('4d20', { sum: true })
|
||
|
t.true(_.isNumber(rpg))
|
||
|
t.true(rpg >= 4)
|
||
|
t.true(rpg <= 80)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.tv()
|
||
|
test('tv() works as expected', t => {
|
||
|
_.times(1000, () => {
|
||
|
let tv = chance.tv()
|
||
|
t.true(_.isString(tv))
|
||
|
t.is(tv.length, 4)
|
||
|
t.true(/^[KW][A-Z][A-Z][A-Z]/.test(tv))
|
||
|
})
|
||
|
})
|