from unittest import TestCase



import json



# Fri Dec 30 18:57:26 2005

JSONDOCS = [

    # http://json.org/JSON_checker/test/fail1.json

    '"A JSON payload should be an object or array, not a string."',

    # http://json.org/JSON_checker/test/fail2.json

    '["Unclosed array"',

    # http://json.org/JSON_checker/test/fail3.json

    '{unquoted_key: "keys must be quoted}',

    # http://json.org/JSON_checker/test/fail4.json

    '["extra comma",]',

    # http://json.org/JSON_checker/test/fail5.json

    '["double extra comma",,]',

    # http://json.org/JSON_checker/test/fail6.json

    '[   , "<-- missing value"]',

    # http://json.org/JSON_checker/test/fail7.json

    '["Comma after the close"],',

    # http://json.org/JSON_checker/test/fail8.json

    '["Extra close"]]',

    # http://json.org/JSON_checker/test/fail9.json

    '{"Extra comma": true,}',

    # http://json.org/JSON_checker/test/fail10.json

    '{"Extra value after close": true} "misplaced quoted value"',

    # http://json.org/JSON_checker/test/fail11.json

    '{"Illegal expression": 1 + 2}',

    # http://json.org/JSON_checker/test/fail12.json

    '{"Illegal invocation": alert()}',

    # http://json.org/JSON_checker/test/fail13.json

    '{"Numbers cannot have leading zeroes": 013}',

    # http://json.org/JSON_checker/test/fail14.json

    '{"Numbers cannot be hex": 0x14}',

    # http://json.org/JSON_checker/test/fail15.json

    '["Illegal backslash escape: \\x15"]',

    # http://json.org/JSON_checker/test/fail16.json

    '["Illegal backslash escape: \\\'"]',

    # http://json.org/JSON_checker/test/fail17.json

    '["Illegal backslash escape: \\017"]',

    # http://json.org/JSON_checker/test/fail18.json

    '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]',

    # http://json.org/JSON_checker/test/fail19.json

    '{"Missing colon" null}',

    # http://json.org/JSON_checker/test/fail20.json

    '{"Double colon":: null}',

    # http://json.org/JSON_checker/test/fail21.json

    '{"Comma instead of colon", null}',

    # http://json.org/JSON_checker/test/fail22.json

    '["Colon instead of comma": false]',

    # http://json.org/JSON_checker/test/fail23.json

    '["Bad value", truth]',

    # http://json.org/JSON_checker/test/fail24.json

    "['single quote']",

    # http://code.google.com/p/simplejson/issues/detail?id=3

    u'["A\u001FZ control characters in string"]',

]



SKIPS = {

    1: "why not have a string payload?",

    18: "spec doesn't specify any nesting limitations",

}



class TestFail(TestCase):

    def test_failures(self):

        for idx, doc in enumerate(JSONDOCS):

            idx = idx + 1

            if idx in SKIPS:

                json.loads(doc)

                continue

            try:

                json.loads(doc)

            except ValueError:

                pass

            else:

                self.fail("Expected failure for fail%d.json: %r" % (idx, doc))

