import py
from exmlparser import exmlparser

def test_single_element():
    p = exmlparser('[book]\n')
    doc = p.parse()
    assert len(doc.children) == 1
    assert doc.children[0].name == 'book'

def test_nested_element():
    p = exmlparser('[book]\n [chapter]\n')
    doc = p.parse()
    assert len(doc.children) == 1
    assert doc.children[0].name == 'book'
    assert len(doc.children[0].children) == 1
    assert doc.children[0].children[0].name == 'chapter'

def test_element_deeper_level():
    p = exmlparser('[book]\n [chapter]\n  [para]\n')
    doc = p.parse()
    assert len(doc.children) == 1
    assert len(doc.children[0].children) == 1
    assert len(doc.children[0].children[0].children) == 1
    assert doc.children[0].children[0].children[0].name == 'para'

def test_text():
    p = exmlparser('[chapter]\n "foo"\n')
    doc = p.parse()
    assert doc.children[0].children[0].value == 'foo'

def test_text_concat():
    p = exmlparser('[chapter]\n "foo "\n "bar"\n')
    doc = p.parse()
    assert doc.children[0].children[0].value == 'foo bar'

def test_text_no_concat_deeper_level():
    p = exmlparser('[chapter]\n [para]\n  "bar"\n "baz"\n')
    doc = p.parse()
    assert len(doc.children[0].children) == 2
    assert len(doc.children[0].children[0].children) == 1
    assert doc.children[0].children[0].name == 'para'
    assert doc.children[0].children[0].children[0].value == 'bar'
    assert doc.children[0].children[1].value == 'baz'

def test_multiline_string():
    p = exmlparser('[chapter]\n """\nfoo\nbar\n"""\n')
    doc = p.parse()
    assert doc.children[0].children[0].value == '\nfoo\nbar\n'

def test_multiline_string_backslash():
    p = exmlparser('[chapter]\n """\\\nfoo\n"""\n')
    doc = p.parse()
    assert doc.children[0].children[0].value == 'foo\n'

def test_comment():
    p = exmlparser('# test\n')
    doc = p.parse()
    assert len(doc.children) == 0

def test_attributes():
    p = exmlparser('[foo bar="baz" qux="quux"]')
    doc = p.parse()
    a = doc.children[0].attributes
    assert len(a) == 2
    assert a[0].name == 'bar'
    assert a[0].value == 'baz'
    assert a[1].name == 'qux'
    assert a[1].value == 'quux'

