Skip to content

Commit d4fde6d

Browse files
committed
add snapshotting logic to the ng crates aswell
1 parent cd7c14b commit d4fde6d

9 files changed

Lines changed: 198 additions & 3 deletions

File tree

ci.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ cargo_test() {
2929
cargo test --all "$@"
3030
}
3131

32-
cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33,heapless-v0_8,insta
32+
cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33,heapless-v0_8
3333

3434
# NOTE: we exclude postcard-dyn for these checks because it is std-only
3535

source/postcard-derive-ng/src/schema.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use proc_macro2::{Span, TokenStream};
22
use quote::{quote, quote_spanned};
33
use syn::{
4-
parse_quote, punctuated::Punctuated, spanned::Spanned, Data, DeriveInput, Fields, GenericParam,
5-
Generics, Path, Token,
4+
parse_quote, punctuated::Punctuated, spanned::Spanned, Data, DeriveInput, Fields, GenericParam, Generics, Ident, Path, Token
65
};
76

87
pub fn do_derive_schema(input: DeriveInput) -> syn::Result<TokenStream> {
@@ -25,10 +24,12 @@ pub fn do_derive_schema(input: DeriveInput) -> syn::Result<TokenStream> {
2524
let ty = generator.generate_type(&input.data, span, name.to_string())?;
2625

2726
let postcard_schema = &generator.postcard_schema;
27+
let insta_test = generator.generate_snapshot_test(name);
2828
let expanded = quote! {
2929
impl #impl_generics #postcard_schema::Schema for #name #ty_generics #where_clause {
3030
const SCHEMA: &'static #postcard_schema::schema::DataModelType = #ty;
3131
}
32+
#insta_test
3233
};
3334

3435
Ok(expanded)
@@ -37,13 +38,15 @@ pub fn do_derive_schema(input: DeriveInput) -> syn::Result<TokenStream> {
3738
struct Generator {
3839
postcard_schema: Path,
3940
bound: Option<Punctuated<syn::WherePredicate, Token![,]>>,
41+
snapshot: bool
4042
}
4143

4244
impl Generator {
4345
fn new(input: &DeriveInput) -> syn::Result<Self> {
4446
let mut generator = Self {
4547
postcard_schema: parse_quote!(::postcard_schema_ng),
4648
bound: None,
49+
snapshot: false
4750
};
4851
for attr in &input.attrs {
4952
if attr.path().is_ident("postcard") {
@@ -67,13 +70,42 @@ impl Generator {
6770
return Ok(());
6871
}
6972

73+
// #[postcard(snapshot)]
74+
if meta.path.is_ident("snapshot") {
75+
if input.generics.params.iter().filter(|x|!matches!(x, GenericParam::Lifetime(_))).count() != 0 {
76+
return Err(syn::Error::new(input.span(), "snapshot testing with generic schemas are not yet supported"));
77+
}
78+
generator.snapshot = true;
79+
return Ok(())
80+
}
81+
82+
7083
Err(meta.error("unsupported #[postcard] attribute"))
7184
})?;
7285
}
7386
}
7487
Ok(generator)
7588
}
7689

90+
91+
fn generate_snapshot_test(&self, ident: &Ident) -> TokenStream {
92+
if self.snapshot {
93+
let postcard_schema = &self.postcard_schema;
94+
let test_name = Ident::new(format!("postcard_snapshot_{}", ident.to_string()).as_str(), ident.span());
95+
quote! {
96+
#[cfg(test)]
97+
#[test]
98+
#[allow(non_snake_case)]
99+
fn #test_name() {
100+
#postcard_schema::impls::insta::assert_debug_snapshot!(#ident::SCHEMA);
101+
}
102+
}
103+
} else {
104+
TokenStream::default()
105+
}
106+
}
107+
108+
77109
fn generate_type(
78110
&self,
79111
data: &Data,

source/postcard-schema-ng/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ version = "0.7"
4646
default-features = false
4747
optional = true
4848

49+
[dependencies.insta]
50+
package = "insta"
51+
version = "1"
52+
4953
[dependencies.heapless_v0_8]
5054
package = "heapless"
5155
version = "0.8"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub use insta::assert_debug_snapshot;

source/postcard-schema-ng/src/impls/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ pub mod serde_big_array_v0_5;
4242
#[cfg_attr(docsrs, doc(cfg(feature = "uuid-v1_0")))]
4343
pub mod uuid_v1_0;
4444

45+
#[doc(hidden)]
46+
pub mod insta;
47+
4548
impl Schema for DataModelType {
4649
const SCHEMA: &'static DataModelType = &DataModelType::Schema;
4750
}

source/postcard-schema-ng/tests/schema.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::path::PathBuf;
66

77
#[allow(unused)]
88
#[derive(Schema)]
9+
#[postcard(snapshot)]
910
enum Inner {
1011
Alpha,
1112
Beta,
@@ -16,6 +17,7 @@ enum Inner {
1617

1718
#[allow(unused)]
1819
#[derive(Schema)]
20+
#[postcard(snapshot)]
1921
struct Outer<'a> {
2022
a: u32,
2123
b: u64,
@@ -27,6 +29,7 @@ struct Outer<'a> {
2729

2830
#[allow(unused)]
2931
#[derive(Schema)]
32+
#[postcard(snapshot)]
3033
struct Slice<'a> {
3134
x: &'a [u8],
3235
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
source: source/postcard-schema-ng/tests/schema.rs
3+
expression: "Inner :: SCHEMA"
4+
---
5+
Enum {
6+
name: "Inner",
7+
variants: [
8+
Variant {
9+
name: "Alpha",
10+
data: Unit,
11+
},
12+
Variant {
13+
name: "Beta",
14+
data: Unit,
15+
},
16+
Variant {
17+
name: "Gamma",
18+
data: Unit,
19+
},
20+
Variant {
21+
name: "Delta",
22+
data: Tuple(
23+
[
24+
I32,
25+
I16,
26+
],
27+
),
28+
},
29+
Variant {
30+
name: "Epsilon",
31+
data: Struct(
32+
[
33+
NamedField {
34+
name: "zeta",
35+
ty: F32,
36+
},
37+
NamedField {
38+
name: "eta",
39+
ty: Bool,
40+
},
41+
],
42+
),
43+
},
44+
],
45+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
source: source/postcard-schema-ng/tests/schema.rs
3+
expression: "Outer :: SCHEMA"
4+
---
5+
Struct {
6+
name: "Outer",
7+
data: Struct(
8+
[
9+
NamedField {
10+
name: "a",
11+
ty: U32,
12+
},
13+
NamedField {
14+
name: "b",
15+
ty: U64,
16+
},
17+
NamedField {
18+
name: "c",
19+
ty: U8,
20+
},
21+
NamedField {
22+
name: "d",
23+
ty: Enum {
24+
name: "Inner",
25+
variants: [
26+
Variant {
27+
name: "Alpha",
28+
data: Unit,
29+
},
30+
Variant {
31+
name: "Beta",
32+
data: Unit,
33+
},
34+
Variant {
35+
name: "Gamma",
36+
data: Unit,
37+
},
38+
Variant {
39+
name: "Delta",
40+
data: Tuple(
41+
[
42+
I32,
43+
I16,
44+
],
45+
),
46+
},
47+
Variant {
48+
name: "Epsilon",
49+
data: Struct(
50+
[
51+
NamedField {
52+
name: "zeta",
53+
ty: F32,
54+
},
55+
NamedField {
56+
name: "eta",
57+
ty: Bool,
58+
},
59+
],
60+
),
61+
},
62+
],
63+
},
64+
},
65+
NamedField {
66+
name: "e",
67+
ty: Tuple(
68+
[
69+
U8,
70+
U8,
71+
U8,
72+
U8,
73+
U8,
74+
U8,
75+
U8,
76+
U8,
77+
U8,
78+
U8,
79+
],
80+
),
81+
},
82+
NamedField {
83+
name: "f",
84+
ty: Seq(
85+
U8,
86+
),
87+
},
88+
],
89+
),
90+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
source: source/postcard-schema-ng/tests/schema.rs
3+
expression: "Slice :: SCHEMA"
4+
---
5+
Struct {
6+
name: "Slice",
7+
data: Struct(
8+
[
9+
NamedField {
10+
name: "x",
11+
ty: Seq(
12+
U8,
13+
),
14+
},
15+
],
16+
),
17+
}

0 commit comments

Comments
 (0)