qfall_math/integer_mod_q/modulus_polynomial_ring_zq/
serialize.rs1use super::ModulusPolynomialRingZq;
15use crate::macros::serialize::{deserialize, serialize};
16use core::fmt;
17use serde::{
18 Deserialize, Serialize,
19 de::{Error, MapAccess, Unexpected, Visitor},
20 ser::SerializeStruct,
21};
22use std::str::FromStr;
23
24serialize!("poly", ModulusPolynomialRingZq);
25deserialize!("poly", Poly, ModulusPolynomialRingZq);
26
27#[cfg(test)]
28mod test_serialize {
29 use crate::integer_mod_q::ModulusPolynomialRingZq;
30 use std::str::FromStr;
31
32 #[test]
34 fn serialize_output_positive() {
35 let poly_str = "2 17 42 mod 331";
36 let poly_z = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
37 let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
38
39 assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
40 }
41
42 #[test]
44 fn serialize_output_negative() {
45 let poly_str = "3 -17 -42 1 mod 331";
46 let poly_z = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
47 let cmp_str = "{\"poly\":\"3 314 289 1 mod 331\"}";
48
49 assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
50 }
51
52 #[test]
54 fn serialize_output_positive_large() {
55 let poly_str = format!("3 1 {} 1 mod {}", u64::MAX, u64::MAX - 58);
56 let poly_z = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
57 let cmp_str = format!("{{\"poly\":\"3 1 58 1 mod {}\"}}", u64::MAX - 58);
58
59 assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
60 }
61
62 #[test]
64 fn serialize_output_negative_large() {
65 let poly_str = format!("3 1 -{} 1 mod {}", u64::MAX, u64::MAX - 58);
66 let poly_z = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
67 let cmp_str = format!(
68 "{{\"poly\":\"3 1 {} 1 mod {}\"}}",
69 u64::MAX - 2 * 58,
70 u64::MAX - 58
71 );
72
73 assert_eq!(cmp_str, serde_json::to_string(&poly_z).unwrap());
74 }
75}
76
77#[cfg(test)]
78mod test_deserialize {
79 use crate::integer_mod_q::ModulusPolynomialRingZq;
80 use std::str::FromStr;
81
82 #[test]
84 fn deserialize_positive() {
85 let poly_str = "2 17 42 mod 331";
86 let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
87
88 let poly_mod = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
89 assert_eq!(
90 poly_mod,
91 serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
92 );
93 }
94
95 #[test]
97 fn deserialize_negative() {
98 let poly_str = "3 -17 -42 1 mod 331";
99 let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
100
101 let poly_mod = ModulusPolynomialRingZq::from_str(poly_str).unwrap();
102 assert_eq!(
103 poly_mod,
104 serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
105 );
106 }
107
108 #[test]
110 fn deserialize_positive_large() {
111 let poly_str = format!("3 -17 {} 1 mod {}", u64::MAX, u64::MAX - 58);
112 let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
113
114 let poly_mod = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
115 assert_eq!(
116 poly_mod,
117 serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
118 );
119 }
120
121 #[test]
123 fn deserialize_negative_large() {
124 let poly_str = format!("3 -17 -{} 1 mod {}", u64::MAX, u64::MAX - 58);
125 let cmp_str = format!("{{\"poly\":\"{poly_str}\"}}");
126
127 let poly_mod = ModulusPolynomialRingZq::from_str(&poly_str).unwrap();
128 assert_eq!(
129 poly_mod,
130 serde_json::from_str::<ModulusPolynomialRingZq>(&cmp_str).unwrap()
131 );
132 }
133
134 #[test]
136 fn non_prime_q() {
137 let a: Result<ModulusPolynomialRingZq, serde_json::Error> =
138 serde_json::from_str(&format!("{{\"poly\":\"2 17 42 mod {}\"}}", u64::MAX));
139 assert!(a.is_ok());
140 }
141
142 #[test]
144 fn negative_q() {
145 let a: Result<ModulusPolynomialRingZq, serde_json::Error> =
146 serde_json::from_str(&format!("{{\"poly\":\"2 17 42 mod -{}\"}}", u64::MAX));
147 assert!(a.is_err());
148
149 let b: Result<ModulusPolynomialRingZq, serde_json::Error> =
150 serde_json::from_str("{{\"poly\":\"2 17 42 mod -17\"}}");
151 assert!(b.is_err());
152 }
153
154 #[test]
156 fn no_field_value() {
157 let a: Result<ModulusPolynomialRingZq, serde_json::Error> =
158 serde_json::from_str("{{\"tree\":\"{2 17 42 mod 331}\"}}");
159 assert!(a.is_err());
160
161 let b: Result<ModulusPolynomialRingZq, serde_json::Error> = serde_json::from_str("{{}}");
162 assert!(b.is_err());
163 }
164
165 #[test]
167 fn too_many_fields() {
168 let a: Result<ModulusPolynomialRingZq, serde_json::Error> = serde_json::from_str(
169 "{{\"tree\":\"{2 17 42 mod 331}\", \"poly\":\"{2 17 42 mod 331}\"}}",
170 );
171 assert!(a.is_err());
172
173 let b: Result<ModulusPolynomialRingZq, serde_json::Error> =
174 serde_json::from_str("{{\"poly\":\"{}\", \"poly\":\"{2 17 42 mod 331}\"}}");
175 assert!(b.is_err());
176 }
177}