#![cfg_attr(rustfmt, rustfmt_skip)]
use indoc::indoc;
use crate::kernel::Settings;
use crate::parser;
use tackler_rs::IndocUtils;
#[test]
fn ok_uncommon_accounts() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD
| a
|
|2019-01-01
| e 1 €
| a
|
|2019-01-01
| e 1 ¢
| a
|
|2019-01-01
| e 1 $
| a
|
|2019-01-01
| e 1 £
| a
|
|2019-01-01
| e 1 ¥
| a
|
|2019-01-01
| e 1 ¤
| a
|
|2019-01-01
| e 1 Au·µg
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 8);
}
#[test]
fn ok_commodity_and_comment_parse() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD; comment
| a
|
|2017-01-01
| e 1 USD ; comment
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 2);
}
#[test]
fn ok_closing_position() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD @ 1.20 EUR
| a
|
|2019-01-01
| e 1 USD @ 1 €
| a
|
|2019-01-01
| e 1 € @ 1 $
| a
|
|2019-01-01
| e 1 $ @ 1 £
| a
|
|2019-01-01
| e 1 £ @ 1 ¥
| a
|
|2019-01-01
| e 1 ¥ @ 1 ¢
| a
|
|2019-01-01
| e 1 ¢ @ 1 Au·µg
| a
|
|2019-01-01
| e 1 Au·µg @ 1 EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 8);
}
#[test]
fn ok_commodity_and_comment_closing_pos_parse() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD @ 1.20 EUR; comment
| a
|
|2017-01-01
| e 1 USD @ 1.20 EUR ; comment
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 2);
}
#[test]
fn ok_opening_with_pnl() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {1.20 EUR}
| a
|
|2017-01-01
| e -1 USD {1.20 EUR}
| a
|
|2019-01-01
| e 1 USD {1 €}
| a
|
|2019-01-01
| e 1 € { 1 $ }
| a
|
|2019-01-01
| e 1 $ {1 £ }
| a
|
|2019-01-01
| e 1 £ { 1 ¥}
| a
|
|2019-01-01
| e 1 ¥ {1 ¢}
| a
|
|2019-01-01
| e 1 ¢ {1 Au·µg}
| a
|
|2019-01-01
| e 1 Au·µg {1 EUR}
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 9);
}
#[test]
fn ok_closing_position_2() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {1.20 EUR}; comment
| a
|
|2017-01-01
| e 1 USD {1.20 EUR} ; comment
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 2);
}
#[test]
fn ok_closing_position_3() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {1.20 EUR} @ 1.09 EUR
| a
|
|2017-01-01
| e -1 USD {1.20 EUR} @ 1.09 EUR
| a
|
|2019-01-01
| e 1 USD {1 €} @ 1.09 €
| a
|
|2019-01-01
| e 1 € { 1 $ } @ 1.09 $
| a
|
|2019-01-01
| e 1 $ {1 £ } @ 1.09 £
| a
|
|2019-01-01
| e 1 £ { 1 ¥} @ 1.09 ¥
| a
|
|2019-01-01
| e 1 ¥ {1 ¢} @ 1.09 ¢
| a
|
|2019-01-01
| e 1 ¢ {1 Au·µg} @ 1.09 Au·µg
| a
|
|2019-01-01
| e 1 ⁴ {1 EUR} @ 1.09 EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 9);
}
#[test]
fn ok_closing_position_4() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {1.20 EUR} @ 1.09 EUR; comment
| a
|
|2017-01-01
| e 1 USD {1.20 EUR} @ 1.09 EUR ; comment
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_ok());
assert_eq!(res.unwrap().len(), 2);
}
#[test]
fn err_unit_cost() {
let txns_str =
indoc!("|
|2017-01-01
| e 1.12 USD {-1.00 EUR}
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_unit_price() {
let txns_str =
indoc!("|
|2019-01-01
| e 1 € @ -1.2 $
| a 1.2 $
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
let msg = res.err().unwrap().to_string();
assert!(msg.contains("Unit price"));
assert!(msg.contains("is negative"));
}
#[test]
fn err_unit_price_commodity() {
let txns_str =
indoc!("|
|2019-01-01
| e 1 € @ 1 €
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_unit_price_commodities() {
let txns_str =
indoc!("|
|2019-01-01
| e 1 € @ 1 $
| a 1 € @ 1 £
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
let msg = res.err().unwrap().to_string();
assert!(msg.contains("Different commodities without"));
}
#[test]
fn err_total_cost() {
let txns_str =
indoc!("|
|2019-01-01
| e -1 $ = 1 €
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
let msg = res.err().unwrap().to_string();
assert!(msg.contains("Total cost"));
assert!(msg.contains("different sign"));
}
#[test]
fn err_total_cost_2() {
let txns_str =
indoc!("|
|2019-01-01
| e 1 $ = -1 €
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
let msg = res.err().unwrap().to_string();
assert!(msg.contains("Total cost"));
assert!(msg.contains("different sign"));
}
#[test]
fn err_total_cost_3() {
let txns_str =
indoc!("|
|2019-01-01
| e 1 € = 1 €
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
assert!(res.err().unwrap().to_string().contains("Both commodities are same for value position [€]"));
}
#[test]
fn err_total_cost_4() {
let txns_str =
indoc!("|
|2019-01-01
| e 1 € = 1 $
| a 1 € = 1 £
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
assert!(res.err().unwrap().to_string().contains("Different commodities without"));
}
#[test]
fn err_parse() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_parse_2() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 @ 1 EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_parse_3() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD @ 2
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_parse_4() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD @ EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_parse_5() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {1.00} @ 1.20 EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_parse_6() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {EUR} @ 1.20 EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}
#[test]
fn err_parse_7() {
let txns_str =
indoc!("|
|2017-01-01
| e 1 USD {1.00 EUR} 1.20 EUR
| a
|
|").strip_margin();
let res = parser::string_to_txns(&mut txns_str.as_str(), &mut Settings::default());
assert!(res.is_err());
}