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)) self.assertEqual(repr(pyson.In('foo', ['foo', 'bar'])), "In('foo', ['foo', 'bar'])")
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(Not(In('company', Eval('context', {}))), '=', '!=')")
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_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_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.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.assertTrue(pyson.PYSONDecoder().decode(eval)) self.assertEqual(repr(pyson.Greater(1, 0)), 'Greater(1, 0, False)') eval = pyson.PYSONEncoder().encode(pyson.Greater( pyson.Eval('i', 0), 0)) self.assertTrue(pyson.PYSONDecoder({'i': 1}).decode(eval))
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_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_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_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 test0010Eval(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([basestring])) 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')")
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([basestring])) 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)