rpg-table-randomizer
Version:
Module for random tables for use in roleplaying games
253 lines (220 loc) • 8.34 kB
JavaScript
;
import { describe, it } from 'mocha';
import { expect } from 'chai';
import { stub } from 'sinon';
import RandomNameGenerator from '../src/RandomNameGenerator.js';
import RandomNameType from '../src/RandomNameType.js';
import RandomNameError from '../src/RandomNameError.js';
const orcType = new RandomNameType({
key: 'orc',
label: 'Orcish',
male: [
'oog',
'boog'
],
female: [
'oosh',
'boosh'
],
surname: [
'spike',
'flame'
]
});
const dwarfType = new RandomNameType({
key: 'dwarf',
label: 'Dwarvish',
male: [
'Thorin'
],
surname: [
'Hammer'
]
});
describe('RandomNameGenerator', function () {
it('it should register name type data', function () {
expect(orcType.getAllPersonalNames()).to.deep.equal([
'oog',
'boog',
'oosh',
'boosh'
]);
expect(orcType.getPersonalNameList('male')).to.deep.equal([
'oog',
'boog'
]);
expect(orcType.getPersonalNameList('female')).to.deep.equal([
'oosh',
'boosh'
]);
expect(orcType.getPersonalNameList('mixed')).to.deep.equal([
'oog',
'boog',
'oosh',
'boosh'
]);
expect(orcType.getPersonalNameList('random')).to.be.deep.oneOf([
[
'oog',
'boog'
],
[
'oosh',
'boosh'
]
]);
expect(dwarfType.getPersonalNameList('random')).to.deep.equal([
'Thorin'
]);
const generator = new RandomNameGenerator({
namedata: [
orcType
]
});
expect(generator.getValidNameTypes()).to.deep.equal(['orc']);
expect(generator.getRandomNameType()).to.equal('orc');
});
it('it should throw on invalid name type data for registerNameType', function () {
const generator = new RandomNameGenerator({});
expect(() => { generator.registerNameType('hello'); }).to.throw(RandomNameError, 'instance');
const type1 = new RandomNameType({});
expect(() => { generator.registerNameType(type1); }).to.throw(RandomNameError, 'key');
const type2 = new RandomNameType({
key: 'random'
});
expect(() => { generator.registerNameType(type2); }).to.throw(RandomNameError, 'reserved');
const type3 = new RandomNameType({
key: 'orc'
});
expect(() => { generator.registerNameType(type3); }).to.throw(RandomNameError, 'lists');
});
it('it should return a name for selectPersonalName', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
expect(generator.selectPersonalName('dwarf', 'male')).to.equal('Thorin');
expect(generator.selectPersonalName('orc', 'male')).to.be.oneOf(['Oog', 'Boog']);
expect(generator.selectPersonalName('orc', 'female')).to.be.oneOf(['Oosh', 'Boosh']);
expect(generator.selectPersonalName('orc')).to.be.oneOf(['Oog', 'Boog', 'Oosh', 'Boosh']);
// Invalid types
expect(() => { generator.selectPersonalName('elf'); }).to.throw(RandomNameError, 'Invalid name type');
expect(() => { generator.selectPersonalName('dwarf', 'female'); }).to.throw(RandomNameError, 'does not have subtype');
});
it('it should return a name for selectSurname', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
expect(generator.selectSurname('dwarf')).to.equal('Hammer');
expect(generator.selectSurname('orc')).to.be.oneOf(['Spike', 'Flame']);
expect(() => { generator.selectSurname('elf'); }).to.throw(RandomNameError, 'Invalid name type');
});
it('it should return a name for selectName', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
expect(generator.selectName('orc', 'male')).to.be.oneOf(['Oog Spike', 'Oog Flame', 'Boog Spike', 'Boog Flame']);
expect(generator.selectName('orc', 'female', 'first')).to.be.oneOf(['Oosh', 'Boosh']);
expect(generator.selectName('dwarf', 'random', 'first')).to.equal('Thorin');
expect(() => { generator.selectName('elf'); }).to.throw(RandomNameError, 'Invalid name type');
});
it('it should return a name for createPersonalName', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
const isMemoryKeySet = stub(generator._markov, 'isMemoryKeySet');
isMemoryKeySet.withArgs('orc_male').returns(false);
const learn = stub(generator._markov, 'learn');
const generate = stub(generator._markov, 'generate');
generate.withArgs('orc_male').returns('new orc name');
expect(generator.createPersonalName('orc', 'male')).to.equal('New Orc Name');
expect(learn.callCount).to.equal(2);
expect(learn.firstCall.args).to.deep.equal([
'orc_male',
'oog'
]);
});
it('it should return a name for createSurName', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
const isMemoryKeySet = stub(generator._markov, 'isMemoryKeySet');
isMemoryKeySet.withArgs('orc_surname').returns(false);
const learn = stub(generator._markov, 'learn');
const generate = stub(generator._markov, 'generate');
generate.withArgs('orc_surname').returns('new orc name');
expect(generator.createSurName('orc')).to.equal('New Orc Name');
expect(learn.callCount).to.equal(2);
expect(learn.firstCall.args).to.deep.equal([
'orc_surname',
'spike'
]);
});
it('it should return a name for createName', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
const createPersonalName = stub(generator, 'createPersonalName');
createPersonalName.withArgs('orc', 'male').returns('New Orc');
const createSurName = stub(generator, 'createSurName');
createSurName.withArgs('orc').returns('Name');
expect(generator.createName('orc', 'male')).to.equal('New Orc Name');
});
it('it should return names for generateList', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
const selectName = stub(generator, 'selectName');
selectName.withArgs('orc', 'male').returns('oof');
selectName.withArgs('orc', 'female').returns('boof');
expect(generator.generateList(2, 'orc')).to.deep.equal({
male: ['oof'],
female: ['boof']
});
});
it('it should create names for generateList', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
const createName = stub(generator, 'createName');
createName.withArgs('orc', 'male').returns('oof');
createName.withArgs('orc', 'female').returns('boof');
expect(generator.generateList(2, 'orc', true)).to.deep.equal({
male: ['oof'],
female: ['boof']
});
});
it('it should return names for nameTokenCallback', function () {
const generator = new RandomNameGenerator({
namedata: [
orcType,
dwarfType
]
});
expect(generator.nameTokenCallback(['name', 'orc', 'male', 'first'])).to.be.oneOf(['Oog', 'Boog']);
expect(generator.nameTokenCallback(['name', 'dwarf', 'female'])).to.equal('');
});
});