defl/tests.old/test_table.py

144 lines
3.2 KiB
Python
Raw Permalink Normal View History

2024-09-11 11:14:03 -04:00
#!/usr/bin/env python
from dataclasses import dataclass, field, KW_ONLY
from typing import ClassVar, Any, Callable, NewType, Container, Mapping, Self, ValuesView, KeysView, ItemsView
import defl
import sys
import pathlib
from operator import itemgetter
from defl import log, cl
from typing import ClassVar
import defl
import json
from defl import log, cl, testing_
tester = testing_.Tester(name=__file__)
listData = [[f'{x1}{x2}' for x2 in [1, 2, 3, 4]] for x1 in ['a', 'b', 'c', 'd']]
dictData = {"a1": ["b1", "c1", "d1"], "a2": ["b2", "c2", "d2"], "a3": ["b3", "c3", "d3"], "a4": ["b4", "c4", "d4"]}
simple = {'a': [1, 2], 'b': [3, 4], 'c': [0, 0]}
@tester.add()
def createTableList():
jd = defl.Table(listData)
assert jd.data == dictData, jd.data
@tester.add()
def createTableDict():
jd = defl.Table(dictData)
assert jd.data == dictData, jd.data
@tester.add()
def addData():
jd = defl.Table(listData)
jd['add'] = [[5, 4, 3]]
assert jd.data['add'] == [5, 4, 3], jd.data
@tester.add()
def sort():
jd = defl.Table({
'a': [0, 0, 1, 0, 0],
'b': [1, 1, 1, 2, 2],
'c': [4, 3, 1, 2, 1],
})
assert jd.data is not jd.sort().data, 'same dictionary not good'
assert (t := jd.sort().data) == {'a': [0, 0, 0, 0, 1], 'b': [1, 1, 2, 2, 1], 'c': [3, 4, 1, 2, 1]}, t
assert (t := jd.sort(['a', 'b', 'c']).data) == {'a': [0, 0, 0, 0, 1], 'b': [1, 1, 2, 2, 1], 'c': [3, 4, 1, 2, 1]}, t
rev = jd.sort(['a', 'b', 'c'], reverse=[True, False, True]).data
assert rev == {'a': [1, 0, 0, 0, 0], 'b': [1, 1, 1, 2, 2], 'c': [1, 4, 3, 2, 1]}
@ tester.add()
def add():
jd = defl.Table(simple)
jd[['a', 'b']] = jd[['a', 'b']] - 1
assert jd.data == {'a': [0, 1], 'b': [2, 3], 'c': [0, 0]}, jd.data
@ tester.add()
def opTable():
jd = defl.Table(simple)
jd['f'] = jd[['a']] - 1
assert jd.data['f'] == [0, 1], jd.data
@ tester.add()
def opTable():
jd = defl.Table(simple)
jd[['f']] = jd[['a']] - 1
assert jd.data['f'] == [0, 1], jd.data
@ tester.add()
def differentID():
jd = defl.Table(simple)
jd2 = defl.Table(jd.data)
assert jd.data is not jd2.data, jd.data
@ tester.add()
def differentID():
jd = defl.Table(simple)
jdA = defl.Table(simple)['a']
jd['a'] / 2
assert jdA is not jd['a']
jd['a'] = jd['a'] / 2
assert jdA is not jd['a']
@ tester.add()
def differentID():
obj = object()
d = {1: [obj, obj]}
assert id(d) == id(d)
assert d is d
jd = defl.Table(d)
assert d is not jd.data
assert d[1] is not jd.data[1]
assert jd.data[1][0] is obj
assert jd.data[1][1] is obj
@ tester.add()
def differentID():
obj = object()
l = [[0, 1], [obj, obj]]
jd = defl.Table(l)
assert jd.data[0][0] == obj
assert jd.data[1][0] == obj
@ dataclass(slots=True, kw_only=True, frozen=False)
class Ev:
i: ClassVar = 0
m: int = 0
def __post_init__(_):
_.m = Ev.i
Ev.i += 1
def ev():
return Ev()
@ tester.add()
def evaluate():
l = [[0, 1], [ev, ev]]
jd = defl.Table(l)
jde = jd.evaluate()
assert callable(jd.data[0][0])
assert callable(jd.data[1][0])
assert jde.data[0][0].m == 0
assert jde.data[1][0].m == 1
log.info(tester.run())