SAPTest

CI codecov

Database and testing framework for Super Auto Pets.

Game information is queried from the Super Auto Pets Fandom wiki page and stored in a SQLite database.


Usage

Teams

Build a Team and simulate battles between them. ```rust use saptest::{ Pet, PetName, Food, FoodName, Team, TeamCombat, Position }; // Create a team. let mut team = Team::new( &vec![Some(Pet::tryfrom(PetName::Ant).unwrap()); 5], 5 ).unwrap(); let mut enemyteam = team.clone();

// Set a seed for a team. team.set_seed(Some(25));

// Give food to pets. team.setitem(Position::First, Food::tryfrom(FoodName::Garlic).ok()); enemyteam.setitem(Position::First, Food::try_from(FoodName::Garlic).ok());

// And fight! team.fight(&mut enemy_team); ```

Shops

Add shop functionality to a Team and roll, freeze, buy/sell pets and foods. ```rust use saptest::{ Shop, ShopItem, TeamShopping, Team, Position, Entity, EntityName, FoodName };

// All teams are constructed with a shop at tier 1. let mut team = Team::default();

// All shop functionality is supported. team.setshopseed(Some(1212)) .setshoppacks(&[Pack::Turtle]) .openshop().unwrap() .buy( &Position::First, // From first. &Entity::Pet, // Pet &Position::First // To first position, merging if possible. ).unwrap() .movepets( &Position::First, // First pet. &Position::Relative(-2), // To pet 2 slots behind. Otherwise, ignore. true // And merge them if possible. ).unwrap() .sell(&Position::First).unwrap() .freezeshop(&Position::Last, &Entity::Pet).unwrap() .rollshop().unwrap() .close_shop().unwrap();

// Shops can be built separately and can replace a team's shop. let mut tier5shop = Shop::new(3, Some(42)).unwrap(); let weakness = ShopItem::new( EntityName::Food(FoodName::Weak), 5 ).unwrap(); tier5shop.additem(weakness).unwrap(); team.replaceshop(tier5shop).unwrap(); ```

Pets

Build custom Pets and Effects. ```rust use saptest::{ Pet, PetName, PetCombat, Food, FoodName, Entity, Position, Effect, Statistics, effects::{ trigger::TRIGGERSTARTBATTLE, actions::GainType, state::Target, actions::Action } }; // Create known pets. let mut pet = Pet::try_from(PetName::Ant).unwrap();

// Or custom pets and effects. let customeffect = Effect::new( Entity::Pet, TRIGGERSTARTBATTLE, // Effect trigger Target::Friend, // Target Position::Adjacent, // Positions Action::Gain(GainType::DefaultItem(FoodName::Melon)), // Action Some(1), // Number of uses. false, // Is temporary. ); let mut custompet = Pet::custom( "MelonBear", Some("melonbear1".tostring()), Statistics::new(50, 50).unwrap(), &[custom_effect], );

// Fight two pets individually as well. // Note: Effects don't activate here. pet.attack(&mut custom_pet); ```

Logging

Enable logging with log4rs with build_log_config to view battle logic. ```rust use saptest::logging::buildlogconfig;

let config = buildlogconfig(); log4rs::init_config(config).unwrap();

// Code below. ... ```

Config

To configure the global SapDB's startup, create a .saptest.toml file in the root of your project. * Specify page versions for pets, foods, and tokens to query. * Toggle recurring updates on startup. * Set database filename.

```toml [database]

https://superautopets.fandom.com/wiki/Pets?oldid=4883

petsversion = 4883 filename = "./sap.db" updateon_startup = false ```


Benchmarks

Benchmarks for saptest are located in benches/battle_benchmarks.rs and run using the criterion crate. * Compared against sapai, a Super Auto Pets testing framework written in Python. * Both tests were run on an AMD Ryzen 5 5600 6-Core Processor @ 3.50 GHz.

```bash

saptest

cargo bench && open target/criterion/sapai_example/report/index.html ```

```bash

sapai

cd benches/ git clone https://github.com/manny405/sapai.git && cd sapai python setup.py install

Then run battle_benchmarks_sapai.ipynb.

```

saptest

sapai


TODO:


Sources