gluesql_test_suite/function/
lpad_rpad.rs

1use {
2    crate::*,
3    gluesql_core::{
4        error::{EvaluateError, TranslateError},
5        prelude::{Payload, Value::*},
6    },
7};
8
9test_case!(lpad_rpad, {
10    let g = get_tester!();
11
12    let test_cases = [
13        (
14            "CREATE TABLE Item (name TEXT DEFAULT LPAD('a', 5) || LPAD('b', 3))",
15            Ok(Payload::Create),
16        ),
17        ("INSERT INTO Item VALUES ('hello')", Ok(Payload::Insert(1))),
18        (
19            "CREATE TABLE NullName (name TEXT NULL)",
20            Ok(Payload::Create),
21        ),
22        ("INSERT INTO NullName VALUES (NULL)", Ok(Payload::Insert(1))),
23        (
24            "CREATE TABLE NullNumber (number INTEGER NULL)",
25            Ok(Payload::Create),
26        ),
27        (
28            "INSERT INTO NullNumber VALUES (NULL)",
29            Ok(Payload::Insert(1)),
30        ),
31        (
32            "SELECT LPAD(name, 10), RPAD(name, 10) FROM Item",
33            Ok(select!(
34                "LPAD(name, 10)"         | "RPAD(name, 10)"
35                Str                      | Str;
36                "     hello".to_owned()    "hello     ".to_owned()
37            )),
38        ),
39        (
40            "SELECT LPAD(name, 10, 'ab'), RPAD(name, 10, 'ab') FROM Item",
41            Ok(select!(
42                "LPAD(name, 10, 'ab')"   | "RPAD(name, 10, 'ab')"
43                Str                      | Str;
44                "ababahello".to_owned()    "helloababa".to_owned()
45            )),
46        ),
47        (
48            "SELECT LPAD(name, 3), RPAD(name, 3) FROM Item",
49            Ok(select!(
50                "LPAD(name, 3)"   | "RPAD(name, 3)"
51                Str               | Str;
52                "hel".to_owned()    "hel".to_owned()
53            )),
54        ),
55        (
56            "SELECT LPAD(name, 3, 'ab'), RPAD(name, 3, 'ab') FROM Item",
57            Ok(select!(
58                "LPAD(name, 3, 'ab')"   | "RPAD(name, 3, 'ab')"
59                Str                     | Str;
60                "hel".to_owned()          "hel".to_owned()
61            )),
62        ),
63        (
64            "SELECT LPAD(name, 10, 'ab') AS lpad FROM NullName",
65            Ok(select_with_null!(lpad; Null)),
66        ),
67        (
68            "SELECT RPAD(name, 10, 'ab') AS rpad FROM NullName",
69            Ok(select_with_null!(rpad; Null)),
70        ),
71        (
72            "SELECT LPAD('hello', number, 'ab') AS lpad FROM NullNumber",
73            Ok(select_with_null!(lpad; Null)),
74        ),
75        (
76            "SELECT RPAD('hello', number, 'ab') AS rpad FROM NullNumber",
77            Ok(select_with_null!(rpad; Null)),
78        ),
79        (
80            "SELECT LPAD('hello', 10, name) AS lpad FROM NullName",
81            Ok(select_with_null!(lpad; Null)),
82        ),
83        (
84            "SELECT RPAD('hello', 10, name) AS rpad FROM NullName",
85            Ok(select_with_null!(rpad; Null)),
86        ),
87        (
88            "SELECT LPAD(name) FROM Item",
89            Err(TranslateError::FunctionArgsLengthNotWithinRange {
90                name: "LPAD".to_owned(),
91                expected_minimum: 2,
92                expected_maximum: 3,
93                found: 1,
94            }
95            .into()),
96        ),
97        (
98            "SELECT RPAD(name) FROM Item",
99            Err(TranslateError::FunctionArgsLengthNotWithinRange {
100                name: "RPAD".to_owned(),
101                expected_minimum: 2,
102                expected_maximum: 3,
103                found: 1,
104            }
105            .into()),
106        ),
107        (
108            "SELECT LPAD(name, 10, 'ab', 'cd') FROM Item",
109            Err(TranslateError::FunctionArgsLengthNotWithinRange {
110                name: "LPAD".to_owned(),
111                expected_minimum: 2,
112                expected_maximum: 3,
113                found: 4,
114            }
115            .into()),
116        ),
117        (
118            "SELECT RPAD(name, 10, 'ab', 'cd') FROM Item",
119            Err(TranslateError::FunctionArgsLengthNotWithinRange {
120                name: "RPAD".to_owned(),
121                expected_minimum: 2,
122                expected_maximum: 3,
123                found: 4,
124            }
125            .into()),
126        ),
127        (
128            "SELECT LPAD(1, 10, 'ab') FROM Item",
129            Err(EvaluateError::FunctionRequiresStringValue("LPAD".to_owned()).into()),
130        ),
131        (
132            "SELECT RPAD(1, 10, 'ab') FROM Item",
133            Err(EvaluateError::FunctionRequiresStringValue("RPAD".to_owned()).into()),
134        ),
135        (
136            "SELECT LPAD(name, -10, 'ab') FROM Item",
137            Err(EvaluateError::FunctionRequiresUSizeValue("LPAD".to_owned()).into()),
138        ),
139        (
140            "SELECT RPAD(name, -10, 'ab') FROM Item",
141            Err(EvaluateError::FunctionRequiresUSizeValue("RPAD".to_owned()).into()),
142        ),
143        (
144            "SELECT LPAD(name, 10.1, 'ab') FROM Item",
145            Err(EvaluateError::FunctionRequiresIntegerValue("LPAD".to_owned()).into()),
146        ),
147        (
148            "SELECT RPAD(name, 10.1, 'ab') FROM Item",
149            Err(EvaluateError::FunctionRequiresIntegerValue("RPAD".to_owned()).into()),
150        ),
151    ];
152
153    for (sql, expected) in test_cases {
154        g.test(sql, expected).await;
155    }
156});