mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-03-21 17:25:10 -05:00
Random Battles: Add basic unit test framework
This will save me a lot of time typing in `/eval`s on localhost to test, and also hopefully catch regressions!
This commit is contained in:
parent
8a587b1746
commit
ffd0092bfb
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"spec": ["test/main.js", "test/lib/**/*.js", "test/server/**/*.js", "test/sim/**/*.js", "test/tools/**/*.js"],
|
"spec": ["test/main.js", "test/lib/**/*.js", "test/server/**/*.js", "test/sim/**/*.js", "test/tools/**/*.js", "test/random-battles/**/*.js"],
|
||||||
"grep": "^((?!\\(slow\\)).)*$",
|
"grep": "^((?!\\(slow\\)).)*$",
|
||||||
"reporter": "dot",
|
"reporter": "dot",
|
||||||
"ui": "bdd",
|
"ui": "bdd",
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,4 @@ server/chat-plugins/scavenger*.ts @xfix @sparkychildcharlie
|
||||||
server/chat-plugins/the-studio.ts @KrisXV
|
server/chat-plugins/the-studio.ts @KrisXV
|
||||||
server/chat-plugins/trivia.ts @AnnikaCodes
|
server/chat-plugins/trivia.ts @AnnikaCodes
|
||||||
server/modlog.ts @monsanto
|
server/modlog.ts @monsanto
|
||||||
|
test/random-battles/* @AnnikaCodes
|
||||||
|
|
|
||||||
37
test/random-battles/gen8.js
Normal file
37
test/random-battles/gen8.js
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
/**
|
||||||
|
* Tests for Gen 8 randomized formats
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const {testSet} = require('./tools');
|
||||||
|
const assert = require('../assert');
|
||||||
|
|
||||||
|
describe('[Gen 8] Random Battle', () => {
|
||||||
|
const options = {format: 'gen8randombattle'};
|
||||||
|
|
||||||
|
it('should not generate Golisopod without Bug STAB', () => {
|
||||||
|
testSet('golisopod', options, set => {
|
||||||
|
assert(set.moves.some(m => {
|
||||||
|
const move = Dex.getMove(m);
|
||||||
|
return move.type === 'Bug' && move.category !== 'Status';
|
||||||
|
}), `Golisopod should get Bug STAB (got ${set.moves})`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('[Gen 8] Random Doubles Battle', () => {
|
||||||
|
const options = {format: 'gen8randomdoublesbattle'};
|
||||||
|
|
||||||
|
it('should never generate Melmetal without Body Press', () => {
|
||||||
|
testSet('melmetal', options, set => {
|
||||||
|
assert(set.moves.includes('bodypress'), `Melmetal should get Body Press (got ${set.moves})`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('[Gen 8] Random Battle (No Dmax)', () => {
|
||||||
|
// No tests here yet!
|
||||||
|
// This format is extremely new; this will be filled in later when I have to fix No Dmax bugs.
|
||||||
|
|
||||||
|
// const options = {format: 'gen8randombattlenodmax', isDynamax: true};
|
||||||
|
});
|
||||||
44
test/random-battles/tools.js
Normal file
44
test/random-battles/tools.js
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
/**
|
||||||
|
* Tools for testing Random Battles.
|
||||||
|
*
|
||||||
|
* @author Annika
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test helper for Pokemon sets
|
||||||
|
*
|
||||||
|
* @param {ID} pokemon the ID of the Pokemon whose set is to be tested
|
||||||
|
* @param {{format?: string, rounds?: number, isDoubles?: boolean, isLead?: boolean, isDynamax?: boolean}} options
|
||||||
|
* @param {(set: RandomTeamsTypes.RandomSet) => void} test a function called on each set
|
||||||
|
*/
|
||||||
|
function testSet(pokemon, options, test) {
|
||||||
|
const generator = Dex.getTeamGenerator(options.format);
|
||||||
|
const rounds = options.rounds || 1000;
|
||||||
|
|
||||||
|
const isDoubles = options.isDoubles || (options.format && options.format.includes('doubles'));
|
||||||
|
const isDynamax = options.isDynamax || !(options.format && options.format.includes('nodmax'));
|
||||||
|
for (let i = 0; i < rounds; i++) {
|
||||||
|
const set = generator.randomSet(pokemon, {}, options.isLead, isDoubles, isDynamax);
|
||||||
|
test(set);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test helper for Pokemon teams
|
||||||
|
*
|
||||||
|
* @param {{format?: string, rounds?: number}} options
|
||||||
|
* @param {(team: RandomTeamsTypes.RandomSet[]) => void} test a function called on each team
|
||||||
|
*/
|
||||||
|
function testTeam(options, test) {
|
||||||
|
const generator = Dex.getTeamGenerator(options.format);
|
||||||
|
const rounds = options.rounds || 1000;
|
||||||
|
|
||||||
|
for (let i = 0; i < rounds; i++) {
|
||||||
|
const team = generator.randomTeam();
|
||||||
|
test(team);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.testSet = testSet;
|
||||||
|
exports.testTeam = testTeam;
|
||||||
Loading…
Reference in New Issue
Block a user