gluesql_test_suite/function/
add_month.rs

1use {
2    crate::*,
3    chrono::format::ParseErrorKind,
4    gluesql_core::{
5        error::EvaluateError,
6        prelude::{Error, Value},
7    },
8};
9
10test_case!(add_month, {
11    macro_rules! date {
12        ($date: expr) => {
13            $date.parse().unwrap()
14        };
15    }
16    fn assert_chrono_error_kind_eq(error: Error, kind: ParseErrorKind) {
17        match error {
18            Error::Evaluate(EvaluateError::FormatParseError(err)) => {
19                assert_eq!(err.kind(), kind)
20            }
21            _ => panic!("invalid error: {error}"),
22        }
23    }
24    let g = get_tester!();
25
26    g.named_test(
27        "plus test on general case",
28        "SELECT ADD_MONTH('2017-06-15',1) AS test;",
29        Ok(select!(
30            "test"
31            Value::Date;
32            date!("2017-07-15")
33        )),
34    )
35    .await;
36    g.named_test(
37        "minus test on general case",
38        "SELECT ADD_MONTH('2017-06-15',-1) AS test;",
39        Ok(select!(
40            "test"
41            Value::Date;
42            date!("2017-05-15")
43        )),
44    )
45    .await;
46    g.named_test(
47        "the last day of February test",
48        "SELECT ADD_MONTH('2017-01-31',1) AS test;",
49        Ok(select!(
50            "test"
51            Value::Date;
52            date!("2017-02-28")
53        )),
54    )
55    .await;
56    g.named_test(
57        "year change test",
58        "SELECT ADD_MONTH('2017-01-31',13) AS test;",
59        Ok(select!(
60            "test"
61            Value::Date;
62            date!("2018-02-28")
63        )),
64    )
65    .await;
66    g.named_test(
67        "zero test",
68        "SELECT ADD_MONTH('2017-01-31',0) AS test;",
69        Ok(select!(
70            "test"
71            Value::Date;
72            date!("2017-01-31")
73        )),
74    )
75    .await;
76    g.named_test(
77        "out of range test with i64::MAX",
78        "SELECT ADD_MONTH('2017-01-31',9223372036854775807) AS test;",
79        Err(EvaluateError::I64ToU32ConversionFailure("ADD_MONTH".to_owned()).into()),
80    )
81    .await;
82    g.named_test(
83        "out of range test",
84        "SELECT ADD_MONTH('2017-01-31',10000000000000000000) AS test;",
85        Err(EvaluateError::FunctionRequiresIntegerValue("ADD_MONTH".to_owned()).into()),
86    )
87    .await;
88    g.named_test(
89        "out of range test with i32::MAX",
90        "SELECT ADD_MONTH('2017-01-31',2147483648) AS test;",
91        Err(EvaluateError::ChrFunctionRequiresIntegerValueInRange0To255.into()),
92    )
93    .await;
94    let error_cases = [
95        (
96            g.run_err("SELECT ADD_MONTH('2017-01-31-10',0) AS test;")
97                .await,
98            chrono::format::ParseErrorKind::TooLong,
99        ),
100        (
101            g.run_err("SELECT ADD_MONTH('2017-01',0) AS test;").await,
102            chrono::format::ParseErrorKind::TooShort,
103        ),
104        (
105            g.run_err("SELECT ADD_MONTH('2015-14-05',1) AS test").await,
106            chrono::format::ParseErrorKind::OutOfRange,
107        ),
108    ];
109
110    for (error, kind) in error_cases {
111        assert_chrono_error_kind_eq(error, kind);
112    }
113});