From 214ac9c88090343d57aa5b2b21f56bc8b7ab00d8 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 08:59:57 -0700 Subject: [PATCH 1/7] Don't allow format characters in C# identifiers They are technically allowed, but some of them are non-breaking spaces which the C# compiler considers equivalent (maybe even ignores?), but which our string comparison doesn't consider equal, so we'll end up with different C# properties that are duplicates to the C# compiler. --- src/Language/CSharp.purs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Language/CSharp.purs b/src/Language/CSharp.purs index 55867e36..cd981023 100644 --- a/src/Language/CSharp.purs +++ b/src/Language/CSharp.purs @@ -67,7 +67,6 @@ isPartCharacter c = Just ConnectorPunctuation -> true Just NonSpacingMark -> true Just SpacingCombiningMark -> true - Just Format -> true _ -> isStartCharacter c renderNullableToCSharp :: IRType -> Doc String From bd4d648fc33e0ddf710abdd3a8f8bf0824b403d6 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 09:00:27 -0700 Subject: [PATCH 2/7] Generate script can generate object from list of strings --- test/generate-json.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/generate-json.py b/test/generate-json.py index a1babcbc..2c7afeda 100755 --- a/test/generate-json.py +++ b/test/generate-json.py @@ -2,6 +2,8 @@ import argparse import random +import json +import sys with open('/usr/share/dict/words') as f: words = f.read().splitlines() @@ -26,9 +28,18 @@ def main(): parser.add_argument('--array-elements', nargs=1, type=int, default=[3]) parser.add_argument('--object-size', nargs=1, type=int, default=None) parser.add_argument('--class-count', nargs=1, type=int, default=None) + parser.add_argument('--with-string-list', nargs=1, default=None) args = parser.parse_args() - if args.class_count: + if args.with_string_list: + with open(args.with_string_list[0]) as f: + strings = [x[:-1] for x in f.readlines()] + obj = {} + for s in strings: + obj[s] = s + obj["dontMakeAMap"] = True + json.dump(obj, sys.stdout) + elif args.class_count: print('{') for i in range(args.class_count[0] - 1): print(' "class%d":' % i) From a14e2bfe556053baaeaf70343a51423086cb3fed Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 09:00:57 -0700 Subject: [PATCH 3/7] Report more errors in the test driver --- test/test.ts | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/test/test.ts b/test/test.ts index 685cba31..3851b449 100755 --- a/test/test.ts +++ b/test/test.ts @@ -297,6 +297,14 @@ function exec( return result; } +function callAndReportFailure(message: string, f: () => T): T { + try { + return f(); + } catch (e) { + failWith(message, { error: e }); + } +} + type ComparisonArgs = { expectedFile: string; jsonFile?: string; @@ -309,16 +317,17 @@ function compareJsonFileToJson(args: ComparisonArgs) { let { expectedFile, jsonFile, jsonCommand, strict } = args; - let jsonString = jsonFile - ? fs.readFileSync(jsonFile, "utf8") - : exec(jsonCommand).stdout; + const jsonString = jsonFile + ? callAndReportFailure("Could not read JSON output file", () => fs.readFileSync(jsonFile, "utf8")) + : callAndReportFailure("Could not run command for JSON output", () => exec(jsonCommand).stdout); - let givenJSON = JSON.parse(jsonString); - let expectedJSON = JSON.parse(fs.readFileSync(expectedFile, "utf8")); + const givenJSON = callAndReportFailure("Could not parse output JSON", () => JSON.parse(jsonString)); + const expectedJSON = callAndReportFailure("Could not read or parse expected JSON file", + () => JSON.parse(fs.readFileSync(expectedFile, "utf8"))); let jsonAreEqual = strict - ? strictDeepEquals(givenJSON, expectedJSON) - : deepEquals(expectedJSON, givenJSON); + ? callAndReportFailure("Failed to strictly compare objects", () => strictDeepEquals(givenJSON, expectedJSON)) + : callAndReportFailure("Failed to compare objects.", () => deepEquals(expectedJSON, givenJSON)); if (!jsonAreEqual) { failWith("Error: Output is not equivalent to input.", { @@ -372,7 +381,11 @@ async function runFixtureWithSample(fixture: Fixture, sample: string, index: num // Generate code from the sample await quicktype({ src: [sampleFile], out: fixture.output, topLevel: fixture.topLevel}); - await fixture.test(sampleFile); + try { + await fixture.test(sampleFile); + } catch (e) { + failWith("Fixture threw an exception", { error: e }); + } if (fixture.diffViaSchema) { debug("* Diffing with code generated via JSON Schema"); From 83a388462b4445e256bf8f2dc2595368f4b0b901 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 09:02:18 -0700 Subject: [PATCH 4/7] Don't call `hasOwnProperty` in `deepEquals` The object in question might have a property called `hasOwnProperty`, which is naughty but shouldn't crash us. --- test/lib/deepEquals.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/lib/deepEquals.ts b/test/lib/deepEquals.ts index 0893e789..ccd10ea7 100644 --- a/test/lib/deepEquals.ts +++ b/test/lib/deepEquals.ts @@ -9,9 +9,6 @@ declare module Math { // https://stackoverflow.com/questions/1068834/object-comparison-in-javascript export default function deepEquals(x: any, y: any, path: string[] = []): boolean { - var i; - var p; - // remember that NaN === NaN returns false // and isNaN(undefined) returns true if (typeof x === 'number' && typeof y === 'number') { @@ -60,8 +57,8 @@ export default function deepEquals(x: any, y: any, path: string[] = []): boolean console.error(`Arrays don't have the same length at path ${pathToString(path)}.`); return false; } - for (i = 0; i < x.length; i++) { - path.push(i) + for (let i = 0; i < x.length; i++) { + path.push(i.toString()); if (!deepEquals(x[i], y[i], path)) return false; path.pop(); @@ -69,10 +66,15 @@ export default function deepEquals(x: any, y: any, path: string[] = []): boolean return true; } - for (p in y) { + // FIXMEL The way we're looking up properties with `indexOf` makes this + // quadratic. So far no problem, so meh. + const xKeys = Object.keys(x); + const yKeys = Object.keys(y); + + for (const p of yKeys) { // We allow properties in y that aren't present in x // so long as they're null. - if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) { + if (xKeys.indexOf(p) < 0) { if (y[p] !== null) { console.error(`Non-null property ${p} is not expected at path ${pathToString(path)}.`); return false; @@ -85,8 +87,8 @@ export default function deepEquals(x: any, y: any, path: string[] = []): boolean } } - for (p in x) { - if (x.hasOwnProperty(p) && !y.hasOwnProperty(p)) { + for (const p of xKeys) { + if (yKeys.indexOf(p) < 0) { console.error(`Expected property ${p} not found at path ${pathToString(path)}.`); return false; } From 3edf709ee468b5f6f398c335aff9fddd23f42dc8 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 09:57:39 -0700 Subject: [PATCH 5/7] true and false are reserved in Java, too --- src/Language/Java.purs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Language/Java.purs b/src/Language/Java.purs index 8bd65e2d..a2301b21 100644 --- a/src/Language/Java.purs +++ b/src/Language/Java.purs @@ -29,7 +29,7 @@ forbiddenNames = , "char", "final", "interface", "static", "void" , "class", "finally", "long", "strictfp", "volatile" , "const", "float", "native", "super", "while" - , "null" + , "null", "false", "true" ] renderer :: Renderer From 1027720a3f96e616de910d0cf8bb2e289625a758 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 09:58:50 -0700 Subject: [PATCH 6/7] Only allow ASCII in Java identifiers Java's unicode properties don't seem to match up with the official definition, so we'd have to implement our own implementation of them, which we might do later. --- src/Language/Java.purs | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/Language/Java.purs b/src/Language/Java.purs index a2301b21..193bc882 100644 --- a/src/Language/Java.purs +++ b/src/Language/Java.purs @@ -2,16 +2,16 @@ module Language.Java ( renderer ) where -import Doc (Doc, Renderer, blank, combineNames, forEachProperty_, forEachTopLevel_, getForSingleOrMultipleTopLevels, getTypeNameForUnion, indent, line, lookupClassName, lookupUnionName, noForbidNamer, renderRenderItems, simpleNamer, transformPropertyNames, unionIsNotSimpleNullable, unionNameIntercalated) -import IRGraph (IRClassData(..), IRType(..), IRUnionRep, forUnion_, isUnionMember, nullableFromUnion, removeNullFromUnion, unionHasArray, unionHasClass, unionHasMap) import Prelude -import Data.Char.Unicode (GeneralCategory(..), generalCategory, isSpace) +import Data.Char.Unicode (isAscii, isDigit, isLetter) import Data.Foldable (for_) import Data.Map (Map) import Data.Map as M import Data.Maybe (Maybe(..)) -import Data.String.Util (camelCase, capitalize, isLetterOrLetterNumber, legalizeCharacters, startWithLetter, stringEscape) +import Data.String.Util (camelCase, capitalize, legalizeCharacters, startWithLetter, stringEscape) +import Doc (Doc, Renderer, blank, combineNames, forEachProperty_, forEachTopLevel_, getForSingleOrMultipleTopLevels, getTypeNameForUnion, indent, line, lookupClassName, lookupUnionName, noForbidNamer, renderRenderItems, simpleNamer, transformPropertyNames, unionIsNotSimpleNullable, unionNameIntercalated) +import IRGraph (IRClassData(..), IRType(..), IRUnionRep, forUnion_, isUnionMember, nullableFromUnion, removeNullFromUnion, unionHasArray, unionHasClass, unionHasMap) forbiddenNames :: Array String forbiddenNames = @@ -57,20 +57,11 @@ nameForClass (IRClassData { names }) = javaNameStyle true $ combineNames names isStartCharacter :: Char -> Boolean isStartCharacter c = - case generalCategory c of - Just CurrencySymbol -> true - Just ConnectorPunctuation -> true - _ -> isLetterOrLetterNumber c + (isAscii c && isLetter c) || c == '_' isPartCharacter :: Char -> Boolean isPartCharacter c = - case generalCategory c of - Just DecimalNumber -> true - Just SpacingCombiningMark -> true - Just NonSpacingMark -> true - Just Format -> true - Just Control -> not $ isSpace c - _ -> isStartCharacter c + isStartCharacter c || (isAscii c && isDigit c) legalize :: String -> String legalize = legalizeCharacters isPartCharacter From 66c3f888b867c5fedf31fa685a4572caa9437b09 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Sat, 9 Sep 2017 10:08:21 -0700 Subject: [PATCH 7/7] Big List of Naughty Strings test --- test/inputs/json/priority/blns-object.json | 1 + test/test.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 test/inputs/json/priority/blns-object.json diff --git a/test/inputs/json/priority/blns-object.json b/test/inputs/json/priority/blns-object.json new file mode 100644 index 00000000..cff06b1f --- /dev/null +++ b/test/inputs/json/priority/blns-object.json @@ -0,0 +1 @@ +{"": "", "\u00ad\u0600\u0601\u0602\u0603\u0604\u0605\u061c\u06dd\u070f\u180e\u200b\u200c\u200d\u200e\u200f\u202a\u202b\u202c\u202d\u202e\u2060\u2061\u2062\u2063\u2064\u2066\u2067\u2068\u2069\u206a\u206b\u206c\u206d\u206e\u206f\ufeff\ufff9\ufffa\ufffb\ud804\udcbd\ud82f\udca0\ud82f\udca1\ud82f\udca2\ud82f\udca3\ud834\udd73\ud834\udd74\ud834\udd75\ud834\udd76\ud834\udd77\ud834\udd78\ud834\udd79\ud834\udd7a\udb40\udc01\udb40\udc20\udb40\udc21\udb40\udc22\udb40\udc23\udb40\udc24\udb40\udc25\udb40\udc26\udb40\udc27\udb40\udc28\udb40\udc29\udb40\udc2a\udb40\udc2b\udb40\udc2c\udb40\udc2d\udb40\udc2e\udb40\udc2f\udb40\udc30\udb40\udc31\udb40\udc32\udb40\udc33\udb40\udc34\udb40\udc35\udb40\udc36\udb40\udc37\udb40\udc38\udb40\udc39\udb40\udc3a\udb40\udc3b\udb40\udc3c\udb40\udc3d\udb40\udc3e\udb40\udc3f\udb40\udc40\udb40\udc41\udb40\udc42\udb40\udc43\udb40\udc44\udb40\udc45\udb40\udc46\udb40\udc47\udb40\udc48\udb40\udc49\udb40\udc4a\udb40\udc4b\udb40\udc4c\udb40\udc4d\udb40\udc4e\udb40\udc4f\udb40\udc50\udb40\udc51\udb40\udc52\udb40\udc53\udb40\udc54\udb40\udc55\udb40\udc56\udb40\udc57\udb40\udc58\udb40\udc59\udb40\udc5a\udb40\udc5b\udb40\udc5c\udb40\udc5d\udb40\udc5e\udb40\udc5f\udb40\udc60\udb40\udc61\udb40\udc62\udb40\udc63\udb40\udc64\udb40\udc65\udb40\udc66\udb40\udc67\udb40\udc68\udb40\udc69\udb40\udc6a\udb40\udc6b\udb40\udc6c\udb40\udc6d\udb40\udc6e\udb40\udc6f\udb40\udc70\udb40\udc71\udb40\udc72\udb40\udc73\udb40\udc74\udb40\udc75\udb40\udc76\udb40\udc77\udb40\udc78\udb40\udc79\udb40\udc7a\udb40\udc7b\udb40\udc7c\udb40\udc7d\udb40\udc7e\udb40\udc7f": "\u00ad\u0600\u0601\u0602\u0603\u0604\u0605\u061c\u06dd\u070f\u180e\u200b\u200c\u200d\u200e\u200f\u202a\u202b\u202c\u202d\u202e\u2060\u2061\u2062\u2063\u2064\u2066\u2067\u2068\u2069\u206a\u206b\u206c\u206d\u206e\u206f\ufeff\ufff9\ufffa\ufffb\ud804\udcbd\ud82f\udca0\ud82f\udca1\ud82f\udca2\ud82f\udca3\ud834\udd73\ud834\udd74\ud834\udd75\ud834\udd76\ud834\udd77\ud834\udd78\ud834\udd79\ud834\udd7a\udb40\udc01\udb40\udc20\udb40\udc21\udb40\udc22\udb40\udc23\udb40\udc24\udb40\udc25\udb40\udc26\udb40\udc27\udb40\udc28\udb40\udc29\udb40\udc2a\udb40\udc2b\udb40\udc2c\udb40\udc2d\udb40\udc2e\udb40\udc2f\udb40\udc30\udb40\udc31\udb40\udc32\udb40\udc33\udb40\udc34\udb40\udc35\udb40\udc36\udb40\udc37\udb40\udc38\udb40\udc39\udb40\udc3a\udb40\udc3b\udb40\udc3c\udb40\udc3d\udb40\udc3e\udb40\udc3f\udb40\udc40\udb40\udc41\udb40\udc42\udb40\udc43\udb40\udc44\udb40\udc45\udb40\udc46\udb40\udc47\udb40\udc48\udb40\udc49\udb40\udc4a\udb40\udc4b\udb40\udc4c\udb40\udc4d\udb40\udc4e\udb40\udc4f\udb40\udc50\udb40\udc51\udb40\udc52\udb40\udc53\udb40\udc54\udb40\udc55\udb40\udc56\udb40\udc57\udb40\udc58\udb40\udc59\udb40\udc5a\udb40\udc5b\udb40\udc5c\udb40\udc5d\udb40\udc5e\udb40\udc5f\udb40\udc60\udb40\udc61\udb40\udc62\udb40\udc63\udb40\udc64\udb40\udc65\udb40\udc66\udb40\udc67\udb40\udc68\udb40\udc69\udb40\udc6a\udb40\udc6b\udb40\udc6c\udb40\udc6d\udb40\udc6e\udb40\udc6f\udb40\udc70\udb40\udc71\udb40\udc72\udb40\udc73\udb40\udc74\udb40\udc75\udb40\udc76\udb40\udc77\udb40\udc78\udb40\udc79\udb40\udc7a\udb40\udc7b\udb40\udc7c\udb40\udc7d\udb40\udc7e\udb40\udc7f", "": "", "\u24af\u24a3\u24a0 \u24ac\u24b0\u24a4\u249e\u24a6 \u249d\u24ad\u24aa\u24b2\u24a9 \u24a1\u24aa\u24b3 \u24a5\u24b0\u24a8\u24ab\u24ae \u24aa\u24b1\u24a0\u24ad \u24af\u24a3\u24a0 \u24a7\u249c\u24b5\u24b4 \u249f\u24aa\u24a2": "\u24af\u24a3\u24a0 \u24ac\u24b0\u24a4\u249e\u24a6 \u249d\u24ad\u24aa\u24b2\u24a9 \u24a1\u24aa\u24b3 \u24a5\u24b0\u24a8\u24ab\u24ae \u24aa\u24b1\u24a0\u24ad \u24af\u24a3\u24a0 \u24a7\u249c\u24b5\u24b4 \u249f\u24aa\u24a2", "classic": "classic", "": "", "`ls -al /`": "`ls -al /`", "1;DROP TABLE users": "1;DROP TABLE users", "undef": "undef", "\u202a\u202atest\u202a": "\u202a\u202atest\u202a", "\ud835\udc7b\ud835\udc89\ud835\udc86 \ud835\udc92\ud835\udc96\ud835\udc8a\ud835\udc84\ud835\udc8c \ud835\udc83\ud835\udc93\ud835\udc90\ud835\udc98\ud835\udc8f \ud835\udc87\ud835\udc90\ud835\udc99 \ud835\udc8b\ud835\udc96\ud835\udc8e\ud835\udc91\ud835\udc94 \ud835\udc90\ud835\udc97\ud835\udc86\ud835\udc93 \ud835\udc95\ud835\udc89\ud835\udc86 \ud835\udc8d\ud835\udc82\ud835\udc9b\ud835\udc9a \ud835\udc85\ud835\udc90\ud835\udc88": "\ud835\udc7b\ud835\udc89\ud835\udc86 \ud835\udc92\ud835\udc96\ud835\udc8a\ud835\udc84\ud835\udc8c \ud835\udc83\ud835\udc93\ud835\udc90\ud835\udc98\ud835\udc8f \ud835\udc87\ud835\udc90\ud835\udc99 \ud835\udc8b\ud835\udc96\ud835\udc8e\ud835\udc91\ud835\udc94 \ud835\udc90\ud835\udc97\ud835\udc86\ud835\udc93 \ud835\udc95\ud835\udc89\ud835\udc86 \ud835\udc8d\ud835\udc82\ud835\udc9b\ud835\udc9a \ud835\udc85\ud835\udc90\ud835\udc88", "1 000 000.00": "1 000 000.00", "Dick Van Dyke": "Dick Van Dyke", "#\tScript Injection": "#\tScript Injection", "0": "0", "# U+0000, U+000A, or U+000D (NUL, LF, CR).": "# U+0000, U+000A, or U+000D (NUL, LF, CR).", "0,00": "0,00", "# Non-whitespace C1 controls: U+0080 through U+0084 and U+0086 through U+009F.": "# Non-whitespace C1 controls: U+0080 through U+0084 and U+0086 through U+009F.", "# and U+200B (ZERO WIDTH SPACE), which are in the C categories but are often": "# and U+200B (ZERO WIDTH SPACE), which are in the C categories but are often", "\">DEF": "ABC
DEF", "0,0,0": "0,0,0", ";alert(123);": ";alert(123);", "test": "test", "": "", "test": "test", "javascript:alert(1);": "javascript:alert(1);", "": "", "False": "False", "test": "test", "-,": "-,", "-.": "-.", "test": "test", "1#SNAN": "1#SNAN", "-0": "-0", "\"`'>": "\"`'>", "\"`'>": "\"`'>", "0,0/0,0": "0,0/0,0", "Kernel.exit(1)": "Kernel.exit(1)", "0x0": "0x0", "ABC
DEF": "ABC
DEF", "\u2066test\u2067": "\u2066test\u2067", "test": "test", "ABC
DEF": "ABC
DEF", "test": "test", "test": "test", "1.0/0.0": "1.0/0.0", "#\tSQL Injection": "#\tSQL Injection", "\\\";alert('XSS');//": "\\\";alert('XSS');//", "Z\u032e\u031e\u0320\u0359\u0354\u0345\u1e00\u0317\u031e\u0348\u033b\u0317\u1e36\u0359\u034e\u032f\u0339\u031e\u0353G\u033bO\u032d\u0317\u032e": "Z\u032e\u031e\u0320\u0359\u0354\u0345\u1e00\u0317\u031e\u0348\u033b\u0317\u1e36\u0359\u034e\u032f\u0339\u031e\u0353G\u033bO\u032d\u0317\u032e", "RomansInSussex.co.uk": "RomansInSussex.co.uk", "\" autofocus onkeyup=\"javascript:alert(123)": "\" autofocus onkeyup=\"javascript:alert(123)", "1#QNAN": "1#QNAN", "True": "True", "{0}": "{0}", "\"`'>": "\"`'>", "test": "test", " ": " ", "#\tStrings which contain Emoji; should be the same behavior as two-byte characters, but not always": "#\tStrings which contain Emoji; should be the same behavior as two-byte characters, but not always", "ABC
DEF": "ABC
DEF", "<<< %s(un='%s') = %u": "<<< %s(un='%s') = %u", "$ENV{'HOME'}": "$ENV{'HOME'}", "# fonts, and have a number of special behaviors": "# fonts, and have a number of special behaviors", "Penistone Community Church": "Penistone Community Church", "\u023a": "\u023a", "\u023e": "\u023e", "\ud83d\udebe \ud83c\udd92 \ud83c\udd93 \ud83c\udd95 \ud83c\udd96 \ud83c\udd97 \ud83c\udd99 \ud83c\udfe7": "\ud83d\udebe \ud83c\udd92 \ud83c\udd93 \ud83c\udd95 \ud83c\udd96 \ud83c\udd97 \ud83c\udd99 \ud83c\udfe7", "LPT2": "LPT2", "LPT3": "LPT3", "#\tHuman injection": "#\tHuman injection", "test": "test", "INF": "INF", "#\tTwo-Byte Characters": "#\tTwo-Byte Characters", "#\tStrings which can call system commands within Ruby/Rails applications": "#\tStrings which can call system commands within Ruby/Rails applications", "#\tKnown CVEs and Vulnerabilities": "#\tKnown CVEs and Vulnerabilities", "Arsenal canal": "Arsenal canal", "-Infinity": "-Infinity", "\u0153\u2211\u00b4\u00ae\u2020\u00a5\u00a8\u02c6\u00f8\u03c0\u201c\u2018": "\u0153\u2211\u00b4\u00ae\u2020\u00a5\u00a8\u02c6\u00f8\u03c0\u201c\u2018", "": "", "!@#$%^&*()`~": "!@#$%^&*()`~", "#\tCharacters which increase in length (2 to 3 bytes) when lowercased": "#\tCharacters which increase in length (2 to 3 bytes) when lowercased", "\"`'>": "\"`'>", "\ufffe": "\ufffe", ",./;'[]\\-=": ",./;'[]\\-=", "\u30d1\u30fc\u30c6\u30a3\u30fc\u3078\u884c\u304b\u306a\u3044\u304b": "\u30d1\u30fc\u30c6\u30a3\u30fc\u3078\u884c\u304b\u306a\u3044\u304b", "\u05d4\u05b8\u05d9\u05b0\u05ea\u05b8\u05d4test\u0627\u0644\u0635\u0641\u062d\u0627\u062a \u0627\u0644\u062a\u0651\u062d\u0648\u0644": "\u05d4\u05b8\u05d9\u05b0\u05ea\u05b8\u05d4test\u0627\u0644\u0635\u0641\u062d\u0627\u062a \u0627\u0644\u062a\u0651\u062d\u0648\u0644", "\u2080\u2081\u2082": "\u2080\u2081\u2082", "\u202btest\u202b": "\u202btest\u202b", "": "", "#\tStrings that test for known vulnerabilities": "#\tStrings that test for known vulnerabilities", "( \u0361\u00b0 \u035c\u0296 \u0361\u00b0)": "( \u0361\u00b0 \u035c\u0296 \u0361\u00b0)", "' OR '1'='1": "' OR '1'='1", "ABC
DEF": "ABC
DEF", "1/2": "1/2", "1/0": "1/0", "`\"'>": "`\"'>", "\uff9f\uff65\u273f\u30fe\u2572(\uff61\u25d5\u203f\u25d5\uff61)\u2571\u273f\uff65\uff9f": "\uff9f\uff65\u273f\u30fe\u2572(\uff61\u25d5\u203f\u25d5\uff61)\u2571\u273f\uff65\uff9f", "": "", "": "", "#\tUnicode font": "#\tUnicode font", "": "", "00\u02d9\u0196$-": "00\u02d9\u0196$-", "AUX": "AUX", "": "", "1E02": "1E02", "\ud83c\uddfa\ud83c\uddf8\ud83c\uddf7\ud83c\uddfa\ud83c\uddf8\ud83c\udde6": "\ud83c\uddfa\ud83c\uddf8\ud83c\uddf7\ud83c\uddfa\ud83c\uddf8\ud83c\udde6", "\ud83d\udc69\ud83c\udffd": "\ud83d\udc69\ud83c\udffd", "test": "test", "$HOME": "$HOME", "test": "test", "#\tString which can reveal system files when parsed by a badly configured XML parser": "#\tString which can reveal system files when parsed by a badly configured XML parser", "ABC
DEF": "ABC
DEF", "ABC
DEF": "ABC
DEF", "\ud83c\uddfa\ud83c\uddf8\ud83c\uddf7\ud83c\uddfa\ud83c\uddf8 \ud83c\udde6\ud83c\uddeb\ud83c\udde6\ud83c\uddf2\ud83c\uddf8": "\ud83c\uddfa\ud83c\uddf8\ud83c\uddf7\ud83c\uddfa\ud83c\uddf8 \ud83c\udde6\ud83c\uddeb\ud83c\udde6\ud83c\uddf2\ud83c\uddf8", "\ud835\udd7f\ud835\udd8d\ud835\udd8a \ud835\udd96\ud835\udd9a\ud835\udd8e\ud835\udd88\ud835\udd90 \ud835\udd87\ud835\udd97\ud835\udd94\ud835\udd9c\ud835\udd93 \ud835\udd8b\ud835\udd94\ud835\udd9d \ud835\udd8f\ud835\udd9a\ud835\udd92\ud835\udd95\ud835\udd98 \ud835\udd94\ud835\udd9b\ud835\udd8a\ud835\udd97 \ud835\udd99\ud835\udd8d\ud835\udd8a \ud835\udd91\ud835\udd86\ud835\udd9f\ud835\udd9e \ud835\udd89\ud835\udd94\ud835\udd8c": "\ud835\udd7f\ud835\udd8d\ud835\udd8a \ud835\udd96\ud835\udd9a\ud835\udd8e\ud835\udd88\ud835\udd90 \ud835\udd87\ud835\udd97\ud835\udd94\ud835\udd9c\ud835\udd93 \ud835\udd8b\ud835\udd94\ud835\udd9d \ud835\udd8f\ud835\udd9a\ud835\udd92\ud835\udd95\ud835\udd98 \ud835\udd94\ud835\udd9b\ud835\udd8a\ud835\udd97 \ud835\udd99\ud835\udd8d\ud835\udd8a \ud835\udd91\ud835\udd86\ud835\udd9f\ud835\udd9e \ud835\udd89\ud835\udd94\ud835\udd8c", "test": "test", "0..0": "0..0", "": "", "\"`'>": "\"`'>", "test": "test", "test": "test", "\"`'>": "\"`'>", "1": "1", "1E2": "1E2", "": "", "ript>alert(123)ript>": "ript>alert(123)ript>", "ABC
DEF": "ABC
DEF", "\u0e14\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47 \u0e14\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47 \u0e14\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47": "\u0e14\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47 \u0e14\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47 \u0e14\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47\u0e47\u0e49\u0e49\u0e49\u0e49\u0e49\u0e47\u0e47\u0e47\u0e47", "": "", "Super Bowl XXX": "Super Bowl XXX", "": "", "123456789012345678901234567890123456789": "123456789012345678901234567890123456789", " Copy me": " Copy me", "javascript:alert(1);": "javascript:alert(1);", "\ud83c\uddfa\ud83c\uddf8\ud83c\uddf7\ud83c\uddfa\ud83c\uddf8\ud83c\udde6\ud83c\uddeb\ud83c\udde6\ud83c\uddf2": "\ud83c\uddfa\ud83c\uddf8\ud83c\uddf7\ud83c\uddfa\ud83c\uddf8\ud83c\udde6\ud83c\uddeb\ud83c\udde6\ud83c\uddf2", "test": "test", "ABC
DEF": "ABC
DEF", "\u0080\u0081\u0082\u0083\u0084\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f": "\u0080\u0081\u0082\u0083\u0084\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f", "test": "test", "": "", "test": "test", "": "", "Jimmy Clitheroe": "Jimmy Clitheroe", "-1E02": "-1E02", "#\tChanging length when lowercased": "#\tChanging length when lowercased", "": "", "\u00b8\u02db\u00c7\u25ca\u0131\u02dc\u00c2\u00af\u02d8\u00bf": "\u00b8\u02db\u00c7\u25ca\u0131\u02dc\u00c2\u00af\u02d8\u00bf", "\";alert(123);t=\"": "\";alert(123);t=\"", "": "", "\"`'>": "\"`'>", "\u0321\u0353\u031e\u0345I\u0317\u0318\u0326\u035dn\u0347\u0347\u0359v\u032e\u032bok\u0332\u032b\u0319\u0348i\u0316\u0359\u032d\u0339\u0320\u031en\u0321\u033b\u032e\u0323\u033ag\u0332\u0348\u0359\u032d\u0359\u032c\u034e \u0330t\u0354\u0326h\u031e\u0332e\u0322\u0324 \u034d\u032c\u0332\u0356f\u0334\u0318\u0355\u0323\u00e8\u0356\u1eb9\u0325\u0329l\u0356\u0354\u035ai\u0353\u035a\u0326\u0360n\u0356\u034d\u0317\u0353\u0333\u032eg\u034d \u0328o\u035a\u032a\u0361f\u0318\u0323\u032c \u0316\u0318\u0356\u031f\u0359\u032ec\u0489\u0354\u032b\u0356\u0353\u0347\u0356\u0345h\u0335\u0324\u0323\u035a\u0354\u00e1\u0317\u033c\u0355\u0345o\u033c\u0323\u0325s\u0331\u0348\u033a\u0316\u0326\u033b\u0362.\u031b\u0316\u031e\u0320\u032b\u0330": "\u0321\u0353\u031e\u0345I\u0317\u0318\u0326\u035dn\u0347\u0347\u0359v\u032e\u032bok\u0332\u032b\u0319\u0348i\u0316\u0359\u032d\u0339\u0320\u031en\u0321\u033b\u032e\u0323\u033ag\u0332\u0348\u0359\u032d\u0359\u032c\u034e \u0330t\u0354\u0326h\u031e\u0332e\u0322\u0324 \u034d\u032c\u0332\u0356f\u0334\u0318\u0355\u0323\u00e8\u0356\u1eb9\u0325\u0329l\u0356\u0354\u035ai\u0353\u035a\u0326\u0360n\u0356\u034d\u0317\u0353\u0333\u032eg\u034d \u0328o\u035a\u032a\u0361f\u0318\u0323\u032c \u0316\u0318\u0356\u031f\u0359\u032ec\u0489\u0354\u032b\u0356\u0353\u0347\u0356\u0345h\u0335\u0324\u0323\u035a\u0354\u00e1\u0317\u033c\u0355\u0345o\u033c\u0323\u0325s\u0331\u0348\u033a\u0316\u0326\u033b\u0362.\u031b\u0316\u031e\u0320\u032b\u0330", "#\tInnocuous strings which may be blocked by profanity filters (https://en.wikipedia.org/wiki/Scunthorpe_problem)": "#\tInnocuous strings which may be blocked by profanity filters (https://en.wikipedia.org/wiki/Scunthorpe_problem)", "#\tMSDOS/Windows Special Filenames": "#\tMSDOS/Windows Special Filenames", "<>?:\"{}|_+": "<>?:\"{}|_+", "TRUE": "TRUE", "\ufeff": "\ufeff", "1'000,00": "1'000,00", "PRN": "PRN", ",": ",", "\u00a1\u2122\u00a3\u00a2\u221e\u00a7\u00b6\u2022\u00aa\u00ba\u2013\u2260": "\u00a1\u2122\u00a3\u00a2\u221e\u00a7\u00b6\u2022\u00aa\u00ba\u2013\u2260", "\u548c\u88fd\u6f22\u8a9e": "\u548c\u88fd\u6f22\u8a9e", "#\tStrings which contain bold/italic/etc. versions of normal characters": "#\tStrings which contain bold/italic/etc. versions of normal characters", "Dr. Herman I. Libshitz": "Dr. Herman I. Libshitz", "\u0152\u201e\u00b4\u2030\u02c7\u00c1\u00a8\u02c6\u00d8\u220f\u201d\u2019": "\u0152\u201e\u00b4\u2030\u02c7\u00c1\u00a8\u02c6\u00d8\u220f\u201d\u2019", "#\tStrings which consists of Japanese-style emoticons which are popular on the web": "#\tStrings which consists of Japanese-style emoticons which are popular on the web", "%x('ls -al /')": "%x('ls -al /')", "%d": "%d", "#\tStrings which contain unicode subscripts/superscripts; can cause rendering issues": "#\tStrings which contain unicode subscripts/superscripts; can cause rendering issues", "\"`'>": "\"`'>", "": "", "1'000'000.00": "1'000'000.00", "false": "false", "\\": "\\", "%s": "%s", "1.00": "1.00", "": "", "nil": "nil", "`\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b0\u00b7\u201a\u2014\u00b1": "`\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b0\u00b7\u201a\u2014\u00b1", "\uff40\uff68(\u00b4\u2200\uff40\u2229": "\uff40\uff68(\u00b4\u2200\uff40\u2229", "`\"'>": "`\"'>", "test": "test", "(\u256f\u00b0\u25a1\u00b0\uff09\u256f\ufe35 \u253b\u2501\u253b)": "(\u256f\u00b0\u25a1\u00b0\uff09\u256f\ufe35 \u253b\u2501\u253b)", "\"`'>": "\"`'>", "ABC
DEF": "ABC
DEF", "\u7530\u4e2d\u3055\u3093\u306b\u3042\u3052\u3066\u4e0b\u3055\u3044": "\u7530\u4e2d\u3055\u3093\u306b\u3042\u3052\u3066\u4e0b\u3055\u3044", "": "\"`'>", "\"`'>": "\"`'>", "'\"'": "'\"'", "0.0/0.0": "0.0/0.0", "#\tCommand Injection (Ruby)": "#\tCommand Injection (Ruby)", "test": "test", "'": "'", "#\tStrings which crashed iMessage in various versions of iOS": "#\tStrings which crashed iMessage in various versions of iOS", "\"`'>": "\"`'>", "": "", "test": "test", "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669", "": "", "-1": "-1", "#\tStrings which contain common unicode symbols (e.g. smart quotes)": "#\tStrings which contain common unicode symbols (e.g. smart quotes)", "None": "None", "../../../../../../../../../../../etc/passwd%00": "../../../../../../../../../../../etc/passwd%00", "#\tUnwanted Interpolation": "#\tUnwanted Interpolation", "#\tStrings which can be accidentally expanded into different strings if evaluated in the wrong context, e.g. used as a printf format string or via Perl or shell eval. Might expose sensitive data from the program doing the interpolation, or might just represent the wrong string.": "#\tStrings which can be accidentally expanded into different strings if evaluated in the wrong context, e.g. used as a printf format string or via Perl or shell eval. Might expose sensitive data from the program doing the interpolation, or might just represent the wrong string.", "(null)": "(null)", "`\"'>": "`\"'>", "#\tStrings which contain misplaced quotation marks; can cause encoding errors": "#\tStrings which contain misplaced quotation marks; can cause encoding errors", "\"`'>": "\"`'>", "#\tStrings which may cause human to reinterpret worldview": "#\tStrings which may cause human to reinterpret worldview", "": "", "perl -e 'print \"\";' > out": "perl -e 'print \"\";' > out", "javascript:alert(1);": "javascript:alert(1);", "Lightwater Country Park": "Lightwater Country Park", "# The next two lines may appear to be blank or mojibake in some viewers.": "# The next two lines may appear to be blank or mojibake in some viewers.", "+0": "+0", "';alert(123);t='": "';alert(123);t='", "#\tUnicode Numbers": "#\tUnicode Numbers", "test": "test", "": "", "../../../../../../../../../../../etc/hosts": "../../../../../../../../../../../etc/hosts", "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999": "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", "The quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]": "The quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]", "ABC
DEF": "ABC
DEF", "\ufdfd": "\ufdfd", "' OR 1=1 -- 1": "' OR 1=1 -- 1", "\ufdfa": "\ufdfa", "": "", "1 000 000,00": "1 000 000,00", "#\tUnicode Symbols": "#\tUnicode Symbols", "test": "test", "\"": "\"", "": "", "0.00": "0.00", "NUL": "NUL", "\"`'>": "\"`'>", "#\tStrings which contain text that should be rendered RTL if possible (e.g. Arabic, Hebrew)": "#\tStrings which contain text that should be rendered RTL if possible (e.g. Arabic, Hebrew)", "": "", "\"`'>": "\"`'>", "$(touch /tmp/blns.fail)": "$(touch /tmp/blns.fail)", "test": "test", "# The next line may appear to be blank, mojibake, or dingbats in some viewers.": "# The next line may appear to be blank, mojibake, or dingbats in some viewers.", "`touch /tmp/blns.fail`": "`touch /tmp/blns.fail`", "<": "<", "\"`'>": "\"`'>", "# Regional Indicator Symbols": "# Regional Indicator Symbols", "\ud83d\ude0d": "\ud83d\ude0d", "test": "test", "