]> Git — Sourcephile - julm/worksheets.git/blob - tests/Worksheets/Writing/RosettaSpec.hs
update
[julm/worksheets.git] / tests / Worksheets / Writing / RosettaSpec.hs
1 {-# LANGUAGE OverloadedLists #-}
2
3 module Worksheets.Writing.RosettaSpec where
4
5 import Data.GenValidity.Map ()
6 import Data.GenValidity.Sequence ()
7 import Data.GenValidity.Set ()
8 import Data.GenValidity.Text ()
9 import Data.List qualified as List
10 import Data.Text qualified as Text
11 import Data.Validity.Map ()
12 import Data.Validity.Set ()
13 import Data.Validity.Text ()
14 import System.FilePath (joinPath, pathSeparator, (<.>), (</>))
15 import Test.Syd
16
17 import Language.Chinese qualified as Chinese
18 import Utils.Prelude
19 import Worksheets.Writing.Rosetta
20
21 runRosetta :: String -> Rosetta -> TestDefM (Chinese.ChineseDict : outers) () ()
22 runRosetta title rose = do
23 descrPath <- getTestDescriptionPath
24 let dirPath =
25 List.reverse descrPath
26 <&> Text.unpack
27 . Text.replace
28 (Text.pack ".")
29 (Text.singleton pathSeparator)
30 & joinPath
31 let outPath = "tests" </> dirPath </> title </> "rosetta" <.> "html"
32 itWithOuter title \dict -> do
33 goldenByteStringBuilderFile outPath
34 $ rosettaHTML dict (Text.pack title) rose
35
36 spec :: HasCallStack => Spec
37 spec = aroundAll readDict do
38 -- runRosetta "Avion" avion
39 -- runRosetta "Bateau" bateau
40 -- runRosetta "Chocolat" chocolat
41 -- runRosetta "Pistache" pistache
42 -- runRosetta "Egg" egg
43 -- runRosetta "Pluie" pluie
44 -- runRosetta "TarteAuxPommes" tarteAuxPommesDanniversaire
45 -- runRosetta "ChatChevalVélo" chatChevalVélo
46 -- runRosetta "chevauxDormirDebout" chevauxDormirDebout
47 runRosetta "ponies" ponies
48 runRosetta "poniesRaces1" poniesRaces1
49 runRosetta "poniesRaces2" poniesRaces2
50 runRosetta "Culicoides" culicoides
51 runRosetta "Fraise" fraise
52 runRosetta "poupéeArielle" poupéeArielle
53 runRosetta "poupéeBella" poupéeBella
54 runRosetta "Mûre" mûre
55 runRosetta "Framboise" framboise
56 where
57 readDict :: (Chinese.ChineseDict -> IO ()) -> IO ()
58 readDict = (Chinese.readChineseDict >>=)
59
60 français v = v{rosettaPartLangue = LangueFrançais}
61 anglais v = v{rosettaPartLangue = LangueAnglais}
62 mandarin v = v{rosettaPartLangue = LangueMandarin}
63
64 {-
65 chocolat =
66 mempty
67 { rosettaParts =
68 [ RosettaPart
69 { rosettaPartPicture = "Plantes/Cacao/Fruit-cacao-tree-source-cocoa-chocolate-plant.avif"
70 , rosettaPartDescription = ""
71 , rosettaPartLangue = LangueFrançais
72 , rosettaPartText = "Le chocolat contient du cacao"
73 }
74 , RosettaPart
75 { rosettaPartPicture = "Plantes/Cacao/42f651_95f537d693fb48068880a02efa662822~mv2.avif"
76 , rosettaPartDescription = ""
77 , rosettaPartLangue = LangueAnglais
78 , rosettaPartText = "Chocolate contains cocoa"
79 }
80 , RosettaPart
81 { rosettaPartPicture = "Plantes/Cacao/Chocolate-Ingredients_520x500_c496776e-df9b-4348-a662-5ff65279f5ca.avif"
82 , rosettaPartDescription = ""
83 , rosettaPartLangue = LangueMandarin
84 , rosettaPartText = "巧克力 含有 可可"
85 }
86 ]
87 }
88 pistache =
89 mempty
90 { rosettaParts =
91 [ RosettaPart
92 { rosettaPartPicture = "Plantes/Pistache/581614a479ee6b4df250c4caddc04bca.avif"
93 , rosettaPartDescription = ""
94 , rosettaPartLangue = LangueFrançais
95 , rosettaPartText = "La glace à la pistache est délicieuse"
96 }
97 , RosettaPart
98 { rosettaPartPicture = "Plantes/Pistache/pistachios.avif"
99 , rosettaPartDescription = ""
100 , rosettaPartLangue = LangueAnglais
101 , rosettaPartText = "Pistachio ice cream is delicious"
102 }
103 , RosettaPart
104 { rosettaPartPicture = "Plantes/Pistache/No-Churn-Vegan-Pistachio-Ice-Cream-3-e1502503524224.avif"
105 , rosettaPartDescription = ""
106 , rosettaPartLangue = LangueMandarin
107 , rosettaPartText = "开心果 冰淇淋 很 好吃"
108 }
109 ]
110 }
111 bateau =
112 mempty
113 { rosettaParts =
114 [ RosettaPart
115 { rosettaPartPicture = "Bateau/pirate-boat.avif"
116 , rosettaPartDescription = ""
117 , rosettaPartLangue = LangueFrançais
118 , rosettaPartText = "Bateau sur l'eau"
119 }
120 , RosettaPart
121 { rosettaPartPicture = "Bateau/tanker.avif"
122 , rosettaPartDescription = ""
123 , rosettaPartLangue = LangueAnglais
124 , rosettaPartText = "Boat on the water"
125 }
126 , RosettaPart
127 { rosettaPartPicture = "Bateau/catamaran.avif"
128 , rosettaPartDescription = ""
129 , rosettaPartLangue = LangueMandarin
130 , rosettaPartText = "水上 的 船"
131 }
132 ]
133 }
134 avion =
135 mempty
136 { rosettaParts =
137 [ RosettaPart
138 { rosettaPartPicture = "Avion/sound-barrier.avif"
139 , rosettaPartDescription = ""
140 , rosettaPartLangue = LangueFrançais
141 , rosettaPartText = "Avion dans le ciel"
142 }
143 , RosettaPart
144 { rosettaPartPicture = "Avion/mustang.avif"
145 , rosettaPartDescription = ""
146 , rosettaPartLangue = LangueAnglais
147 , rosettaPartText = "Airoplane in the sky"
148 }
149 , RosettaPart
150 { rosettaPartPicture = "Avion/cockpit.avif"
151 , rosettaPartDescription = ""
152 , rosettaPartLangue = LangueMandarin
153 , rosettaPartText = "天空 中 有 一 架 飞机"
154 }
155 ]
156 }
157 egg =
158 mempty
159 { rosettaParts =
160 [ RosettaPart
161 { rosettaPartPicture = "Egg/R.avif"
162 , rosettaPartDescription = ""
163 , rosettaPartLangue = LangueFrançais
164 , rosettaPartText = "Les poules pondent des œufs"
165 }
166 , RosettaPart
167 { rosettaPartPicture = "Egg/everything-you-ever-wanted-to-know-about-chicken-eggs.avif"
168 , rosettaPartDescription = ""
169 , rosettaPartLangue = LangueAnglais
170 , rosettaPartText = "Hens lay eggs"
171 }
172 , RosettaPart
173 { rosettaPartPicture = "Egg/OIP.avif"
174 , rosettaPartDescription = ""
175 , rosettaPartLangue = LangueMandarin
176 , rosettaPartText = "母鸡 下蛋"
177 }
178 ]
179 }
180 pluie =
181 mempty
182 { rosettaParts =
183 [ RosettaPart
184 { rosettaPartPicture = "Pluie/R.avif"
185 , rosettaPartDescription = ""
186 , rosettaPartLangue = LangueFrançais
187 , rosettaPartText = "L'eau de pluie retourne à l'océan"
188 }
189 , RosettaPart
190 { rosettaPartPicture = "Pluie/OIP2.avif"
191 , rosettaPartDescription = ""
192 , rosettaPartLangue = LangueAnglais
193 , rosettaPartText = "Rainwater returns to the ocean"
194 }
195 , RosettaPart
196 { rosettaPartPicture = "Pluie/c1b4767475208de5a389045b7ad856a0.avif"
197 , rosettaPartDescription = ""
198 , rosettaPartLangue = LangueMandarin
199 , rosettaPartText = "雨水 回归 海洋"
200 }
201 ]
202 }
203 tarteAuxPommesDanniversaire =
204 mempty
205 { rosettaParts =
206 [ RosettaPart
207 { rosettaPartPicture = "TarteAuxPommesDanniversaire/IMG_20250605_180725.avif"
208 , rosettaPartDescription = ""
209 , rosettaPartLangue = LangueFrançais
210 , rosettaPartText = "Délicieuse tarte aux pommes d'anniversaire"
211 }
212 , RosettaPart
213 { rosettaPartPicture = "TarteAuxPommesDanniversaire/VID_20250605_214924.mp4.00-01-40-421.avif"
214 , rosettaPartDescription = ""
215 , rosettaPartLangue = LangueAnglais
216 , rosettaPartText = "Delicious birthday apple pie"
217 }
218 , RosettaPart
219 { rosettaPartPicture = "TarteAuxPommesDanniversaire/VID_20250605_214924.mp4.00-01-47-284.avif"
220 , rosettaPartDescription = ""
221 , rosettaPartLangue = LangueMandarin
222 , rosettaPartText = "美味 的 生日 苹果派"
223 }
224 ]
225 }
226 chatChevalVélo =
227 mempty
228 { rosettaParts =
229 [ RosettaPart
230 { rosettaPartPicture = "Chat/IMG_20250605_194233_truffe.avif"
231 , rosettaPartDescription = ""
232 , rosettaPartLangue = LangueFrançais
233 , rosettaPartText = "chat cheval vélo"
234 }
235 , RosettaPart
236 { rosettaPartPicture = "Cheval/IMG_20250602_170549_himalaya.avif"
237 , rosettaPartDescription = ""
238 , rosettaPartLangue = LangueAnglais
239 , rosettaPartText = "cat horse bicycle"
240 }
241 , RosettaPart
242 { rosettaPartPicture = "Vélo/IMG_20250602_155624.fav.vélos.avif"
243 , rosettaPartDescription = ""
244 , rosettaPartLangue = LangueMandarin
245 , rosettaPartText = "猫 马 自行车"
246 }
247 ]
248 }
249 -}
250
251 rosetta :: Rosetta
252 rosetta =
253 typeDefault
254 { rosettaDifficulties =
255 typeDefault
256 & rosettaDifficultiesLatinBig
257 & rosettaDifficultiesLatinHidden
258 & rosettaDifficultiesCJKBig
259 }
260
261 chevauxDormirDebout =
262 rosettaLandscape
263 $ rosetta
264 { rosettaParts =
265 [ français
266 $ typeDefault
267 { rosettaPartPicture = "Cheval/R5.avif"
268 , rosettaPartDescription = ""
269 , rosettaPartLangue = LangueFrançais
270 , rosettaPartText = "Les chevaux peuvent dormir debout"
271 }
272 , anglais
273 $ typeDefault
274 { rosettaPartPicture = "Cheval/Do-Horses-Lay-Down-to-Sleep.avif"
275 , rosettaPartDescription = ""
276 , rosettaPartLangue = LangueAnglais
277 , rosettaPartText = "Horses can sleep standing up"
278 }
279 , mandarin
280 $ typeDefault
281 { rosettaPartPicture = "Cheval/3YVGNyR45fw5NwHQxvJ8P6.avif"
282 , rosettaPartDescription = ""
283 , rosettaPartLangue = LangueMandarin
284 , rosettaPartText = "马 可以 站 着 睡觉"
285 }
286 ]
287 }
288 ponies =
289 rosettaLandscape
290 $ rosetta
291 { rosettaParts =
292 [ français
293 $ typeDefault
294 { rosettaPartPicture = "Poney/Horse-and-pony2.avif"
295 , rosettaPartPictureCSS = cssBlockObjectFitCover
296 , rosettaPartDescription = ""
297 , rosettaPartText = "Les poneys sont petits mais costauds"
298 }
299 , anglais
300 $ typeDefault
301 { rosettaPartPicture = "Poney/A-girl-equestrian-athlete-jumps-on-a-horse-high-barrier-ss230301-768x448.jpg.avif"
302 , rosettaPartPictureCSS = cssBlockObjectFitCover
303 , rosettaPartDescription = ""
304 , rosettaPartText = "Ponies are small but strong"
305 }
306 , mandarin
307 $ typeDefault
308 { rosettaPartPicture = "Poney/horse-pull.avif"
309 , rosettaPartPictureCSS = cssBlockObjectFitCover
310 , rosettaPartDescription = ""
311 , rosettaPartText = "小马 虽 小 但 很 强壮"
312 }
313 ]
314 }
315 poniesRaces1 =
316 rosettaLandscape
317 $ rosetta
318 { rosettaParts =
319 [ français
320 $ typeDefault
321 { rosettaPartPicture = "Poney/Shetland/Canva-Ponies-of-the-New-Forest-scaled.avif"
322 , rosettaPartPictureCSS = cssBlockObjectFitCover
323 , rosettaPartDescription = "Shetland Pony"
324 , rosettaPartText = "Il existe environ 159 races de poneys"
325 }
326 , anglais
327 $ typeDefault
328 { rosettaPartPicture = "Poney/PoneyFrançaisDeSelle/pho11-1441004372-ulk-modele1.avif"
329 , rosettaPartPictureCSS = cssBlockObjectFitCover
330 , rosettaPartDescription = "Poney Français de Selle"
331 , rosettaPartText = "There are approximately 159 pony breeds"
332 }
333 , mandarin
334 $ typeDefault
335 { rosettaPartPicture = "Poney/NorwegianFjord/shutterstock_2092896190-1024x683.avif"
336 , rosettaPartPictureCSS = cssBlockObjectFitCover
337 , rosettaPartDescription = "Norwegian Fjord Pony"
338 , rosettaPartText = "有 大约 159 个 小马 品种"
339 }
340 ]
341 }
342 poniesRaces2 =
343 rosettaLandscape
344 $ rosetta
345 { rosettaParts =
346 [ français
347 $ typeDefault
348 { rosettaPartPicture = "Poney/Haflinger/GettyImages-546441489-3087a0a3f3a0486f96e7e6d7eb0b6bc1.avif"
349 , rosettaPartPictureCSS = cssBlockObjectFitCover
350 , rosettaPartDescription = "Haflinger Pony"
351 , rosettaPartText = "Il existe environ 159 races de poneys"
352 }
353 , anglais
354 $ typeDefault
355 { rosettaPartPicture = "Poney/Dartmoor/GettyImages-149824058-ee7fd8a5e9984f5a9dc73c5916a238aa.avif"
356 , rosettaPartPictureCSS = cssBlockObjectFitCover
357 , rosettaPartDescription = "Dartmoor Pony"
358 , rosettaPartText = "There are approximately 159 pony breeds"
359 }
360 , mandarin
361 $ typeDefault
362 { rosettaPartPicture = "Poney/Connemara/eaa17d54a2978f5962edc405f0beabb7.avif"
363 , rosettaPartPictureCSS = cssBlockObjectFitCover
364 , rosettaPartDescription = "Connemara Pony"
365 , rosettaPartText = "有 大约 159 个 小马 品种"
366 }
367 ]
368 }
369 poniesRaces3 =
370 rosettaLandscape
371 $ rosetta
372 { rosettaParts =
373 [ français
374 $ typeDefault
375 { rosettaPartPicture = "Poney/"
376 , rosettaPartPictureCSS = cssBlockObjectFitCover
377 , rosettaPartDescription = "Pony"
378 , rosettaPartText = "Il existe environ 159 races de poneys"
379 }
380 , anglais
381 $ typeDefault
382 { rosettaPartPicture = "Poney/Dartmoor/GettyImages-149824058-ee7fd8a5e9984f5a9dc73c5916a238aa.avif"
383 , rosettaPartPictureCSS = cssBlockObjectFitCover
384 , rosettaPartDescription = "Dartmoor Pony"
385 , rosettaPartText = "There are approximately 159 pony breeds"
386 }
387 , mandarin
388 $ typeDefault
389 { rosettaPartPicture = "Poney/Connemara/eaa17d54a2978f5962edc405f0beabb7.avif"
390 , rosettaPartPictureCSS = cssBlockObjectFitCover
391 , rosettaPartDescription = "Connemara Pony"
392 , rosettaPartText = "有 大约 159 个 小马 品种"
393 }
394 ]
395 }
396 culicoides =
397 typeDefault
398 { rosettaParts =
399 [ français
400 $ typeDefault
401 { rosettaPartPicture = "Culicoides/Blood-Feeding-Culicoides-Midges.avif"
402 , rosettaPartPictureCSS = cssBlockObjectFitCover
403 , rosettaPartText = "Les moucherons culicoides sont des vampires infectieuses"
404 }
405 , anglais
406 $ typeDefault
407 { rosettaPartPicture = "Culicoides/Mosquito_(Ochlerotatus_annulipes)_and_Midge_(Culicoides_impunctatus)_biting_human_(me).avif"
408 , rosettaPartPictureCSS = cssBlockObjectFitCover
409 , rosettaPartText = "Culicoides midges are infectious vampires"
410 }
411 , mandarin
412 $ typeDefault
413 { rosettaPartPicture = "Culicoides/CSIRO_ScienceImage_1791_SEM_of_a_biting_midge_Culicoides_brevitarsis.avif"
414 , rosettaPartPictureCSS = cssBlockObjectFitCover
415 , rosettaPartText = "库蠓属 具有 传染性 的 吸血鬼"
416 }
417 ]
418 }
419
420 fraise =
421 rosettaLandscape
422 $ rosetta
423 { rosettaParts =
424 [ français
425 $ typeDefault
426 { rosettaPartPicture = "Fraise/96caabc77f79887c4bbcb2383092707b.avif"
427 , rosettaPartText = "Les fruits de la fraise sont les akènes"
428 }
429 , anglais
430 $ typeDefault
431 { rosettaPartPicture = "Fraise/OIP.avif"
432 , rosettaPartPictureCSS = cssBlockObjectFitCover
433 , rosettaPartText = "Strawberry's fruits are the achenes"
434 }
435 , mandarin
436 $ typeDefault
437 { rosettaPartPicture = "Fraise/Coupe_d'une_fraise_dont_les_akènes_ont_germés.avif"
438 , rosettaPartText = "草莓 的 果实 是 瘦果"
439 }
440 ]
441 }
442 poupéeArielle =
443 rosettaLandscape
444 $ rosetta
445 { rosettaParts =
446 [ français
447 $ typeDefault
448 { rosettaPartPicture = "ArielleLaPetiteSirène/3aff97d2a3c36b307c12e7ea36e2000b.avif"
449 , rosettaPartText = "Arielle la poupée et Merlin le garçon"
450 }
451 , anglais
452 $ typeDefault
453 { rosettaPartPicture = "ArielleLaPetiteSirène/halle-bailey-as-ariel-in-the-little-mermaid-zk-1280x2120.small.avif"
454 , rosettaPartText = "Ariel the doll and Merlin the boy"
455 }
456 , mandarin
457 $ typeDefault
458 { rosettaPartPicture = "Poupée/IMG_20250613_111606.avif"
459 , rosettaPartText = "娃娃 Arielle 和 男孩 梅林"
460 }
461 ]
462 }
463 poupéeBella =
464 rosettaPortrait
465 $ rosetta
466 { rosettaParts =
467 [ français
468 $ typeDefault
469 { rosettaPartPicture = "LaBelleEtLaBête/batbjpg-fe2293_1280w.avif"
470 , rosettaPartText = "Bella la poupée et Maya la fille"
471 }
472 , anglais
473 $ typeDefault
474 { rosettaPartPicture = "LaBelleEtLaBête/disney-live-action-02.avif"
475 , rosettaPartPictureCSS = cssBlockObjectFitCover
476 , rosettaPartText = "Bella the doll and Maya the girl"
477 }
478 , mandarin
479 $ typeDefault
480 { rosettaPartPicture = "Poupée/IMG_20250613_111730.avif"
481 , rosettaPartText = "娃娃 Bella 和 女孩 马雅" -- 玛雅
482 }
483 ]
484 }
485 mûre =
486 rosettaLandscape
487 $ rosetta
488 { rosettaParts =
489 [ français
490 $ typeDefault
491 { rosettaPartPicture = "Mûre/Bee-Feeding-on-Blackberry-Blossom.avif"
492 , rosettaPartPictureCSS = cssBlockObjectFitCover
493 , rosettaPartText = "Les fruits de la mûre sont des drupéoles"
494 }
495 , anglais
496 $ typeDefault
497 { rosettaPartPicture = "Mûre/blackberry-anatomy.avif"
498 , rosettaPartText = "Blackberry's fruits are drupelets"
499 }
500 , mandarin
501 $ typeDefault
502 { rosettaPartPicture = "Mûre/berryblack.avif"
503 , rosettaPartPictureCSS = cssBlockObjectFitCover
504 , rosettaPartText = "黑莓 的 果实 是 小 核果"
505 }
506 ]
507 }
508 framboise =
509 rosettaLandscape
510 $ rosetta
511 { rosettaParts =
512 [ français
513 $ typeDefault
514 { rosettaPartPicture = "Framboise/ghows-SR-6c5aadd8-13b2-7679-e053-0100007f79b5-ad44228b.avif"
515 , rosettaPartPictureCSS =
516 cssBlockObjectFitCover
517 <> ["object-position" := "left center"]
518 , rosettaPartText = ""
519 }
520 , anglais
521 $ typeDefault
522 { rosettaPartPicture = "Framboise/framboise-schema-fr.avif"
523 , rosettaPartText = ""
524 }
525 , mandarin
526 $ typeDefault
527 { rosettaPartPicture = "Framboise/RR.avif"
528 , rosettaPartPictureCSS =
529 cssBlockObjectFitCover
530 <> ["object-position" := "right bottom"]
531 , rosettaPartText = ""
532 }
533 ]
534 }