956 lines
36 KiB
Python
Executable File
956 lines
36 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
|
|
import datetime
|
|
import sys
|
|
import unittest
|
|
from decimal import Decimal
|
|
|
|
from trytond import pyson
|
|
|
|
|
|
class PYSONTestCase(unittest.TestCase):
|
|
'Test PySON'
|
|
|
|
def test_Decimal(self):
|
|
"Test PYSONEncoder for Decimal"
|
|
self.assertEqual(pyson.PYSONEncoder().encode(Decimal('1.1')), '1.1')
|
|
|
|
def test_Eval(self):
|
|
'Test pyson.Eval'
|
|
self.assertEqual(pyson.Eval('test').pyson(), {
|
|
'__class__': 'Eval',
|
|
'v': 'test',
|
|
'd': '',
|
|
})
|
|
self.assertEqual(pyson.Eval('test', 'foo').pyson(), {
|
|
'__class__': 'Eval',
|
|
'v': 'test',
|
|
'd': 'foo',
|
|
})
|
|
|
|
self.assertEqual(pyson.Eval('test', 'foo').types(), set([str]))
|
|
self.assertEqual(pyson.Eval('test', 1).types(), set([int]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Eval('test', 0))
|
|
self.assertEqual(pyson.PYSONDecoder({'test': 1}).decode(eval), 1)
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 0)
|
|
|
|
self.assertEqual(repr(pyson.Eval('test', 'foo')),
|
|
"Eval('test', 'foo')")
|
|
|
|
self.assertIsInstance(~pyson.Eval('test', False), pyson.Not)
|
|
self.assertIsInstance(pyson.Eval('test', False) & True, pyson.And)
|
|
self.assertIsInstance(True & pyson.Eval('test', False), pyson.And)
|
|
self.assertIsInstance(pyson.Eval('test', False) | False, pyson.Or)
|
|
self.assertIsInstance(False | pyson.Eval('test', False), pyson.Or)
|
|
|
|
def test_Not(self):
|
|
'Test pyson.Not'
|
|
self.assertEqual(pyson.Not(True).pyson(), {
|
|
'__class__': 'Not',
|
|
'v': True,
|
|
})
|
|
|
|
self.assertEqual(pyson.Not(True).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Not(True))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Not(False))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.Not(True)), 'Not(True)')
|
|
|
|
self.assertEqual(
|
|
repr(~pyson.Eval('foo', False)), "~Eval('foo', False)")
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('foo') != 'bar'),
|
|
"(Eval('foo') != 'bar')")
|
|
|
|
eval_ = pyson.PYSONEncoder().encode(pyson.Not({}))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval_))
|
|
|
|
eval_ = pyson.PYSONEncoder().encode(pyson.Not({
|
|
'a': 1,
|
|
}))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval_))
|
|
|
|
eval_ = pyson.PYSONEncoder().encode(pyson.Not([]))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval_))
|
|
|
|
eval_ = pyson.PYSONEncoder().encode(pyson.Not(['a']))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval_))
|
|
|
|
def test_Bool(self):
|
|
'Test pyson.Bool'
|
|
self.assertEqual(pyson.Bool('test').pyson(), {
|
|
'__class__': 'Bool',
|
|
'v': 'test',
|
|
})
|
|
|
|
self.assertEqual(pyson.Bool('test').types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool(True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool(False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool('test'))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool(''))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool(1))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool(0))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool(['test']))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool([]))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool({'foo': 'bar'}))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Bool({}))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.Bool('test')), "Bool('test')")
|
|
|
|
def test_And(self):
|
|
'Test pyson.And'
|
|
self.assertEqual(pyson.And(True, False).pyson(), {
|
|
'__class__': 'And',
|
|
's': [True, False],
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.And, True)
|
|
self.assertRaises(AssertionError, pyson.And)
|
|
|
|
self.assertEqual(pyson.And(True, False).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(True, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(True, True, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(True, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(False, True))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(False, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(False, False, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(True, False, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(False, True, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.And(False, False, True))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.And(False, True, True)),
|
|
'And(False, True, True)')
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('foo', True) & pyson.Eval('bar', False)),
|
|
"(Eval('foo', True) & Eval('bar', False))")
|
|
|
|
def test_Or(self):
|
|
'Test pyson.Or'
|
|
self.assertEqual(pyson.Or(True, False).pyson(), {
|
|
'__class__': 'Or',
|
|
's': [True, False],
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.Or, True)
|
|
self.assertRaises(AssertionError, pyson.Or)
|
|
|
|
self.assertEqual(pyson.Or(True, False).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(True, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(True, True, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(True, False))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(False, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(False, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(False, False, False))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(True, False, False))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(False, True, False))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Or(False, False, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.Or(False, True, True)),
|
|
'Or(False, True, True)')
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('foo', True) | pyson.Eval('bar', False)),
|
|
"(Eval('foo', True) | Eval('bar', False))")
|
|
|
|
def test_Equal(self):
|
|
'Test pyson.Equal'
|
|
self.assertEqual(pyson.Equal('test', 'test').pyson(), {
|
|
'__class__': 'Equal',
|
|
's1': 'test',
|
|
's2': 'test',
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.Equal, 'test', True)
|
|
|
|
self.assertEqual(pyson.Equal('test', 'test').types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Equal('test', 'test'))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Equal('foo', 'bar'))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.Equal('foo', 'bar')),
|
|
"Equal('foo', 'bar')")
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('foo') == 'bar'),
|
|
"(Eval('foo') == 'bar')")
|
|
|
|
def test_Greater(self):
|
|
'Test pyson.Greater'
|
|
self.assertEqual(pyson.Greater(1, 0).pyson(), {
|
|
'__class__': 'Greater',
|
|
's1': 1,
|
|
's2': 0,
|
|
'e': False,
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.Greater, 'test', 0)
|
|
self.assertRaises(AssertionError, pyson.Greater, 1, 'test')
|
|
self.assertRaises(
|
|
AssertionError, pyson.Greater, pyson.Eval('foo'), 0)
|
|
self.assertRaises(AssertionError, pyson.Greater,
|
|
'test', pyson.DateTime())
|
|
self.assertRaises(AssertionError, pyson.Greater,
|
|
pyson.DateTime(), 'test')
|
|
|
|
self.assertEqual(pyson.Greater(1, 0).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 0))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(0, 1))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 0, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(0, 1, True))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 1))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 1, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(None, 1))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, None))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.Greater(1, 0)), 'Greater(1, 0, False)')
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
datetime.date(2020, 1, 2)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 1),
|
|
datetime.date(2020, 1, 1)))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
datetime.date(2020, 1, 1), True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.Date(2020, 1, 1),
|
|
datetime.date(2020, 1, 1)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.Date(2020, 1, 1),
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 1)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 1),
|
|
pyson.Date(2020, 1, 1), True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
pyson.Date(2020, 1, 1), True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.TimeDelta(5, 2),
|
|
pyson.TimeDelta(4, 2)))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.TimeDelta(4, 2),
|
|
pyson.TimeDelta(5, 2)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Greater(
|
|
pyson.TimeDelta(5, 2),
|
|
datetime.timedelta(4, 2)))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(
|
|
pyson.Greater(pyson.Eval('i', 0), 0))
|
|
self.assertTrue(pyson.PYSONDecoder({'i': 1}).decode(eval))
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('i', 0) > 0),
|
|
"(Eval('i', 0) > 0)")
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('i', 0) >= 0),
|
|
"(Eval('i', 0) >= 0)")
|
|
|
|
def test_Less(self):
|
|
'Test pyson.Less'
|
|
self.assertEqual(pyson.Less(0, 1).pyson(), {
|
|
'__class__': 'Less',
|
|
's1': 0,
|
|
's2': 1,
|
|
'e': False,
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.Less, 'test', 1)
|
|
self.assertRaises(AssertionError, pyson.Less, 0, 'test')
|
|
self.assertRaises(AssertionError, pyson.Less,
|
|
'test', pyson.DateTime())
|
|
self.assertRaises(AssertionError, pyson.Less,
|
|
pyson.DateTime(), 'test')
|
|
|
|
self.assertEqual(pyson.Less(0, 1).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(0, 1))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 0))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(0, 1, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 0, True))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 1))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(1, 1, True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(None, 1))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(1, None))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.Less(0, 1)), 'Less(0, 1, False)')
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
datetime.date(2020, 1, 1)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
datetime.date(2020, 1, 2), True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0)))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.Date(2020, 1, 1),
|
|
datetime.date(2020, 1, 2)))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.Date(2020, 1, 1),
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 1)))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
|
|
pyson.Date(2020, 1, 1), True))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Less(
|
|
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('i', 0) > 0),
|
|
"(Eval('i', 0) > 0)")
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('i', 0) >= 0),
|
|
"(Eval('i', 0) >= 0)")
|
|
|
|
def test_If(self):
|
|
'Test pyson.If'
|
|
self.assertEqual(pyson.If(True, 'foo', 'bar').pyson(), {
|
|
'__class__': 'If',
|
|
'c': True,
|
|
't': 'foo',
|
|
'e': 'bar',
|
|
})
|
|
|
|
self.assertEqual(pyson.If(True, 'foo', 'bar').types(),
|
|
set([str]))
|
|
self.assertEqual(pyson.If(True, False, True).types(), set([bool]))
|
|
self.assertEqual(
|
|
pyson.If(True, 'foo', False).types(), set([bool, str]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.If(True, 'foo', 'bar'))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 'foo')
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.If(False, 'foo', 'bar'))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 'bar')
|
|
|
|
self.assertEqual(repr(pyson.If(True, 'foo', 'bar')),
|
|
"If(True, 'foo', 'bar')")
|
|
|
|
def test_Get(self):
|
|
'Test pyson.Get'
|
|
self.assertEqual(pyson.Get({'foo': 'bar'}, 'foo', 'default').pyson(), {
|
|
'__class__': 'Get',
|
|
'v': {'foo': 'bar'},
|
|
'k': 'foo',
|
|
'd': 'default',
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(
|
|
AssertionError, pyson.Get, 'test', 'foo', 'default')
|
|
self.assertRaises(AssertionError, pyson.Get, {}, 1, 'default')
|
|
|
|
self.assertEqual(pyson.Get({}, 'foo', 'default').types(),
|
|
set([str]))
|
|
self.assertEqual(pyson.Get({}, 'foo', True).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Get(
|
|
{'foo': 'bar'}, 'foo', 'default'))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 'bar')
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Get(
|
|
{'foo': 'bar'}, 'test', 'default'))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 'default')
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Get(
|
|
{}, 'foo', 'default'))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 'default')
|
|
|
|
self.assertEqual(repr(pyson.Get({'foo': 'bar'}, 'foo', 'default')),
|
|
"Get({'foo': 'bar'}, 'foo', 'default')")
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('foo', {}).get('bar')),
|
|
"Eval('foo', {}).get('bar')")
|
|
|
|
def test_In(self):
|
|
'Test pyson.In'
|
|
self.assertEqual(pyson.In('foo', {'foo': 'bar'}).pyson(), {
|
|
'__class__': 'In',
|
|
'k': 'foo',
|
|
'v': {'foo': 'bar'},
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.In, object(), {})
|
|
self.assertRaises(AssertionError, pyson.In, 'test', 'foo')
|
|
|
|
self.assertEqual(pyson.In('foo', {}).types(), set([bool]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('foo', {'foo': 'bar'}))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In(
|
|
pyson.Eval('test', 'foo'), {'foo': 'bar'}))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('1', {1: 'bar'}))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('test', {'foo': 'bar'}))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In(
|
|
pyson.Eval('foo', 'test'), {'foo': 'bar'}))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('1', {2: 'bar'}))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('test', {}))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('foo', ['foo']))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In(1, [1]))
|
|
self.assertTrue(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('test', ['foo']))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In(1, [2]))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.In('test', []))
|
|
self.assertFalse(pyson.PYSONDecoder().decode(eval))
|
|
|
|
eval = pyson.PYSONEncoder().encode(
|
|
pyson.In('test', pyson.Eval('foo', [])))
|
|
self.assertFalse(pyson.PYSONDecoder({'foo': None}).decode(eval))
|
|
|
|
self.assertEqual(repr(pyson.In('foo', ['foo', 'bar'])),
|
|
"In('foo', ['foo', 'bar'])")
|
|
|
|
self.assertEqual(
|
|
repr(pyson.Eval('foo').in_(['foo', 'bar'])),
|
|
"Eval('foo').in_(['foo', 'bar'])")
|
|
|
|
def test_Date(self):
|
|
'Test pyson.Date'
|
|
self.assertEqual(pyson.Date(2010, 1, 12, -1, 12, -7).pyson(), {
|
|
'__class__': 'Date',
|
|
'y': 2010,
|
|
'M': 1,
|
|
'd': 12,
|
|
'dy': -1,
|
|
'dM': 12,
|
|
'dd': -7,
|
|
'start': None,
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(
|
|
AssertionError, pyson.Date, 'test', 1, 12, -1, 12, -7)
|
|
self.assertRaises(
|
|
AssertionError, pyson.Date, 2010, 'test', 12, -1, 12, -7)
|
|
self.assertRaises(
|
|
AssertionError, pyson.Date, 2010, 1, 'test', -1, 12, -7)
|
|
self.assertRaises(
|
|
AssertionError, pyson.Date, 2010, 1, 12, 'test', 12, -7)
|
|
self.assertRaises(
|
|
AssertionError, pyson.Date, 2010, 1, 12, -1, 'test', -7)
|
|
self.assertRaises(
|
|
AssertionError, pyson.Date, 2010, 1, 12, -1, 12, 'test')
|
|
|
|
self.assertEqual(pyson.Date(2010, 1, 12, -1, 12, -7).types(),
|
|
set([datetime.date]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date())
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.date.today())
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.date(2010, 1, 12))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, -1))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.date(2009, 1, 12))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, 0, 12))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.date(2011, 1, 12))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, 0, 0, -7))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.date(2010, 1, 5))
|
|
|
|
eval = pyson.PYSONEncoder().encode(datetime.date(2010, 2, 22))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.date(2010, 2, 22))
|
|
|
|
self.assertEqual(repr(pyson.Date(2010, 1, 12, -1, 12, -7)),
|
|
'Date(2010, 1, 12, -1, 12, -7, None)')
|
|
|
|
def test_Date_start(self):
|
|
"Test Date with start"
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(
|
|
start=pyson.Eval('date')))
|
|
|
|
date = datetime.date(2000, 1, 1)
|
|
self.assertEqual(pyson.PYSONDecoder(
|
|
{'date': date}).decode(eval), date)
|
|
|
|
def test_Date_start_datetime(self):
|
|
"Test Date with start as datetime"
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(
|
|
start=pyson.Eval('datetime')))
|
|
|
|
datetime_ = datetime.datetime(2000, 1, 1, 12, 00)
|
|
self.assertEqual(pyson.PYSONDecoder(
|
|
{'datetime': datetime_}).decode(eval), datetime_.date())
|
|
|
|
def test_Date_start_invalid(self):
|
|
"Test Date with invalid start"
|
|
eval = pyson.PYSONEncoder().encode(pyson.Date(
|
|
start=pyson.Eval('foo')))
|
|
|
|
self.assertEqual(pyson.PYSONDecoder(
|
|
{'foo': 'bar'}).decode(eval), datetime.date.today())
|
|
|
|
def test_DateTime(self):
|
|
'Test pyson.DateTime'
|
|
self.assertEqual(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,
|
|
-1, 12, -7, 2, 15, 30, 1).pyson(), {
|
|
'__class__': 'DateTime',
|
|
'y': 2010,
|
|
'M': 1,
|
|
'd': 12,
|
|
'h': 10,
|
|
'm': 30,
|
|
's': 20,
|
|
'ms': 0,
|
|
'dy': -1,
|
|
'dM': 12,
|
|
'dd': -7,
|
|
'dh': 2,
|
|
'dm': 15,
|
|
'ds': 30,
|
|
'dms': 1,
|
|
'start': None,
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
'test', 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 'test', 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 'test', 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 'test', 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 'test', 20, 0, -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 'test', 0, -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 'test', -1, 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, 'test', 12, -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, -1, 'test', -7, 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, -1, 12, 'test', 2, 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 'test', 15, 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 'test', 30, 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 'test', 1)
|
|
self.assertRaises(
|
|
AssertionError, pyson.DateTime,
|
|
2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 'test')
|
|
|
|
self.assertEqual(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,
|
|
-1, 12, -7, 2, 15, 30, 1).types(), set([datetime.datetime]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 1, 12, 10, 30, 20, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, -1))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2009, 1, 12, 10, 30, 20, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, 0, 12))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2011, 1, 12, 10, 30, 20, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, 0, 0, -7))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 1, 5, 10, 30, 20, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, 0, 0, 0, 12))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 1, 12, 22, 30, 20, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, 0, 0, 0, 0, -30))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 1, 12, 10, 0, 20, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, 0, 0, 0, 0, 0, 30))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 1, 12, 10, 30, 50, 0))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,
|
|
10, 30, 20, 0, 0, 0, 0, 0, 0, 0, 200))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 1, 12, 10, 30, 20, 200))
|
|
|
|
eval = pyson.PYSONEncoder().encode(datetime.datetime(
|
|
2010, 2, 22, 10, 30, 20, 200))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval),
|
|
datetime.datetime(2010, 2, 22, 10, 30, 20, 200))
|
|
|
|
self.assertEqual(repr(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,
|
|
-1, 12, -7, 2, 15, 30, 1)),
|
|
('DateTime(2010, 1, 12, 10, 30, 20, 0, '
|
|
'-1, 12, -7, 2, 15, 30, 1, None)'))
|
|
|
|
def test_DateTime_start(self):
|
|
"Test DateTime with start"
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(
|
|
start=pyson.Eval('datetime')))
|
|
|
|
datetime_ = datetime.datetime(2000, 1, 1, 12, 0)
|
|
self.assertEqual(pyson.PYSONDecoder(
|
|
{'datetime': datetime_}).decode(eval), datetime_)
|
|
|
|
def test_DateTime_start_datetime(self):
|
|
"Test DateTime with start as date"
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(
|
|
start=pyson.Eval('date')))
|
|
|
|
date = datetime.date(2000, 1, 1)
|
|
self.assertEqual(pyson.PYSONDecoder(
|
|
{'date': date}).decode(eval),
|
|
datetime.datetime(2000, 1, 1, 0, 0))
|
|
|
|
def test_DateTime_start_invalid(self):
|
|
"Test DateTime with invalid start"
|
|
eval = pyson.PYSONEncoder().encode(pyson.DateTime(
|
|
start=pyson.Eval('foo')))
|
|
|
|
self.assertIsInstance(pyson.PYSONDecoder(
|
|
{'foo': 'bar'}).decode(eval), datetime.datetime)
|
|
|
|
def test_Len(self):
|
|
'Test pyson.Len'
|
|
self.assertEqual(pyson.Len([1, 2, 3]).pyson(), {
|
|
'__class__': 'Len',
|
|
'v': [1, 2, 3],
|
|
})
|
|
|
|
if not sys.flags.optimize:
|
|
self.assertRaises(AssertionError, pyson.Len, object())
|
|
|
|
self.assertEqual(pyson.Len([1, 2, 3]).types(), set([int]))
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Len([1, 2, 3]))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 3)
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Len({1: 2, 3: 4}))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 2)
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Len('foo bar'))
|
|
self.assertEqual(pyson.PYSONDecoder().decode(eval), 7)
|
|
|
|
self.assertEqual(repr(pyson.Len([1, 2, 3])), 'Len([1, 2, 3])')
|
|
|
|
def test_TimeDelta_pyson(self):
|
|
"Test pyson.TimeDelta.pyson"
|
|
self.assertEqual(pyson.TimeDelta(1, 2, 3).pyson(), {
|
|
'__class__': 'TimeDelta',
|
|
'd': 1,
|
|
's': 2,
|
|
'm': 3,
|
|
})
|
|
|
|
def test_TimeDelta_enode(self):
|
|
"Test pyson.TimeDelta encode"
|
|
eval = pyson.PYSONEncoder().encode(pyson.TimeDelta(1, 2, 3))
|
|
self.assertEqual(
|
|
pyson.PYSONDecoder().decode(eval),
|
|
datetime.timedelta(1, 2, 3))
|
|
|
|
eval = pyson.PYSONEncoder().encode(datetime.timedelta(1, 2, 3))
|
|
self.assertEqual(
|
|
pyson.PYSONDecoder().decode(eval),
|
|
datetime.timedelta(1, 2, 3))
|
|
|
|
def test_TimeDelta_types(self):
|
|
"Test pyson.TimeDelta.types"
|
|
self.assertEqual(
|
|
pyson.TimeDelta(seconds=10).types(), {datetime.timedelta})
|
|
|
|
@unittest.skipIf(sys.flags.optimize, "assert removed by optimization")
|
|
def test_TimeDelta_invalid_type(self):
|
|
"Test pyson.TimeDelta invalid type"
|
|
with self.assertRaises(AssertionError):
|
|
pyson.TimeDelta('foo')
|
|
|
|
def test_TimeDelta_eval(self):
|
|
"Test pyson.TimeDelta.eval"
|
|
eval = pyson.PYSONEncoder().encode(pyson.TimeDelta(1, 2, 3))
|
|
|
|
self.assertEqual(
|
|
pyson.PYSONDecoder().decode(eval), datetime.timedelta(1, 2, 3))
|
|
|
|
def test_TimeDelta_repr(self):
|
|
"Test pyson.TimeDelta.repr"
|
|
self.assertEqual(
|
|
repr(pyson.TimeDelta(1, 2, 3)), 'TimeDelta(1, 2, 3)')
|
|
|
|
def test_Composite(self):
|
|
'Test Composite'
|
|
expr = pyson.If(pyson.Not(
|
|
pyson.In('company', pyson.Eval('context', {}))), '=', '!=')
|
|
eval = pyson.PYSONEncoder().encode(['id', expr,
|
|
pyson.Get(pyson.Eval('context', {}), 'company', -1)])
|
|
self.assertEqual(pyson.PYSONDecoder({'context': {'company': 1}}
|
|
).decode(eval), ['id', '!=', 1])
|
|
self.assertEqual(pyson.PYSONDecoder({'context': {}}
|
|
).decode(eval), ['id', '=', -1])
|
|
|
|
self.assertEqual(repr(expr),
|
|
"If(~Eval('context', {}).contains('company'), '=', '!=')")
|
|
|
|
def test_noeval(self):
|
|
decoder = pyson.PYSONDecoder(noeval=True)
|
|
encoder = pyson.PYSONEncoder()
|
|
|
|
for instance in [
|
|
pyson.Eval('test', 0),
|
|
pyson.Not(True),
|
|
pyson.Bool('test'),
|
|
pyson.And(True, False, True),
|
|
pyson.Or(False, True, True),
|
|
pyson.Equal('foo', 'bar'),
|
|
pyson.Greater(1, 0),
|
|
pyson.Less(0, 1),
|
|
pyson.If(True, 'foo', 'bar'),
|
|
pyson.Get({'foo': 'bar'}, 'foo', 'default'),
|
|
pyson.In('foo', ['foo', 'bar']),
|
|
pyson.Date(),
|
|
pyson.DateTime(),
|
|
pyson.Len([1, 2, 3]),
|
|
]:
|
|
self.assertEqual(decoder.decode(encoder.encode(instance)).pyson(),
|
|
instance.pyson())
|
|
|
|
def test_Eval_dot_notation(self):
|
|
'Test pyson.Eval with dot notation'
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Eval('foo.bar', 0))
|
|
|
|
for ctx, result in [
|
|
({'foo': {'bar': 1}}, 1),
|
|
({'foo': {'foo': 1}}, 0),
|
|
({'bar': {'bar': 1}}, 0),
|
|
({}, 0),
|
|
]:
|
|
self.assertEqual(pyson.PYSONDecoder(ctx).decode(eval), result)
|
|
|
|
def test_Eval_dot_notation_nested(self):
|
|
'Test pyson.Eval with dot notation with nested dots'
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Eval('foo.bar.test', 0))
|
|
|
|
for ctx, result in [
|
|
({'foo': {'bar': {'test': 1}}}, 1),
|
|
({'foo': {'foo': 1}}, 0),
|
|
({'bar': {'bar': 1}}, 0),
|
|
({}, 0),
|
|
]:
|
|
self.assertEqual(pyson.PYSONDecoder(ctx).decode(eval), result)
|
|
|
|
def test_Eval_dot_notation_in_context(self):
|
|
"Test pyson.Eval with dot notation in context"
|
|
|
|
eval = pyson.PYSONEncoder().encode(pyson.Eval('foo.bar', 0))
|
|
ctx = {
|
|
'foo.bar': 1,
|
|
'foo': {
|
|
'bar': 0,
|
|
},
|
|
}
|
|
|
|
self.assertEqual(pyson.PYSONDecoder(ctx).decode(eval), 1)
|
|
|
|
def test_eval_true(self):
|
|
"Test PYSON.eval JS true"
|
|
self.assertEqual(eval('true', pyson.CONTEXT), True)
|
|
|
|
def test_eval_false(self):
|
|
"Test PYSON.eval JS false"
|
|
self.assertEqual(eval('false', pyson.CONTEXT), False)
|