gluesql_test_suite/function/
add_month.rs1use {
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});