serialization.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. use anchor_lang::{AnchorDeserialize, AnchorSerialize, Discriminator, InstructionData};
  2. #[test]
  3. fn test_instruction_data() {
  4. // Define some test type and implement ser/de, discriminator, and ix data
  5. #[derive(Default, AnchorSerialize, AnchorDeserialize, PartialEq, Eq)]
  6. struct MyType {
  7. foo: [u8; 8],
  8. bar: String,
  9. }
  10. impl Discriminator for MyType {
  11. const DISCRIMINATOR: &'static [u8] = &[1, 2, 3, 4, 5, 6, 7, 8];
  12. }
  13. impl InstructionData for MyType {}
  14. // Initialize some instance of the type
  15. let instance = MyType {
  16. foo: [0, 2, 4, 6, 8, 10, 12, 14],
  17. bar: "sharding sucks".into(),
  18. };
  19. // Serialize using both methods
  20. let data = instance.data();
  21. let mut write = vec![];
  22. instance.write_to(&mut write);
  23. // Check that one is correct and that they are equal (implies other is correct)
  24. let correct_disc = &data[0..8] == MyType::DISCRIMINATOR;
  25. let correct_data = MyType::deserialize(&mut &data[8..]).is_ok_and(|result| result == instance);
  26. let correct_serialization = correct_disc & correct_data;
  27. assert!(correct_serialization, "serialization was not correct");
  28. assert_eq!(
  29. &data, &write,
  30. "the different methods produced different serialized representations"
  31. );
  32. }