// Benchmarks and tests that require private items extern crate test; use test::Bencher; use super::{from_str, Parser, StackElement, Stack}; use std::string; #[test] fn test_stack() { let mut stack = Stack::new(); assert!(stack.is_empty()); assert!(stack.is_empty()); assert!(!stack.last_is_index()); stack.push_index(0); stack.bump_index(); assert!(stack.len() == 1); assert!(stack.is_equal_to(&[StackElement::Index(1)])); assert!(stack.starts_with(&[StackElement::Index(1)])); assert!(stack.ends_with(&[StackElement::Index(1)])); assert!(stack.last_is_index()); assert!(stack.get(0) == StackElement::Index(1)); stack.push_key("foo".to_string()); assert!(stack.len() == 2); assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.starts_with(&[StackElement::Index(1)])); assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.ends_with(&[StackElement::Key("foo")])); assert!(!stack.last_is_index()); assert!(stack.get(0) == StackElement::Index(1)); assert!(stack.get(1) == StackElement::Key("foo")); stack.push_key("bar".to_string()); assert!(stack.len() == 3); assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo"), StackElement::Key("bar")])); assert!(stack.starts_with(&[StackElement::Index(1)])); assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo"), StackElement::Key("bar")])); assert!(stack.ends_with(&[StackElement::Key("bar")])); assert!(stack.ends_with(&[StackElement::Key("foo"), StackElement::Key("bar")])); assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo"), StackElement::Key("bar")])); assert!(!stack.last_is_index()); assert!(stack.get(0) == StackElement::Index(1)); assert!(stack.get(1) == StackElement::Key("foo")); assert!(stack.get(2) == StackElement::Key("bar")); stack.pop(); assert!(stack.len() == 2); assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.starts_with(&[StackElement::Index(1)])); assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo")])); assert!(stack.ends_with(&[StackElement::Key("foo")])); assert!(!stack.last_is_index()); assert!(stack.get(0) == StackElement::Index(1)); assert!(stack.get(1) == StackElement::Key("foo")); } #[bench] fn bench_streaming_small(b: &mut Bencher) { b.iter( || { let mut parser = Parser::new( r#"{ "a": 1.0, "b": [ true, "foo\nbar", { "c": {"d": null} } ] }"#.chars() ); loop { match parser.next() { None => return, _ => {} } } }); } #[bench] fn bench_small(b: &mut Bencher) { b.iter( || { let _ = from_str(r#"{ "a": 1.0, "b": [ true, "foo\nbar", { "c": {"d": null} } ] }"#); }); } fn big_json() -> string::String { let mut src = "[\n".to_string(); for _ in 0..500 { src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \ [1,2,3]},"#); } src.push_str("{}]"); return src; } #[bench] fn bench_streaming_large(b: &mut Bencher) { let src = big_json(); b.iter( || { let mut parser = Parser::new(src.chars()); loop { match parser.next() { None => return, _ => {} } } }); } #[bench] fn bench_large(b: &mut Bencher) { let src = big_json(); b.iter( || { let _ = from_str(&src); }); }