Skip to content

Commit

Permalink
test coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
davidhewitt committed Dec 4, 2023
1 parent 7280838 commit 530ce06
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 24 deletions.
39 changes: 15 additions & 24 deletions src/jiter.rs
Expand Up @@ -3,6 +3,7 @@ use crate::number_decoder::{NumberAny, NumberFloat, NumberInt, NumberRange};
use crate::parse::{Parser, Peek};
use crate::string_decoder::{StringDecoder, StringDecoderRange, Tape};
use crate::value::{take_value, JsonValue};
use crate::{JsonError, JsonErrorType};

pub type JiterResult<T> = Result<T, JiterError>;

Expand Down Expand Up @@ -112,13 +113,7 @@ impl<'j> Jiter<'j> {
pub fn known_number(&mut self, peek: Peek) -> JiterResult<NumberAny> {
self.parser
.consume_number::<NumberAny>(peek.into_inner(), self.allow_inf_nan)
.map_err(|e| {
if !peek.is_num() {
self.wrong_type(JsonType::Int, peek)
} else {
e.into()
}
})
.map_err(|e| self.maybe_number_error(e, JsonType::Int, peek))
}

/// Assuming the next value is an integer, consume it. Error if it is not an integer, or is invalid JSON.
Expand All @@ -132,10 +127,10 @@ impl<'j> Jiter<'j> {
self.parser
.consume_number::<NumberInt>(peek.into_inner(), self.allow_inf_nan)
.map_err(|e| {
if !peek.is_num() {
self.wrong_type(JsonType::Int, peek)
if e.error_type == JsonErrorType::FloatExpectingInt {
JiterError::wrong_type(JsonType::Int, JsonType::Float, self.parser.index)
} else {
e.into()
self.maybe_number_error(e, JsonType::Int, peek)
}
})
}
Expand All @@ -150,13 +145,7 @@ impl<'j> Jiter<'j> {
pub fn known_float(&mut self, peek: Peek) -> JiterResult<f64> {
self.parser
.consume_number::<NumberFloat>(peek.into_inner(), self.allow_inf_nan)
.map_err(|e| {
if !peek.is_num() {
self.wrong_type(JsonType::Float, peek)
} else {
e.into()
}
})
.map_err(|e| self.maybe_number_error(e, JsonType::Float, peek))
}

/// Assuming the next value is a number, consume it and return bytes from the original JSON data.
Expand All @@ -172,13 +161,7 @@ impl<'j> Jiter<'j> {
.consume_number::<NumberRange>(peek.into_inner(), self.allow_inf_nan)
{
Ok(range) => Ok(&self.data[range]),
Err(e) => {
if !peek.is_num() {
Err(self.wrong_type(JsonType::Float, peek))
} else {
Err(e.into())
}
}
Err(e) => Err(self.maybe_number_error(e, JsonType::Float, peek)),
}
}

Expand Down Expand Up @@ -327,4 +310,12 @@ impl<'j> Jiter<'j> {
};
JiterError::wrong_type(expected, actual, self.parser.index)
}

fn maybe_number_error(&self, e: JsonError, expected: JsonType, peek: Peek) -> JiterError {
if peek.is_num() {
e.into()
} else {
self.wrong_type(expected, peek)
}
}
}
97 changes: 97 additions & 0 deletions tests/main.rs
Expand Up @@ -934,3 +934,100 @@ fn jiter_clone() {
jiter1.finish().unwrap();
jiter2.finish().unwrap();
}

#[test]
fn jiter_invalid_value() {
let mut jiter = Jiter::new(b" bar", false);
let e = jiter.next_value().unwrap_err();
assert_eq!(
e.error_type,
JiterErrorType::JsonError(JsonErrorType::ExpectedSomeValue)
);
assert_eq!(e.index, 1);
assert_eq!(jiter.error_position(e.index), LinePosition::new(1, 2));
}

#[test]
fn jiter_wrong_types() {
macro_rules! expect_wrong_type_inner {
($actual:path, $input:expr, $method: ident, $expected:path) => {
let mut jiter = Jiter::new($input, false);
let result = jiter.$method();
if $actual == $expected || matches!(($actual, $expected), (JsonType::Int, JsonType::Float)) {
// Type matches, or int input to float
assert!(result.is_ok());
} else {
let e = result.unwrap_err();
assert_eq!(
e.error_type,
JiterErrorType::WrongType {
expected: $expected,
actual: $actual,
}
);
}
};
}

macro_rules! expect_wrong_type {
($method:ident, $expected:path) => {
expect_wrong_type_inner!(JsonType::Array, b"[]", $method, $expected);
expect_wrong_type_inner!(JsonType::Bool, b"true", $method, $expected);
expect_wrong_type_inner!(JsonType::Int, b"123", $method, $expected);
expect_wrong_type_inner!(JsonType::Float, b"123.123", $method, $expected);
expect_wrong_type_inner!(JsonType::Null, b"null", $method, $expected);
expect_wrong_type_inner!(JsonType::Object, b"{}", $method, $expected);
expect_wrong_type_inner!(JsonType::String, b"\"hello\"", $method, $expected);
};
}

expect_wrong_type!(next_array, JsonType::Array);
expect_wrong_type!(next_bool, JsonType::Bool);
expect_wrong_type!(next_bytes, JsonType::String);
expect_wrong_type!(next_null, JsonType::Null);
expect_wrong_type!(next_object, JsonType::Object);
expect_wrong_type!(next_object_bytes, JsonType::Object);
expect_wrong_type!(next_str, JsonType::String);
expect_wrong_type!(next_int, JsonType::Int);
expect_wrong_type!(next_float, JsonType::Float);
}

#[test]
fn jiter_invalid_numbers() {
let mut jiter = Jiter::new(b" -a", false);
let peek = jiter.peek().unwrap();
let e = jiter.known_int(peek).unwrap_err();
assert_eq!(e.error_type, JiterErrorType::JsonError(JsonErrorType::InvalidNumber));
let e = jiter.known_float(peek).unwrap_err();
assert_eq!(e.error_type, JiterErrorType::JsonError(JsonErrorType::InvalidNumber));
let e = jiter.known_number(peek).unwrap_err();
assert_eq!(e.error_type, JiterErrorType::JsonError(JsonErrorType::InvalidNumber));
let e = jiter.next_number_bytes().unwrap_err();
assert_eq!(e.error_type, JiterErrorType::JsonError(JsonErrorType::InvalidNumber));
}

#[test]
fn jiter_invalid_numbers_expected_some_value() {
let mut jiter = Jiter::new(b" bar", false);
let peek = jiter.peek().unwrap();
let e = jiter.known_int(peek).unwrap_err();
assert_eq!(
e.error_type,
JiterErrorType::JsonError(JsonErrorType::ExpectedSomeValue)
);
let e = jiter.known_float(peek).unwrap_err();
assert_eq!(
e.error_type,
JiterErrorType::JsonError(JsonErrorType::ExpectedSomeValue)
);
let e = jiter.known_number(peek).unwrap_err();
assert_eq!(
e.error_type,
JiterErrorType::JsonError(JsonErrorType::ExpectedSomeValue)
);
let e = jiter.next_number_bytes().unwrap_err();
assert_eq!(
e.error_type,
JiterErrorType::JsonError(JsonErrorType::ExpectedSomeValue)
);
}

0 comments on commit 530ce06

Please sign in to comment.