plotnik-compiler 0.3.2

Compiler for Plotnik query language (parser, analyzer, bytecode emitter)
Documentation
use super::{SourceId, SourceKind, SourceMap};

#[test]
fn single_one_liner() {
    let map = SourceMap::one_liner("hello world");
    let id = SourceId(0);

    assert_eq!(map.content(id), "hello world");
    assert_eq!(map.kind(id), &SourceKind::OneLiner);
    assert_eq!(map.len(), 1);
}

#[test]
fn stdin_source() {
    let mut map = SourceMap::new();
    let id = map.add_stdin("from stdin");

    assert_eq!(map.content(id), "from stdin");
    assert_eq!(map.kind(id), &SourceKind::Stdin);
}

#[test]
fn file_source() {
    let mut map = SourceMap::new();
    let id = map.add_file("main.ptk", "Foo = (bar)");

    assert_eq!(map.content(id), "Foo = (bar)");
    assert_eq!(map.kind(id), &SourceKind::File("main.ptk".to_owned()));
}

#[test]
fn multiple_sources() {
    let mut map = SourceMap::new();
    let a = map.add_file("a.ptk", "content a");
    let b = map.add_file("b.ptk", "content b");
    let c = map.add_one_liner("inline");
    let d = map.add_stdin("piped");

    assert_eq!(map.len(), 4);
    assert_eq!(map.content(a), "content a");
    assert_eq!(map.content(b), "content b");
    assert_eq!(map.content(c), "inline");
    assert_eq!(map.content(d), "piped");

    assert_eq!(map.kind(a), &SourceKind::File("a.ptk".to_owned()));
    assert_eq!(map.kind(b), &SourceKind::File("b.ptk".to_owned()));
    assert_eq!(map.kind(c), &SourceKind::OneLiner);
    assert_eq!(map.kind(d), &SourceKind::Stdin);
}

#[test]
fn iteration() {
    let mut map = SourceMap::new();
    map.add_file("a.ptk", "aaa");
    map.add_one_liner("bbb");

    let items: Vec<_> = map.iter().collect();
    assert_eq!(items.len(), 2);
    assert_eq!(items[0].id, SourceId(0));
    assert_eq!(items[0].kind, &SourceKind::File("a.ptk".to_owned()));
    assert_eq!(items[0].content, "aaa");
    assert_eq!(items[1].id, SourceId(1));
    assert_eq!(items[1].kind, &SourceKind::OneLiner);
    assert_eq!(items[1].content, "bbb");
}

#[test]
fn get_source() {
    let mut map = SourceMap::new();
    let id = map.add_file("test.ptk", "hello");

    let source = map.get(id);
    assert_eq!(source.id, id);
    assert_eq!(source.kind, &SourceKind::File("test.ptk".to_owned()));
    assert_eq!(source.content, "hello");
    assert_eq!(source.as_str(), "hello");
}

#[test]
fn display_name() {
    assert_eq!(SourceKind::OneLiner.display_name(), "<query>");
    assert_eq!(SourceKind::Stdin.display_name(), "<stdin>");
    assert_eq!(
        SourceKind::File("foo.ptk".to_owned()).display_name(),
        "foo.ptk"
    );
}

#[test]
#[should_panic(expected = "invalid SourceId")]
fn invalid_id_panics() {
    let map = SourceMap::new();
    let _ = map.content(SourceId(999));
}

#[test]
fn multiple_stdin_sources() {
    let mut map = SourceMap::new();
    let a = map.add_stdin("first stdin");
    let b = map.add_stdin("second stdin");

    assert_eq!(map.content(a), "first stdin");
    assert_eq!(map.content(b), "second stdin");
    assert_eq!(map.kind(a), &SourceKind::Stdin);
    assert_eq!(map.kind(b), &SourceKind::Stdin);
}