struct.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #![allow(dead_code)]
  2. use std::collections::HashMap;
  3. use indoc::indoc;
  4. use pretty_assertions::assert_eq;
  5. use tsify::Tsify;
  6. #[test]
  7. fn test_unit() {
  8. #[derive(Tsify)]
  9. struct Unit;
  10. if cfg!(feature = "js") {
  11. assert_eq!(Unit::DECL, "export type Unit = undefined;");
  12. } else {
  13. assert_eq!(Unit::DECL, "export type Unit = null;");
  14. };
  15. }
  16. #[test]
  17. fn test_named_fields() {
  18. #[derive(Tsify)]
  19. struct A {
  20. a: (usize, u64),
  21. b: HashMap<String, i128>,
  22. }
  23. let expected = if cfg!(feature = "js") {
  24. indoc! {"
  25. export interface A {
  26. a: [number, number];
  27. b: Map<string, bigint>;
  28. }"
  29. }
  30. } else {
  31. indoc! {"
  32. export interface A {
  33. a: [number, number];
  34. b: Record<string, number>;
  35. }"
  36. }
  37. };
  38. assert_eq!(A::DECL, expected);
  39. }
  40. #[test]
  41. fn test_newtype_struct() {
  42. #[derive(Tsify)]
  43. struct Newtype(i32);
  44. assert_eq!(Newtype::DECL, "export type Newtype = number;");
  45. }
  46. #[test]
  47. fn test_tuple_struct() {
  48. #[derive(Tsify)]
  49. struct Tuple(i32, String);
  50. #[derive(Tsify)]
  51. struct EmptyTuple();
  52. assert_eq!(Tuple::DECL, "export type Tuple = [number, string];");
  53. assert_eq!(EmptyTuple::DECL, "export type EmptyTuple = [];");
  54. }
  55. #[test]
  56. fn test_nested_struct() {
  57. #[derive(Tsify)]
  58. struct A {
  59. x: f64,
  60. }
  61. #[derive(Tsify)]
  62. struct B {
  63. a: A,
  64. }
  65. assert_eq!(
  66. B::DECL,
  67. indoc! {"
  68. export interface B {
  69. a: A;
  70. }"
  71. }
  72. );
  73. }
  74. #[test]
  75. fn test_struct_with_borrowed_fields() {
  76. use std::borrow::Cow;
  77. #[derive(Tsify)]
  78. struct Borrow<'a> {
  79. raw: &'a str,
  80. cow: Cow<'a, str>,
  81. }
  82. assert_eq!(
  83. Borrow::DECL,
  84. indoc! {"
  85. export interface Borrow {
  86. raw: string;
  87. cow: string;
  88. }"
  89. }
  90. );
  91. }
  92. #[test]
  93. fn test_tagged_struct() {
  94. #[derive(Tsify)]
  95. #[serde(tag = "type")]
  96. struct TaggedStruct {
  97. x: i32,
  98. y: i32,
  99. }
  100. assert_eq!(
  101. TaggedStruct::DECL,
  102. indoc! {r#"
  103. export interface TaggedStruct {
  104. type: "TaggedStruct";
  105. x: number;
  106. y: number;
  107. }"#
  108. }
  109. );
  110. }