pub fn simple(n: usize) -> String {
let accounts = [
("Expenses:Food", "Assets:Bank:Checking"),
("Expenses:Transport", "Assets:Bank:Checking"),
("Expenses:Utilities", "Assets:Bank:Checking"),
("Expenses:Shopping", "Liabilities:CreditCard"),
("Income:Salary", "Assets:Bank:Checking"),
];
let mut out = String::with_capacity(n * 80);
for i in 0..n {
let (debit, credit) = accounts[i % accounts.len()];
let amount = 10 + (i % 490);
let day = (i % 28) + 1;
let month = (i % 12) + 1;
let year = 2020 + i / 336;
out.push_str(&format!(
"{:04}/{:02}/{:02} Payee {}\n {} $ {}\n {}\n\n",
year,
month,
day,
i % 100,
debit,
amount,
credit,
));
}
out
}
pub fn wide(n: usize) -> String {
let mut out = String::with_capacity(n * 90);
for i in 0..n {
let acct = format!("Expenses:Category{}", i % 500);
let amount = 10 + (i % 490);
let day = (i % 28) + 1;
let month = (i % 12) + 1;
let year = 2020 + i / 336;
out.push_str(&format!(
"{:04}/{:02}/{:02} Payee {}\n {} $ {}\n Assets:Bank:Checking\n\n",
year,
month,
day,
i % 100,
acct,
amount,
));
}
out
}
pub fn deep(n: usize) -> String {
let accounts = [
"Expenses:Food",
"Expenses:Transport",
"Expenses:Utilities",
"Expenses:Shopping",
];
let mut out = String::with_capacity(n * 200);
for i in 0..n {
let day = (i % 28) + 1;
let month = (i % 12) + 1;
let year = 2020 + i / 336;
out.push_str(&format!(
"{:04}/{:02}/{:02} Payee {}\n",
year,
month,
day,
i % 100
));
for (j, acct) in accounts.iter().enumerate() {
out.push_str(&format!(" {} $ {}\n", acct, 10 + (i + j) % 90));
}
out.push_str(" Assets:Bank:Checking\n\n");
}
out
}
pub fn multi_commodity(n: usize) -> String {
let commodities = ["USD", "EUR", "GBP"];
let mut out = String::with_capacity(n * 120);
for i in 0..n {
let commodity = commodities[i % commodities.len()];
let amount = 10 + (i % 490);
let day = (i % 28) + 1;
let month = (i % 12) + 1;
let year = 2020 + i / 336;
out.push_str(&format!(
"{:04}/{:02}/{:02} Payee {}\n Expenses:Foreign {} {}\n Assets:Bank:Checking {} -{}\n\n",
year, month, day, i % 100, commodity, amount, commodity, amount,
));
}
out
}
pub fn workloads() -> Vec<(&'static str, String)> {
vec![
("simple", simple(10_000)),
("wide", wide(10_000)),
("deep", deep(10_000)),
("multi_commodity", multi_commodity(10_000)),
]
}