From 22d0bdae8aba241ee7b05bc92a489bd8daa9c244 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Fri, 26 Feb 2016 21:52:07 -0800 Subject: [PATCH 1/4] tests(readme): Use skeptic to test the readme --- serde_macros/Cargo.toml | 12 +++++++++++- serde_macros/build.rs | 17 +++++++++++++++++ serde_macros/tests/skeptic.rs | 3 +++ serde_macros/tests/test.rs | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 serde_macros/build.rs create mode 100644 serde_macros/tests/skeptic.rs diff --git a/serde_macros/Cargo.toml b/serde_macros/Cargo.toml index aafbfe05..264f2dac 100644 --- a/serde_macros/Cargo.toml +++ b/serde_macros/Cargo.toml @@ -8,17 +8,27 @@ repository = "https://github.com/serde-rs/serde" documentation = "https://github.com/serde-rs/serde" keywords = ["serde", "serialization"] include = ["Cargo.toml", "src/**/*.rs"] +build = "build.rs" [lib] name = "serde_macros" plugin = true [features] -unstable-testing = ["clippy", "serde/unstable-testing", "serde_codegen/unstable-testing"] +unstable-testing = [ + "clippy", + "skeptic", + "serde/unstable-testing", + "serde_codegen/unstable-testing" +] + +[build-dependencies] +skeptic = { version = "^0.6.0", optional = true } [dependencies] clippy = { version = "^0.*", optional = true } serde_codegen = { version = "=0.8.0", default-features = false, features = ["unstable"] } +skeptic = { version = "^0.6.0", optional = true } [dev-dependencies] clippy = "^0.*" diff --git a/serde_macros/build.rs b/serde_macros/build.rs new file mode 100644 index 00000000..b7320275 --- /dev/null +++ b/serde_macros/build.rs @@ -0,0 +1,17 @@ +#[cfg(feature = "nightly-testing")] +mod inner { + extern crate skeptic; + + pub fn main() { + skeptic::generate_doc_tests(&["../README.md"]); + } +} + +#[cfg(not(feature = "nightly-testing"))] +mod inner { + pub fn main() {} +} + +fn main() { + inner::main() +} diff --git a/serde_macros/tests/skeptic.rs b/serde_macros/tests/skeptic.rs new file mode 100644 index 00000000..39a3a51d --- /dev/null +++ b/serde_macros/tests/skeptic.rs @@ -0,0 +1,3 @@ +#![cfg(feature = "nightly-testing")] + +include!(concat!(env!("OUT_DIR"), "/skeptic-tests.rs")); diff --git a/serde_macros/tests/test.rs b/serde_macros/tests/test.rs index e0462787..94d8338b 100644 --- a/serde_macros/tests/test.rs +++ b/serde_macros/tests/test.rs @@ -6,3 +6,4 @@ extern crate test; include!("../../testing/tests/test.rs.in"); mod compile_tests; +mod skeptic; From e40b9e98148312f2a8a830cd97babea73a0dcb3e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 3 Aug 2016 16:00:20 +0200 Subject: [PATCH 2/4] fix skeptic --- serde_macros/Cargo.toml | 6 ++++++ serde_macros/build.rs | 5 +++-- serde_macros/tests/skeptic.rs | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/serde_macros/Cargo.toml b/serde_macros/Cargo.toml index 264f2dac..4791f416 100644 --- a/serde_macros/Cargo.toml +++ b/serde_macros/Cargo.toml @@ -18,6 +18,7 @@ plugin = true unstable-testing = [ "clippy", "skeptic", + "serde_json", "serde/unstable-testing", "serde_codegen/unstable-testing" ] @@ -29,6 +30,7 @@ skeptic = { version = "^0.6.0", optional = true } clippy = { version = "^0.*", optional = true } serde_codegen = { version = "=0.8.0", default-features = false, features = ["unstable"] } skeptic = { version = "^0.6.0", optional = true } +serde_json = { version = "0.8.0", optional = true } [dev-dependencies] clippy = "^0.*" @@ -42,6 +44,10 @@ serde_test = "0.8.0" name = "test" path = "tests/test.rs" +[[test]] +name = "skeptic" +path = "tests/skeptic.rs" + [[bench]] name = "bench" path = "benches/bench.rs" diff --git a/serde_macros/build.rs b/serde_macros/build.rs index b7320275..0f545500 100644 --- a/serde_macros/build.rs +++ b/serde_macros/build.rs @@ -1,13 +1,14 @@ -#[cfg(feature = "nightly-testing")] +#[cfg(feature = "unstable-testing")] mod inner { extern crate skeptic; pub fn main() { + println!("cargo:rerun-if-changed=../README.md"); skeptic::generate_doc_tests(&["../README.md"]); } } -#[cfg(not(feature = "nightly-testing"))] +#[cfg(not(feature = "unstable-testing"))] mod inner { pub fn main() {} } diff --git a/serde_macros/tests/skeptic.rs b/serde_macros/tests/skeptic.rs index 39a3a51d..47e632d0 100644 --- a/serde_macros/tests/skeptic.rs +++ b/serde_macros/tests/skeptic.rs @@ -1,3 +1,3 @@ -#![cfg(feature = "nightly-testing")] +#![cfg(feature = "unstable-testing")] include!(concat!(env!("OUT_DIR"), "/skeptic-tests.rs")); From 8c30ec969859b471a10ae19731e6605abcd527ef Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 3 Aug 2016 16:00:30 +0200 Subject: [PATCH 3/4] fix doc bugs found by skeptic --- README.md | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 31b97bc1..04873ff3 100644 --- a/README.md +++ b/README.md @@ -434,35 +434,10 @@ impl serde::Serialize for Point { fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: serde::Serializer { - serializer.serialize_struct("Point", PointMapVisitor { - value: self, - state: 0, - }) - } -} - -struct PointMapVisitor<'a> { - value: &'a Point, - state: u8, -} - -impl<'a> serde::ser::MapVisitor for PointMapVisitor<'a> { - fn visit(&mut self, serializer: &mut S) -> Result, S::Error> - where S: serde::Serializer - { - match self.state { - 0 => { - self.state += 1; - Ok(Some(try!(serializer.serialize_struct_elt("x", &self.value.x)))) - } - 1 => { - self.state += 1; - Ok(Some(try!(serializer.serialize_struct_elt("y", &self.value.y)))) - } - _ => { - Ok(None) - } - } + let mut state = try!(serializer.serialize_struct("Point", 2)); + try!(serializer.serialize_struct_elt(&mut state, "x", &self.x)); + try!(serializer.serialize_struct_elt(&mut state, "y", &self.y)); + serializer.serialize_struct_end(state) } } From 3a687e5369359cc3a3015b246fccb60ac5979e8b Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 3 Aug 2016 16:04:11 +0200 Subject: [PATCH 4/4] fix untestable docs --- README.md | 55 +++++++------------------------------------------------ 1 file changed, 7 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 04873ff3..3c136b84 100644 --- a/README.md +++ b/README.md @@ -356,11 +356,8 @@ impl serde::Serialize for i32 { ``` As you can see it's pretty simple. More complex types like `BTreeMap` need to -pass a -[MapVisitor](http://serde-rs.github.io/serde/serde/serde/ser/trait.MapVisitor.html) -to the -[Serializer](http://serde-rs.github.io/serde/serde/serde/ser/trait.Serializer.html) -in order to walk through the type: +use a multi-step process (init, elements, end) in order to walk through the +type: ```rust,ignore impl Serialize for BTreeMap @@ -371,55 +368,17 @@ impl Serialize for BTreeMap fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer, { - serializer.serialize_map(MapIteratorVisitor::new(self.iter(), Some(self.len()))) - } -} - -pub struct MapIteratorVisitor { - iter: Iter, - len: Option, -} - -impl MapIteratorVisitor - where Iter: Iterator -{ - #[inline] - pub fn new(iter: Iter, len: Option) -> MapIteratorVisitor { - MapIteratorVisitor { - iter: iter, - len: len, + let mut state = try!(serializer.serialize_map(Some(self.len()))); + for (k, v) in self { + try!(serializer.serialize_map_elt(&mut state, k, v)); } - } -} - -impl MapVisitor for MapIteratorVisitor - where K: Serialize, - V: Serialize, - I: Iterator, -{ - #[inline] - fn visit(&mut self, serializer: &mut S) -> Result, S::Error> - where S: Serializer, - { - match self.iter.next() { - Some((key, value)) => { - let value = try!(serializer.serialize_map_elt(key, value)); - Ok(Some(value)) - } - None => Ok(None) - } - } - - #[inline] - fn len(&self) -> Option { - self.len + serializer.serialize_map_end(state) } } ``` Serializing structs follow this same pattern. In fact, structs are represented -as a named map. Its visitor uses a simple state machine to iterate through all -the fields: +as a named map, with a known length. ```rust extern crate serde;