generics.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #![allow(dead_code)]
  2. use indoc::indoc;
  3. use pretty_assertions::assert_eq;
  4. use tsify::Tsify;
  5. #[test]
  6. fn test_generic_struct() {
  7. #[derive(Tsify)]
  8. pub struct GenericStruct<'a, A, B, C, D> {
  9. a: A,
  10. b: B,
  11. #[serde(skip)]
  12. c: &'a C,
  13. d: D,
  14. }
  15. assert_eq!(
  16. GenericStruct::<(), (), (), ()>::DECL,
  17. indoc! {"
  18. export interface GenericStruct<A, B, D> {
  19. a: A;
  20. b: B;
  21. d: D;
  22. }"
  23. }
  24. );
  25. #[derive(Tsify)]
  26. pub struct GenericNewtype<T>(T);
  27. assert_eq!(
  28. GenericNewtype::<()>::DECL,
  29. "export type GenericNewtype<T> = T;"
  30. );
  31. #[derive(Tsify)]
  32. pub struct GenericTuple<'a, A, B, C, D>(A, #[serde(skip)] &'a B, C, D);
  33. assert_eq!(
  34. GenericTuple::<(), (), (), ()>::DECL,
  35. "export type GenericTuple<A, C, D> = [A, C, D];"
  36. );
  37. }
  38. #[test]
  39. fn test_generic_enum() {
  40. #[derive(Tsify)]
  41. pub enum GenericEnum<T, U> {
  42. Unit,
  43. NewType(T),
  44. Seq(T, U),
  45. Map { x: T, y: U },
  46. }
  47. let expected = indoc! {r#"
  48. export type GenericEnum<T, U> = "Unit" | { NewType: T } | { Seq: [T, U] } | { Map: { x: T; y: U } };"#
  49. };
  50. assert_eq!(GenericEnum::<(), ()>::DECL, expected);
  51. }
  52. #[test]
  53. fn test_generic_enum_with_namespace() {
  54. #[derive(Tsify)]
  55. #[tsify(namespace)]
  56. pub enum GenericEnum<T, U> {
  57. Unit,
  58. NewType(T),
  59. Seq(T, U),
  60. Map { x: T, y: U },
  61. }
  62. let expected = indoc! {r#"
  63. declare namespace GenericEnum {
  64. export type Unit = "Unit";
  65. export type NewType<T> = { NewType: T };
  66. export type Seq<T, U> = { Seq: [T, U] };
  67. export type Map<T, U> = { Map: { x: T; y: U } };
  68. }
  69. export type GenericEnum<T, U> = "Unit" | { NewType: T } | { Seq: [T, U] } | { Map: { x: T; y: U } };"#
  70. };
  71. assert_eq!(GenericEnum::<(), ()>::DECL, expected);
  72. }