diff --git a/src/structs/data_bar.rs b/src/structs/data_bar.rs index de08d275..bad98904 100644 --- a/src/structs/data_bar.rs +++ b/src/structs/data_bar.rs @@ -85,16 +85,17 @@ impl DataBar { ) { xml_read_loop!( reader, - Event::Empty(ref e) => { + ref n @ (Event::Empty(ref e) | Event::Start(ref e)) => { + let is_empty = matches!(n, Event::Empty(_)); match e.name().into_inner() { b"cfvo" => { let mut obj = ConditionalFormatValueObject::default(); - obj.set_attributes(reader, e, true); + obj.set_attributes(reader, e, is_empty); self.cfvo_collection.push(obj); } b"color" => { let mut obj = Color::default(); - obj.set_attributes(reader, e, true); + obj.set_attributes(reader, e, is_empty); self.color_collection.push(obj); } _ => (), @@ -126,3 +127,49 @@ impl DataBar { write_end_tag(writer, "dataBar"); } } + +#[cfg(test)] +mod tests { + use super::*; + + fn read_data_bar(xml: &str) -> DataBar { + let mut reader = Reader::from_reader(std::io::BufReader::new(xml.as_bytes())); + let mut buf = Vec::new(); + loop { + match reader.read_event_into(&mut buf) { + Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) + if e.name().into_inner() == b"dataBar" => + { + let mut obj = DataBar::default(); + obj.set_attributes(&mut reader, e); + return obj; + } + Ok(Event::Eof) => panic!("dataBar element not found"), + _ => (), + } + buf.clear(); + } + } + + #[test] + fn read_child_elements_with_end_tags() { + // Writers such as openpyxl emit children as + // (Start + End events instead of Empty). + let obj = read_data_bar( + r#""#, + ); + assert_eq!(obj.get_cfvo_collection().len(), 2); + assert_eq!(obj.get_color_collection().len(), 1); + assert_eq!(obj.get_color_collection()[0].get_argb_str(), "FF1E2761"); + } + + #[test] + fn read_child_elements_self_closing() { + let obj = read_data_bar( + r#""#, + ); + assert_eq!(obj.get_cfvo_collection().len(), 2); + assert_eq!(obj.get_color_collection().len(), 1); + assert_eq!(obj.get_color_collection()[0].get_argb_str(), "FF638EC6"); + } +}