aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/locale/language.lux
blob: cb2fb5477523857b806c6629c967f34238344033 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
(.using
 [library
  [lux (.except)
   ["_" test (.only Test)]
   [abstract
    [monad (.only do)]
    [hash (.only Hash)]
    [\\specification
     ["$[0]" hash]]]
   [control
    ["[0]" maybe]]
   [data
    ["[0]" text]
    [collection
     ["[0]" set (.only Set)]
     ["[0]" list (.open: "[1]#[0]" functor mix)]]]
   [macro
    ["[0]" template]]
   [math
    ["[0]" random (.only Random)]
    [number
     ["n" nat]]]]]
 [\\library
  ["[0]" /]])

(type: Bundle
  (Record
   [#amount Nat
    #names (Set Text)
    #codes (Set Text)
    #languages (Set /.Language)
    #test Test]))

(template [<bundle> <languages>]
  [(def: <bundle>
     Bundle
     (let [amount (template.amount <languages>)
           languages (is (List /.Language)
                         (`` (list (~~ (template.spliced <languages>)))))]
       [#amount amount
        #names (|> languages (list#each /.name) (set.of_list text.hash))
        #codes (|> languages (list#each /.code) (set.of_list text.hash))
        #languages (set.of_list /.hash languages)
        #test (_.coverage <languages>
                true)]))]

  [languages/a [/.afar /.abkhazian /.achinese /.acoli /.adangme
                /.adyghe /.afro_asiatic /.afrihili /.afrikaans /.ainu
                /.akan /.akkadian /.aleut /.algonquian /.southern_altai
                /.amharic /.old_english /.angika /.apache /.arabic
                /.official_aramaic /.aragonese /.mapudungun /.arapaho /.artificial
                /.arawak /.assamese /.asturian /.athapascan /.australian
                /.avaric /.avestan /.awadhi /.aymara /.azerbaijani]]
  [languages/b [/.banda /.bamileke /.bashkir /.baluchi /.bambara
                /.balinese /.basa /.baltic /.beja /.belarusian
                /.bemba /.bengali /.berber /.bhojpuri /.bihari
                /.bikol /.bini /.bislama /.siksika /.bantu
                /.tibetan /.bosnian /.braj /.breton /.batak
                /.buriat /.buginese /.bulgarian /.blin]]
  [languages/c [/.caddo /.central_american_indian /.galibi_carib /.catalan /.caucasian
                /.cebuano /.celtic /.czech /.chamorro /.chibcha
                /.chechen /.chagatai /.chuukese /.mari /.chinook
                /.choctaw /.chipewyan /.cherokee /.church_slavic /.chuvash
                /.cheyenne /.chamic /.montenegrin /.coptic /.cornish
                /.corsican /.creoles_and_pidgins/english /.creoles_and_pidgins/french /.creoles_and_pidgins/portuguese /.cree
                /.crimean /.creoles_and_pidgins /.kashubian /.cushitic /.welsh]]
  [languages/d [/.dakota /.danish /.dargwa /.land_dayak /.delaware
                /.slavey /.dogrib /.dinka /.dhivehi /.dogri
                /.dravidian /.lower_sorbian /.duala /.middle_dutch /.dyula
                /.dzongkha]]
  [languages/e [/.efik /.egyptian /.ekajuk /.greek /.elamite
                /.english /.middle_english /.esperanto /.estonian /.basque
                /.ewe /.ewondo]]
  [languages/f [/.fang /.faroese /.persian /.fanti /.fijian
                /.filipino /.finnish /.finno_ugrian /.fon /.french
                /.middle_french /.old_french /.northern_frisian /.eastern_frisian /.western_frisian
                /.fulah /.friulian]]
  [languages/g [/.ga /.gayo /.gbaya /.germanic /.german
                /.geez /.gilbertese /.gaelic /.irish /.galician
                /.manx /.middle_high_german /.old_high_german /.gondi /.gorontalo
                /.gothic /.grebo /.ancient_greek /.guarani /.swiss_german
                /.gujarati /.gwich'in]]
  [languages/h [/.haida /.haitian /.hausa /.hawaiian /.hebrew
                /.herero /.hiligaynon /.himachali /.hindi /.hittite
                /.hmong /.hiri_motu /.croatian /.upper_sorbian /.hungarian
                /.hupa /.armenian]]
  [languages/i [/.iban /.igbo /.ido /.sichuan_yi /.ijo
                /.inuktitut /.interlingue /.iloko /.interlingua /.indic
                /.indonesian /.indo_european /.ingush /.inupiaq /.iranian
                /.iroquoian /.icelandic /.italian]]
  [languages/j [/.javanese /.lojban /.japanese /.judeo_persian /.judeo_arabic]]
  [languages/k [/.kara_kalpak /.kabyle /.kachin /.kalaallisut /.kamba
                /.kannada /.karen /.kashmiri /.georgian /.kanuri
                /.kawi /.kazakh /.kabardian /.khasi /.khoisan
                /.central_khmer /.khotanese /.gikuyu /.kinyarwanda /.kyrgyz
                /.kimbundu /.konkani /.komi /.kongo /.korean
                /.kosraean /.kpelle /.karachay_balkar /.karelian /.kru
                /.kurukh /.kwanyama /.kumyk /.kurdish /.kutenai]]
  [languages/l [/.ladino /.lahnda /.lamba /.lao /.latin
                /.latvian /.lezghian /.limburgan /.lingala /.lithuanian
                /.mongo /.lozi /.luxembourgish /.luba_lulua /.luba_katanga
                /.ganda /.luiseno /.lunda /.luo /.lushai]]
  [languages/m [/.madurese /.magahi /.marshallese /.maithili /.makasar
                /.malayalam /.mandingo /.austronesian /.marathi /.masai
                /.moksha /.mandar /.mende /.middle_irish /.mi'kmaq
                /.minangkabau /.macedonian /.mon_khmer /.malagasy /.maltese
                /.manchu /.manipuri /.manobo /.mohawk /.mongolian
                /.mossi /.maori /.malay /.munda /.creek
                /.mirandese /.marwari /.burmese /.mayan /.erzya]]
  [languages/n [/.nahuatl /.north_american_indian /.neapolitan /.nauru /.navajo
                /.south_ndebele /.north_ndebele /.ndonga /.low_german /.nepali
                /.newari /.nias /.niger_kordofanian /.niuean /.dutch
                /.nynorsk /.bokmal /.nogai /.old_norse /.norwegian
                /.n'ko /.northern_sotho /.nubian /.old_newari /.nyanja
                /.nyamwezi /.nyankole /.nyoro /.nzima]]
  [languages/o [/.occitan /.ojibwa /.oriya /.oromo /.osage
                /.ossetic /.ottoman_turkish /.otomian]]
  [languages/p [/.papuan /.pangasinan /.pahlavi /.pampanga /.punjabi
                /.papiamento /.palauan /.old_persian /.philippine /.phoenician
                /.pali /.polish /.pohnpeian /.portuguese /.prakrit
                /.old_provencal /.pashto]]
  [languages/q [/.quechua]]
  [languages/r [/.rajasthani /.rapanui /.rarotongan /.romance /.romansh
                /.romany /.romanian /.rundi /.aromanian /.russian]]
  [languages/s0 [/.sandawe /.sango /.yakut /.south_american_indian /.salishan
                 /.samaritan_aramaic /.sanskrit /.sasak /.santali /.sicilian
                 /.scots /.selkup /.semitic /.old_irish /.sign
                 /.shan /.sidamo /.sinhalese /.siouan /.sino_tibetan
                 /.slavic /.slovak /.slovenian /.southern_sami /.northern_sami
                 /.sami /.lule /.inari /.samoan /.skolt_sami]]
  [languages/s1 [/.shona /.sindhi /.soninke /.sogdian /.somali
                 /.songhai /.southern_sotho /.spanish /.albanian /.sardinian
                 /.sranan_tongo /.serbian /.serer /.nilo_saharan /.swati
                 /.sukuma /.sundanese /.susu /.sumerian /.swahili
                 /.swedish /.classical_syriac /.syriac]]
  [languages/t [/.tahitian /.tai /.tamil /.tatar /.telugu
                /.timne /.tereno /.tetum /.tajik /.tagalog
                /.thai /.tigre /.tigrinya /.tiv /.tokelau
                /.klingon /.tlingit /.tamashek /.tonga /.tongan
                /.tok_pisin /.tsimshian /.tswana /.tsonga /.turkmen
                /.tumbuka /.tupi /.turkish /.altaic /.tuvalu
                /.twi /.tuvinian]]
  [languages/u [/.udmurt /.ugaritic /.uyghur /.ukrainian /.umbundu
                /.urdu /.uzbek]]
  [languages/v [/.vai /.venda /.vietnamese /.volapük /.votic]]
  [languages/w [/.wakashan /.walamo /.waray /.washo /.sorbian
                /.walloon /.wolof]]
  [languages/x [/.kalmyk /.xhosa]]
  [languages/y [/.yao /.yapese /.yiddish /.yoruba /.yupik]]
  [languages/z [/.zapotec /.blissymbols /.zenaga /.standard_moroccan_tamazight /.zhuang
                /.chinese /.zande /.zulu /.zuni /.zaza]]
  [languages/etc [/.uncoded /.multiple /.undetermined /.not_applicable]]
  )

(def: languages
  (List Bundle)
  (list ..languages/a
        ..languages/b
        ..languages/c
        ..languages/d
        ..languages/e
        ..languages/f
        ..languages/g
        ..languages/h
        ..languages/i
        ..languages/j
        ..languages/k
        ..languages/l
        ..languages/m
        ..languages/n
        ..languages/o
        ..languages/p
        ..languages/q
        ..languages/r
        ..languages/s0
        ..languages/s1
        ..languages/t
        ..languages/u
        ..languages/v
        ..languages/w
        ..languages/x
        ..languages/y
        ..languages/z
        ..languages/etc
        ))

(def: (aggregate lens hash territories)
  (All (_ a) (-> (-> Bundle (Set a))
                 (Hash a)
                 (List Bundle)
                 [Nat (Set a)]))
  (list#mix (function (_ bundle [amount set])
              [(n.+ amount (the #amount bundle))
               (set.union set (lens bundle))])
            [0 (set.empty hash)]
            territories))

(def: languages_test
  Test
  (|> ..languages
      list.reversed
      (list#each (the #test))
      (list#mix _.and
                (`` (all _.and
                         (~~ (template [<lens> <tag> <hash>]
                               [(let [[amount set] (..aggregate (the <tag>) <hash> ..languages)]
                                  (_.coverage [<lens>]
                                    (n.= amount (set.size set))))]

                               [/.name #names text.hash]
                               [/.code #codes text.hash]
                               [/.equivalence #languages /.hash]
                               ))
                         )))))

(template: (!aliases <reference> <aliases>)
  [(_.coverage <aliases>
     (list.every? (at /.equivalence = <reference>)
                  (`` (list (~~ (template.spliced <aliases>))))))])

(def: aliases_test/0
  Test
  (all _.and
       ... A
       (!aliases /.official_aramaic [/.imperial_aramaic])
       (!aliases /.asturian [/.bable /.leonese /.asturleonese])
       ... B
       (!aliases /.bini [/.edo])
       (!aliases /.blin [/.bilin])
       ... C
       (!aliases /.catalan [/.valencian])
       (!aliases /.church_slavic [/.old_slavonic /.church_slavonic /.old_bulgarian /.old_church_slavonic])
       ... D
       (!aliases /.dhivehi [/.maldivian])
       ... G
       (!aliases /.swiss_german [/.alemannic /.alsatian])
       ... I
       (!aliases /.sichuan_yi [/.nuosu])
       ... K
       (!aliases /.kachin [/.jingpho])
       (!aliases /.kalaallisut [/.greenlandic])
       (!aliases /.khotanese [/.sakan])
       ))

(def: aliases_test/1
  Test
  (all _.and
       ... M
       (!aliases /.mi'kmaq [/.micmac])
       ... N
       (!aliases /.newari [/.nepal_bhasa])
       (!aliases /.dutch [/.flemish])
       (!aliases /.northern_sotho [/.pedi /.sepedi])
       (!aliases /.old_newari [/.classical_newari /.classical_nepal_bhasa])
       (!aliases /.nyanja [/.chichewa /.chewa])
       ... O
       (!aliases /.occitan [/.provencal])
       ... P
       (!aliases /.pampanga [/.kapampangan])
       ... R
       (!aliases /.rarotongan [/.cook_islands_maori])
       (!aliases /.romanian [/.moldavian /.moldovan])
       (!aliases /.aromanian [/.arumanian /.macedo_romanian])
       ... S
       (!aliases /.spanish [/.castilian])
       ... X
       (!aliases /.kalmyk [/.oirat])
       ... Z
       (!aliases /.zaza [/.dimili /.dimli /.kirdki /.kirmanjki /.zazaki])
       ))

(def: aliases_test
  Test
  (all _.and
       ..aliases_test/0
       ..aliases_test/1
       ))

(def: .public random
  (Random /.Language)
  (let [options (|> ..languages
                    (list#each (|>> (the #languages) set.list))
                    list.together)]
    (do [! random.monad]
      [choice (at ! each (n.% (list.size options))
                  random.nat)]
      (in (maybe.trusted (list.item choice options))))))

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Language])
      (all _.and
           (_.for [/.hash]
                  ($hash.spec /.hash ..random))
           
           ..languages_test
           ..aliases_test
           )))