osmio 0.14.0

Read and write OpenStreetMap data files
Documentation
use super::*;

#[test]
fn char_to_objtype() {
    assert_eq!(OSMObjectType::try_from('n'), Ok(OSMObjectType::Node));
    assert_eq!(OSMObjectType::try_from('w'), Ok(OSMObjectType::Way));
    assert_eq!(OSMObjectType::try_from('r'), Ok(OSMObjectType::Relation));
    assert!(OSMObjectType::try_from('x').is_err());
}

#[test]
fn string_to_objtype() {
    assert_eq!("n".parse(), Ok(OSMObjectType::Node));
    assert_eq!("node".parse(), Ok(OSMObjectType::Node));
    assert_eq!("w".parse(), Ok(OSMObjectType::Way));
    assert_eq!("way".parse(), Ok(OSMObjectType::Way));
    assert_eq!("r".parse(), Ok(OSMObjectType::Relation));
    assert_eq!("relation".parse(), Ok(OSMObjectType::Relation));
    assert_eq!("rel".parse(), Ok(OSMObjectType::Relation));

    assert!(" ".parse::<OSMObjectType>().is_err());
}

mod timestamp_format {
    use super::*;
    use std::cmp::Ordering::*;
    use std::cmp::*;

    macro_rules! assert_cmp {
        ( $name:ident, $a:expr, $b:expr, $expected_ord:expr ) => {
            #[test]
            fn $name() {
                let a: TimestampFormat = $a;
                let b: TimestampFormat = $b;
                assert_eq!(a.partial_cmp(&b), Some($expected_ord));
            }
        };
    }

    assert_cmp!(ints1, 0.into(), 0.into(), Equal);
    assert_cmp!(ints2, 0.into(), 1.into(), Less);
    assert_cmp!(ints3, 3.into(), 1.into(), Greater);

    assert_cmp!(
        isos1,
        "2020-01-01T00:00:00Z".parse().unwrap(),
        "2020-01-01T00:00:00Z".parse().unwrap(),
        Equal
    );
    assert_cmp!(
        isos2,
        "2010-01-01T00:00:00Z".parse().unwrap(),
        "2020-01-01T00:00:00Z".parse().unwrap(),
        Less
    );
    assert_cmp!(
        isos3,
        "2020-01-01T00:00:00Z".parse().unwrap(),
        "2000-01-01T00:00:00Z".parse().unwrap(),
        Greater
    );

    assert_cmp!(
        int_iso1,
        1577836800.into(),
        "2020-01-01T00:00:00Z".parse().unwrap(),
        Equal
    );
    assert_cmp!(
        int_iso2,
        "2020-01-01T00:00:00Z".parse().unwrap(),
        1577836800.into(),
        Equal
    );

    assert_cmp!(
        int_iso3,
        TimestampFormat::EpochNunber(1577836800),
        TimestampFormat::ISOString("2020-01-01T00:00:00Z".to_string()),
        Equal
    );
    assert_cmp!(
        int_iso4,
        TimestampFormat::ISOString("2020-01-01T00:00:00Z".to_string()),
        TimestampFormat::EpochNunber(1577836800),
        Equal
    );
}

#[test]
fn area_ways() {
    use crate::{obj_types::StringOSMObj, xml::XMLReader};

    macro_rules! assert_closed_area {
        ($input: expr, $expect_is_closed: expr, $expect_is_area: expr) => {
            let mut reader = XMLReader::new($input.as_bytes());
            let mut found = false;
            for obj in reader.objects() {
                if let StringOSMObj::Way(osm_way) = obj {
                    found = true;
                    assert_eq!($expect_is_closed, osm_way.is_closed());
                    assert_eq!($expect_is_area, osm_way.is_area());
                }
            }
            assert!(found, "no Ways were found");
        };
    }

    let not_closed_input = r#"
        <?xml version="1.0" encoding="utf-8"?>
        <osm version="0.6" generator="osmio/0.4.0">\
        <node id="1" lat="0" lon="0" />
        <node id="2" lat="1" lon="0" />
        <node id="3" lat="1" lon="1" />
        <way id="1">
            <nd ref="1" />
            <nd ref="2" />
            <nd ref="3" />
        </way>
        </osm>"#;
    assert_closed_area!(not_closed_input, false, false);

    let closed_area_input = r#"
        <?xml version="1.0" encoding="utf-8"?>
        <osm version="0.6" generator="osmio/0.4.0">\
        <node id="1" lat="0" lon="0" />
        <node id="2" lat="1" lon="0" />
        <node id="3" lat="1" lon="1" />
        <way id="1">
            <nd ref="1" />
            <nd ref="2" />
            <nd ref="3" />
            <nd ref="1" />
        </way>
        </osm>"#;
    assert_closed_area!(closed_area_input, true, true);

    let closed_nonarea_input = r#"
        <?xml version="1.0" encoding="utf-8"?>
        <osm version="0.6" generator="osmio/0.4.0">\
        <node id="1" lat="0" lon="0" />
        <node id="2" lat="1" lon="0" />
        <node id="3" lat="1" lon="1" />
        <way id="1">
            <nd ref="1" />
            <nd ref="2" />
            <nd ref="3" />
            <nd ref="1" />
            <tag k="area" v="no" />
        </way>
        </osm>"#;
    assert_closed_area!(closed_nonarea_input, true, false);

    let closed_explicit_area_input = r#"
        <?xml version="1.0" encoding="utf-8"?>
        <osm version="0.6" generator="osmio/0.4.0">\
        <node id="1" lat="0" lon="0" />
        <node id="2" lat="1" lon="0" />
        <node id="3" lat="1" lon="1" />
        <way id="1">
            <nd ref="1" />
            <nd ref="2" />
            <nd ref="3" />
            <nd ref="1" />
            <tag k="area" v="yes" />
        </way>
        </osm>"#;
    assert_closed_area!(closed_explicit_area_input, true, true);
}