+ assert_eq!(
+ read_rows(&b"foo\nbar\n"[..]).flatten().collect::<Vec<_>>(),
+ vec![
+ RowInput {
+ label: String::from("foo"),
+ entries: vec![]
+ },
+ RowInput {
+ label: String::from("bar"),
+ entries: vec![]
+ }
+ ]
+ );
+ assert_eq!(
+ read_rows(&b"foo\n bar\n"[..]).flatten().collect::<Vec<_>>(),
+ vec![RowInput {
+ label: String::from("foo"),
+ entries: vec![String::from("bar")]
+ }]
+ );
+ assert_eq!(
+ read_rows(&b"foo\n bar\n baz\n"[..])
+ .flatten()
+ .collect::<Vec<_>>(),
+ vec![RowInput {
+ label: String::from("foo"),
+ entries: vec![String::from("bar"), String::from("baz")]
+ }]
+ );
+ assert_eq!(
+ read_rows(&b"foo\n\nbar\n"[..])
+ .flatten()
+ .collect::<Vec<_>>(),
+ vec![
+ RowInput {
+ label: String::from("foo"),
+ entries: vec![]
+ },
+ RowInput {
+ label: String::from("bar"),
+ entries: vec![]
+ }
+ ]
+ );
+ assert_eq!(
+ read_rows(&b"foo\n \nbar\n"[..])
+ .flatten()
+ .collect::<Vec<_>>(),
+ vec![
+ RowInput {
+ label: String::from("foo"),
+ entries: vec![]
+ },
+ RowInput {
+ label: String::from("bar"),
+ entries: vec![]
+ }
+ ]
+ );
+ assert_eq!(
+ read_rows(&b"foo \n bar \n"[..])
+ .flatten()
+ .collect::<Vec<_>>(),
+ vec![RowInput {
+ label: String::from("foo"),
+ entries: vec![String::from("bar")]
+ }]
+ );
+
+ let bad = read_rows(&b" foo"[..]).next().unwrap();
+ assert!(bad.is_err());
+ assert!(format!("{bad:?}").contains("1: Entry with no header"));
+
+ let bad2 = read_rows(&b"foo\n\n bar"[..]).nth(1).unwrap();
+ assert!(bad2.is_err());
+ assert!(format!("{bad2:?}").contains("3: Entry with no header"));
+ }
+
+ #[test]
+ fn test_column_counts() {
+ assert_eq!(
+ column_counts(
+ &read_rows(&b"foo\n bar\n baz\n"[..])
+ .collect::<Result<Vec<_>, _>>()
+ .unwrap()
+ ),
+ HashMap::from([(String::from("bar"), 1), (String::from("baz"), 1)])
+ );
+ assert_eq!(
+ column_counts(
+ &read_rows(&b"foo\n bar\n baz\nquux\n baz"[..])
+ .collect::<Result<Vec<_>, _>>()
+ .unwrap()
+ ),
+ HashMap::from([(String::from("bar"), 1), (String::from("baz"), 2)])
+ );