# -*- coding: utf-8 -*-

import pytest

import copy
import datetime
import dingguo
import os
import yaml

def test_sum_init_eur():
    assert dingguo.Sum(1.23, u'EUR') == dingguo.Sum(1.23, u'€')

def test_sum_init_usd():
    assert dingguo.Sum(1.23, u'USD') == dingguo.Sum(1.23, u'US$')

def test_distance_metres():
    assert int(dingguo.Distance(1.23, u'km').metres) == 1230

def test_person_first_name():
    p = dingguo.Person()
    p.first_name = u'äbc'
    assert p.first_name == u'äbc'
    p.first_name = u'qrßtuvw'
    assert p.first_name == u'qrßtuvw'

def test_person_first_name_string():
    p = dingguo.Person()
    with pytest.raises(Exception):
        p.first_name = 'äbc'

def test_person_last_name():
    p = dingguo.Person()
    p.last_name = u'歌曲'
    assert p.last_name == u'歌曲'
    p.last_name = u'bär'
    assert p.last_name == u'bär'

def test_person_last_name_string():
    p = dingguo.Person()
    with pytest.raises(Exception):
        p.last_name = 'äbc'

@pytest.mark.parametrize(('text', 'sum'), [
    [u'$-1,23 USD',  dingguo.Sum(-1.23, u'USD')],
    [u'$-1.23 USD',  dingguo.Sum(-1.23, u'USD')],
    [u'$-30 USD',    dingguo.Sum(-30.0, u'USD')],
    [u'$-30,00 USD', dingguo.Sum(-30.0, u'USD')],
    [u'$-30.00 USD', dingguo.Sum(-30.0, u'USD')],
    [u'$-8',         dingguo.Sum(-8.0,  u'USD')],
    [u'$-8,00',      dingguo.Sum(-8.0,  u'USD')],
    [u'$-8.00',      dingguo.Sum(-8.0,  u'USD')],
    [u'$1,23 USD',   dingguo.Sum(1.23,  u'USD')],
    [u'$1.23 USD',   dingguo.Sum(1.23,  u'USD')],
    [u'$30 USD',     dingguo.Sum(30.0,  u'USD')],
    [u'$30,00 USD',  dingguo.Sum(30.0,  u'USD')],
    [u'$30.00 USD',  dingguo.Sum(30.0,  u'USD')],
    [u'$8',          dingguo.Sum(8.0,   u'USD')],
    [u'$8,00',       dingguo.Sum(8.0,   u'USD')],
    [u'$8.00',       dingguo.Sum(8.0,   u'USD')],
    [u'US$-0.50',    dingguo.Sum(-0.5,  u'USD')],
    [u'US$0.50',     dingguo.Sum(0.5,   u'USD')],
    [u'€-0.25',      dingguo.Sum(-0.25, u'EUR')],
    [u'€1.20',       dingguo.Sum(1.2,   u'EUR')],
    [u'¥ 4.27',     dingguo.Sum(4.27,  u'CNY')],
    ])
def test_sum_parse_text(text, sum):
    assert dingguo.Sum.parse_text(text) == sum

@pytest.mark.parametrize(('text'), [
    u'pre$1.23 USD',
    u'$1.23 USDpost',
    u'$1#23 USD',
    u'1#23 USD',
    ])
def test_sum_parse_text_fail(text):
    with pytest.raises(Exception):
        dingguo.Sum.parse_text(text)

@pytest.mark.parametrize(('minuend', 'subtrahend', 'difference'), [
    [dingguo.Sum(5.0, u'USD'), dingguo.Sum(2.0, u'USD'), dingguo.Sum(3.0, u'USD')],
    [dingguo.ScalarFigure(5.0, u'cm'), dingguo.ScalarFigure(2.0, u'cm'), dingguo.ScalarFigure(3.0, u'cm')],
    [dingguo.ScalarFigure(1.0, u'kg'), dingguo.ScalarFigure(2.0, u'kg'), dingguo.ScalarFigure(-1.0, u'kg')],
    ])
def test_figure_sub(minuend, subtrahend, difference):
    minuend_copy = copy.deepcopy(minuend)
    subtrahend_copy = copy.deepcopy(subtrahend)
    assert (minuend - subtrahend) == difference
    assert minuend_copy == minuend
    assert subtrahend_copy == subtrahend

@pytest.mark.parametrize(('minuend', 'subtrahend'), [
    [dingguo.Sum(5.0, u'USD'), dingguo.Sum(2.0, u'EUR')],
    [dingguo.ScalarFigure(5.0, u'cm'), dingguo.ScalarFigure(2.0, u'kg')],
    ])
def test_figure_sub_fail(minuend, subtrahend):
    with pytest.raises(Exception):
        (minuend - subtrahend)

@pytest.mark.parametrize(('factor_a', 'factor_b', 'product'), [
    [dingguo.Sum(5.0, u'USD'), 1.5, dingguo.Sum(7.5, u'USD')],
    [dingguo.Sum(5.0, u'USD'), 2, dingguo.Sum(10.0, u'USD')],
    [dingguo.ScalarFigure(5.0, u'cm'), -0.5, dingguo.ScalarFigure(-2.5, u'cm')],
    [dingguo.ScalarFigure(1.0, u'kg'), 10, dingguo.ScalarFigure(10.0, u'kg')],
    ])
def test_scalar_figure_mul(factor_a, factor_b, product):
    factor_a_copy = copy.deepcopy(factor_a)
    factor_b_copy = copy.deepcopy(factor_b)
    assert (factor_a * factor_b) == product
    assert factor_a_copy == factor_a
    assert factor_b_copy == factor_b

@pytest.mark.parametrize(('factor_a', 'factor_b'), [
    [dingguo.Sum(5.0, u'USD'), dingguo.Sum(2.0, u'EUR')],
    [dingguo.ScalarFigure(5.0, u'cm'), dingguo.ScalarFigure(2.0, u'cm')],
    ])
def test_figure_mul_fail(factor_a, factor_b):
    with pytest.raises(Exception):
        (factor_a * factor_b)