# Simulate `index.js` allows for running multiple random simulations of Pokemon battles for testing or benchmarking purposes. Without any arguments, `index.js` will run 100 random battles and report any errors that occur. Using any flag will trigger [minimist](https://github.com/substack/minimist) to be installed if it has not been already. ## multi The `multi` subcommand (alias: `random`) allows for configuring the amount of battles played, which formats are used, how they are run, and what to output. ### General - **`--num`**: play a specific number of games for a format instead of the default 100. - **`--seed`**: PRNG seed to use (eg. `'1234,5678,9012,3456'`). - **`--output`**: makes the harness display the _output_ logs of each battle it runs. - **`--input`**: dump the battle _input_ logs of each battle it runs. - **`--error`**: dump the battle _input_ logs of each battle which errors. ### Format By default, the harness will select the format of the next game it runs randomly based on its initial `--seed`. Alternatively, it can run games all in the same format, cycle through the formats or run all formats. - **`--format`**: play the specified format for each of the games it runs. Note that the harness only supports formats where the team can be randomly generated. - **`--cycle`**: cycles through the possible formats, playing one battle in each `--num` battles in total. - **`--all`**: plays every supported format `--num` times before moving on to the next format. ### Concurrency The harness runs games sequentially by default, but can be configured to run games asynchronously. - **`--async`**: runs each game concurrently instead of waiting for the previous game to complete before starting the next. Note that since battles run through the harness should not be blocking to begin with (battles naturally wait for players to make their decisions, but the AI's should be making decisions pretty much immediately), this mode is not expected to have large performance benefits over the default sequential mode and may require additional memory. **TODO**: Add support for running battles in `--parallel` on muliple cores with [`worker_threads`](https://nodejs.org/api/worker_threads.html). ## exhaustive The `exhaustive` subcommand cycles through all generations and game types, attempting to use as many different effects as possible in the battles it randomly simulates. This can be useful as a form of ['smoke testing'](https://en.wikipedia.org/wiki/Smoke_testing_\(software\)), a form of sanity testing/build verification which can be used to expose obvious critical issues with the application. Making it through a successful cycle of smoke tests does *not* mean the application is without bugs, or even that it is crash free - it simply provides some confidence that the application is less likely to catch fire. ### Flags - **`--format`** / **`--formats`**: play the specified format(s) instead of iterating through all possible formats. If multiple formats are specified, separate each format with a comma (eg. `format1,format2`). - **`--cycles`**: exhaust the pools of effects `--cycles` times instead of just once. If `--cycles` is negative, `--forever` is implied. - **`--forever`**: continue iterating through formats infinitely, exhausting each `--cycles` times. - **`--seed`**: PRNG seed to use (eg. `'1234,5678,9012,3456'`). - **`--maxFailures`**: exit early if this many failures have occured.