text: from unittest import TestCase
  from test import support
  from functools import reduce
  
  class Bucket(object):
      def __init__(self, value):
          self.__value = value
      def _get(self):
          return self.__value
      def _set(self, value):
          assert self.__value == value, "Value changed!"
      value = property(_get, _set)
  
  class PropBucket(object):
      def __init__(self):
          self.__dict__['_d'] = {}
      def __getattr__(self, attr):
          value = self._d.setdefault(attr, 0)
          self._d[attr] = value + 1
          return Bucket(value)
      def __setattr__(self, attr, value):
          value.append(attr)
  
  class EvaluationOrder(TestCase):
      def test_TestFunctionality(self):
          bucket = PropBucket()
          try:
              bucket.prop.value = bucket.prop.value + 0
          except AssertionError:
              pass
          else:
              assert False, "PropBucket is not working"
      def test_augassign(self):
          bucket = PropBucket()
          bucket.prop.value += 0
      def test_AssignOrder(self):
          bucket = PropBucket()
          expected = ['one', 'two', 'three']
          result = []
          bucket.one = bucket.two = bucket.three = result
          assert result == expected, "expected %s, got %s" % (expected, result)
      def test_operands(self):
          m = [(2,), (1,)].pop
          assert m() + m() == (1, 2), "faulty operand order"
      def test_arguments(self):
          def one(a,b,c,d,*extra):
              return reduce(lambda r, x: r+x, extra, a+b+c+d)
          m = list((x,) for x in range(100, 0, -1)).pop
          value = one(m(), m(), m(), m())
          assert value == (1, 2, 3, 4), "simple call, got: %s " % (value,)
          value = one(m(), m(), d=m(), c=m())
          assert value == (5, 6, 8, 7), "call with keywords, got: %s" % (value,)
          value = one(m(), m(), m(), m(), m(), m())
          assert value == (9, 10, 11, 12, 13, 14), "long call, got: %s" % (value,)
          value = one(m(),m(),*[m(), m(), m(), m()])
          assert value == (15, 16, 17, 18, 19, 20), "varcalls, got: %s" % (value,)
          value = one(m(),m(),**dict(c=m(), d=m()))
          assert value == (21, 22, 23, 24), "varkeywordcall, got: %s" % (value,)
          value = one(*[m(), m()],**dict(c=m(), d=m()))
          assert value == (25, 26, 27, 28), "bothvarcalls, got: %s" % (value,)
  
  def test_main():
      support.run_unittest(EvaluationOrder)
  
  if __name__ == '__main__':
      test_main()
  