1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

New test cases for QRF

FossilOrigin-Name: e49c63e31888c6787ab13f736d58ff985a24c3f98b475e05c30e8b244afffb80
This commit is contained in:
drh
2025-12-02 18:37:49 +00:00
parent 8df04c3f41
commit a0a63a0408
7 changed files with 651 additions and 17 deletions

View File

@@ -537,13 +537,20 @@ static int qrfIsVt100(const unsigned char *z){
/*
** Return the length of a string in display characters.
** Multibyte UTF8 characters count as a single character
** for single-width characters, or as two characters for
** double-width characters.
**
** Most characters of the input string count as 1, including
** multi-byte UTF8 characters. However, zero-width unicode
** characters and VT100 escape sequences count as zero, and
** double-width characters count as two.
**
** The definition of "zero-width" and "double-width" characters
** is not precise. It depends on the output device, to some extent,
** and it varies according to the Unicode version. This routine
** makes the best guess that it can.
*/
static int qrfDisplayLength(const char *zIn){
size_t sqlite3_qrf_wcswidth(const char *zIn){
const unsigned char *z = (const unsigned char*)zIn;
int n = 0;
size_t n = 0;
while( *z ){
if( z[0]<' ' ){
int k;
@@ -2198,7 +2205,7 @@ static void qrfExplain(Qrf *p){
int len;
if( i==nArg-1 ) w = 0;
if( zVal==0 ) zVal = "";
len = qrfDisplayLength(zVal);
len = (int)sqlite3_qrf_wcswidth(zVal);
if( len>w ){
w = len;
zSep = " ";
@@ -2388,7 +2395,7 @@ static void qrfOneSimpleRow(Qrf *p){
int sz;
p->u.sLine.azCol[i] = sqlite3_column_name(p->pStmt, i);
if( p->u.sLine.azCol[i]==0 ) p->u.sLine.azCol[i] = "unknown";
sz = qrfDisplayLength(p->u.sLine.azCol[i]);
sz = (int)sqlite3_qrf_wcswidth(p->u.sLine.azCol[i]);
if( sz > p->u.sLine.mxColWth ) p->u.sLine.mxColWth = sz;
}
}

View File

@@ -176,13 +176,21 @@ int sqlite3_format_query_result(
** character c. For normal characters, the answer is always 1. But the
** estimate might be 0 or 2 for zero-width and double-width characters.
**
** Different display devices display unicode using different widths. So
** Different devices display unicode using different widths. So
** it is impossible to know that true display width with 100% accuracy.
** Inaccuracies in the width estimates might cause columns to be misaligned.
** Unfortunately, there is nothing we can do about that.
*/
int sqlite3_qrf_wcwidth(int c);
/*
** Return an estimate of the number of display columns used by the
** string in the argument. The width of individual characters is
** determined as for sqlite3_qrf_wcwidth(). VT100 escape code sequences
** are assigned a width of zero.
*/
size_t sqlite3_qrf_wcswidth(const char*);
#ifdef __cplusplus
}

View File

@@ -1,5 +1,5 @@
C Fix\sa\sharmless\scompiler\swarning\sin\sthe\sprevious\scheck-in.
D 2025-12-02T15:01:29.826
C New\stest\scases\sfor\sQRF
D 2025-12-02T18:37:49.618
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -418,8 +418,8 @@ F ext/misc/zipfile.c 09e6e3a3ff40a99677de3c0bc6569bd5f4709b1844ac3d1c1452a456c5a
F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee
F ext/qrf/README.md 86fc5c3c5e3eddbe54fc1235cbdc52b8c2c0732791d224345c3014cd45c4c0e7
F ext/qrf/dev-notes.md e68a6d91ce4c7eb296ef2daadc2bb79c95c317ad15b9fafe40850c67b29c2430
F ext/qrf/qrf.c 425d02cffcc5b5fe9ff5817794bf751b1fdd6912f570c354272429ce1262b866
F ext/qrf/qrf.h 322d48537a5aa39c206c2ec0764a7938ea7662a8c25be1c4e9d742789609ba1e
F ext/qrf/qrf.c c50368ea2be3ab67bd6698d8b34bf70210d3fbf6b3659ed328543e5ec8d69eff
F ext/qrf/qrf.h 2cd7bd43579c522d3ae5c16034c7fdf41085684189811ae8e18ebc932a1cc79f
F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8
F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255
F ext/rbu/rbu10.test 7c22caa32c2ff26983ca8320779a31495a6555737684af7aba3daaf762ef3363
@@ -745,7 +745,7 @@ F src/sqliteInt.h a89c3a9296928dffcb4c287df176a739f9cf620c7c9d33aec59e8efb9b39cb
F src/sqliteLimit.h 0a5516b4ec192a205c541e05f67009028a9451dc6678aae4cf8e68596903c246
F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
F src/tclsqlite.c ec2ad3fbf5390c3d4307bc9d1f2a37a9c5d726b5309769dc770ab37f6812152d
F src/tclsqlite.c 4b6f6b142b951a8a127e0cbd2e37284fc71f8e6a391ec8c6188fb831b51ec0b8
F src/tclsqlite.h 614b3780a62522bc9f8f2b9fb22689e8009958e7aa77e572d0f3149050af348a
F src/test1.c 0e71fbcb484a271564e98e0158192c28c24f5521594218c3ba48bcb4cf634f91
F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
@@ -1515,6 +1515,8 @@ F test/qrf01.test 48c86e90f606739e67b73937babb662ef0edf1ede06954489c588815fa17b5
F test/qrf02.test 39b4afdc000bedccdafc0aecf17638df67a67aaa2d2942865ae6abcc48ba0e92
F test/qrf03.test ad7fa339fb46b26b08625f3a77a4827bdee9f0dad402d8ddc1fcb8f05aa64a54
F test/qrf04.test 0894692c998d2401dcc33449c02051b503ecce0c94217be54fb007c82d2d1379
F test/qrf05.test 8ade5bfa7ef0b448e531687203fa8ae9ef41f1d7e4c11d5ba0c4846af75b13d5
F test/qrf06.test 60ee6a77955a28ff7ab4e418ea71ca7ab8d24d993783a46ec0f7f4223174fabd
F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
F test/quickcheck.test a4b7e878cd97e46108291c409b0bf8214f29e18fddd68a42bc5c1375ad1fb80a
@@ -2181,8 +2183,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P c872bd1ee7b219e055f40e43766e4ed6bc2d2ca8cb92577cd3560f4173b1f257
R c46cfff780eeed3878512057a17d323b
P 601c40a1d9e1bcd9c453210c275001543d1533af25b4ccf399d5ef4ea1328950
R db3be16f518798aa64811be276402ae9
U drh
Z 089d78bdb228ed07162c6c905e40e2c9
Z c58c2647d0ec0d77cab1c57aa88aaed0
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
601c40a1d9e1bcd9c453210c275001543d1533af25b4ccf399d5ef4ea1328950
e49c63e31888c6787ab13f736d58ff985a24c3f98b475e05c30e8b244afffb80

View File

@@ -2361,6 +2361,10 @@ static int dbQrf(SqliteDb *pDb, int objc, Tcl_Obj *const*objv){
}else if( strcmp(zArg,"-null")==0 ){
qrf.zNull = Tcl_GetString(objv[i+1]);
i++;
}else if( strcmp(zArg,"-version")==0 ){
/* Undocumented. Testing use only */
qrf.iVersion = atoi(Tcl_GetString(objv[i+1]));
i++;
}else{
Tcl_AppendResult(pDb->interp, "unknown option: ", zArg, (char*)0);
rc = TCL_ERROR;

37
test/qrf05.test Normal file
View File

@@ -0,0 +1,37 @@
# 2025-12-02
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
# Test cases for the Query Result Formatter (QRF)
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix qrf05
do_execsql_test 1.0 {
CREATE TABLE t1(a INT NOT NULL);
}
do_test 1.1 {
set rc [catch {db format -style list \
{INSERT INTO t1 VALUES(123) RETURNING *}} msg]
list $rc [string trim $msg]
} {0 123}
do_test 1.2 {
set rc [catch {db format -style list \
{INSERT INTO t1 VALUES(NULL) RETURNING *}} msg]
list $rc [string trim $msg]
} {1 {NOT NULL constraint failed: t1.a}}
do_test 1.3 {
set rc [catch {db format -version 99 {SELECT * FROM t1}} msg]
list $rc [string trim $msg]
} {1 {unusable sqlite3_qrf_spec.iVersion (99)}}
finish_test

576
test/qrf06.test Normal file
View File

@@ -0,0 +1,576 @@
# 2025-12-02
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
# Test cases for the Query Result Formatter (QRF), and especially
# the sqlite3_qrf_wcwidth() function and its utilization.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix qrf06
# Data
db eval {
BEGIN TRANSACTION;
CREATE TABLE language(name TEXT);
INSERT INTO language(name) VALUES
('العربية'),
('Deutsch'),
('English'),
('Español'),
('فارسی'),
('Français'),
('Italiano'),
('مصرى'),
('Nederlands'),
('日本語'),
('Polski'),
('Português'),
('Sinugboanong Binisaya'),
('Svenska'),
('Українська'),
('Tiếng Việt'),
('Winaray'),
('中文'),
('Русский'),
('Afrikaans'),
('Shqip'),
('Asturianu'),
('Azərbaycanca'),
('Български'),
('閩南語 / Bân-lâm-gú'),
('বাংলা'),
('Беларуская'),
('Català'),
('Čeština'),
('Cymraeg'),
('Dansk'),
('Eesti'),
('Ελληνικά'),
('Esperanto'),
('Euskara'),
('Galego'),
('한국어'),
('Հայերեն'),
('हिन्दी'),
('Hrvatski'),
('Bahasa Indonesia'),
('עברית'),
('ქართული'),
('Ladin'),
('Latina'),
('Latviešu'),
('Lietuvių'),
('Magyar'),
('Македонски'),
('Malagasy'),
('मराठी'),
('Bahasa Melayu'),
('Bahaso Minangkabau'),
('မြန်မာဘာသာ'),
('Norskbokmålnynorsk'),
('Нохчийн'),
('Oʻzbekcha / Ўзбекча'),
('Қазақша / Qazaqşa / قازاقشا'),
('Română'),
('Simple English'),
('Slovenčina'),
('Slovenščina'),
('Српски / Srpski'),
('Srpskohrvatski / Српскохрватски'),
('Suomi'),
('Kiswahili'),
('தமிழ்'),
('Татарча / Tatarça'),
('తెలుగు'),
('ภาษาไทย'),
('Тоҷикӣ'),
('تۆرکجه'),
('Türkçe'),
('اردو'),
('粵語'),
('Bahsa Acèh'),
('Alemannisch'),
('አማርኛ'),
('Aragonés'),
('Արեւմտահայերէն'),
('Bahasa Hulontalo'),
('Basa Bali'),
('Bahasa Banjar'),
('Basa Banyumasan'),
('Башҡортса'),
('Беларуская (тарашкевіца)'),
('Bikol Central'),
('বিষ্ণুপ্রিয়া মণিপুরী'),
('Boarisch'),
('Bosanski'),
('Brezhoneg'),
('Чӑвашла'),
('Dagbanli'),
('الدارجة'),
('Diné Bizaad'),
('Emigliàn–Rumagnòl'),
('Fiji Hindi'),
('Føroyskt'),
('Frysk'),
('Fulfulde'),
('Gaeilge'),
('Gàidhlig'),
('گیلکی'),
('ગુજરાતી'),
('Hak-kâ-ngî / 客家語'),
('Hausa'),
('Hornjoserbsce'),
('Ido'),
('Igbo'),
('Ilokano'),
('Interlingua'),
('Interlingue'),
('Ирон'),
('Íslenska'),
('Jawa'),
('ಕನ್ನಡ'),
('Kapampangan'),
('ភាសាខ្មែរ'),
('Kotava'),
('Kreyòl Ayisyen'),
('Kurdî / كوردی'),
('کوردیی ناوەندی'),
('Кыргызча'),
('Кырык мары'),
('Lëtzebuergesch'),
('Lìgure'),
('Limburgs'),
('Lombard'),
('मैथिली'),
('മലയാളം'),
('მარგალური'),
('مازِرونی'),
('Mìng-dĕ̤ng-ngṳ̄ / 閩東語'),
('Монгол'),
('Napulitano'),
('नेपाल भाषा'),
('Nordfriisk'),
('Occitan'),
('Олык марий'),
('ଓଡି଼ଆ'),
('অসমীযা়'),
('ਪੰਜਾਬੀ'),
('پنجابی (شاہ مکھی)'),
('پښتو'),
('Piemontèis'),
('Plattdüütsch'),
('Qaraqalpaqsha'),
('Qırımtatarca'),
('Runa Simi'),
('Русиньскый'),
('संस्कृतम्'),
('ᱥᱟᱱᱛᱟᱲᱤ'),
('سرائیکی'),
('Саха Тыла'),
('Scots'),
('ChiShona'),
('Sicilianu'),
('සිංහල'),
('سنڌي'),
('Ślůnski'),
('Basa Sunda'),
('Taclḥit'),
('Tagalog'),
('ၽႃႇသႃႇတႆး'),
('ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ'),
('tolışi'),
('chiTumbuka'),
('Basa Ugi'),
('Vèneto'),
('Volapük'),
('Walon'),
('文言'),
('吴语'),
('ייִדיש'),
('Yorùbá'),
('Zazaki'),
('žemaitėška'),
('isiZulu'),
('नेपाली'),
('ꯃꯤꯇꯩ ꯂꯣꯟ'),
('Dzhudezmo / לאדינו'),
('Адыгэбзэ'),
('Ænglisc'),
('Anarâškielâ'),
('अंगिका'),
('Аԥсшәа'),
('armãneashti'),
('Arpitan'),
('atikamekw'),
('ܐܬܘܪܝܐ'),
('Avañe’ẽ'),
('Авар'),
('Aymar'),
('Batak Toba'),
('Betawi'),
('भोजपुरी'),
('Bislama'),
('བོད་ཡིག'),
('Буряад'),
('Chavacano de Zamboanga'),
('Chichewa'),
('Corsu'),
('Vahcuengh / 話僮'),
('Dagaare'),
('Davvisámegiella'),
('Deitsch'),
('ދިވެހިބަސް'),
('Dolnoserbski'),
('Dusun Bundu-liwan'),
('Эрзянь'),
('Estremeñu'),
('Eʋegbe'),
('Farefare'),
('Fɔ̀ngbè'),
('Furlan'),
('Gaelg'),
('Gagauz'),
('ГӀалгӀай'),
('Ghanaian Pidgin'),
('Gĩkũyũ'),
('赣语 / 贛語'),
('Gungbe'),
('Хальмг'),
('ʻŌlelo Hawaiʻi'),
('Ikinyarwanda'),
('Jaku Iban'),
('Kabɩyɛ'),
('Yerwa Kanuri'),
('Kaszëbsczi'),
('Kernewek'),
('Коми'),
('Перем коми'),
('Kongo'),
('कोंकणी / Konknni'),
('كٲشُر'),
('Kriyòl Gwiyannen'),
('Kumoring'),
('Kʋsaal'),
('ພາສາລາວ'),
('Лакку'),
('Latgaļu'),
('Лезги'),
('Li Niha'),
('Lingála'),
('Lingua Franca Nova'),
('livvinkarjala'),
('lojban'),
('Luganda'),
('Madhurâ'),
('Malti'),
('Mandailing'),
('Māori'),
('Mfantse'),
('Mirandés'),
('Мокшень'),
('ဘာသာ မန်'),
('Moore'),
('ߒߞߏ'),
('Na Vosa Vaka-Viti'),
('Nāhuatlahtōlli'),
('Naijá'),
('Nedersaksisch'),
('Nouormand / Normaund'),
('Novial'),
('Afaan Oromoo'),
('ပအိုဝ်ႏဘာႏသာႏ'),
('Pangasinán'),
('Pangcah'),
('Papiamentu'),
('Patois'),
('Pfälzisch'),
('Picard'),
('Къарачай–малкъар'),
('Ripoarisch'),
('Rumantsch'),
('Sakizaya'),
('Gagana Sāmoa'),
('Sardu'),
('Seediq'),
('Seeltersk'),
('Sesotho'),
('Sesotho sa Leboa'),
('Setswana'),
('ꠍꠤꠟꠐꠤ'),
('Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ'),
('Soomaaliga'),
('Sranantongo'),
('SiSwati'),
('Reo tahiti'),
('Taqbaylit'),
('Tarandíne'),
('Tayal'),
('Tetun'),
('Tok Pisin'),
('faka Tonga'),
('Türkmençe'),
('Twi'),
('Tyap'),
('Тыва дыл'),
('Удмурт'),
('ئۇيغۇرچه'),
('Vepsän'),
('võro'),
('West-Vlams'),
('Wolof'),
('isiXhosa'),
('Zeêuws'),
('алтай тил'),
('अवधी'),
('डोटेली'),
('ತುಳು'),
('ရခိုင်'),
('Bajau Sama'),
('Bamanankan'),
('Chamoru'),
('རྫོང་ཁ'),
('𐌲𐌿𐍄𐌹𐍃𐌺'),
('Igala'),
('ᐃᓄᒃᑎᑐᑦ / Inuktitut'),
('Iñupiak'),
('isiNdebele seSewula'),
('Kalaallisut'),
('Nupe'),
('Obolo'),
('पालि'),
('pinayuanan'),
('Ποντιακά'),
('romani čhib'),
('Ikirundi'),
('руски'),
('Sängö'),
('ᥖᥭᥰᥖᥬᥳᥑᥨᥒᥰ'),
('ትግርኛ'),
('Thuɔŋjäŋ'),
('ᏣᎳᎩ'),
('Tsėhesenėstsestotse'),
('Xitsonga'),
('Tshivenḓa'),
('Wayuunaiki'),
('адыгабзэ');
COMMIT;
}
do_test 1.2 {
set res \n[db format -style box {
SELECT name, rowid AS id FROM language
WHERE length(name)=2
ORDER BY name
}]
set exp {
┌──────┬─────┐
│ name │ id │
├──────┼─────┤
│ 中文 │ 18 │
│ 吴语 │ 173 │
│ 文言 │ 172 │
│ 粵語 │ 75 │
└──────┴─────┘
}
if {$res ne $exp} {
puts [list $res]
puts [list $exp]
}
string compare $res $exp
} {0}
do_test 1.3 {
set res \n[db format -style box {
SELECT name, rowid AS id FROM language
WHERE length(name)=3
ORDER BY name
}]
set exp {
┌────────┬─────┐
│ name │ id │
├────────┼─────┤
│ Ido │ 108 │
│ Twi │ 297 │
│ ߒߞߏ │ 258 │
│ ᏣᎳᎩ │ 335 │
│ 日本語 │ 10 │
│ 한국어 │ 37 │
└────────┴─────┘
}
if {$res ne $exp} {
puts [list $res]
puts [list $exp]
}
string compare $res $exp
} {0}
do_test 1.4 {
set res \n[db format -style box {
SELECT name, rowid AS id FROM language
WHERE length(name)=4
ORDER BY name
}]
set exp {
┌──────┬─────┐
│ name │ id │
├──────┼─────┤
│ Igbo │ 109 │
│ Jawa │ 115 │
│ Nupe │ 323 │
│ Tyap │ 298 │
│ võro │ 303 │
│ Авар │ 192 │
│ Ирон │ 113 │
│ Коми │ 231 │
│ اردو │ 74 │
│ سنڌي │ 159 │
│ مصرى │ 8 │
│ پښتو │ 144 │
│ अवधी │ 309 │
│ पालि │ 325 │
│ ತುಳು │ 311 │
│ ትግርኛ │ 333 │
│ አማርኛ │ 78 │
└──────┴─────┘
}
if {$res ne $exp} {
puts [list $res]
puts [list $exp]
}
string compare $res $exp
} {0}
do_test 1.5 {
set res \n[db format -style box {
SELECT name, rowid AS id FROM language
WHERE length(name)=5
ORDER BY name
}]
set exp {
┌───────┬─────┐
│ name │ id │
├───────┼─────┤
│ Aymar │ 193 │
│ Corsu │ 202 │
│ Dansk │ 31 │
│ Eesti │ 32 │
│ Frysk │ 99 │
│ Gaelg │ 216 │
│ Hausa │ 106 │
│ Igala │ 318 │
│ Kongo │ 233 │
│ Ladin │ 44 │
│ Malti │ 250 │
│ Moore │ 257 │
│ Māori │ 252 │
│ Naijá │ 261 │
│ Obolo │ 324 │
│ Sardu │ 278 │
│ Scots │ 155 │
│ Shqip │ 21 │
│ Suomi │ 65 │
│ Sängö │ 331 │
│ Tayal │ 292 │
│ Tetun │ 293 │
│ Walon │ 171 │
│ Wolof │ 305 │
│ Лакку │ 240 │
│ Лезги │ 242 │
│ руски │ 330 │
│ עברית │ 42 │
│ فارسی │ 5 │
│ كٲشُر │ 235 │
│ گیلکی │ 103 │
│ मराठी │ 51 │
│ বাংলা │ 26 │
│ ଓଡି଼ଆ │ 140 │
│ தமிழ் │ 67 │
│ ಕನ್ನಡ │ 116 │
│ සිංහල │ 158 │
│ ꠍꠤꠟꠐꠤ │ 284 │
└───────┴─────┘
}
if {$res ne $exp} {
puts [list $res]
puts [list $exp]
}
string compare $res $exp
} {0}
do_test 1.6 {
set res \n[db format -style box {
SELECT name, rowid AS id FROM language
WHERE length(name)=6
ORDER BY name
}]
set exp {
┌────────┬─────┐
│ name │ id │
├────────┼─────┤
│ Betawi │ 195 │
│ Català │ 28 │
│ Eʋegbe │ 212 │
│ Furlan │ 215 │
│ Gagauz │ 217 │
│ Galego │ 36 │
│ Gungbe │ 222 │
│ Gĩkũyũ │ 220 │
│ Kabɩyɛ │ 227 │
│ Kotava │ 119 │
│ Kʋsaal │ 238 │
│ Latina │ 45 │
│ Lìgure │ 126 │
│ Magyar │ 48 │
│ Novial │ 264 │
│ Patois │ 270 │
│ Picard │ 272 │
│ Polski │ 11 │
│ Română │ 59 │
│ Seediq │ 279 │
│ Türkçe │ 73 │
│ Vepsän │ 302 │
│ Vèneto │ 169 │
│ Yorùbá │ 175 │
│ Zazaki │ 176 │
│ Zeêuws │ 307 │
│ lojban │ 247 │
│ tolışi │ 166 │
│ Аԥсшәа │ 186 │
│ Буряад │ 199 │
│ Монгол │ 134 │
│ Тоҷикӣ │ 71 │
│ Удмурт │ 300 │
│ Хальмг │ 223 │
│ Эрзянь │ 210 │
│ ייִדיש │ 174 │
│ تۆرکجه │ 72 │
│ ܐܬܘܪܝܐ │ 190 │
│ अंगिका │ 185 │
│ डोटेली │ 310 │
│ नेपाली │ 179 │
│ मैथिली │ 129 │
│ हिन्दी │ 39 │
│ ਪੰਜਾਬੀ │ 142 │
│ తెలుగు │ 69 │
│ മലയാളം │ 130 │
│ རྫོང་ཁ │ 316 │
│ ရခိုင် │ 312 │
└────────┴─────┘
}
if {$res ne $exp} {
puts [list $res]
puts [list $exp]
}
string compare $res $exp
} {0}
finish_test