Skip to content

Commit

Permalink
Fixed parsing lone numbers (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
cjermain committed Oct 4, 2022
1 parent b3d44a3 commit dc7b0f5
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 21 deletions.
12 changes: 7 additions & 5 deletions src/number.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,21 @@ pub fn parse_number<'b, 'a>(values: &'b mut &'a [u8]) -> Result<Number<'a>, Erro
}
length += 1;

prev_state = state;

if matches!(prev_state, State::Number | State::Fraction) {
number_end += 1
};

if values.len() == 1 {
break;
}

*values = values.get(1..).ok_or(Error::InvalidEOF)?;
let byte = values.get(0).ok_or(Error::InvalidEOF)?;

prev_state = state;
state = next_state(*byte, state)?;

if matches!(prev_state, State::Number | State::Fraction) {
number_end += 1
};

if state == State::Finished {
break;
}
Expand Down
45 changes: 29 additions & 16 deletions tests/it/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,15 @@ fn empty_string() -> Result<(), Error> {

#[test]
fn number() -> Result<(), Error> {
let data: &str = "[10]";
let num: &str = "10";
let array: &str = &format!("[{}]", num);

let item = parse(data.as_bytes())?;
assert_eq!(
item,
parse(num.as_bytes())?,
Value::Number(Number::Integer(b"10", b""))
);
assert_eq!(
parse(array.as_bytes())?,
Value::Array(vec![Value::Number(Number::Integer(b"10", b""))])
);
Ok(())
Expand Down Expand Up @@ -176,39 +180,48 @@ fn multiple_escape() -> Result<(), Error> {

#[test]
fn number_exponent() -> Result<(), Error> {
let data: &[u8] = b"[1E10]";
let num: &str = "1E10";
let array: &str = &format!("[{}]", num);

let item = parse(data)?;
assert_eq!(
item,
parse(num.as_bytes())?,
Value::Number(Number::Integer(b"1", b"10"))
);
assert_eq!(
parse(array.as_bytes())?,
Value::Array(vec![Value::Number(Number::Integer(b"1", b"10"))])
);
Ok(())
}

#[test]
fn number_exponent1() -> Result<(), Error> {
let data: &[u8] = b"[1e-10]";
let num: &str = "1e-10";
let array: &str = &format!("[{}]", num);

let item = parse(data)?;
assert_eq!(
item,
parse(num.as_bytes())?,
Value::Number(Number::Integer(b"1", b"-10"))
);
assert_eq!(
parse(array.as_bytes())?,
Value::Array(vec![Value::Number(Number::Integer(b"1", b"-10"))])
);
Ok(())
}

#[test]
fn number_exponent2() -> Result<(), Error> {
let data: &[u8] = b"[8.310346185542391e275]";
let num: &str = "8.310346185542391e275";
let array: &str = &format!("[{}]", num);

let item = parse(data)?;
assert_eq!(
item,
Value::Array(vec![Value::Number(Number::Float(
b"8.310346185542391",
b"275"
))])
parse(num.as_bytes())?,
Value::Number(Number::Float(b"8.310346185542391", b"275"))
);
assert_eq!(
parse(array.as_bytes())?,
Value::Array(vec![Value::Number(Number::Float(b"8.310346185542391", b"275"))])
);
Ok(())
}
Expand Down

0 comments on commit dc7b0f5

Please sign in to comment.