1use super::*;
2use sqlx_pg_uint_macros::UIntWrapper;
3
4use crate::UIntType;
5
6impl UIntType for PgU16 {
7 type Uint = u16;
8}
9
10impl private::Sealed for PgU16 {}
11
12#[derive(Debug, PartialEq, Eq, Clone, Hash, PartialOrd, Ord, UIntWrapper, sqlx::FromRow)]
13pub struct PgU16 {
15 inner: BigDecimal,
16}
17
18impl From<PgU16> for u16 {
19 fn from(value: PgU16) -> Self {
20 value.inner.to_string().parse().unwrap()
21 }
22}
23
24impl From<u16> for PgU16 {
25 fn from(value: u16) -> Self {
26 Self {
27 inner: BigDecimal::from(value),
28 }
29 }
30}
31
32#[cfg(test)]
33mod pg_u16_tests {
34 use bigdecimal::num_bigint::BigInt;
35
36 use super::*;
37
38 #[test]
39 fn test_to_u16() {
40 let pg_u16 = PgU16::from(121u16);
41 assert_eq!(pg_u16.to_uint(), 121u16);
42 let pg_u16 = PgU16::from(0);
43 assert_eq!(pg_u16.to_uint(), 0u16);
44 let pg_u16 = PgU16::from(u16::MAX);
45 assert_eq!(pg_u16.to_uint(), u16::MAX);
46 }
47
48 #[test]
49 fn test_add() {
50 let pg_u16 = PgU16::from(12u16);
51 let pg_u162 = PgU16::from(12u16);
52 assert_eq!((pg_u16 + pg_u162).to_uint(), 24u16);
53
54 let pg_u16 = PgU16::from(0u16);
55 let pg_u162 = PgU16::from(0u16);
56 assert_eq!((pg_u16 + pg_u162).to_uint(), 0u16);
57 }
58
59 #[test]
60 #[should_panic]
61 fn test_add_overflow() {
62 let pg_u16 = PgU16::from(u16::MAX);
63 let pg_u162 = PgU16::from(1u16);
64 let _ = pg_u16 + pg_u162;
65 }
66
67 #[test]
68 #[should_panic]
69 fn test_add_underflow() {
70 let pg_u16 = PgU16::from(0u16);
71 let pg_u162 = PgU16::from(1u16);
72 let _ = pg_u16 - pg_u162;
73 }
74
75 #[test]
76 fn try_from_bigdecimal() {
77 let pg_u16 = PgU16::try_from(BigDecimal::from(126u16)).unwrap();
78 assert_eq!(pg_u16.to_uint(), 126u16);
79
80 let pg_u16 = PgU16::try_from(BigDecimal::from(0)).unwrap();
81 assert_eq!(pg_u16.to_uint(), 0u16);
82
83 let pg_u16 = PgU16::try_from(BigDecimal::from(u16::MAX)).unwrap();
84 assert_eq!(pg_u16.to_uint(), u16::MAX);
85
86 let pg_u16 = PgU16::try_from(BigDecimal::from(-1));
87 assert!(pg_u16.is_err());
88 let err = pg_u16.unwrap_err();
89 assert_eq!(err, Error::InvalidValue(BigDecimal::from(-1)));
90
91 let fractional = BigDecimal::from(3) / BigDecimal::from(2);
92 let pg_u16 = PgU16::try_from(fractional.clone());
93 assert_eq!(pg_u16.unwrap_err(), Error::Fractional(fractional));
94
95 let big_decimal = BigDecimal::from(BigInt::from(2).pow(128));
96 let pg_u16 = PgU16::try_from(big_decimal.clone());
97 assert_eq!(pg_u16.unwrap_err(), Error::InvalidValue(big_decimal));
98 }
99
100 #[test]
101 fn test_option_conversion() {
102 let somepguint = Some(PgU16::from(123u16));
103 let someuint = somepguint.to_option_uint();
104 assert_eq!(someuint, Some(123u16));
105
106 let pguint = PgU16::from(123);
107 let someuint = pguint.to_option_uint();
108 assert_eq!(someuint, Some(123u16));
109
110 let pguint: Option<PgU16> = None;
111 let someuint = pguint.to_option_uint();
112 assert_eq!(someuint, None::<u16>);
113 }
114}