144 lines
3.2 KiB
Python
Executable File
144 lines
3.2 KiB
Python
Executable File
#!/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())
|