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