Path: blob/main/singlestoredb/tests/test_xdict.py
469 views
#!/usr/bin/env python1# type: ignore2# encoding: utf-83#4# Copyright SAS Institute5#6# Licensed under the Apache License, Version 2.0 (the License);7# you may not use this file except in compliance with the License.8# You may obtain a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing, software13# distributed under the License is distributed on an "AS IS" BASIS,14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.15# See the License for the specific language governing permissions and16# limitations under the License.17#18# This file originally copied from https://github.com/sassoftware/python-swat19#20import copy21import unittest2223from singlestoredb.utils.xdict import xadict24from singlestoredb.utils.xdict import xdict2526out1 = {27'a': {'one': 1},28'b': {'two': 2},29'c': {30'three': {'nest': 3},31'four': {32'nest': {'double': 4},33},34},35}3637flatout1 = {38'a.one': 1,39'b.two': 2,40'c.three.nest': 3,41'c.four.nest.double': 4,42}434445class TestXDict(unittest.TestCase):4647def test_constructor(self):48x = xdict(one=1, two=2, three=3)49self.assertEqual(x, dict(one=1, two=2, three=3))5051x = xdict([('a.one', 1), ('b.two', 2), ('c.three.nest', 3)])52self.assertEqual(53x, {54'a': {'one': 1},55'b': {'two': 2},56'c': {57'three': {'nest': 3},58},59},60)6162x = xdict([63('a.one', 1), ('b.two', 2), ('c.three.nest', 3),64('c.four.nest.double', 4),65])66self.assertEqual(x, out1)6768x = xdict(out1)69self.assertEqual(x, out1)7071x = xdict(flatout1)72self.assertEqual(x, out1)7374x = xdict(**out1)75self.assertEqual(x, out1)7677x = xdict(**flatout1)78self.assertEqual(x, out1)7980def test_setitem(self):81x = xdict()82x['a.one'] = 183x['b.two'] = 284x['c.three.nest'] = 385x['c.four.nest.double'] = 486self.assertEqual(x, out1)8788x[100] = 100089self.assertEqual(x[100], 1000)9091x = xdict()92x['a.one'] = 193x['b.two'] = 294x['c.three.nest'] = 395x['c.four'] = {'nest': {'double': 4}}96self.assertEqual(x, out1)9798def test_getitem(self):99x = xdict(out1)100self.assertEqual(x['a.one'], 1)101self.assertEqual(x['b.two'], 2)102self.assertEqual(x['c.three.nest'], 3)103self.assertEqual(x['c.four.nest.double'], 4)104105self.assertEqual(x['a'], {'one': 1})106self.assertEqual(x['b'], {'two': 2})107self.assertEqual(x['c'], {'three': {'nest': 3}, 'four': {'nest': {'double': 4}}})108self.assertEqual(x['c.three'], {'nest': 3})109self.assertEqual(x['c.four'], {'nest': {'double': 4}})110self.assertEqual(x['c.four.nest'], {'double': 4})111112self.assertEqual(x['a'], {'one': 1})113self.assertEqual(x['a']['one'], 1)114self.assertEqual(x['b'], {'two': 2})115self.assertEqual(x['b']['two'], 2)116self.assertEqual(x['c'], {'three': {'nest': 3}, 'four': {'nest': {'double': 4}}})117self.assertEqual(x['c']['three'], {'nest': 3})118self.assertEqual(x['c']['three']['nest'], 3)119self.assertEqual(x['c']['four'], {'nest': {'double': 4}})120self.assertEqual(x['c']['four']['nest'], {'double': 4})121self.assertEqual(x['c']['four']['nest']['double'], 4)122123def test_get(self):124x = xdict(out1)125126self.assertEqual(x.get('a', 1000), {'one': 1})127self.assertEqual(x.get('a.one', 1000), 1)128self.assertEqual(x.get('a.does.not.exist', 1000), 1000)129130def test_delitem(self):131newout1 = copy.deepcopy(out1)132x = xdict(out1)133134del x['a']135del newout1['a']136self.assertEqual(x, newout1)137138del x['c.four.nest']139del newout1['c']['four']['nest']140self.assertEqual(x, newout1)141142with self.assertRaises(KeyError):143del x['a.does.not.exist']144145def test_flattened(self):146x = xdict(out1)147self.assertEqual(x.flattened(), flatout1)148149def test_setdefault(self):150x = xdict(out1)151152self.assertEqual(x.setdefault('a.one'), 1)153self.assertEqual(x.setdefault('b.two'), 2)154self.assertEqual(x.setdefault('b'), {'two': 2})155156self.assertEqual(x.setdefault('w.none'), None)157self.assertEqual(x['w.none'], None)158self.assertEqual(x['w']['none'], None)159self.assertEqual(x.setdefault('x.y.z', 200), 200)160self.assertEqual(x['x.y.z'], 200)161self.assertEqual(x['x']['y']['z'], 200)162self.assertEqual(x.setdefault('x.y.z', 10), 200)163self.assertEqual(x['x.y.z'], 200)164self.assertEqual(x['x']['y']['z'], 200)165self.assertEqual(x['x']['y'], {'z': 200})166167self.assertEqual(x.setdefault('does.not.exist', {'new': 'key'}), {'new': 'key'})168self.assertTrue(isinstance(x.setdefault('does.not.exist', {'new': 'key'}), xdict))169170def test_json(self):171x = xdict(out1)172self.assertEqual(xdict.from_json(x.to_json()), out1)173174def test_flat(self):175x = xdict(out1)176177self.assertEqual(sorted(x.flatkeys()), sorted(flatout1.keys()))178self.assertEqual(sorted(x.flatvalues()), sorted(flatout1.values()))179self.assertEqual(sorted(x.flatitems()), sorted(flatout1.items()))180181if hasattr(flatout1, 'iterkeys'):182self.assertEqual(sorted(x.iterflatkeys()), sorted(flatout1.iterkeys()))183if hasattr(flatout1, 'itervalues'):184self.assertEqual(sorted(x.iterflatvalues()), sorted(flatout1.itervalues()))185if hasattr(flatout1, 'iteritems'):186self.assertEqual(sorted(x.iterflatitems()), sorted(flatout1.iteritems()))187188if hasattr(flatout1, 'iterkeys'):189self.assertEqual(sorted(x.viewflatkeys()), sorted(flatout1.iterkeys()))190if hasattr(flatout1, 'itervalues'):191self.assertEqual(sorted(x.viewflatvalues()), sorted(flatout1.itervalues()))192if hasattr(flatout1, 'iteritems'):193self.assertEqual(sorted(x.viewflatitems()), sorted(flatout1.iteritems()))194195def test_contains(self):196x = xdict(out1)197198self.assertTrue('a' in x)199self.assertTrue('a.one' in x)200self.assertTrue('b' in x)201self.assertTrue('c.four' in x)202self.assertTrue('c.four.nest' in x)203self.assertTrue('c.four.nest.double' in x)204self.assertFalse('z' in x)205self.assertFalse('four' in x)206207self.assertTrue(x.has_key('a')) # noqa: W601208self.assertTrue(x.has_key('a.one')) # noqa: W601209self.assertTrue(x.has_key('b')) # noqa: W601210self.assertTrue(x.has_key('c.four')) # noqa: W601211self.assertTrue(x.has_key('c.four.nest')) # noqa: W601212self.assertTrue(x.has_key('c.four.nest.double')) # noqa: W601213self.assertFalse(x.has_key('z')) # noqa: W601214self.assertFalse(x.has_key('four')) # noqa: W601215216def test_pop(self):217x = xdict(out1)218219self.assertEqual(x, out1)220221self.assertEqual(x.pop('a.one'), out1['a']['one'])222self.assertEqual(x.pop('b.two'), out1['b']['two'])223self.assertEqual(x.pop('c'), out1['c'])224225self.assertEqual(x, {'a': {}, 'b': {}})226227with self.assertRaises(KeyError):228x.pop('a.does.not.exist')229230self.assertEqual(x.pop('a.does.not.exist', 1000), 1000)231232def test_copy(self):233w = xdict(out1)234235x = w.copy()236237self.assertEqual(w, x)238self.assertTrue(w is not x)239self.assertTrue(w['a'] is x['a'])240self.assertTrue(w['b'] is x['b'])241self.assertTrue(w['c'] is x['c'])242243y = copy.copy(w)244245self.assertEqual(w, y)246self.assertTrue(w is not y)247self.assertTrue(w['a'] is y['a'])248self.assertTrue(w['a.one'] is y['a.one'])249self.assertTrue(w['b'] is y['b'])250self.assertTrue(w['b.two'] is y['b.two'])251self.assertTrue(w['c'] is y['c'])252self.assertTrue(w['c.three'] is y['c.three'])253254z = copy.deepcopy(w)255256# TODO: Deepcopy is only shallow copying257self.assertEqual(w, z)258self.assertTrue(w is not z)259self.assertTrue(w['a'] is not z['a'])260# self.assertTrue(w['a.one'] is not z['a.one'])261self.assertTrue(w['b'] is not z['b'])262# self.assertTrue(w['b.two'] is not z['b.two'])263self.assertTrue(w['c'] is not z['c'])264# self.assertTrue(w['c.three'] is not z['c.three'])265266def test_attrs(self):267x = xadict(out1)268269self.assertEqual(x.a, x['a'])270self.assertEqual(x.a.one, x['a.one'])271self.assertEqual(x.a.one, x['a']['one'])272self.assertEqual(x.b, x['b'])273self.assertEqual(x.b.two, x['b.two'])274self.assertEqual(x.b.two, x['b']['two'])275self.assertEqual(x.c, x['c'])276self.assertEqual(x.c.three, x['c.three'])277self.assertEqual(x.c.three, x['c']['three'])278279x.a.one = 100280x.c.four.nest = {'float': 5}281282self.assertEqual(x['a.one'], 100)283self.assertEqual(x['c.four.nest'], {'float': 5})284285del x.c.three286287self.assertEqual(x.c, {'four': {'nest': {'float': 5}}})288289del x.c290291self.assertEqual(x, {'a': {'one': 100}, 'b': {'two': 2}})292293del x.a294del x.b295296self.assertEqual(x, {})297298# Non-existent keys299x.foo.bar.xxx = 10300x.foo.baz = 'hi there'301302self.assertEqual(x, {'foo': {'bar': {'xxx': 10}, 'baz': 'hi there'}})303304def test_ints(self):305x = xadict(out1)306307out1int = dict(out1)308out1int['d'] = {}309out1int['d'][0] = dict(hi='there', bye='now')310out1int['d'][1] = dict(test='value')311out1int['d'][2] = 100312313x.d[0].hi = 'there'314x.d[0].bye = 'now'315x.d[1].test = 'value'316x.d[2] = 100317318self.assertEqual(x, out1int)319320# Flat321flatout1int = dict(flatout1)322flatout1int['d[0].hi'] = 'there'323flatout1int['d[0].bye'] = 'now'324flatout1int['d[1].test'] = 'value'325flatout1int['d[2]'] = 100326327self.assertEqual(x.flattened(), flatout1int)328329330if __name__ == '__main__':331import nose2332nose2.main()333334335