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

import pytest

import copy
import dingguo

@pytest.mark.parametrize(('params', 'kwargs', 'expected_value', 'expected_currency'), [
    [[1.0, u'US$'], {}, 1.0, u'USD'],
    [[1.0, u'USD'], {}, 1.0, u'USD'],
    [[-4.0], {'unit': u'EUR'}, -4.0, u'EUR'],
    [[-4.0], {'unit': u'€'}, -4.0, u'EUR'],
    [[-4.0], {'currency': u'EUR'}, -4.0, u'EUR'],
    [[-4.0], {'currency': u'€'}, -4.0, u'EUR'],
    [[], {'value': 2.3, 'unit': u'EUR'}, 2.3, u'EUR'],
    [[], {'value': 2.3, 'unit': u'€'}, 2.3, u'EUR'],
    [[], {'value': 2.3, 'currency': u'EUR'}, 2.3, u'EUR'],
    [[], {'value': 2.3, 'currency': u'€'}, 2.3, u'EUR'],
    ])
def test_init(params, kwargs, expected_value, expected_currency):
    f = dingguo.Sum(*params, **kwargs)
    assert type(f.value) == type(expected_value)
    assert type(f.unit) == type(expected_currency)
    assert f.value == expected_value
    assert f.unit == expected_currency
    assert f.currency == expected_currency

@pytest.mark.parametrize(('params', 'kwargs'), [
    [[(-1, 3), u'EUR'], {}],
    [[1, 'EUR'], {}],
    [[1, u'EUR'], {}],
    [[1.0, u'USD', u'EUR'], {}],
    [[1.2], {'value': 2.3, 'unit': u'EUR'}],
    [[1], {'unit': 'EUR'}],
    [[1], {'unit': u'EUR'}],
    [[None, u'EUR'], {}],
    [[None, u'kg'], {}],
    [[None], {}],
    [[], {'unit': u'EUR'}],
    [[], {'value': (3, -1), 'unit': u'EUR'}],
    [[], {'value': 2.3, 'unit': u'EUR', 'currency': u'EUR'}],
    [[], {}],
    ])
def test_init_fail(params, kwargs):
    with pytest.raises(Exception):
        dingguo.Sum(*params, **kwargs)

@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.Sum(5.0, u'EUR'), 1.5, dingguo.Sum(7.5, u'EUR')],
    [dingguo.Sum(5.0, u'EUR'), 2, dingguo.Sum(10.0, u'EUR')],
    ])
def test_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.ScalarFigure(5.0, u'USD'), dingguo.ScalarFigure(2.0, u'USD')],
    [dingguo.ScalarFigure(5.0, u'EUR'), dingguo.ScalarFigure(2.0, u'USD')],
    [dingguo.ScalarFigure(5.0, u'USD'), '23'],
    ])
def test_mul_fail(factor_a, factor_b):
    with pytest.raises(Exception):
        (factor_a * factor_b)