CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
json501.test337 linesDownload Raw Back to test
1# 2023-04-272#3# The author disclaims copyright to this source code.  In place of4# a legal notice, here is a blessing:5#6#    May you do good and not evil.7#    May you find forgiveness for yourself and forgive others.8#    May you share freely, never taking more than you give.9#10#***********************************************************************11# This file implements tests for the JSON5 enhancements to the12# JSON SQL functions extension to the SQLite library.13#14 15set testdir [file dirname $argv0]16source $testdir/tester.tcl17set testprefix json50118 19# From https://spec.json5.org/#introduction20#21#-----------------------------------------------------------------------------22# Summary of Features23# 24# The following ECMAScript 5.1 features, which are not supported in JSON, have25# been extended to JSON5. 26#27# Objects28#29#    1) Object keys may be an ECMAScript 5.1 IdentifierName.30#    2) Objects may have a single trailing comma.31#32# Arrays33#34#    3) Arrays may have a single trailing comma.35#36# Strings37#38#    4) Strings may be single quoted.39#    5) Strings may span multiple lines by escaping new line characters.40#    6) Strings may include character escapes.41#42# Numbers43#44#    7) Numbers may be hexadecimal.45#    8) Numbers may have a leading or trailing decimal point.46#    9) Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.47#   10) Numbers may begin with an explicit plus sign.48#49# Comments50#51#   11) Single and multi-line comments are allowed.52#53# White Space54#55#   12) Additional white space characters are allowed.56#-----------------------------------------------------------------------------57#58# Test number in this file are of the form X.Y where X is one of the item59# numbers in the feature list above and Y is the test sequence number.60#61 62###############################################################################63#    1) Object keys may be an ECMAScript 5.1 IdentifierName.64do_execsql_test 1.1 {65  WITH c(x) AS (VALUES('{a:5,b:6}'))66  SELECT x->>'a', json(x), json_valid(x), NOT json_error_position(x) FROM c;67} {5 {{"a":5,"b":6}} 0 1}68do_execsql_test 1.2 {69  SELECT '[7,null,{a:5,b:6},[8,9]]'->>'$[2].b';70} {6}71do_execsql_test 1.3 {72  SELECT '{ $123 : 789 }'->>'$."$123"';73} 78974do_execsql_test 1.4 {75  SELECT '{ _123$xyz : 789 }'->>'$."_123$xyz"';76} 78977do_execsql_test 1.5 {78  SELECT '{ MNO_123$xyz : 789 }'->>'$."MNO_123$xyz"';79} 78980 81do_execsql_test 1.6 {82  SELECT json('{ MNO_123$xyz : 789 }');83} [list {{"MNO_123$xyz":789}}]84 85do_catchsql_test 1.10 {86  SELECT json('{ MNO_123/xyz : 789 }');87} {1 {malformed JSON}}88 89do_execsql_test 1.11 {90  SELECT '{ MNO_123æxyz : 789 }'->>'MNO_123æxyz';91} {789}92 93###############################################################################94#    2) Objects may have a single trailing comma.95 96do_execsql_test 2.1 {97  WITH c(x) AS (VALUES('{"a":5, "b":6, }'))98  SELECT x->>'b', json(x), json_valid(x), NOT json_error_position(x) FROM c;99} {6 {{"a":5,"b":6}} 0 1}100do_execsql_test 2.2 {101  SELECT '{a:5, b:6 , }'->>'b';102} 6103do_catchsql_test 2.3 {104  SELECT '{a:5, b:6 ,, }'->>'b';105} {1 {malformed JSON}}106do_catchsql_test 2.4 {107  SELECT '{a:5, b:6, ,}'->>'b';108} {1 {malformed JSON}}109 110###############################################################################111#    3) Arrays may have a single trailing comma.112 113do_execsql_test 3.1 {114  WITH c(x) AS (VALUES('[5, 6,]'))115  SELECT x->>1, json(x), json_valid(x), NOT json_error_position(x) FROM c;116} {6 {[5,6]} 0 1}117do_execsql_test 3.2 {118  SELECT '[5, 6 , ]'->>1;119} 6120do_catchsql_test 3.3 {121  SELECT '[5, 6,,]'->>1;122} {1 {malformed JSON}}123do_catchsql_test 3.4 {124  SELECT '[5, 6 , , ]'->>1;125} {1 {malformed JSON}}126 127###############################################################################128#    4) Strings may be single quoted.129 130do_execsql_test 4.1 {131  WITH c(x) AS (VALUES('{"a": ''abcd''}'))132  SELECT x->>'a', json(x), json_valid(x), NOT json_error_position(x) FROM c;133} {abcd {{"a":"abcd"}} 0 1}134do_execsql_test 4.2 {135  SELECT '{b: 123, ''a'': ''ab\''cd''}'->>'a';136} {ab'cd}137 138###############################################################################139#    5) Strings may span multiple lines by escaping new line characters.140 141do_execsql_test 5.1 {142  WITH c(x) AS (VALUES('{a: "abc'||char(0x5c,0x0a)||'xyz"}'))143  SELECT x->>'a', json(x), json_valid(x), NOT json_error_position(x) FROM c;144} {abcxyz {{"a":"abcxyz"}} 0 1}145do_execsql_test 5.2 {146  SELECT ('{a: "abc'||char(0x5c,0x0d)||'xyz"}')->>'a';147} {abcxyz}148do_execsql_test 5.3 {149  SELECT ('{a: "abc'||char(0x5c,0x0d,0x0a)||'xyz"}')->>'a';150} {abcxyz}151do_execsql_test 5.4 {152  SELECT ('{a: "abc'||char(0x5c,0x2028)||'xyz"}')->>'a';153} {abcxyz}154do_execsql_test 5.5 {155  SELECT ('{a: "abc'||char(0x5c,0x2029)||'xyz"}')->>'a';156} {abcxyz}157 158 159###############################################################################160#    6) Strings may include character escapes.161 162do_execsql_test 6.1 {163  SELECT ('{a: "abc'||char(0x5c,0x27)||'xyz"}')->>'a';164} {abc'xyz}165do_execsql_test 6.2 {166  SELECT ('{a: "abc'||char(0x5c,0x22)||'xyz"}')->>'a';167} {abc"xyz}168do_execsql_test 6.3 {169  SELECT ('{a: "abc'||char(0x5c,0x5c)||'xyz"}')->>'a';170} {{abc\xyz}}171do_execsql_test 6.4 {172  SELECT hex(('{a: "abc\bxyz"}')->>'a');173} {6162630878797A}174do_execsql_test 6.5 {175  SELECT hex(('{a: "abc\f\n\r\t\vxyz"}')->>'a');176} {6162630C0A0D090B78797A}177do_execsql_test 6.6 {178  SELECT hex(('{a: "abc\0xyz"}')->>'a');179} {6162630078797A}180do_execsql_test 6.7 {181  SELECT '{a: "abc\x35\x4f\x6Exyz"}'->>'a';182} {abc5Onxyz}183do_execsql_test 6.8 {184  SELECT '{a: "\x6a\x6A\x6b\x6B\x6c\x6C\x6d\x6D\x6e\x6E\x6f\x6F"}'->>'a';185} {jjkkllmmnnoo}186 187###############################################################################188#    7) Numbers may be hexadecimal.189 190do_execsql_test 7.1 {191  SELECT '{a: 0x0}'->>'a';192} 0193do_execsql_test 7.2 {194  SELECT '{a: -0x0}'->>'a';195} 0196do_execsql_test 7.3 {197  SELECT '{a: +0x0}'->>'a';198} 0199do_execsql_test 7.4 {200  SELECT '{a: 0xabcdef}'->>'a';201} 11259375202do_execsql_test 7.5 {203  SELECT '{a: -0xaBcDeF}'->>'a';204} -11259375205do_execsql_test 7.6 {206  SELECT '{a: +0xABCDEF}'->>'a';207} 11259375208 209###############################################################################210#    8) Numbers may have a leading or trailing decimal point.211 212do_execsql_test 8.1 {213  WITH c(x) AS (VALUES('{x: 4.}')) SELECT x->>'x', json(x) FROM c;214} {4.0 {{"x":4.0}}}215do_execsql_test 8.2 {216  WITH c(x) AS (VALUES('{x: +4.}')) SELECT x->>'x', json(x) FROM c;217} {4.0 {{"x":4.0}}}218do_execsql_test 8.3 {219  WITH c(x) AS (VALUES('{x: -4.}')) SELECT x->>'x', json(x) FROM c;220} {-4.0 {{"x":-4.0}}}221do_execsql_test 8.3 {222  WITH c(x) AS (VALUES('{x: .5}')) SELECT x->>'x', json(x) FROM c;223} {0.5 {{"x":0.5}}}224do_execsql_test 8.4 {225  WITH c(x) AS (VALUES('{x: -.5}')) SELECT x->>'x', json(x) FROM c;226} {-0.5 {{"x":-0.5}}}227do_execsql_test 8.5 {228  WITH c(x) AS (VALUES('{x: +.5}')) SELECT x->>'x', json(x) FROM c;229} {0.5 {{"x":0.5}}}230do_execsql_test 8.6 {231  WITH c(x) AS (VALUES('{x: 4.e0}')) SELECT x->>'x', json(x) FROM c;232} {4.0 {{"x":4.0e0}}}233do_execsql_test 8.7 {234  WITH c(x) AS (VALUES('{x: +4.e1}')) SELECT x->>'x', json(x) FROM c;235} {40.0 {{"x":4.0e1}}}236do_execsql_test 8.8 {237  WITH c(x) AS (VALUES('{x: -4.e2}')) SELECT x->>'x', json(x) FROM c;238} {-400.0 {{"x":-4.0e2}}}239do_execsql_test 8.9 {240  WITH c(x) AS (VALUES('{x: .5e3}')) SELECT x->>'x', json(x) FROM c;241} {500.0 {{"x":0.5e3}}}242do_execsql_test 8.10 {243  WITH c(x) AS (VALUES('{x: -.5e-1}')) SELECT x->>'x', json(x) FROM c;244} {-0.05 {{"x":-0.5e-1}}}245do_execsql_test 8.11 {246  WITH c(x) AS (VALUES('{x: +.5e-2}')) SELECT x->>'x', json(x) FROM c;247} {0.005 {{"x":0.5e-2}}}248 249 250###############################################################################251#    9) Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.252 253do_execsql_test 9.1 {254  WITH c(x) AS (VALUES('{x: +Infinity}')) SELECT x->>'x', json(x) FROM c;255} {Inf {{"x":9e999}}}256do_execsql_test 9.2 {257  WITH c(x) AS (VALUES('{x: -Infinity}')) SELECT x->>'x', json(x) FROM c;258} {-Inf {{"x":-9e999}}}259do_execsql_test 9.3 {260  WITH c(x) AS (VALUES('{x: Infinity}')) SELECT x->>'x', json(x) FROM c;261} {Inf {{"x":9e999}}}262do_execsql_test 9.4 {263  WITH c(x) AS (VALUES('{x: NaN}')) SELECT x->>'x', json(x) FROM c;264} {{} {{"x":null}}}265 266###############################################################################267#   10) Numbers may begin with an explicit plus sign.268 269do_execsql_test 10.1 {270  SELECT '{a: +123}'->'a';271} 123272 273###############################################################################274#   11) Single and multi-line comments are allowed.275 276do_execsql_test 11.1 {277  SELECT ' /* abc */ { /*def*/ aaa /* xyz */ : // to the end of line278          123 /* xyz */ , /* 123 */ }'->>'aaa';279} 123280 281###############################################################################282#   12) Additional white space characters are allowed.283 284do_execsql_test 12.1 {285  SELECT (char(0x09,0x0a,0x0b,0x0c,0x0d,0x20,0xa0,0x2028,0x2029)286          || '{a: "xyz"}')->>'a';287} xyz288do_execsql_test 12.2 {289  SELECT ('{a:' || char(0x09,0x0a,0x0b,0x0c,0x0d,0x20,0xa0,0x2028,0x2029)290          || '"xyz"}')->>'a';291} xyz292do_execsql_test 12.3 {293  SELECT (char(0x1680,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,294               0x2006,0x2007,0x2008,0x2009,0x200a,0x3000,0xfeff)295          || '{a: "xyz"}')->>'a';296} xyz297do_execsql_test 12.4 {298  SELECT ('{a: ' ||char(0x1680,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,299                        0x2006,0x2007,0x2008,0x2009,0x200a,0x3000,0xfeff)300          || ' "xyz"}')->>'a';301} xyz302 303# 2023-11-08 forum/forumpost/ddcad3e884304#305do_execsql_test 13.1 {306  SELECT json('{x:''a "b" c''}');307} {{{"x":"a \"b\" c"}}}308 309# 2024-01-31310# Allow control characters within JSON5 string literals.311#312for {set c 1} {$c<=0x1f} {incr c} {313  do_execsql_test 14.$c.1 {314    SELECT json_valid('"abc' || char($c) || 'xyz"');315  } {0}316  do_execsql_test 14.$c.2 {317    SELECT json_valid('"abc' || char($c) || 'xyz"', 2);318  } {1}319  switch $c {320    8   {set e "\\b"}321    9   {set e "\\t"}322    10  {set e "\\n"}323    12  {set e "\\f"}324    13  {set e "\\r"}325    default {set e [format "\\u00%02x" $c]}326  }327  do_execsql_test 14.$c.3 {328    SELECT json('{label:"abc' || char($c) || 'xyz"}');329  } "{{\"label\":\"abc${e}xyz\"}}"330  do_execsql_test 14.$c.4 {331    SELECT jsonb('{label:"abc' || char($c) || 'xyz"}') -> '$';332  } "{{\"label\":\"abc${e}xyz\"}}"333}334 335 336finish_test337