ensure that the marker is cleared ensure that the marker is cleared test that loading highlynested objects doesn t segfault when c accelerations are used see 12017 see 12051 see 12051 if checkcircular is false this will keep adding another list return o with self assertraisesrecursionerror with support infiniterecursion endlessjsonencodercheckcircularfalse encode5j class testpyrecursiontestrecursion pytest pass class testcrecursiontestrecursion ctest pass ensure that the marker is cleared ensure that the marker is cleared test that loading highly nested objects doesn t segfault when c accelerations are used see 12017 see 12051 see 12051 if check_circular is false this will keep adding another list
from test import support
from test.test_json import PyTest, CTest


class JSONTestObject:
    pass


class TestRecursion:
    def test_listrecursion(self):
        x = []
        x.append(x)
        try:
            self.dumps(x)
        except ValueError:
            pass
        else:
            self.fail("didn't raise ValueError on list recursion")
        x = []
        y = [x]
        x.append(y)
        try:
            self.dumps(x)
        except ValueError:
            pass
        else:
            self.fail("didn't raise ValueError on alternating list recursion")
        y = []
        x = [y, y]
        
        self.dumps(x)

    def test_dictrecursion(self):
        x = {}
        x["test"] = x
        try:
            self.dumps(x)
        except ValueError:
            pass
        else:
            self.fail("didn't raise ValueError on dict recursion")
        x = {}
        y = {"a": x, "b": x}
        
        self.dumps(x)

    def test_defaultrecursion(self):
        class RecursiveJSONEncoder(self.json.JSONEncoder):
            recurse = False
            def default(self, o):
                if o is JSONTestObject:
                    if self.recurse:
                        return [JSONTestObject]
                    else:
                        return 'JSONTestObject'
                return self.json.JSONEncoder.default(o)

        enc = RecursiveJSONEncoder()
        self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"')
        enc.recurse = True
        try:
            enc.encode(JSONTestObject)
        except ValueError:
            pass
        else:
            self.fail("didn't raise ValueError on default recursion")


    def test_highly_nested_objects_decoding(self):
        
        
        with self.assertRaises(RecursionError):
            with support.infinite_recursion():
                self.loads('{"a":' * 100000 + '1' + '}' * 100000)
        with self.assertRaises(RecursionError):
            with support.infinite_recursion():
                self.loads('{"a":' * 100000 + '[1]' + '}' * 100000)
        with self.assertRaises(RecursionError):
            with support.infinite_recursion():
                self.loads('[' * 100000 + '1' + ']' * 100000)

    def test_highly_nested_objects_encoding(self):
        
        l, d = [], {}
        for x in range(100000):
            l, d = [l], {'k':d}
        with self.assertRaises(RecursionError):
            with support.infinite_recursion():
                self.dumps(l)
        with self.assertRaises(RecursionError):
            with support.infinite_recursion():
                self.dumps(d)

    def test_endless_recursion(self):
        
        class EndlessJSONEncoder(self.json.JSONEncoder):
            def default(self, o):
                
                return [o]

        with self.assertRaises(RecursionError):
            with support.infinite_recursion():
                EndlessJSONEncoder(check_circular=False).encode(5j)


class TestPyRecursion(TestRecursion, PyTest): pass
class TestCRecursion(TestRecursion, CTest): pass