1  // Copyright (c) 2023 Huawei Device Co., Ltd.
2  // Licensed under the Apache License, Version 2.0 (the "License");
3  // you may not use this file except in compliance with the License.
4  // You may obtain a copy of the License at
5  //
6  //     http://www.apache.org/licenses/LICENSE-2.0
7  //
8  // Unless required by applicable law or agreed to in writing, software
9  // distributed under the License is distributed on an "AS IS" BASIS,
10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  // See the License for the specific language governing permissions and
12  // limitations under the License.
13  
14  use crate::encoder::encode_string_inner;
15  use crate::{Error, Error::*};
16  use serde::{ser, ser::SerializeSeq, Serialize};
17  
18  /// A data format that can serialize any data structure supported by Serde.
19  struct Serializer<W>
20  where
21      W: std::io::Write,
22  {
23      writer: W,
24      element_num: Vec<usize>, // Used to record the number of traveled elements in the sequence.
25  }
26  
27  /// An auxiliary struct which implements Write trait used in 'to_string' function.
28  struct AuxiliaryWriter {
29      output: Vec<u8>,
30  }
31  
32  impl std::io::Write for AuxiliaryWriter {
write(&mut self, buf: &[u8]) -> std::io::Result<usize>33      fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
34          self.output.extend_from_slice(buf);
35          Ok(buf.len())
36      }
37  
flush(&mut self) -> std::io::Result<()>38      fn flush(&mut self) -> std::io::Result<()> {
39          Ok(())
40      }
41  }
42  
43  /// ylong_json::serializer_compact supports two functions to produce as output: 'to_string' and 'to_writer'.
44  ///
45  /// The to_string function serialize an instance which implements the Serialize Trait to a string and return.
to_string<T>(value: &T) -> Result<String, Error> where T: Serialize,46  pub fn to_string<T>(value: &T) -> Result<String, Error>
47  where
48      T: Serialize,
49  {
50      let mut writer = AuxiliaryWriter { output: Vec::new() };
51      to_writer(value, &mut writer)?;
52      Ok(unsafe { String::from_utf8_unchecked(writer.output) })
53  }
54  
55  /// The to_writer function serialize an instance which implements the Serialize Trait and
56  /// writes result into the writer passed in by the user, which needs to implement the std::io::Write.
to_writer<T, W>(value: &T, writer: &mut W) -> Result<(), Error> where T: Serialize, W: std::io::Write,57  pub fn to_writer<T, W>(value: &T, writer: &mut W) -> Result<(), Error>
58  where
59      T: Serialize,
60      W: std::io::Write,
61  {
62      let mut serializer = Serializer {
63          writer,
64          element_num: Vec::new(),
65      };
66      value.serialize(&mut serializer)?;
67      Ok(())
68  }
69  
70  impl<'a, W: std::io::Write> ser::Serializer for &'a mut Serializer<W> {
71      // Using `Ok` to propagate the data structure around simplifies Serializers
72      // which build in-memory data structures. Set 'ok=()' and write the serialization
73      // result to the buffer contained by the instance.
74      type Ok = ();
75  
76      // The error type when serializing an instance may occur.
77      type Error = Error;
78  
79      // Associative type composite data structures, such as sequences and maps,
80      // used to track other states at serialization time. In this case, no state
81      // is required other than what is already stored in the Serializer struct.
82      type SerializeSeq = Self;
83      type SerializeMap = Self;
84      type SerializeStruct = Self;
85      type SerializeStructVariant = Self;
86      type SerializeTuple = Self;
87      type SerializeTupleStruct = Self;
88      type SerializeTupleVariant = Self;
89  
90      // The following 12 methods take one of the base types of the data model
91      // and map it to JSON by appending it to the output string.
serialize_bool(self, v: bool) -> Result<(), Error>92      fn serialize_bool(self, v: bool) -> Result<(), Error> {
93          self.writer.write_fmt(format_args!("{v}"))?;
94          Ok(())
95      }
96  
97      // JSON does not distinguish between integers of different sizes,
98      // so all signed integers and all unsigned integers will be serialized in the same way.
99      // Therefore, all integers are converted to 64-bit integers and serialized here.
serialize_i8(self, v: i8) -> Result<(), Error>100      fn serialize_i8(self, v: i8) -> Result<(), Error> {
101          self.serialize_i64(i64::from(v))
102      }
103  
serialize_i16(self, v: i16) -> Result<(), Error>104      fn serialize_i16(self, v: i16) -> Result<(), Error> {
105          self.serialize_i64(i64::from(v))
106      }
107  
serialize_i32(self, v: i32) -> Result<(), Error>108      fn serialize_i32(self, v: i32) -> Result<(), Error> {
109          self.serialize_i64(i64::from(v))
110      }
111  
serialize_i64(self, v: i64) -> Result<(), Error>112      fn serialize_i64(self, v: i64) -> Result<(), Error> {
113          self.writer.write_fmt(format_args!("{v}"))?;
114          Ok(())
115      }
116  
serialize_u8(self, v: u8) -> Result<(), Error>117      fn serialize_u8(self, v: u8) -> Result<(), Error> {
118          self.serialize_u64(u64::from(v))
119      }
120  
serialize_u16(self, v: u16) -> Result<(), Error>121      fn serialize_u16(self, v: u16) -> Result<(), Error> {
122          self.serialize_u64(u64::from(v))
123      }
124  
serialize_u32(self, v: u32) -> Result<(), Error>125      fn serialize_u32(self, v: u32) -> Result<(), Error> {
126          self.serialize_u64(u64::from(v))
127      }
128  
serialize_u64(self, v: u64) -> Result<(), Error>129      fn serialize_u64(self, v: u64) -> Result<(), Error> {
130          self.writer.write_fmt(format_args!("{v}"))?;
131          Ok(())
132      }
133  
134      // Same way for floating-point types.
serialize_f32(self, v: f32) -> Result<(), Error>135      fn serialize_f32(self, v: f32) -> Result<(), Error> {
136          self.serialize_f64(f64::from(v))
137      }
138  
serialize_f64(self, v: f64) -> Result<(), Error>139      fn serialize_f64(self, v: f64) -> Result<(), Error> {
140          self.writer.write_fmt(format_args!("{v:?}"))?;
141          Ok(())
142      }
143  
serialize_char(self, v: char) -> Result<(), Error>144      fn serialize_char(self, v: char) -> Result<(), Error> {
145          self.serialize_str(v.encode_utf8(&mut [0; 4]))
146      }
147  
serialize_str(self, v: &str) -> Result<(), Error>148      fn serialize_str(self, v: &str) -> Result<(), Error> {
149          self.writer.write_all(b"\"")?;
150          encode_string_inner(&mut self.writer, v)?;
151          self.writer.write_all(b"\"")?;
152          Ok(())
153      }
154  
155      // Serialize a byte array into an array of bytes.
156      // Binary formats will typically represent byte arrays more compactly.
serialize_bytes(self, v: &[u8]) -> Result<(), Error>157      fn serialize_bytes(self, v: &[u8]) -> Result<(), Error> {
158          let mut seq = self.serialize_seq(Some(v.len()))?;
159          for byte in v {
160              seq.serialize_element(byte)?;
161          }
162          seq.end()
163      }
164  
165      // JSON `null` represent an absent optional.
serialize_none(self) -> Result<(), Error>166      fn serialize_none(self) -> Result<(), Error> {
167          self.serialize_unit()
168      }
169  
170      // Represent an optional instance as the contained value.
serialize_some<T>(self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,171      fn serialize_some<T>(self, value: &T) -> Result<(), Error>
172      where
173          T: ?Sized + Serialize,
174      {
175          value.serialize(self)
176      }
177  
178      // In Serde, unit represents an anonymous value that does not contain any data.
179      // Map this to JSON as "null".
serialize_unit(self) -> Result<(), Error>180      fn serialize_unit(self) -> Result<(), Error> {
181          self.writer.write_all(b"null")?;
182          Ok(())
183      }
184  
185      // Unit struct represents a named value that does not contain any data. Map it to JSON as "null".
serialize_unit_struct(self, _name: &'static str) -> Result<(), Error>186      fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Error> {
187          self.serialize_unit()
188      }
189  
190      // When serializing a unit variant (or any other kind of variant), formats
191      // can choose whether to track it by index or by name. Binary formats
192      // usually use index while human-readable formats usually use name.
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<(), Error>193      fn serialize_unit_variant(
194          self,
195          _name: &'static str,
196          _variant_index: u32,
197          variant: &'static str, // The name of the variant.
198      ) -> Result<(), Error> {
199          self.serialize_str(variant)
200      }
201  
202      // Treat newtype structs as insignificant wrappers for the data they contain.
serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,203      fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Error>
204      where
205          T: ?Sized + Serialize,
206      {
207          value.serialize(self)
208      }
209  
210      // The newtype variant (and all other variant serialization methods)
211      // specifically refers to the enumerated representation of the "externally tagged".
212      //
213      // Serialize it to JSON with an outer tag of the form '{NAME: VALUE}'.
serialize_newtype_variant<T>( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<(), Error> where T: ?Sized + Serialize,214      fn serialize_newtype_variant<T>(
215          self,
216          _name: &'static str,
217          _variant_index: u32,
218          variant: &'static str, // The name of the variant.
219          value: &T,
220      ) -> Result<(), Error>
221      where
222          T: ?Sized + Serialize,
223      {
224          self.writer.write_all(b"{")?;
225          variant.serialize(&mut *self)?;
226          self.writer.write_all(b":")?;
227          value.serialize(&mut *self)?;
228          self.writer.write_all(b"}")?;
229          Ok(())
230      }
231  
232      // The following is the serialization of compound types.
233      // The start of the sequence, each value, and the end use three separate method calls.
234      // The serializer can be able to support sequences for which the length is unknown up front.
235      //
236      // This one used to serialize the start of the sequence, which in JSON is `[`.
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error>237      fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
238          self.element_num.push(0); // Now there is no element in this sequence.
239          self.writer.write_all(b"[")?;
240          Ok(self)
241      }
242  
243      // Tuples and sequences are represented similarly in JSON.
244      // Some formats can represent tuples more efficiently by omitting the length.
serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error>245      fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error> {
246          self.serialize_seq(Some(len))
247      }
248  
249      // Tuple and sequences are represented similarly in JSON.
serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Error>250      fn serialize_tuple_struct(
251          self,
252          _name: &'static str,
253          len: usize, // The number of data fields that will be serialized.
254      ) -> Result<Self::SerializeTupleStruct, Error> {
255          self.serialize_seq(Some(len))
256      }
257  
258      // Tuple variants are represented in JSON as `{ NAME: [DATA...] }`.
259      // This method used only for the externally tagged representation.
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Error>260      fn serialize_tuple_variant(
261          self,
262          _name: &'static str,
263          _variant_index: u32,
264          variant: &'static str, // The name of the variant.
265          _len: usize,
266      ) -> Result<Self::SerializeTupleVariant, Error> {
267          self.element_num.push(0);
268          self.writer.write_all(b"{")?;
269          variant.serialize(&mut *self)?;
270          self.writer.write_all(b":[")?;
271          Ok(self)
272      }
273  
274      // Maps are represented in JSON as `{ K: V, K: V, ... }`.
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error>275      fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
276          self.element_num.push(0);
277          self.writer.write_all(b"{")?;
278          Ok(self)
279      }
280  
281      // Structs and maps are represented similarly in JSON.
serialize_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Error>282      fn serialize_struct(
283          self,
284          _name: &'static str,
285          len: usize, // The number of data fields that will be serialized.
286      ) -> Result<Self::SerializeStruct, Error> {
287          self.serialize_map(Some(len))
288      }
289  
290      // Struct variants are represented in JSON as `{ NAME: { K: V, ... } }`.
291      // This used for the externally tagged representation.
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Error>292      fn serialize_struct_variant(
293          self,
294          _name: &'static str,
295          _variant_index: u32,
296          variant: &'static str, // The name of the variant.
297          _len: usize,
298      ) -> Result<Self::SerializeStructVariant, Error> {
299          self.element_num.push(0);
300          self.writer.write_all(b"{")?;
301          variant.serialize(&mut *self)?;
302          self.writer.write_all(b":{")?;
303          Ok(self)
304      }
305  }
306  
307  impl<W> Serializer<W>
308  where
309      W: std::io::Write,
310  {
311      // Serialize a single member of sequence or map.
whether_to_add_comma(&mut self) -> Result<(), Error>312      fn whether_to_add_comma(&mut self) -> Result<(), Error> {
313          match self.element_num.last_mut() {
314              None => return Err(IncorrectSerdeUsage),
315              Some(x) => {
316                  // This is not the first element, add a comma before the element.
317                  if *x > 0 {
318                      self.writer.write_all(b",")?
319                  };
320                  *x += 1;
321              }
322          }
323          Ok(())
324      }
325  
326      // Add another half of the parentheses at the end.
add_another_half(&mut self, buf: &[u8]) -> Result<(), Error>327      fn add_another_half(&mut self, buf: &[u8]) -> Result<(), Error> {
328          self.writer.write_all(buf)?;
329          Ok(())
330      }
331  }
332  
333  // The following 7 impls used to serialize compound types like sequences and maps.
334  // At the beginning of serializing such types, one call of Serializer method.
335  // Next, zero or more calls which serializes a single element of the compound type.
336  // Finally, one call to end the serializing of the compound type.
337  //
338  // This impl is SerializeSeq so these methods are called after calling 'serialize_seq' on Serializer.
339  impl<'a, W: std::io::Write> ser::SerializeSeq for &'a mut Serializer<W> {
340      // Must match the `Ok` type of the serializer.
341      type Ok = ();
342      // Must match the `Error` type of the serializer.
343      type Error = Error;
344  
345      // Serialize a single element in the sequence.
serialize_element<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,346      fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
347      where
348          T: ?Sized + Serialize,
349      {
350          self.whether_to_add_comma()?;
351          value.serialize(&mut **self)
352      }
353  
354      // Close the sequence.
end(self) -> Result<(), Error>355      fn end(self) -> Result<(), Error> {
356          self.element_num.pop();
357          self.add_another_half(b"]")
358      }
359  }
360  
361  // Same thing but for tuples.
362  impl<'a, W: std::io::Write> ser::SerializeTuple for &'a mut Serializer<W> {
363      type Ok = ();
364      type Error = Error;
365  
serialize_element<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,366      fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
367      where
368          T: ?Sized + Serialize,
369      {
370          self.whether_to_add_comma()?;
371          value.serialize(&mut **self)
372      }
373  
end(self) -> Result<(), Error>374      fn end(self) -> Result<(), Error> {
375          self.element_num.pop();
376          self.add_another_half(b"]")
377      }
378  }
379  
380  // Same thing but for tuple structs.
381  impl<'a, W: std::io::Write> ser::SerializeTupleStruct for &'a mut Serializer<W> {
382      type Ok = ();
383      type Error = Error;
384  
serialize_field<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,385      fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
386      where
387          T: ?Sized + Serialize,
388      {
389          self.whether_to_add_comma()?;
390          value.serialize(&mut **self)
391      }
392  
end(self) -> Result<(), Error>393      fn end(self) -> Result<(), Error> {
394          self.element_num.pop();
395          self.add_another_half(b"]")
396      }
397  }
398  
399  // The tuple variants are slightly different. Refer back to the
400  // `serialize_tuple_variant` method above:
401  //
402  //    self.writer.write_all(b"{");
403  //    variant.serialize(&mut *self)?;
404  //    self.writer.write_all(b":[");
405  //
406  // So the `end` method in this impl is responsible for closing
407  // both the `]` and the `}`.
408  impl<'a, W: std::io::Write> ser::SerializeTupleVariant for &'a mut Serializer<W> {
409      type Ok = ();
410      type Error = Error;
411  
serialize_field<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,412      fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
413      where
414          T: ?Sized + Serialize,
415      {
416          self.whether_to_add_comma()?;
417          value.serialize(&mut **self)
418      }
419  
end(self) -> Result<(), Error>420      fn end(self) -> Result<(), Error> {
421          self.element_num.pop();
422          self.add_another_half(b"]}")
423      }
424  }
425  
426  // Some "Serialize" types cannot hold both keys and values
427  // in memory, so the "SerializeMap" implementation needs to
428  // support "serialize_key" and "serialize_value" respectively.
429  //
430  // There is a third optional method on the `SerializeMap` trait.
431  // The 'serialize_entry' method allows the serializer to be optimized
432  // for cases where both keys and values are available. In JSON, it doesn't
433  // make a difference so the default behavior for `serialize_entry` is fine.
434  impl<'a, W: std::io::Write> ser::SerializeMap for &'a mut Serializer<W> {
435      type Ok = ();
436      type Error = Error;
437  
438      // The Serde data model allows map keys to be any serializable type. JSON
439      // only allows string keys, so if the key is serialized to something other than a string,
440      // the following implementation will produce invalid JSON.
serialize_key<T>(&mut self, key: &T) -> Result<(), Error> where T: ?Sized + Serialize,441      fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error>
442      where
443          T: ?Sized + Serialize,
444      {
445          self.whether_to_add_comma()?;
446          key.serialize(&mut **self)
447      }
448  
449      // It makes no difference whether the colon is printed at
450      // the end of 'serialize_key' or at the beginning of 'serialize_value'.
451      // Here we choose to print at the beginning of 'serialize_value'.
serialize_value<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,452      fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error>
453      where
454          T: ?Sized + Serialize,
455      {
456          self.writer.write_all(b":")?;
457          value.serialize(&mut **self)
458      }
459  
end(self) -> Result<(), Error>460      fn end(self) -> Result<(), Error> {
461          self.add_another_half(b"}")
462      }
463  }
464  
465  // A structure is like a map where the keys are restricted to a compile-time constant string.
466  impl<'a, W: std::io::Write> ser::SerializeStruct for &'a mut Serializer<W> {
467      type Ok = ();
468      type Error = Error;
469  
serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,470      fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
471      where
472          T: ?Sized + Serialize,
473      {
474          self.whether_to_add_comma()?;
475          key.serialize(&mut **self)?;
476          self.writer.write_all(b":")?;
477          value.serialize(&mut **self)
478      }
479  
end(self) -> Result<(), Error>480      fn end(self) -> Result<(), Error> {
481          self.element_num.pop();
482          self.add_another_half(b"}")
483      }
484  }
485  
486  // Similar to 'SerializeTupleVariant', the 'end' method here is responsible for
487  // closing two curly braces opened by 'serialize_struct_variant'.
488  impl<'a, W: std::io::Write> ser::SerializeStructVariant for &'a mut Serializer<W> {
489      type Ok = ();
490      type Error = Error;
491  
serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,492      fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
493      where
494          T: ?Sized + Serialize,
495      {
496          self.whether_to_add_comma()?;
497          key.serialize(&mut **self)?;
498          self.writer.write_all(b":")?;
499          value.serialize(&mut **self)
500      }
501  
end(self) -> Result<(), Error>502      fn end(self) -> Result<(), Error> {
503          self.element_num.pop();
504          self.add_another_half(b"}}")
505      }
506  }
507  
508  #[cfg(test)]
509  mod ut_serializer {
510      use super::*;
511      use std::collections::HashMap;
512  
513      /// UT test to serialize simple types.
514      ///
515      /// # Title
516      /// ut_serialize_simple
517      ///
518      /// # Brief
519      /// 1.Uses Serializer::to_string method to serialize simple types.
520      /// 2.Checks if the test results are correct.
521      #[test]
ut_serialize_simple()522      fn ut_serialize_simple() {
523          let value: Option<u32> = None;
524          let expected = "null";
525          assert_eq!(to_string(&value).unwrap(), expected);
526  
527          let value: Option<u32> = Some(123);
528          let expected = "123";
529          assert_eq!(to_string(&value).unwrap(), expected);
530  
531          let value = true;
532          let expected = "true";
533          assert_eq!(to_string(&value).unwrap(), expected);
534  
535          let value: i8 = 123;
536          let expected = "123";
537          assert_eq!(to_string(&value).unwrap(), expected);
538  
539          let value: i16 = 123;
540          let expected = "123";
541          assert_eq!(to_string(&value).unwrap(), expected);
542  
543          let value: i32 = 123;
544          let expected = "123";
545          assert_eq!(to_string(&value).unwrap(), expected);
546  
547          let value: i64 = 123;
548          let expected = "123";
549          assert_eq!(to_string(&value).unwrap(), expected);
550  
551          let value: u8 = 123;
552          let expected = "123";
553          assert_eq!(to_string(&value).unwrap(), expected);
554  
555          let value: u16 = 123;
556          let expected = "123";
557          assert_eq!(to_string(&value).unwrap(), expected);
558  
559          let value: u32 = 123;
560          let expected = "123";
561          assert_eq!(to_string(&value).unwrap(), expected);
562  
563          let value: u64 = 123;
564          let expected = "123";
565          assert_eq!(to_string(&value).unwrap(), expected);
566  
567          let value: f32 = 1.0;
568          let expected = "1.0";
569          assert_eq!(to_string(&value).unwrap(), expected);
570  
571          let value: f64 = 1.0;
572          let expected = "1.0";
573          assert_eq!(to_string(&value).unwrap(), expected);
574  
575          let value = "abc";
576          let expected = "\"abc\"";
577          assert_eq!(to_string(&value).unwrap(), expected);
578  
579          let value = b"abc";
580          let expected = "[97,98,99]";
581          assert_eq!(to_string(&value).unwrap(), expected);
582      }
583  
584      /// UT test to serialize struct
585      ///
586      /// # Title
587      /// ut_serialize_struct
588      ///
589      /// # Brief
590      /// 1.Uses Serializer::to_string method to serialize struct.
591      /// 2.Checks if the test results are correct.
592      #[test]
ut_serialize_struct()593      fn ut_serialize_struct() {
594          #[derive(Serialize)]
595          struct TestUnit;
596          let test = TestUnit;
597          let expected = "null";
598          assert_eq!(to_string(&test).unwrap(), expected);
599  
600          #[derive(Serialize)]
601          struct TestNewtype(u32);
602          let test = TestNewtype(123);
603          let expected = "123";
604          assert_eq!(to_string(&test).unwrap(), expected);
605  
606          #[derive(Serialize)]
607          struct TestTuple(u32, u32, bool);
608          let test = TestTuple(123, 321, true);
609          let expected = "[123,321,true]";
610          assert_eq!(to_string(&test).unwrap(), expected);
611  
612          #[derive(Serialize)]
613          struct Test {
614              int: u32,
615              seq: Vec<&'static str>,
616              tup: (i32, i32, i32),
617          }
618  
619          let test = Test {
620              int: 1,
621              seq: vec!["a", "b"],
622              tup: (1, 2, 3),
623          };
624          let expected = r#"{"int":1,"seq":["a","b"],"tup":[1,2,3]}"#;
625          assert_eq!(to_string(&test).unwrap(), expected);
626      }
627  
628      /// UT test to serialize enum
629      ///
630      /// # Title
631      /// ut_serialize_enum
632      ///
633      /// # Brief
634      /// 1.Uses Serializer::to_string method to serialize enum.
635      /// 2.Checks if the test results are correct.
636      #[test]
ut_serialize_enum()637      fn ut_serialize_enum() {
638          #[derive(Serialize)]
639          enum E {
640              Newtype(i32),
641              Unit,
642              Struct { a: u32 },
643              Tuple(u32, u32),
644          }
645  
646          let n = E::Newtype(-1);
647          let expected = r#"{"Newtype":-1}"#;
648          assert_eq!(to_string(&n).unwrap(), expected);
649  
650          let u = E::Unit;
651          let expected = r#""Unit""#;
652          assert_eq!(to_string(&u).unwrap(), expected);
653  
654          let s = E::Struct { a: 10 };
655          let expected = r#"{"Struct":{"a":10}}"#;
656          assert_eq!(to_string(&s).unwrap(), expected);
657  
658          let t = E::Tuple(100, 200);
659          let expected = r#"{"Tuple":[100,200]}"#;
660          assert_eq!(to_string(&t).unwrap(), expected);
661      }
662  
663      /// UT test to serialize string
664      ///
665      /// # Title
666      /// ut_serialize_string
667      ///
668      /// # Brief
669      /// 1.Uses Serializer::to_string method to serialize string.
670      /// 2.Checks if the test results are correct.
671      #[test]
ut_serialize_string()672      fn ut_serialize_string() {
673          let ch = 't';
674          let expected = r#""t""#;
675          assert_eq!(to_string(&ch).unwrap(), expected);
676  
677          let value = String::from("test string.");
678          let expected = r#""test string.""#;
679          assert_eq!(to_string(&value).unwrap(), expected);
680  
681          #[cfg(not(feature = "ascii_only"))]
682          {
683              let ch = '中';
684              let expected = r#""\u4e2d""#;
685              assert_eq!(to_string(&ch).unwrap(), expected);
686  
687              let value = String::from("中文测试字符串");
688              let expected = r#""\u4e2d\u6587\u6d4b\u8bd5\u5b57\u7b26\u4e32""#;
689              assert_eq!(to_string(&value).unwrap(), expected);
690          }
691      }
692  
693      /// UT test to serializer object
694      ///
695      /// # Title
696      /// ut_serialize_object
697      ///
698      /// # Brief
699      /// 1.Uses Serializer::to_string method to serialize object.
700      /// 2.Checks if the test results are correct.
701      #[test]
ut_serialize_object()702      fn ut_serialize_object() {
703          let mut hash = HashMap::new();
704          hash.insert("apple", 1);
705          let expected = r#"{"apple":1}"#;
706          assert_eq!(to_string(&hash).unwrap(), expected);
707          hash.insert("banana", 2);
708          assert!(to_string(&hash).is_ok());
709      }
710  }
711