# coding: utf-8
"""Tests for the Python API for composing notebook elements"""

import nose.tools as nt

from IPython.nbformat.validator import isvalid, validate, ValidationError
from ..nbbase import (
    NotebookNode, nbformat,
    new_code_cell, new_markdown_cell, new_notebook,
    new_output, new_raw_cell,
)

def test_empty_notebook():
    nb = new_notebook()
    nt.assert_equal(nb.cells, [])
    nt.assert_equal(nb.metadata, NotebookNode())
    nt.assert_equal(nb.nbformat, nbformat)

def test_empty_markdown_cell():
    cell = new_markdown_cell()
    nt.assert_equal(cell.cell_type, 'markdown')
    nt.assert_equal(cell.source, '')

def test_markdown_cell():
    cell = new_markdown_cell(u'* Søme markdown')
    nt.assert_equal(cell.source, u'* Søme markdown')

def test_empty_raw_cell():
    cell = new_raw_cell()
    nt.assert_equal(cell.cell_type, u'raw')
    nt.assert_equal(cell.source, '')

def test_raw_cell():
    cell = new_raw_cell('hi')
    nt.assert_equal(cell.source, u'hi')

def test_empty_code_cell():
    cell = new_code_cell('hi')
    nt.assert_equal(cell.cell_type, 'code')
    nt.assert_equal(cell.source, u'hi')

def test_empty_display_data():
    output = new_output('display_data')
    nt.assert_equal(output.output_type, 'display_data')

def test_empty_stream():
    output = new_output('stream')
    nt.assert_equal(output.output_type, 'stream')
    nt.assert_equal(output.name, 'stdout')
    nt.assert_equal(output.text, '')

def test_empty_execute_result():
    output = new_output('execute_result', execution_count=1)
    nt.assert_equal(output.output_type, 'execute_result')

mimebundle = {
    'text/plain': "some text",
    "application/json": {
        "key": "value"
    },
    "image/svg+xml": 'ABCDEF',
    "application/octet-stream": 'ABC-123',
    "application/vnd.foo+bar": "Some other stuff",
}

def test_display_data():
    output = new_output('display_data', mimebundle)
    for key, expected in mimebundle.items():
        nt.assert_equal(output.data[key], expected)

def test_execute_result():
    output = new_output('execute_result', mimebundle, execution_count=10)
    nt.assert_equal(output.execution_count, 10)
    for key, expected in mimebundle.items():
        nt.assert_equal(output.data[key], expected)

def test_error():
    o = new_output(output_type=u'error', ename=u'NameError',
        evalue=u'Name not found', traceback=[u'frame 0', u'frame 1', u'frame 2']
    )
    nt.assert_equal(o.output_type, u'error')
    nt.assert_equal(o.ename, u'NameError')
    nt.assert_equal(o.evalue, u'Name not found')
    nt.assert_equal(o.traceback, [u'frame 0', u'frame 1', u'frame 2'])

def test_code_cell_with_outputs():
    cell = new_code_cell(execution_count=10, outputs=[
        new_output('display_data', mimebundle),
        new_output('stream', text='hello'),
        new_output('execute_result', mimebundle, execution_count=10),
    ])
    nt.assert_equal(cell.execution_count, 10)
    nt.assert_equal(len(cell.outputs), 3)
    er = cell.outputs[-1]
    nt.assert_equal(er.execution_count, 10)
    nt.assert_equal(er['output_type'], 'execute_result')

def test_stream():
    output = new_output('stream', name='stderr', text='hello there')
    nt.assert_equal(output.name, 'stderr')
    nt.assert_equal(output.text, 'hello there')