曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.かつては雑草やヨモギと共に雨や露を分かち合っていたが、今では松やヒノキと共に霜や雪に耐えている。曾与蒿藜同雨露,Once sharing rain and dew with weeds and wormwood, now enduring frost and snow with pines and cypresses.终随松柏到冰霜.曾与蒿藜同雨露한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.,终随松柏到冰霜.譖セ荳手珍阯懷酔髮ィ髴イ�檎サ磯囂譚セ譟丞芦蜀ー髴�曾与蒿藜同雨露,鏇句笌钂胯棞鍚岄洦闇诧紝缁堥殢鏉炬煆鍒板啺闇�终随松柏到冰霜.曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.曾与蒿藜同雨露,终随松柏到冰霜. rahbord-ins.ir - GrazzMean-Shell
Uname: Linux server18.dn-server.com 3.10.0-962.3.2.lve1.5.88.el7.x86_64 #1 SMP Fri Sep 26 14:06:42 UTC 2025 x86_64
Software: LiteSpeed
PHP version: 7.4.33 [ PHP INFO ] PHP os: Linux
Server Ip: 185.126.202.122
Your Ip: 216.73.216.193
User: rahbordf (4876) | Group: rahbordf (4881)
Safe Mode: OFF
Disable Function:
show_source, system, shell_exec, passthru, exec, popen, proc_open

name : test_comparison.py
# Copyright (c) 2008-2013 Simplistix Ltd
# See license.txt for license details.

from testfixtures import Comparison as C, TempDirectory, compare
from testfixtures.compat import PY2, PY3, exception_module
from testfixtures.tests.sample1 import TestClassA, a_function
from unittest import TestCase
import sys

from .compat import py_33_plus, py_34_plus


class AClass:

    def __init__(self, x, y=None):
        self.x = x
        if y:
            self.y = y

    def __repr__(self):
        return '<'+self.__class__.__name__+'>'


class BClass(AClass):
    pass


class WeirdException(Exception):
    def __init__(self, x, y):
        self.x = x
        self.y = y


class X(object):
    __slots__ = ['x']

    def __repr__(self):
        return '<X>'


class FussyDefineComparison(object):

    def __init__(self, attr):
        self.attr = attr

    def __eq__(self, other):
        if not isinstance(other, self.__class__):  # pragma: no cover
            raise TypeError()
        return False  # pragma: no cover

    def __ne__(self, other):
        return not self == other  # pragma: no cover


class TestC(TestCase):

    def test_example(self):
        # In this pattern, we want to check a sequence is
        # of the correct type and order.
        r = a_function()
        self.assertEqual(r, (
            C('testfixtures.tests.sample1.TestClassA'),
            C('testfixtures.tests.sample1.TestClassB'),
            C('testfixtures.tests.sample1.TestClassA'),
            ))
        # We also want to check specific parts of some
        # of the returned objects' attributes
        self.assertEqual(r[0].args[0], 1)
        self.assertEqual(r[1].args[0], 2)
        self.assertEqual(r[2].args[0], 3)

    def test_example_with_object(self):
        # Here we see compare an object with a Comparison
        # based on an object of the same type and with the
        # same attributes:
        self.assertEqual(
            C(AClass(1, 2)),
            AClass(1, 2),
            )
        # ...even though the original class doesn't support
        # meaningful comparison:
        self.assertNotEqual(
            AClass(1, 2),
            AClass(1, 2),
            )

    def test_example_with_vars(self):
        # Here we use a Comparison to make sure both the
        # type and attributes of an object are correct.
        self.assertEqual(
            C('testfixtures.tests.test_comparison.AClass',
              x=1, y=2),
            AClass(1, 2),
            )

    def test_example_with_odd_vars(self):
        # If the variable names class with parameters to the
        # Comparison constructor, they can be specified in a
        # dict:
        self.assertEqual(
            C('testfixtures.tests.test_comparison.AClass',
              {'x': 1, 'y': 2}),
            AClass(1, 2),
            )

    def test_example_not_strict(self):
        # Here, we only care about the 'x' attribute of
        # the AClass object, so we turn strict mode off.
        # With strict mode off, only attributes specified
        # in the Comparison object will be checked, and
        # any others will be ignored.
        self.assertEqual(
            C('testfixtures.tests.test_comparison.AClass',
              x=1,
              strict=False),
            AClass(1, 2),
            )

    def test_example_dont_use_c_wrappers_on_both_sides(self):
        # NB: don't use C wrappers on both sides!
        e = ValueError('some message')
        try:
            self.assertEqual(C(e), C(e))
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(
                e.args,
                (("<C(failed):{mod}.ValueError>wrong type</C> != \n"
                  "  <C:{mod}.ValueError>\n"
                  "  args:('some message',)\n"
                  "  </C>"
                  ).format(mod=exception_module), ))
        else:
            self.fail('No exception raised!')

    def test_repr_module(self):
        self.assertEqual(repr(C('datetime')), '<C:datetime>')

    def test_repr_class(self):
        self.assertEqual(
            repr(C('testfixtures.tests.sample1.TestClassA')),
            '<C:testfixtures.tests.sample1.TestClassA>'
            )

    def test_repr_function(self):
        self.assertEqual(
            repr(C('testfixtures.tests.sample1.z')),
            '<C:testfixtures.tests.sample1.z>'
            )

    def test_repr_instance(self):
        self.assertEqual(
            repr(C(TestClassA('something'))),
            "\n"
            "  <C:testfixtures.tests.sample1.TestClassA>\n"
            "  args:('something',)\n"
            "  </C>"
            )

    def test_repr_exception(self):
        self.assertEqual(
            repr(C(ValueError('something'))),
            ("\n"
             "  <C:{0}.ValueError>\n"
             "  args:('something',)\n"
             "  </C>"
             ).format(exception_module))

    def test_repr_exception_not_args(self):
        r = repr(C(WeirdException(1, 2)))

        if sys.version_info >= (3, 2, 4):
            # in PY3, even args that aren't set still appear to be there
            args = "  args:(1, 2)\n"
        else:
            args = "  args:()\n"

        self.assertEqual(
            r,
            "\n"
            "  <C:testfixtures.tests.test_comparison.WeirdException>\n"
            + args +
            "  x:1\n"
            "  y:2\n"
            "  </C>"
            )

    def test_repr_class_and_vars(self):
        self.assertEqual(
            repr(C(TestClassA, {'args': (1, )})),
            "\n"
            "  <C:testfixtures.tests.sample1.TestClassA>\n"
            "  args:(1,)\n"
            "  </C>"
            )

    def test_repr_nested(self):
        self.assertEqual(
            repr(C(TestClassA, y=C(AClass), z=C(BClass(1, 2)))),
            "\n"
            "  <C:testfixtures.tests.sample1.TestClassA>\n"
            "  y:<C:testfixtures.tests.test_comparison.AClass>\n"
            "  z:\n"
            "    <C:testfixtures.tests.test_comparison.BClass>\n"
            "    x:1\n"
            "    y:2\n"
            "    </C>\n"
            "  </C>"
            )

    def test_repr_failed_wrong_class(self):
        try:
            self.assertEqual(
                C('testfixtures.tests.test_comparison.AClass',
                  x=1, y=2),
                BClass(1, 2)
                )
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(e.args, ((
                "<C(failed):testfixtures.tests.test_comparison.AClass>"
                "wrong type</C> != <BClass>"
                ), ))
        else:
            self.fail('No exception raised!')

    def test_repr_failed_all_reasons_in_one(self):
        if py_34_plus:
            expected = (
                "\n  <C(failed):testfixtures.tests.test_com[79 chars] </C>"
                " != <AClass>",
                )
        else:
            expected = (
                "\n"
                "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                "  x:1 not in Comparison\n"
                "  y:5 != 2\n"
                "  z:'missing' not in other\n"
                "  </C> != <AClass>",
                )
        try:
            self.assertEqual(
                C('testfixtures.tests.test_comparison.AClass',
                  y=5, z='missing'),
                AClass(1, 2)
                )
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(e.args, expected)
        else:
            self.fail('No exception raised!')

    def test_repr_failed_not_in_other(self):
        if py_34_plus:
            expected = (
                "\n  <C(failed):testfixtures.tests.test_com[39 chars] </C>"
                " != <AClass>",
                )
        else:
            expected = (
                "\n"
                "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                "  z:(3,) not in other\n"
                "  </C> != <AClass>",
                )
        # use single element tuple to check %
        try:
            self.assertEqual(
                C('testfixtures.tests.test_comparison.AClass',
                  x=1, y=2, z=(3, )),
                AClass(1, 2)
                )
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(e.args, expected)
        else:
            self.fail('No exception raised!')

    def test_repr_failed_not_in_self_strict(self):
        # use single element tuple to check %
        if py_34_plus:
            expected = (
                "\n  <C(failed):testfixtures.tests.test_com[44 chars] </C>"
                " != <AClass>",
                )
        else:
            expected = (
                "\n"
                "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                "  x:(1,) not in Comparison\n"
                "  </C> != <AClass>",
                )
        try:
            self.assertEqual(
                C('testfixtures.tests.test_comparison.AClass', y=2),
                AClass((1, ), 2)
                )
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(e.args, expected)
        else:
            self.fail('No exception raised!')

    def test_repr_failed_not_in_self_not_strict(self):
        if py_34_plus:
            expected = (
                "\n  <C(failed):testfixtures.tests.test_com[39 chars] </C>"
                " != <AClass>",
                )
        else:
            expected = (
                "\n"
                "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                "  z:(3,) not in other\n"
                "  </C> != <AClass>",
                )
        try:
            self.assertEqual(
                C('testfixtures.tests.test_comparison.AClass',
                  x=1, y=2, z=(3, )),
                AClass(1, 2)
                )
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(e.args, expected)
        else:
            self.fail('No exception raised!')

    def test_repr_failed_one_attribute_not_equal(self):
        # use single element tuple to check %
        try:
            self.assertEqual(
                C('testfixtures.tests.test_comparison.AClass', x=1, y=(2, )),
                AClass(1, (3, ))
                )
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(
                e.args,
                ("\n"
                 "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                 "  y:(2,) != (3,)\n"
                 "  </C> != <AClass>",
                 ))
        else:
            self.fail('No exception raised!')

    def test_repr_failed_nested(self):
        left_side = [C(AClass, x=1, y=2),
                     C(BClass, x=C(AClass, x=1), y=C(AClass))]
        right_side = [AClass(1, 3), AClass(1, 3)]

        # do the comparison
        left_side == right_side

        self.assertEqual(
            "[\n"
            "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
            "  y:2 != 3\n"
            "  </C>, \n"
            "  <C:testfixtures.tests.test_comparison.BClass>\n"
            "  x:\n"
            "    <C:testfixtures.tests.test_comparison.AClass>\n"
            "    x:1\n"
            "    </C>\n"
            "  y:<C:testfixtures.tests.test_comparison.AClass>\n"
            "  </C>]",
            repr(left_side)
            )

        self.assertEqual(
            "[<AClass>, <AClass>]",
            repr(right_side)
            )

    def test_repr_failed_nested_failed(self):
        left_side = [C(AClass, x=1, y=2),
                     C(BClass,
                       x=C(AClass, x=1, strict=False),
                       y=C(AClass, z=2))]
        right_side = [AClass(1, 2),
                      BClass(AClass(1, 2), AClass(1, 2))]

        # do the comparison
        left_side == right_side

        self.assertEqual(
            "[\n"
            "  <C:testfixtures.tests.test_comparison.AClass>\n"
            "  x:1\n"
            "  y:2\n"
            "  </C>, \n"
            "  <C(failed):testfixtures.tests.test_comparison.BClass>\n"
            "  y:\n"
            "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
            "  x:1 not in Comparison\n"
            "  y:2 not in Comparison\n"
            "  z:2 not in other\n"
            "  </C> != <AClass>\n"
            "  </C>]",
            repr(left_side)
            )

        self.assertEqual(
            '[<AClass>, <BClass>]',
            repr(right_side)
            )

    def test_repr_failed_passed_failed(self):
        c = C('testfixtures.tests.test_comparison.AClass', x=1, y=2)

        try:
            self.assertEqual(c, AClass(1, 3))
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(
                e.args,
                ("\n"
                 "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                 "  y:2 != 3\n"
                 "  </C> != <AClass>",
                 ))
        else:
            self.fail('No exception raised!')

        self.assertEqual(c, AClass(1, 2))

        try:
            self.assertEqual(c, AClass(3, 2))
        except Exception as e:
            self.failUnless(isinstance(e, AssertionError))
            self.assertEqual(
                e.args,
                ("\n"
                 "  <C(failed):testfixtures.tests.test_comparison.AClass>\n"
                 "  x:1 != 3\n"
                 "  </C> != <AClass>",
                 ))
        else:
            self.fail('No exception raised!')

    def test_first(self):
        self.assertEqual(
            C('testfixtures.tests.sample1.TestClassA'),
            TestClassA()
            )

    def test_second(self):
        self.assertEqual(
            TestClassA(),
            C('testfixtures.tests.sample1.TestClassA'),
            )

    def test_not_same_first(self):
        self.assertNotEqual(
            C('datetime'),
            TestClassA()
            )

    def test_not_same_second(self):
        self.assertNotEqual(
            TestClassA(),
            C('datetime')
            )

    def test_object_supplied(self):
        self.assertEqual(
            TestClassA(1),
            C(TestClassA(1))
            )

    def test_class_and_vars(self):
        self.assertEqual(
            TestClassA(1),
            C(TestClassA, {'args': (1, )})
            )

    def test_class_and_kw(self):
        self.assertEqual(
            TestClassA(1),
            C(TestClassA, args=(1, ))
            )

    def test_class_and_vars_and_kw(self):
        self.assertEqual(
            AClass(1, 2),
            C(AClass, {'x': 1}, y=2)
            )

    def test_object_and_vars(self):
        # vars passed are used instead of the object's
        self.assertEqual(
            TestClassA(1),
            C(TestClassA(), {'args': (1, )})
            )

    def test_object_and_kw(self):
        # kws passed are used instead of the object's
        self.assertEqual(
            TestClassA(1),
            C(TestClassA(), args=(1, ))
            )

    def test_object_not_strict(self):
        # only attributes on comparison object
        # are used
        self.assertEqual(
            C(AClass(1), strict=False),
            AClass(1, 2),
            )

    def test_exception(self):
        self.assertEqual(
            ValueError('foo'),
            C(ValueError('foo'))
            )

    def test_exception_class_and_args(self):
        self.assertEqual(
            ValueError('foo'),
            C(ValueError, args=('foo', ))
            )

    def test_exception_instance_and_args(self):
        self.assertEqual(
            ValueError('foo'),
            C(ValueError('bar'), args=('foo', ))
            )

    def test_exception_not_same(self):
        self.assertNotEqual(
            ValueError('foo'),
            C(ValueError('bar'))
            )

    def test_exception_no_args_different(self):
        self.assertNotEqual(
            WeirdException(1, 2),
            C(WeirdException(1, 3))
            )

    def test_exception_no_args_same(self):
        self.assertEqual(
            C(WeirdException(1, 2)),
            WeirdException(1, 2)
            )

    def test_repr_file_different(self):
        with TempDirectory() as d:
            path = d.write('file', b'stuff')
            f = open(path)
            f.close()
        if PY3:
            c = C('io.TextIOWrapper', name=path, mode='r', closed=False,
                  strict=False)
            self.assertNotEqual(f, c)
            compare(repr(c),
                    "\n"
                    "  <C(failed):_io.TextIOWrapper>\n"
                    "  closed:False != True\n"
                    "  </C>",
                    )
        else:
            c = C(file, name=path, mode='r', closed=False, strict=False)
            self.assertNotEqual(f, c)
            compare(repr(c),
                    "\n"
                    "  <C(failed):__builtin__.file>\n"
                    "  closed:False != True\n"
                    "  </C>",
                    )

    def test_file_same(self):
        with TempDirectory() as d:
            path = d.write('file', b'stuff')
            f = open(path)
            f.close()
        if PY3:
            self.assertEqual(
                f,
                C('io.TextIOWrapper', name=path, mode='r', closed=True,
                  strict=False)
                )
        else:
            self.assertEqual(
                f,
                C(file, name=path, mode='r', closed=True, strict=False)
                )

    def test_no___dict___strict(self):
        x = X()
        try:
            self.assertEqual(
                C(X, x=1),
                x
                )
        except TypeError as e:
            self.assertEqual(e.args, (
                '<X> does not support vars() so cannot do strict comparison',
                ))
        else:
            self.fail('No exception raised!')

    def test_no___dict___not_strict_same(self):
        x = X()
        x.x = 1
        self.assertEqual(C(X, x=1, strict=False), x)

    def test_no___dict___not_strict_different(self):
        if py_34_plus:
            expected = (
                "\n  <C(failed):testfixtures.tests.test_com[42 chars] </C>"
                " != <X>",
                )
        else:
            expected = (
                "\n"
                "  <C(failed):testfixtures.tests.test_comparison.X>\n"
                "  x:1 != 2\n"
                "  y:2 not in other\n"
                "  </C> != <X>",
                )
        x = X()
        x.x = 2
        try:
            self.assertEqual(
                C(X, x=1, y=2, strict=False),
                x
                )
        except AssertionError as e:
            compare(e.args, expected)
        else:
            self.fail('No exception raised!')

    def test_compared_object_defines_eq(self):
        # If an object defines eq, such as Django instances,
        # things become tricky

        class Annoying:
            def __init__(self):
                self.eq_called = 0

            def __eq__(self, other):
                self.eq_called += 1
                if isinstance(other, Annoying):
                    return True
                return False

        self.assertEqual(Annoying(), Annoying())

        # Suddenly, order matters.

        # This order is wrong, as it uses the class's __eq__:
        self.assertFalse(Annoying() == C(Annoying))
        if PY2:
            # although this, which is subtly different, does not:
            self.assertFalse(Annoying() != C(Annoying))
        else:
            # but on PY3 __eq__ is used as a fallback:
            self.assertTrue(Annoying() != C(Annoying))

        # This is the right ordering:
        self.assertTrue(C(Annoying) == Annoying())
        self.assertFalse(C(Annoying) != Annoying())

        # When the ordering is right, you still get the useful
        # comparison representation afterwards
        c = C(Annoying, eq_called=1)
        c == Annoying()
        self.assertEqual(
            repr(c),
            '\n  <C(failed):testfixtures.tests.test_comparison.Annoying>\n'
            '  eq_called:1 != 0\n'
            '  </C>')

    def test_compared_object_class_attributes(self):

        class Classy(object):
            x = 1
            y = 2

        self.assertEqual(C(Classy, x=1, y=2), Classy())

        c = C(Classy, x=1, y=1)
        self.assertNotEqual(c, Classy())
        self.assertEqual(
            repr(c),
            '\n  <C(failed):testfixtures.tests.test_comparison.Classy>\n'
            '  y:1 != 2\n'
            '  </C>')

        ce = C(Classy, x=1, y=1)
        ca = Classy()
        ca.y = 1
        self.assertEqual(ce, ca)

        ce = C(Classy, x=1, y=2)
        ca = Classy()
        ca.y = 1
        self.assertNotEqual(ce, ca)
        self.assertEqual(
            repr(ce),
            '\n  <C(failed):testfixtures.tests.test_comparison.Classy>\n'
            '  y:2 != 1\n'
            '  </C>')

    def test_importerror(self):
        self.failIf(
            C(ImportError('x')) != ImportError('x')
            )

    def test_class_defines_comparison_strictly(self):
        self.assertEqual(
            C('testfixtures.tests.test_comparison.FussyDefineComparison',
              attr=1),
            FussyDefineComparison(1)
            )

    def test_cant_resolve(self):
        try:
            C('testfixtures.bonkers')
        except Exception as e:
            self.failUnless(isinstance(e, AttributeError))
            self.assertEqual(
                e.args,
                ("'testfixtures.bonkers' could not be resolved", )
                )
        else:
            self.fail('No exception raised!')

    def test_no_name(self):
        class NoName(object):
            pass
        NoName.__name__ = ''
        NoName.__module__ = ''
        c = C(NoName)
        if py_33_plus:
            expected = "<C:<class '.TestC.test_no_name.<locals>.NoName'>>"
        else:
            expected = "<C:<class '.'>>"
        self.assertEqual(repr(c), expected)
© 2026 GrazzMean-Shell