module Data.Char.MathSpec ( spec ) where import Test.Hspec import Data.Char.Core import Data.Char.Math spec :: Spec spec = do describe "math" do describe "Serif" do describe "NoItalic" do describe "NoBold" do let transform = math Serif NoItalic NoBold it "latin" do transform <$> latin `shouldBe` Just <$> latin it "greek" do transform <$> greek `shouldBe` Just <$> greek it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> digits unsupportedcheck transform describe "Bold" do let transform = math Serif NoItalic Bold it "latin" do transform <$> latin `shouldBe` Just <$> "๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž๐๐๐‘๐’๐“๐”๐•๐–๐—๐˜๐™๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ" it "greek" do transform <$> greek `shouldBe` Just <$> "๐šจ๐šฉ๐šช๐šซ๐šฌ๐šญ๐šฎ๐šฏ๐šฐ๐šฑ๐šฒ๐šณ๐šด๐šต๐šถ๐šท๐šธ๐šบ๐šป๐šผ๐šฝ๐šพ๐šฟ๐›€๐›๐šน๐›‚๐›ƒ๐›„๐›…๐›†๐›‡๐›ˆ๐›‰๐›Š๐›‹๐›Œ๐›๐›Ž๐›๐›๐›‘๐›’๐›“๐›”๐›•๐›–๐›—๐›˜๐›™๐›š๐››๐›œ๐›๐›ž๐›Ÿ๐› ๐›ก" it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—" unsupportedcheck transform describe "Italic" do describe "NoBold" do let transform = math Serif Italic NoBold it "latin" do transform <$> latin `shouldBe` Just <$> "๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐‘€๐‘๐‘‚๐‘ƒ๐‘„๐‘…๐‘†๐‘‡๐‘ˆ๐‘‰๐‘Š๐‘‹๐‘Œ๐‘๐‘Ž๐‘๐‘๐‘‘๐‘’๐‘“๐‘”โ„Ž๐‘–๐‘—๐‘˜๐‘™๐‘š๐‘›๐‘œ๐‘๐‘ž๐‘Ÿ๐‘ ๐‘ก๐‘ข๐‘ฃ๐‘ค๐‘ฅ๐‘ฆ๐‘ง" it "greek" do transform <$> greek `shouldBe` Just <$> "๐›ข๐›ฃ๐›ค๐›ฅ๐›ฆ๐›ง๐›จ๐›ฉ๐›ช๐›ซ๐›ฌ๐›ญ๐›ฎ๐›ฏ๐›ฐ๐›ฑ๐›ฒ๐›ด๐›ต๐›ถ๐›ท๐›ธ๐›น๐›บ๐›ป๐›ณ๐›ผ๐›ฝ๐›พ๐›ฟ๐œ€๐œ๐œ‚๐œƒ๐œ„๐œ…๐œ†๐œ‡๐œˆ๐œ‰๐œŠ๐œ‹๐œŒ๐œ๐œŽ๐œ๐œ๐œ‘๐œ’๐œ“๐œ”๐œ•๐œ–๐œ—๐œ˜๐œ™๐œš๐œ›" it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> digits unsupportedcheck transform describe "Bold" do let transform = math Serif Italic Bold it "latin" do transform <$> latin `shouldBe` Just <$> "๐‘จ๐‘ฉ๐‘ช๐‘ซ๐‘ฌ๐‘ญ๐‘ฎ๐‘ฏ๐‘ฐ๐‘ฑ๐‘ฒ๐‘ณ๐‘ด๐‘ต๐‘ถ๐‘ท๐‘ธ๐‘น๐‘บ๐‘ป๐‘ผ๐‘ฝ๐‘พ๐‘ฟ๐’€๐’๐’‚๐’ƒ๐’„๐’…๐’†๐’‡๐’ˆ๐’‰๐’Š๐’‹๐’Œ๐’๐’Ž๐’๐’๐’‘๐’’๐’“๐’”๐’•๐’–๐’—๐’˜๐’™๐’š๐’›" it "greek" do transform <$> greek `shouldBe` Just <$> "๐œœ๐œ๐œž๐œŸ๐œ ๐œก๐œข๐œฃ๐œค๐œฅ๐œฆ๐œง๐œจ๐œฉ๐œช๐œซ๐œฌ๐œฎ๐œฏ๐œฐ๐œฑ๐œฒ๐œณ๐œด๐œต๐œญ๐œถ๐œท๐œธ๐œน๐œบ๐œป๐œผ๐œฝ๐œพ๐œฟ๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž๐๐๐‘๐’๐“๐”๐•" it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—" unsupportedcheck transform describe "SansSerif" do describe "NoItalic" do describe "NoBold" do let transform = math SansSerif NoItalic NoBold it "latin" do transform <$> latin `shouldBe` Just <$> "๐– ๐–ก๐–ข๐–ฃ๐–ค๐–ฅ๐–ฆ๐–ง๐–จ๐–ฉ๐–ช๐–ซ๐–ฌ๐–ญ๐–ฎ๐–ฏ๐–ฐ๐–ฑ๐–ฒ๐–ณ๐–ด๐–ต๐–ถ๐–ท๐–ธ๐–น๐–บ๐–ป๐–ผ๐–ฝ๐–พ๐–ฟ๐—€๐—๐—‚๐—ƒ๐—„๐—…๐—†๐—‡๐—ˆ๐—‰๐—Š๐—‹๐—Œ๐—๐—Ž๐—๐—๐—‘๐—’๐—“" nogreekDigitssansserifUnsupported transform describe "Bold" do let transform = math SansSerif NoItalic Bold it "latin" do transform <$> latin `shouldBe` Just <$> "๐—”๐—•๐—–๐——๐—˜๐—™๐—š๐—›๐—œ๐—๐—ž๐—Ÿ๐— ๐—ก๐—ข๐—ฃ๐—ค๐—ฅ๐—ฆ๐—ง๐—จ๐—ฉ๐—ช๐—ซ๐—ฌ๐—ญ๐—ฎ๐—ฏ๐—ฐ๐—ฑ๐—ฒ๐—ณ๐—ด๐—ต๐—ถ๐—ท๐—ธ๐—น๐—บ๐—ป๐—ผ๐—ฝ๐—พ๐—ฟ๐˜€๐˜๐˜‚๐˜ƒ๐˜„๐˜…๐˜†๐˜‡" it "greek" do transform <$> greek `shouldBe` Just <$> "๐–๐—๐˜๐™๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ง๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐ž€๐ž๐ž‚๐žƒ๐ž„๐ž…๐ž†๐ž‡๐žˆ๐ž‰๐žŠ๐ž‹๐žŒ๐ž๐žŽ๐ž" it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต" unsupportedcheck transform describe "Italic" do describe "NoBold" do let transform = math SansSerif Italic NoBold it "latin" do transform <$> latin `shouldBe` Just <$> "๐˜ˆ๐˜‰๐˜Š๐˜‹๐˜Œ๐˜๐˜Ž๐˜๐˜๐˜‘๐˜’๐˜“๐˜”๐˜•๐˜–๐˜—๐˜˜๐˜™๐˜š๐˜›๐˜œ๐˜๐˜ž๐˜Ÿ๐˜ ๐˜ก๐˜ข๐˜ฃ๐˜ค๐˜ฅ๐˜ฆ๐˜ง๐˜จ๐˜ฉ๐˜ช๐˜ซ๐˜ฌ๐˜ญ๐˜ฎ๐˜ฏ๐˜ฐ๐˜ฑ๐˜ฒ๐˜ณ๐˜ด๐˜ต๐˜ถ๐˜ท๐˜ธ๐˜น๐˜บ๐˜ป" nogreekDigitssansserifUnsupported transform describe "Bold" do let transform = math SansSerif Italic Bold it "latin" do transform <$> latin `shouldBe` Just <$> "๐˜ผ๐˜ฝ๐˜พ๐˜ฟ๐™€๐™๐™‚๐™ƒ๐™„๐™…๐™†๐™‡๐™ˆ๐™‰๐™Š๐™‹๐™Œ๐™๐™Ž๐™๐™๐™‘๐™’๐™“๐™”๐™•๐™–๐™—๐™˜๐™™๐™š๐™›๐™œ๐™๐™ž๐™Ÿ๐™ ๐™ก๐™ข๐™ฃ๐™ค๐™ฅ๐™ฆ๐™ง๐™จ๐™ฉ๐™ช๐™ซ๐™ฌ๐™ญ๐™ฎ๐™ฏ" it "greek" do transform <$> greek `shouldBe` Just <$> "๐ž๐ž‘๐ž’๐ž“๐ž”๐ž•๐ž–๐ž—๐ž˜๐ž™๐žš๐ž›๐žœ๐ž๐žž๐žŸ๐ž ๐žข๐žฃ๐žค๐žฅ๐žฆ๐žง๐žจ๐žฉ๐žก๐žช๐žซ๐žฌ๐žญ๐žฎ๐žฏ๐žฐ๐žฑ๐žฒ๐žณ๐žด๐žต๐žถ๐žท๐žธ๐žน๐žบ๐žป๐žผ๐žฝ๐žพ๐žฟ๐Ÿ€๐Ÿ๐Ÿ‚๐Ÿƒ๐Ÿ„๐Ÿ…๐Ÿ†๐Ÿ‡๐Ÿˆ๐Ÿ‰" it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต" unsupportedcheck transform describe "digit" do describe "Serif" do describe "NoBold" do let transform = digit Serif NoBold nolatin transform nogreek transform it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> digits it "0-9 (int)" do intToDigitChar Serif NoBold <$> [0..9] `shouldBe` Just <$> digits unsupportedcheck transform describe "Bold" do let transform = digit Serif Bold nolatin transform nogreek transform it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—" it "0-9 (int)" do intToDigitChar Serif Bold <$> [0..9] `shouldBe` Just <$> "๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—" unsupportedcheck transform describe "SansSerif" do describe "NoBold" do let transform = digit SansSerif NoBold nolatin transform nogreek transform it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ" it "0-9 (int)" do intToDigitChar SansSerif NoBold <$> [0..9] `shouldBe` Just <$> "๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ" unsupportedcheck transform describe "Bold" do let transform = digit SansSerif Bold nolatin transform nogreek transform it "0-9 (char)" do transform <$> digits `shouldBe` Just <$> "๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต" it "0-9 (int)" do intToDigitChar SansSerif Bold <$> [0..9] `shouldBe` Just <$> "๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต" unsupportedcheck transform describe "doubleStruck" do it "latin" do doubleStruck <$> latin `shouldBe` Just <$> "๐”ธ๐”นโ„‚๐”ป๐”ผ๐”ฝ๐”พโ„๐•€๐•๐•‚๐•ƒ๐•„โ„•๐•†โ„™โ„šโ„๐•Š๐•‹๐•Œ๐•๐•Ž๐•๐•โ„ค๐•’๐•“๐•”๐••๐•–๐•—๐•˜๐•™๐•š๐•›๐•œ๐•๐•ž๐•Ÿ๐• ๐•ก๐•ข๐•ฃ๐•ค๐•ฅ๐•ฆ๐•ง๐•จ๐•ฉ๐•ช๐•ซ" nogreek doubleStruck it "0-9 (char)" do doubleStruck <$> digits `shouldBe` Just <$> "๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก" it "0-9 (int)" do intToDigitDoubleStruck <$> [0..9] `shouldBe` Just <$> "๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก" unsupportedcheck doubleStruck describe "script" do describe "NoBold" do let transform = script NoBold it "latin" do transform <$> latin `shouldBe` Just <$> "๐’œโ„ฌ๐’ž๐’Ÿโ„ฐโ„ฑ๐’ขโ„‹โ„๐’ฅ๐’ฆโ„’โ„ณ๐’ฉ๐’ช๐’ซ๐’ฌโ„›๐’ฎ๐’ฏ๐’ฐ๐’ฑ๐’ฒ๐’ณ๐’ด๐’ต๐’ถ๐’ท๐’ธ๐’นโ„ฏ๐’ปโ„Š๐’ฝ๐’พ๐’ฟ๐“€๐“๐“‚๐“ƒโ„ด๐“…๐“†๐“‡๐“ˆ๐“‰๐“Š๐“‹๐“Œ๐“๐“Ž๐“" nogreekDigitsUnsupported transform describe "Bold" do let transform = script Bold it "latin" do transform <$> latin `shouldBe` Just <$> "๐“๐“‘๐“’๐““๐“”๐“•๐“–๐“—๐“˜๐“™๐“š๐“›๐“œ๐“๐“ž๐“Ÿ๐“ ๐“ก๐“ข๐“ฃ๐“ค๐“ฅ๐“ฆ๐“ง๐“จ๐“ฉ๐“ช๐“ซ๐“ฌ๐“ญ๐“ฎ๐“ฏ๐“ฐ๐“ฑ๐“ฒ๐“ณ๐“ด๐“ต๐“ถ๐“ท๐“ธ๐“น๐“บ๐“ป๐“ผ๐“ฝ๐“พ๐“ฟ๐”€๐”๐”‚๐”ƒ" nogreekDigitsUnsupported transform describe "fraktur" do describe "NoBold" do let transform = fraktur NoBold it "latin" do transform <$> latin `shouldBe` Just <$> "๐”„๐”…โ„ญ๐”‡๐”ˆ๐”‰๐”Šโ„Œโ„‘๐”๐”Ž๐”๐”๐”‘๐”’๐”“๐””โ„œ๐”–๐”—๐”˜๐”™๐”š๐”›๐”œโ„จ๐”ž๐”Ÿ๐” ๐”ก๐”ข๐”ฃ๐”ค๐”ฅ๐”ฆ๐”ง๐”จ๐”ฉ๐”ช๐”ซ๐”ฌ๐”ญ๐”ฎ๐”ฏ๐”ฐ๐”ฑ๐”ฒ๐”ณ๐”ด๐”ต๐”ถ๐”ท" nogreekDigitsUnsupported transform describe "Bold" do let transform = fraktur Bold it "latin" do transform <$> latin `shouldBe` Just <$> "๐•ฌ๐•ญ๐•ฎ๐•ฏ๐•ฐ๐•ฑ๐•ฒ๐•ณ๐•ด๐•ต๐•ถ๐•ท๐•ธ๐•น๐•บ๐•ป๐•ผ๐•ฝ๐•พ๐•ฟ๐–€๐–๐–‚๐–ƒ๐–„๐–…๐–†๐–‡๐–ˆ๐–‰๐–Š๐–‹๐–Œ๐–๐–Ž๐–๐–๐–‘๐–’๐–“๐–”๐–•๐––๐–—๐–˜๐–™๐–š๐–›๐–œ๐–๐–ž๐–Ÿ" nogreekDigitsUnsupported transform describe "monospace" do it "latin" do monospace <$> latin `shouldBe` Just <$> "๐™ฐ๐™ฑ๐™ฒ๐™ณ๐™ด๐™ต๐™ถ๐™ท๐™ธ๐™น๐™บ๐™ป๐™ผ๐™ฝ๐™พ๐™ฟ๐š€๐š๐š‚๐šƒ๐š„๐š…๐š†๐š‡๐šˆ๐š‰๐šŠ๐š‹๐šŒ๐š๐šŽ๐š๐š๐š‘๐š’๐š“๐š”๐š•๐š–๐š—๐š˜๐š™๐šš๐š›๐šœ๐š๐šž๐šŸ๐š ๐šก๐šข๐šฃ" nogreek monospace checkdigits "๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ" monospace it "0-9 (int)" do intToDigitMonospace <$> [0..9] `shouldBe` Just <$> "๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ" unsupportedcheck monospace greek :: String greek = "ฮ‘ฮ’ฮ“ฮ”ฮ•ฮ–ฮ—ฮ˜ฮ™ฮšฮ›ฮœฮฮžฮŸฮ ฮกฮฃฮคฮฅฮฆฮงฮจฮฉโˆ‡ฯดฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰โˆ‚ฯตฯ‘ฯฐฯ•ฯฑฯ–" latin :: String latin = ['A' .. 'Z'] <> ['a' .. 'z'] digits :: String digits = ['0' .. '9'] unsupported :: String unsupported = [ pred 'A', succ 'Z', pred 'a', succ 'z' , pred 'ฮ‘', succ 'ฮฉ', pred 'ฮฑ', succ 'ฯ‰' , pred '0', succ '9' , 'รŸ', '๐‘€' ] checkVal :: String -> String -> [Maybe Char] -> (Char -> Maybe Char) -> SpecWith (Arg Expectation) checkVal name vals expect transform = it name (transform <$> vals `shouldBe` expect) checkVal_ :: String -> String -> String -> (Char -> Maybe Char) -> SpecWith (Arg Expectation) checkVal_ name vals expect = checkVal name vals (Just <$> expect) checkdigits :: String -> (Char -> Maybe Char) -> SpecWith (Arg Expectation) checkdigits = checkVal_ "0-9 (char)" digits checkValFunc :: (String -> [Maybe Char]) -> String -> String -> (Char -> Maybe Char) -> SpecWith (Arg Expectation) checkValFunc f name vals = checkVal name vals (f vals) notsupported :: String -> String -> (Char -> Maybe Char) -> SpecWith (Arg Expectation) notsupported = checkValFunc (Nothing <$) unsupportedcheck :: (Char -> Maybe Char) -> SpecWith (Arg Expectation) unsupportedcheck = notsupported "unsupported" unsupported nogreek :: (Char -> Maybe Char) -> SpecWith (Arg Expectation) nogreek = notsupported "greek" greek nolatin :: (Char -> Maybe Char) -> SpecWith (Arg Expectation) nolatin = notsupported "latin" latin nodigits :: (Char -> Maybe Char) -> SpecWith (Arg Expectation) nodigits = notsupported "0-9 (char)" digits nogreekDigitsUnsupported :: (Char -> Maybe Char) -> SpecWith (Arg Expectation) nogreekDigitsUnsupported transform = nogreek transform >> nodigits transform >> unsupportedcheck transform nogreekDigitssansserifUnsupported :: (Char -> Maybe Char) -> SpecWith (Arg Expectation) nogreekDigitssansserifUnsupported transform = nogreek transform >> checkdigits "๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ" transform >> unsupportedcheck transform