diff --git a/__tests__/commands/Attribute.js b/__tests__/commands/Attribute.js new file mode 100644 index 0000000..3b7112e --- /dev/null +++ b/__tests__/commands/Attribute.js @@ -0,0 +1,115 @@ +require('module-alias/register'); +const rewire = require('rewire'); +const rewireUtils = rewire('@Commands/Attribute'); +const Attribute = require('@Commands/Attribute'); +const HandleNamedAttributes = rewireUtils.__get__('HandleNamedAttributes'); +const getAttributeLevel = rewireUtils.__get__('getAttributeLevel'); +const getAttribute = rewireUtils.__get__('getAttribute'); +const handleAttributeCheck = rewireUtils.__get__('handleAttributeCheck'); +test('getAttribute should return Object', () => { + const obj = { id: 'mut', kuerzel: 'MU', name: 'Mut' }; + expect(getAttribute('KK')).toEqual( + expect.objectContaining({ + id: expect.any(String), + kuerzel: expect.any(String), + name: expect.any(String), + }) + ); + expect(getAttribute('MU')).toEqual(obj); + expect(getAttribute('mut')).toEqual(obj); +}); +it('should return undefined', () => { + expect(getAttribute()).toBeUndefined(); +}); + +it('returns a number ', () => { + expect(getAttributeLevel({ attributes: [{ id: 'mut', level: 8 }] }, { id: 'mut' })).toBe(8); +}); + +it('should return an object', () => { + const Character = { + attributes: [{ id: 'mut', level: 8 }], + }; + expect(HandleNamedAttributes({ Character: Character, args: ['mut'] })).toEqual({ + Name: 'Mut', + Level: 8, + }); +}); + +it('should return with no errors', () => { + const reply = jest.fn(str => str); + const message = { + reply: reply, + author: { + tag: 'test', + }, + }; + const docs = [{ character: { attributes: [{ id: 'mut', level: 8 }] } }]; + const args = ['mut']; + expect(handleAttributeCheck(docs, { message, args })).toEqual(expect.any(String)); +}); +it('should return with no errors', () => { + const reply = jest.fn(str => str); + const message = { + reply: reply, + author: { + tag: 'test', + }, + }; + const docs = [{ character: { attributes: [{ id: 'mut', level: 8 }] } }]; + const args = ['MU']; + expect(handleAttributeCheck(docs, { message, args })).toEqual(expect.any(String)); +}); +it('should return with no errors', () => { + const reply = jest.fn(str => str); + const message = { + reply: reply, + author: { + tag: 'test', + }, + }; + const docs = [{ character: { attributes: [{ id: 'mut', level: 8 }] } }]; + const args = [8]; + for (let i = 0; i < 30; i++) { + expect(handleAttributeCheck(docs, { message, args })).toEqual(expect.any(String)); + } +}); +it('should return with no errors', () => { + const reply = jest.fn(str => str); + const message = { + reply: reply, + author: { + tag: 'test', + }, + }; + const docs = [{ character: { attributes: [{ id: 'mut', level: 8 }] } }]; + const args = [8, '+2']; + for (let i = 0; i < 30; i++) { + expect(handleAttributeCheck(docs, { message, args })).toEqual(expect.any(String)); + } +}); +it('should return empty', () => { + const message = { author: { tag: 'test' } }; + const args = ['MU']; + expect(Attribute.exec(message, args)).toEqual(expect.objectContaining({})); +}); +/* + +const reply = jest.fn(str => str); +const message = { + reply: reply, + author: { + tag: 'test', + }, +}; +const docs = [{ character: { attributes: [{ id: 'mut', level: 8 }] } }]; +const args = ['MU']; +const run = []; +for (let i = 1; i < 100; i++) { + run.push(i); +} + +test.each(run)('run multiple times (%s)', () => { + expect(handleAttributeCheck(docs, { message, args })).toEqual(expect.any(String)); +}); +*/ diff --git a/commands/Attribute.js b/commands/Attribute.js index 7a3ff41..bc11f90 100644 --- a/commands/Attribute.js +++ b/commands/Attribute.js @@ -1,116 +1,88 @@ -const globals = require('../globals'); -const { CountOccurences } = require('@dsabot/CountOccurences'); -const Random = require('random'); -const db = globals.db; - -module.exports = { - name: 'attribute', - description: '', - aliases: ['ap', 'ep'], - usage: ' / ', - needs_args: true, - async exec(message, args) { - let Attribute; - let AttributeName; - let Level = 8; - await db.find( - { - user: message.author.tag, - }, - async (err, docs) => { - // user calls with text, let's look him up in the database. - if (isNaN(args[0])) { - Attribute = HandleNamedAttributes({ - Character: docs[0].character, - args: args, - }); - AttributeName = Attribute.Name; - Level = Attribute.Level; - } else { - Level = args[0]; - } - Random.use(message.author.tag); - - const dice = []; - dice.push(Random.int(1, 20)); - if (dice[0] === 1 || dice[0] === 20) { - dice.push(Random.int(1, 20)); - } - // handle crits - if (CountOccurences(dice, 1) === 2) { - message.reply( - `Du hast einen kritischen Erfolg erzielt (${dice.join(', ')})! πŸŽ‰πŸ₯³πŸŽ†` - ); - return; - } else if (CountOccurences(dice, 20) === 2) { - message.reply( - 'Du hast einen Patzer (' + - dice.join(', ') + - ')! 😭 Viel Erfolg beim nΓ€chsten mal!' - ); - return; - } - if ( - (dice.length == 2 && dice[0] != 20 && dice[1] <= Level) || - (dice.length == 1 && dice[0] <= Level) - ) { - if (AttributeName) { - message.reply( - 'Du hast die Probe auf ' + - AttributeName + - ' (Stufe ' + - Level + - ') bestanden.\n' + - 'Deine 🎲: ' + - dice.join(', ') - ); - } else { - message.reply( - 'Du hast die Probe (Stufe ' + - Level + - ') bestanden.\n' + - 'Deine 🎲: ' + - dice.join(', ') - ); - } - } else if (AttributeName) { - message.reply( - 'Du hast die Probe auf ' + - AttributeName + - ' (Stufe ' + - Level + - ') leider nicht bestanden 😒.\n' + - 'Deine 🎲: ' + - dice.join(', ') - ); - } else { - message.reply( - `Du hast die Probe (Stufe ${Level}) leider nicht bestanden 😒.\nDeine 🎲: ${dice.join( - ', ' - )}` - ); - } - } - ); - }, -}; - -function HandleNamedAttributes({ Character: Character = [], args: args = [] } = {}) { - let Attribute = getAttribute(args[0]); - let Level = getAttributeLevel(Character, Attribute) || 8; - - return { - Name: Attribute.name, - Level: Level, - }; -} - -function getAttributeLevel(Character = {}, Attribute = {}) { - return Character.attributes.find(attribute => attribute.id === Attribute.id).level; -} - -function getAttribute(attribute = '') { - return attribute.length === 2 - ? globals.Werte.find(a => a.kuerzel === attribute.toUpperCase()) - : globals.Werte.find(a => a.name.toLowerCase() === attribute.toLowerCase()); -} +require('module-alias/register'); +const globals = require('../globals'); +const db = globals.db; +const { roll } = require('@dsabot/Roll'); +const { findMessage } = require('@dsabot/findMessage'); +const { CompareResults } = require('@dsabot/CompareResults'); + +function handleAttributeCheck(docs, { message, args }) { + let Attribute = isNaN(args[0]) + ? HandleNamedAttributes({ Character: docs[0].character, args: args }) + : null; + let Level = Attribute ? Attribute.Level : args[0] || 8; + let Bonus = parseInt(args[1]) || 0; + let dice = roll(2, 20, message.author.tag).dice; + const Result = CompareResults(dice, [Level, Level], Bonus); + + // handle crits + if (Result.CriticalHit === 2) { + return message.reply( + `${findMessage('TITLE_CRIT_SUCCESS')}\n${findMessage('MSG_CRIT_SUCCESS')}` + ); + } + if (Result.Fumbles === 2) { + return message.reply( + `${findMessage('TITLE_CRIT_FAILURE')}\n${findMessage('MSG_CRIT_FAILURE')}` + ); + } + + // every + if (dice[0] + Bonus > Level) { + return message.reply( + `Du hast die Probe (Stufe ${Level}) leider nicht bestanden 😒.\nDeine 🎲: ${dice[0]} ${ + Bonus ? `+${Bonus}` : '' + }` + ); + } + if (Attribute) { + return message.reply( + `Du hast die Probe auf ${Attribute.Name} (Stufe ${ + Attribute.Level + }) bestanden. Deine 🎲: ${dice[0]} ${Bonus ? `+${Bonus}` : ''}` + ); + } + + return message.reply( + `Du hast die Probe (Stufe ${Level}) bestanden. Deine 🎲: ${dice[0]} ${ + Bonus ? `+${Bonus}` : '' + }` + ); +} + +function HandleNamedAttributes({ Character: Character = [], args: args = [] } = {}) { + let Attribute = getAttribute(args[0]); + let Level = getAttributeLevel(Character, Attribute) || 8; + + return { + Name: Attribute.name, + Level: Level, + }; +} + +function getAttributeLevel(Character = {}, Attribute = {}) { + return Character.attributes.find(attribute => attribute.id === Attribute.id).level; +} + +function getAttribute(attribute = '') { + return attribute.length === 2 + ? globals.Werte.find(a => a.kuerzel === attribute.toUpperCase()) + : globals.Werte.find(a => a.name.toLowerCase() === attribute.toLowerCase()); +} + +module.exports = { + name: 'attribute', + description: '', + aliases: ['ap', 'ep'], + usage: ' / ', + needs_args: true, + async exec(message, args) { + db.find({ user: message.author.tag }, (err, docs) => { + if (err) { + message.reply(findMessage('ERROR')); + throw new Error(err); + } + handleAttributeCheck(docs, { message, args }); + }); + }, +}; +