#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Testing functions from utils.py
"""

import pytest
from slsdet.utils import *
import datetime as dt

def test_iterable():
    assert is_iterable(5) == False
    assert is_iterable('abc') == True
    assert is_iterable([]) == True
    assert is_iterable(5.9) == False

def test_reduce_time_to_single_value_from_list():
    t = 3*[dt.timedelta(seconds = 1)]
    assert reduce_time(t) == 1

def test_reduce_time_to_single_value_from_list_of_lists():
    t = 3*[dt.timedelta(seconds = 3.3)]
    tt = 5*t
    assert reduce_time(tt) == 3.3

def test_reduce_time_when_sublist_is_different():
    t = [dt.timedelta(seconds = 1), dt.timedelta(seconds = 2), dt.timedelta(seconds = 1)]
    tt = [t for i in range(4)]
    assert reduce_time(tt) == [1,2,1]


def test_convert_zero():
    assert eiger_register_to_time(0) == 0

def test_convert_smallest_unit():
    assert pytest.approx(eiger_register_to_time(0b1000), 1e-9) == 1e-8

def test_convert_second_smallest_unit():
    assert pytest.approx(eiger_register_to_time(0b10000), 1e-9) == 2e-8

def test_convert_one_ms_using_exponent():
    assert pytest.approx(eiger_register_to_time(0b1101), 1e-9) == 1e-3

def test_convert_five_seconds():
    assert pytest.approx(eiger_register_to_time(0b1001110001000101), 1e-9) == 5.0

def test_all_equal_int():
    assert all_equal([5,5]) == True

def test_all_equal_fails():
    assert all_equal([5,6])  == False

def test_all_equal_tuple():
    assert all_equal(('a', 'a', 'a')) == True

def test_all_equal_str():
    assert all_equal('aaa') == True

def test_all_equal_str_fails():
    assert all_equal('aaab') == False



def test_element_if_equal_int():
    assert element_if_equal([5,5]) == 5

def test_element_if_equal_str():
    assert element_if_equal('hhh') == 'h'

def test_element_if_equal_int_fails():
    assert element_if_equal([5, 6, 7]) == [5, 6, 7]

def test_get_set_bits():
    assert(get_set_bits(0) == [])
    assert get_set_bits(7) == [0, 1, 2]
    
def test_list_to_mask():
    assert(list_to_bitmask([0,1,2]) == 7)
    assert(list_to_bitmask([]) == 0)
    assert(list_to_bitmask([0]) == 1)
    assert(list_to_bitmask([1]) == 2)
    assert(list_to_bitmask([3]) == 8)
    assert(list_to_bitmask([1,1,1]) == 2)


def test_make_timedelta_from_double():
    t = 1.7
    r = make_timedelta(t)
    assert t == r.total_seconds()
    assert r == dt.timedelta(seconds=t)

def test_make_timedelta_from_timedelta():
    t = dt.timedelta(minutes=1)
    r = make_timedelta(t)
    assert 60 == r.total_seconds()
    assert r == dt.timedelta(minutes=1)