Fix test_spec_ex7_3

This commit is contained in:
Yuheng Chen 2015-05-28 17:18:20 +08:00
parent ce6b057bfe
commit b4f94fdca7
5 changed files with 51 additions and 12 deletions

View file

@ -156,7 +156,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
-> Result<(), ScanError> { -> Result<(), ScanError> {
match *first_ev { match *first_ev {
Event::Alias => { unimplemented!() }, Event::Alias => { unimplemented!() },
Event::Scalar(ref v, style) => { Event::Scalar(_, _) => {
Ok(()) Ok(())
}, },
Event::SequenceStart => { Event::SequenceStart => {
@ -170,7 +170,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
} }
} }
fn load_mapping<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R) fn load_mapping<R: EventReceiver>(&mut self, _first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
let mut ev = try!(self.parse(recv)); let mut ev = try!(self.parse(recv));
while ev != Event::MappingEnd { while ev != Event::MappingEnd {
@ -187,11 +187,11 @@ impl<T: Iterator<Item=char>> Parser<T> {
Ok(()) Ok(())
} }
fn load_sequence<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R) fn load_sequence<R: EventReceiver>(&mut self, _first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
let mut ev = try!(self.parse(recv)); let mut ev = try!(self.parse(recv));
while ev != Event::SequenceEnd { while ev != Event::SequenceEnd {
let entry = try!(self.load_node(&ev, recv)); try!(self.load_node(&ev, recv));
// next event // next event
ev = try!(self.parse(recv)); ev = try!(self.parse(recv));
@ -367,7 +367,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
self.state = State::BlockMappingFirstKey; self.state = State::BlockMappingFirstKey;
Ok(Event::MappingStart) Ok(Event::MappingStart)
}, },
_ => { unimplemented!(); } _ => { Err(ScanError::new(tok.0, "while parsing a node, did not find expected node content")) }
} }
} }
@ -474,7 +474,11 @@ impl<T: Iterator<Item=char>> Parser<T> {
return self.parse_node(false, false); return self.parse_node(false, false);
} }
} }
} else if (tok.1 != TokenType::FlowMappingEndToken) { // XXX libyaml fail ex 7.3, empty key
} else if tok.1 == TokenType::ValueToken {
self.state = State::FlowMappingValue;
return Ok(Event::empty_scalar());
} else if tok.1 != TokenType::FlowMappingEndToken {
self.push_state(State::FlowMappingEmptyValue); self.push_state(State::FlowMappingEmptyValue);
return self.parse_node(false, false); return self.parse_node(false, false);
} }
@ -494,7 +498,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
if tok.1 == TokenType::ValueToken { if tok.1 == TokenType::ValueToken {
self.skip(); self.skip();
let mut tok = try!(self.peek()); let tok = try!(self.peek());
match tok.1 { match tok.1 {
TokenType::FlowEntryToken TokenType::FlowEntryToken
| TokenType::FlowMappingEndToken => { }, | TokenType::FlowMappingEndToken => { },

View file

@ -553,7 +553,7 @@ impl<T: Iterator<Item=char>> Scanner<T> {
let mut chomping: i32 = 0; let mut chomping: i32 = 0;
let mut increment: usize = 0; let mut increment: usize = 0;
let mut indent: usize = 0; let mut indent: usize = 0;
let mut trailing_blank: bool = false; let mut trailing_blank: bool;
let mut leading_blank: bool = false; let mut leading_blank: bool = false;
let mut string = String::new(); let mut string = String::new();
@ -742,7 +742,7 @@ impl<T: Iterator<Item=char>> Scanner<T> {
let mut leading_break = String::new(); let mut leading_break = String::new();
let mut trailing_breaks = String::new(); let mut trailing_breaks = String::new();
let mut whitespaces = String::new(); let mut whitespaces = String::new();
let mut leading_blanks = false; let mut leading_blanks;
/* Eat the left quote. */ /* Eat the left quote. */
self.skip(); self.skip();
@ -820,7 +820,6 @@ impl<T: Iterator<Item=char>> Scanner<T> {
self.skip(); self.skip();
// Consume an arbitrary escape code. // Consume an arbitrary escape code.
if code_length > 0 { if code_length > 0 {
let val = 0usize;
self.lookahead(code_length); self.lookahead(code_length);
let mut value = 0u32; let mut value = 0u32;
for i in 0..code_length { for i in 0..code_length {
@ -840,7 +839,7 @@ impl<T: Iterator<Item=char>> Scanner<T> {
}; };
string.push(ch); string.push(ch);
for i in 0..code_length { for _ in 0..code_length {
self.skip(); self.skip();
} }
} }
@ -1491,5 +1490,29 @@ key:
next!(p, StreamEndToken); next!(p, StreamEndToken);
end!(p); end!(p);
} }
#[test]
fn test_spec_ex7_3() {
let s =
"
{
? foo :,
: bar,
}
";
let mut p = Scanner::new(s.chars());
next!(p, StreamStartToken(..));
next!(p, FlowMappingStartToken);
next!(p, KeyToken);
next_scalar!(p, TScalarStyle::Plain, "foo");
next!(p, ValueToken);
next!(p, FlowEntryToken);
next!(p, ValueToken);
next_scalar!(p, TScalarStyle::Plain, "bar");
next!(p, FlowEntryToken);
next!(p, FlowMappingEndToken);
next!(p, StreamEndToken);
end!(p);
}
} }

View file

@ -205,7 +205,6 @@ impl Index<usize> for Yaml {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use parser::Parser;
use yaml::*; use yaml::*;
#[test] #[test]
fn test_coerce() { fn test_coerce() {

View file

@ -0,0 +1,6 @@
# Ex 8.18
plain key: in-line value
: # Both empty
"quoted key":
- entry

View file

@ -0,0 +1,7 @@
# Ex 7.17
{
unqoted : "separate",
http://foo.com,
omitted value:,
: omitted key,
}