msgcat.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This file contains a collection of tests for the msgcat package.
  2. # Sourcing this file into Tcl runs the tests and
  3. # generates output for errors.  No output means no errors were found.
  4. #
  5. # Copyright (c) 1998 Mark Harrison.
  6. # Copyright (c) 1998-1999 by Scriptics Corporation.
  7. # Contributions from Don Porter, NIST, 2002.  (not subject to US copyright)
  8. #
  9. # See the file "license.terms" for information on usage and redistribution
  10. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11. #
  12. # Note that after running these tests, entries will be left behind in the
  13. # message catalogs for locales foo, foo_BAR, and foo_BAR_baz.
  14. #
  15. # RCS: @(#) $Id: msgcat.test,v 1.11.2.4 2006/09/11 16:15:12 andreas_kupries Exp $
  16. package require Tcl 8.2
  17. if {[catch {package require tcltest 2}]} {
  18.     puts stderr "Skipping tests in [info script].  tcltest 2 required."
  19.     return
  20. }
  21. if {[catch {package require msgcat 1.3.4}]} {
  22.     puts stderr "Skipping tests in [info script].  No msgcat 1.3.4 found to test."
  23.     return
  24. }
  25. namespace eval ::msgcat::test {
  26.     namespace import ::msgcat::*
  27.     namespace import ::tcltest::test
  28.     namespace import ::tcltest::cleanupTests
  29.     namespace import ::tcltest::temporaryDirectory
  30.     namespace import ::tcltest::make*
  31.     namespace import ::tcltest::remove*
  32.     # Tests msgcat-0.*: locale initialization
  33.     proc PowerSet {l} {
  34. if {[llength $l] == 0} {return [list [list]]}
  35. set element [lindex $l 0]
  36. set rest [lrange $l 1 end]
  37. set result [list]
  38. foreach x [PowerSet $rest] {
  39.     lappend result [linsert $x 0 $element]
  40.     lappend result $x
  41. }
  42. return $result
  43.     }
  44.     variable envVars {LC_ALL LC_MESSAGES LANG}
  45.     variable count 0
  46.     variable body
  47.     variable result
  48.     variable setVars
  49.     foreach setVars [PowerSet $envVars] { 
  50. set result [string tolower [lindex $setVars 0]]
  51. if {[string length $result] == 0} {
  52.     if {[info exists ::tcl::mac::locale]} {
  53. set result [string tolower $::tcl::mac::locale]
  54.     } else {
  55. set result c
  56.     }
  57. }
  58. test msgcat-0.$count [list 
  59.     locale initialization from environment variables $setVars 
  60. ] -setup {
  61.     variable var
  62.     foreach var $envVars {
  63. catch {variable $var $::env($var)}
  64. catch {unset ::env($var)}
  65.     }
  66.     foreach var $setVars {
  67. set ::env($var) $var
  68.     }
  69.     interp create [namespace current]::i
  70.     i eval [list package ifneeded msgcat [package provide msgcat] 
  71.     [package ifneeded msgcat [package provide msgcat]]]
  72.     i eval package require msgcat
  73. } -cleanup {
  74.     interp delete [namespace current]::i
  75.     foreach var $envVars {
  76. catch {unset ::env($var)}
  77. catch {set ::env($var) [set [namespace current]::$var]}
  78.     }
  79. } -body {i eval msgcat::mclocale} -result $result
  80. incr count
  81.     }
  82.     catch {unset result}
  83.     
  84.     # Could add tests of initialization from Windows registry here.
  85.     # Use a fake registry package.
  86.     # Tests msgcat-1.*: [mclocale], [mcpreferences]
  87.     test msgcat-1.3 {mclocale set, single element} -setup {
  88. variable locale [mclocale]
  89.     } -cleanup {
  90. mclocale $locale
  91.     } -body {
  92. mclocale en
  93.     } -result en
  94.     test msgcat-1.4 {mclocale get, single element} -setup {
  95. variable locale [mclocale]
  96. mclocale en
  97.     } -cleanup {
  98. mclocale $locale
  99.     } -body {
  100. mclocale
  101.     } -result en
  102.     test msgcat-1.5 {mcpreferences, single element} -setup {
  103. variable locale [mclocale]
  104. mclocale en
  105.     } -cleanup {
  106. mclocale $locale
  107.     } -body {
  108. mcpreferences
  109.     } -result en
  110.     test msgcat-1.6 {mclocale set, two elements} -setup {
  111. variable locale [mclocale]
  112.     } -cleanup {
  113. mclocale $locale
  114.     } -body {
  115. mclocale en_US
  116.     } -result en_us
  117.     test msgcat-1.7 {mclocale get, two elements} -setup {
  118. variable locale [mclocale]
  119. mclocale en_US
  120.     } -cleanup {
  121. mclocale $locale
  122.     } -body {
  123. mclocale
  124.     } -result en_us
  125.     test msgcat-1.8 {mcpreferences, two elements} -setup {
  126. variable locale [mclocale]
  127. mclocale en_US
  128.     } -cleanup {
  129. mclocale $locale
  130.     } -body {
  131. mcpreferences
  132.     } -result {en_us en}
  133.     test msgcat-1.9 {mclocale set, three elements} -setup {
  134. variable locale [mclocale]
  135.     } -cleanup {
  136. mclocale $locale
  137.     } -body {
  138. mclocale en_US_funky
  139.     } -result en_us_funky
  140.     test msgcat-1.10 {mclocale get, three elements} -setup {
  141. variable locale [mclocale]
  142. mclocale en_US_funky
  143.     } -cleanup {
  144. mclocale $locale
  145.     } -body {
  146. mclocale
  147.     } -result en_us_funky
  148.     test msgcat-1.11 {mcpreferences, three elements} -setup {
  149. variable locale [mclocale]
  150. mclocale en_US_funky
  151.     } -cleanup {
  152. mclocale $locale
  153.     } -body {
  154. mcpreferences
  155.     } -result {en_us_funky en_us en}
  156.     test msgcat-1.12 {mclocale set, reject evil input} -setup {
  157. variable locale [mclocale]
  158.     } -cleanup {
  159. mclocale $locale
  160.     } -body {
  161. mclocale /path/to/evil/code
  162.     } -returnCodes error -match glob -result {invalid newLocale value *}
  163.     test msgcat-1.13 {mclocale set, reject evil input} -setup {
  164. variable locale [mclocale]
  165.     } -cleanup {
  166. mclocale $locale
  167.     } -body {
  168. mclocale looks/ok/../../../../but/is/path/to/evil/code
  169.     } -returnCodes error -match glob -result {invalid newLocale value *}
  170.     # Tests msgcat-2.*: [mcset], [mcmset], namespace partitioning
  171.     test msgcat-2.1 {mcset, global scope} {
  172. namespace eval :: ::msgcat::mcset  foo_BAR text1 text2
  173.     } {text2}
  174.     test msgcat-2.2 {mcset, global scope, default} {
  175. namespace eval :: ::msgcat::mcset foo_BAR text3
  176.     } {text3}
  177.     test msgcat-2.2.1 {mcset, namespace overlap} {
  178. namespace eval baz {::msgcat::mcset  foo_BAR con1 con1baz}
  179.     } {con1baz}
  180.     test msgcat-2.3 {mcset, namespace overlap} -setup {
  181. namespace eval bar {::msgcat::mcset  foo_BAR con1 con1bar}
  182. namespace eval baz {::msgcat::mcset  foo_BAR con1 con1baz}
  183. variable locale [mclocale]
  184. mclocale foo_BAR
  185.     } -cleanup {
  186. mclocale $locale
  187.     } -body {
  188. namespace eval bar {::msgcat::mc con1}
  189.     } -result con1bar
  190.     test msgcat-2.4 {mcset, namespace overlap} -setup {
  191. namespace eval bar {::msgcat::mcset  foo_BAR con1 con1bar}
  192. namespace eval baz {::msgcat::mcset  foo_BAR con1 con1baz}
  193. variable locale [mclocale]
  194. mclocale foo_BAR
  195.     } -cleanup {
  196. mclocale $locale
  197.     } -body {
  198. namespace eval baz {::msgcat::mc con1}
  199.     } -result con1baz
  200.     test msgcat-2.5 {mcmset, global scope} -setup {
  201. namespace eval :: {
  202.     ::msgcat::mcmset  foo_BAR {
  203.         src1 trans1
  204.         src2 trans2
  205.     }
  206. }
  207. variable locale [mclocale]
  208. mclocale foo_BAR
  209.     } -cleanup {
  210. mclocale $locale
  211.     } -body {
  212. namespace eval :: {
  213.     ::msgcat::mc src1
  214. }
  215.     } -result trans1
  216.     test msgcat-2.6 {mcmset, namespace overlap} -setup {
  217. namespace eval bar {::msgcat::mcmset  foo_BAR {con2 con2bar}}
  218. namespace eval baz {::msgcat::mcmset  foo_BAR {con2 con2baz}}
  219. variable locale [mclocale]
  220. mclocale foo_BAR
  221.     } -cleanup {
  222. mclocale $locale
  223.     } -body {
  224. namespace eval bar {::msgcat::mc con2}
  225.     } -result con2bar
  226.     test msgcat-2.7 {mcmset, namespace overlap} -setup {
  227. namespace eval bar {::msgcat::mcmset  foo_BAR {con2 con2bar}}
  228. namespace eval baz {::msgcat::mcmset  foo_BAR {con2 con2baz}}
  229. variable locale [mclocale]
  230. mclocale foo_BAR
  231.     } -cleanup {
  232. mclocale $locale
  233.     } -body {
  234. namespace eval baz {::msgcat::mc con2}
  235.     } -result con2baz
  236.     # Tests msgcat-3.*: [mcset], [mc], catalog "inheritance"
  237.     #
  238.     # Test mcset and mc, ensuring that more specific locales
  239.     # (e.g. en_UK) will search less specific locales
  240.     # (e.g. en) for translation strings.
  241.     #
  242.     # Do this for the 12 permutations of
  243.     #     locales: {foo foo_BAR foo_BAR_baz}
  244.     #     strings: {ov1 ov2 ov3 ov4}
  245.     #     locale foo         defines ov1, ov2, ov3
  246.     #     locale foo_BAR     defines      ov2, ov3
  247.     #     locale foo_BAR_BAZ defines           ov3
  248.     #     (ov4 is defined in none)
  249.     # So,
  250.     #     ov3 should be resolved in foo, foo_BAR, foo_BAR_baz
  251.     #     ov2 should be resolved in foo, foo_BAR
  252.     #     ov2 should resolve to foo_BAR in foo_BAR_baz
  253.     #     ov1 should be resolved in foo
  254.     #     ov1 should resolve to foo in foo_BAR, foo_BAR_baz
  255.     #     ov4 should be resolved in none, and call mcunknown
  256.     #
  257.     variable count 2
  258.     variable result
  259.     array set result {
  260. foo,ov1 ov1_foo foo,ov2 ov2_foo foo,ov3 ov3_foo foo,ov4 ov4
  261. foo_BAR,ov1 ov1_foo foo_BAR,ov2 ov2_foo_BAR foo_BAR,ov3 ov3_foo_BAR
  262. foo_BAR,ov4 ov4 foo_BAR_baz,ov1 ov1_foo foo_BAR_baz,ov2 ov2_foo_BAR
  263. foo_BAR_baz,ov3 ov3_foo_BAR_baz foo_BAR_baz,ov4 ov4
  264.     }
  265.     variable loc
  266.     variable string
  267.     foreach loc {foo foo_BAR foo_BAR_baz} {
  268. foreach string {ov1 ov2 ov3 ov4} {
  269.     test msgcat-3.$count {mcset, overlap} -setup {
  270. mcset foo ov1 ov1_foo
  271. mcset foo ov2 ov2_foo
  272. mcset foo ov3 ov3_foo
  273. mcset foo_BAR ov2 ov2_foo_BAR
  274. mcset foo_BAR ov3 ov3_foo_BAR
  275. mcset foo_BAR_baz ov3 ov3_foo_BAR_baz
  276. variable locale [mclocale]
  277. mclocale $loc
  278.     } -cleanup {
  279. mclocale $locale
  280.     } -body {
  281. mc $string
  282.     } -result $result($loc,$string)
  283.     incr count
  284. }
  285.     }
  286.     catch {unset result}
  287.     # Tests msgcat-4.*: [mcunknown]
  288.     test msgcat-4.2 {mcunknown, default} -setup {
  289. mcset foo unk1 "unknown 1"
  290. variable locale [mclocale]
  291. mclocale foo
  292.     } -cleanup {
  293. mclocale $locale
  294.     } -body {
  295. mc unk1
  296.     } -result {unknown 1}
  297.     test msgcat-4.3 {mcunknown, default} -setup {
  298. mcset foo unk1 "unknown 1"
  299. variable locale [mclocale]
  300. mclocale foo
  301.     } -cleanup {
  302. mclocale $locale
  303.     } -body {
  304. mc unk2
  305.     } -result unk2
  306.     test msgcat-4.4 {mcunknown, overridden} -setup {
  307. rename ::msgcat::mcunknown SavedMcunknown
  308. proc ::msgcat::mcunknown {dom s} {
  309.             return unknown:$dom:$s
  310. }
  311. mcset foo unk1 "unknown 1"
  312. variable locale [mclocale]
  313. mclocale foo
  314.     } -cleanup {
  315. mclocale $locale
  316. rename ::msgcat::mcunknown {}
  317. rename SavedMcunknown ::msgcat::mcunknown
  318.     } -body {
  319. mc unk1
  320.     } -result {unknown 1}
  321.     test msgcat-4.5 {mcunknown, overridden} -setup {
  322. rename ::msgcat::mcunknown SavedMcunknown
  323. proc ::msgcat::mcunknown {dom s} {
  324.             return unknown:$dom:$s
  325. }
  326. mcset foo unk1 "unknown 1"
  327. variable locale [mclocale]
  328. mclocale foo
  329.     } -cleanup {
  330. mclocale $locale
  331. rename ::msgcat::mcunknown {}
  332. rename SavedMcunknown ::msgcat::mcunknown
  333.     } -body {
  334. mc unk2
  335.     } -result {unknown:foo:unk2}
  336.     test msgcat-4.6 {mcunknown, uplevel context} -setup {
  337. rename ::msgcat::mcunknown SavedMcunknown
  338. proc ::msgcat::mcunknown {dom s} {
  339.             return "unknown:$dom:$s:[expr {[info level] - 1}]"
  340. }
  341. mcset foo unk1 "unknown 1"
  342. variable locale [mclocale]
  343. mclocale foo
  344.     } -cleanup {
  345. mclocale $locale
  346. rename ::msgcat::mcunknown {}
  347. rename SavedMcunknown ::msgcat::mcunknown
  348.     } -body {
  349. mc unk2
  350.     } -result unknown:foo:unk2:[info level]
  351.     # Tests msgcat-5.*: [mcload]
  352.     variable locales {foo foo_BAR foo_BAR_baz}
  353.     makeDirectory msgdir
  354.     foreach loc $locales {
  355. makeFile "::msgcat::mcset $loc abc abc-$loc" 
  356. [string tolower [file join msgdir $loc.msg]]
  357.     }
  358.     variable count 1
  359.     foreach loc {foo foo_BAR foo_BAR_baz} {
  360. test msgcat-5.$count {mcload} -setup {
  361.     variable locale [mclocale]
  362.     mclocale $loc
  363. } -cleanup {
  364.     mclocale $locale
  365. } -body {
  366.     mcload [file join [temporaryDirectory] msgdir]
  367. } -result $count
  368. incr count
  369.     }
  370.     # Even though foo_BAR_notexist does not exist,
  371.     # foo_BAR and foo should be loaded.
  372. test msgcat-5.4 {mcload} -setup {
  373.     variable locale [mclocale]
  374.     mclocale foo_BAR_notexist
  375. } -cleanup {
  376.     mclocale $locale
  377. } -body {
  378.     mcload [file join [temporaryDirectory] msgdir]
  379. } -result 2
  380. test msgcat-5.5 {mcload} -setup {
  381.     variable locale [mclocale]
  382.     mclocale no_FI_notexist
  383. } -cleanup {
  384.     mclocale $locale
  385. } -body {
  386.     mcload [file join [temporaryDirectory] msgdir]
  387. } -result 0
  388. test msgcat-5.6 {mcload} -setup {
  389.     variable locale [mclocale]
  390.     mclocale foo
  391. } -cleanup {
  392.     mclocale $locale
  393. } -body {
  394.     mc abc
  395. } -result abc-foo
  396. test msgcat-5.7 {mcload} -setup {
  397.     variable locale [mclocale]
  398.     mclocale foo_BAR
  399. } -cleanup {
  400.     mclocale $locale
  401. } -body {
  402.     mc abc
  403. } -result abc-foo_BAR
  404. test msgcat-5.8 {mcload} -setup {
  405.     variable locale [mclocale]
  406.     mclocale foo_BAR_baz
  407. } -cleanup {
  408.     mclocale $locale
  409. } -body {
  410.     mc abc
  411. } -result abc-foo_BAR_baz
  412. test msgcat-5.9 {mcload} -setup {
  413.     rename ::msgcat::mcunknown SavedMcunknown
  414.     proc ::msgcat::mcunknown {dom s} {
  415. return unknown:$dom:$s
  416.     }
  417.     variable locale [mclocale]
  418.     mclocale no_FI_notexist
  419. } -cleanup {
  420.     mclocale $locale
  421.     rename ::msgcat::mcunknown {}
  422.     rename SavedMcunknown ::msgcat::mcunknown
  423. } -body {
  424.     mc abc
  425. } -result unknown:no_fi_notexist:abc
  426.     foreach loc $locales {
  427. removeFile [string tolower [file join msgdir $loc.msg]]
  428.     }
  429.     removeDirectory msgdir
  430.     # Tests msgcat-6.*: [mcset], [mc] namespace inheritance
  431. #
  432. # Test mcset and mc, ensuring that resolution for messages
  433. # proceeds from the current ns to its parent and so on to the 
  434. # global ns.
  435. #
  436. # Do this for the 12 permutations of
  437. #     locales: foo
  438. #     namespaces: foo foo::bar foo::bar::baz
  439. #     strings: {ov1 ov2 ov3 ov4}
  440. #     namespace ::foo            defines ov1, ov2, ov3
  441. #     namespace ::foo::bar       defines      ov2, ov3
  442. #     namespace ::foo::bar::baz  defines           ov3
  443. #
  444. #     ov4 is not defined in any namespace.
  445. #
  446. # So,
  447. #     ov3 should be resolved in ::foo::bar::baz, ::foo::bar, ::foo;
  448. #     ov2 should be resolved in ::foo, ::foo::bar
  449. #     ov1 should be resolved in ::foo
  450. #     ov4 should be resolved in none, and call mcunknown
  451. #
  452.     variable result
  453.     array set result {
  454. foo,ov1 ov1_foo foo,ov2 ov2_foo foo,ov3 ov3_foo foo,ov4 ov4
  455. foo::bar,ov1 ov1_foo foo::bar,ov2 ov2_foo_bar
  456. foo::bar,ov3 ov3_foo_bar foo::bar,ov4 ov4 foo::bar::baz,ov1 ov1_foo
  457. foo::bar::baz,ov2 ov2_foo_bar foo::bar::baz,ov3 ov3_foo_bar_baz
  458. foo::bar::baz,ov4 ov4
  459.     }
  460.     variable count 1
  461.     variable ns
  462.     foreach ns {foo foo::bar foo::bar::baz} {
  463. foreach string {ov1 ov2 ov3 ov4} {
  464.     test msgcat-6.$count {mcset, overlap} -setup {
  465. namespace eval foo {
  466.     ::msgcat::mcset foo ov1 ov1_foo
  467.     ::msgcat::mcset foo ov2 ov2_foo
  468.     ::msgcat::mcset foo ov3 ov3_foo
  469.     namespace eval bar {
  470. ::msgcat::mcset foo ov2 ov2_foo_bar
  471. ::msgcat::mcset foo ov3 ov3_foo_bar
  472. namespace eval baz {
  473.     ::msgcat::mcset foo ov3 "ov3_foo_bar_baz"
  474. }
  475.     }
  476.     
  477. }
  478. variable locale [mclocale]
  479. mclocale foo
  480.     } -cleanup {
  481. mclocale $locale
  482. namespace delete foo
  483.     } -body {
  484. namespace eval $ns [list ::msgcat::mc $string]
  485.     } -result $result($ns,$string)
  486.     incr count
  487. }
  488.     }
  489.     # Tests msgcat-7.*: [mc] extra args processed by [format]
  490.     test msgcat-7.1 {mc extra args go through to format} -setup {
  491. mcset foo format1 "this is a test"
  492. mcset foo format2 "this is a %s"
  493. mcset foo format3 "this is a %s %s"
  494. variable locale [mclocale]
  495. mclocale foo
  496.     } -cleanup {
  497. mclocale $locale
  498.     } -body {
  499. mc format1 "good test"
  500.     } -result "this is a test"
  501.     test msgcat-7.2 {mc extra args go through to format} -setup {
  502. mcset foo format1 "this is a test"
  503. mcset foo format2 "this is a %s"
  504. mcset foo format3 "this is a %s %s"
  505. variable locale [mclocale]
  506. mclocale foo
  507.     } -cleanup {
  508. mclocale $locale
  509.     } -body {
  510. mc format2 "good test"
  511.     } -result "this is a good test"
  512.     test msgcat-7.3 {mc errors from format are propagated} -setup {
  513. mcset foo format1 "this is a test"
  514. mcset foo format2 "this is a %s"
  515. mcset foo format3 "this is a %s %s"
  516. variable locale [mclocale]
  517. mclocale foo
  518.     } -cleanup {
  519. mclocale $locale
  520.     } -body {
  521. catch {mc format3 "good test"}
  522.     } -result 1
  523.     test msgcat-7.4 {mc, extra args are given to unknown} -setup {
  524. mcset foo format1 "this is a test"
  525. mcset foo format2 "this is a %s"
  526. mcset foo format3 "this is a %s %s"
  527. variable locale [mclocale]
  528. mclocale foo
  529.     } -cleanup {
  530. mclocale $locale
  531.     } -body {
  532. mc "this is a %s" "good test"
  533.     } -result "this is a good test"
  534.     cleanupTests
  535. }
  536. namespace delete ::msgcat::test
  537. return