(.module: [library [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)] [\\specification ["$." equivalence] ["$." hash] ["$." monoid]]] [data ["." text] [collection ["." set] ["." list]]] [macro ["." template]] [math ["." random (#+ Random)] [number (#+ hex) ["n" nat]]]]] [\\library ["." /]]) (def: .public random (Random /.Block) (do {! random.monad} [start (\ ! each (n.% 1,000,000) random.nat) additional (\ ! each (n.% 1,000,000) random.nat)] (in (/.block start additional)))) (with_expansions [ (as_is [blocks/0 [/.basic_latin /.latin_1_supplement /.latin_extended_a /.latin_extended_b /.ipa_extensions /.spacing_modifier_letters /.combining_diacritical_marks /.greek_and_coptic /.cyrillic /.cyrillic_supplementary /.armenian /.hebrew /.arabic /.syriac /.thaana /.devanagari /.bengali /.gurmukhi /.gujarati /.oriya]] [blocks/1 [/.tamil /.telugu /.kannada /.malayalam /.sinhala /.thai /.lao /.tibetan /.myanmar /.georgian /.hangul_jamo /.ethiopic /.cherokee /.unified_canadian_aboriginal_syllabics /.ogham /.runic /.tagalog /.hanunoo /.buhid /.tagbanwa /.khmer /.mongolian]] [blocks/2 [/.limbu /.tai_le /.khmer_symbols /.phonetic_extensions /.latin_extended_additional /.greek_extended /.general_punctuation /.superscripts_and_subscripts /.currency_symbols /.combining_diacritical_marks_for_symbols /.letterlike_symbols /.number_forms /.arrows /.mathematical_operators /.miscellaneous_technical /.control_pictures /.optical_character_recognition /.enclosed_alphanumerics /.box_drawing /.block_elements /.geometric_shapes /.miscellaneous_symbols]] [blocks/3 [/.dingbats /.miscellaneous_mathematical_symbols_a /.supplemental_arrows_a /.braille_patterns /.supplemental_arrows_b /.miscellaneous_mathematical_symbols_b /.supplemental_mathematical_operators /.miscellaneous_symbols_and_arrows /.cjk_radicals_supplement /.kangxi_radicals /.ideographic_description_characters /.cjk_symbols_and_punctuation /.hiragana /.katakana /.bopomofo /.hangul_compatibility_jamo /.kanbun /.bopomofo_extended]] [blocks/4 [/.katakana_phonetic_extensions /.enclosed_cjk_letters_and_months /.cjk_compatibility /.cjk_unified_ideographs_extension_a /.yijing_hexagram_symbols /.cjk_unified_ideographs /.yi_syllables /.yi_radicals /.hangul_syllables /.high_surrogates /.high_private_use_surrogates /.low_surrogates /.private_use_area /.cjk_compatibility_ideographs /.alphabetic_presentation_forms]] [blocks/5 [/.arabic_presentation_forms_a /.variation_selectors /.combining_half_marks /.cjk_compatibility_forms /.small_form_variants /.arabic_presentation_forms_b /.halfwidth_and_fullwidth_forms /.specials ... Specialized blocks /.basic_latin/decimal /.basic_latin/upper /.basic_latin/lower]] ) (template [ ] [((: (-> Any (List /.Block)) (function (_ _) (`` (list (~~ (template.spliced )))))) [])] )] (template [ ] [(def: Test (`` (_.cover [(~~ (template.spliced ))] (let [all (list.together (list )) unique (set.of_list /.hash all)] (n.= (list.size all) (set.size unique))))))] ) (def: .public test Test (<| (_.covering /._) (_.for [/.Block]) (do {! random.monad} [.let [top_start (hex "AC00") top_end (hex "D7AF") end_range (n.- top_start top_end)] start (\ ! each (|>> (n.% top_start) ++) random.nat) end (\ ! each (|>> (n.% end_range) (n.+ top_start)) random.nat) .let [additional (n.- start end) sample (/.block start additional) size (/.size sample)] inside (\ ! each (|>> (n.% size) (n.+ (/.start sample))) random.nat)] (`` ($_ _.and (_.for [/.equivalence] ($equivalence.spec /.equivalence ..random)) (_.for [/.hash] ($hash.spec /.hash ..random)) (_.for [/.monoid] ($monoid.spec /.equivalence /.monoid ..random)) (_.for [/.block] ($_ _.and (_.cover [/.start] (n.= start (/.start sample))) (_.cover [/.end] (n.= end (/.end sample))) (_.cover [/.size] (n.= (++ additional) (/.size sample))) (_.cover [/.within?] (and (/.within? sample inside) (not (/.within? sample (-- (/.start sample)))) (not (/.within? sample (++ (/.end sample)))))) (~~ (template [ ] [] )))) ))))) )