Skip to content

Commit

Permalink
account for sign in double parsing
Browse files Browse the repository at this point in the history
When sign was present during double parsing correctly jump forward the
extra character when parsing fraction and exponent.
  • Loading branch information
bobthekingofegypt committed Jul 28, 2016
1 parent 3401361 commit f3079e8
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
12 changes: 6 additions & 6 deletions components/style/attr.rs
Expand Up @@ -92,17 +92,17 @@ pub fn parse_double(string: &str) -> Result<f64, ()> {
let trimmed = string.trim_matches(HTML_SPACE_CHARACTERS);
let mut input = trimmed.chars().peekable();

let (value, divisor) = match input.peek() {
let (value, divisor, chars_skipped) = match input.peek() {
None => return Err(()),
Some(&'-') => {
input.next();
(-1f64, -1f64)
(-1f64, -1f64, 1)
}
Some(&'+') => {
input.next();
(1f64, 1f64)
(1f64, 1f64, 1)
}
_ => (1f64, 1f64)
_ => (1f64, 1f64, 0)
};

let (value, value_digits) = if let Some(&'.') = input.peek() {
Expand All @@ -112,11 +112,11 @@ pub fn parse_double(string: &str) -> Result<f64, ()> {
(value * read_val.and_then(|result| result.to_f64()).unwrap_or(1f64), read_digits)
};

let input = trimmed.chars().skip(value_digits).peekable();
let input = trimmed.chars().skip(value_digits + chars_skipped).peekable();

let (mut value, fraction_digits) = read_fraction(input, divisor, value);

let input = trimmed.chars().skip(value_digits + fraction_digits).peekable();
let input = trimmed.chars().skip(value_digits + chars_skipped + fraction_digits).peekable();

if let Some(exp) = read_exponent(input) {
value *= 10f64.powi(exp)
Expand Down
18 changes: 18 additions & 0 deletions tests/unit/style/attr.rs
Expand Up @@ -14,6 +14,24 @@ fn test_parse_double() {
}
}

#[test]
fn test_parse_double_negative_prefix() {
let value = String::from("-5.6");
match AttrValue::from_double(value, 0.0) {
AttrValue::Double(_, num) => assert_eq!(num, -5.6f64),
_ => panic!("expected a double value")
}
}

#[test]
fn test_parse_double_positive_prefix() {
let value = String::from("+5.6");
match AttrValue::from_double(value, 0.0) {
AttrValue::Double(_, num) => assert_eq!(num, 5.6f64),
_ => panic!("expected a double value")
}
}

#[test]
fn test_from_limited_i32_should_be_default_when_less_than_0() {
let value = String::from("-1");
Expand Down

0 comments on commit f3079e8

Please sign in to comment.