summaryrefslogtreecommitdiff
path: root/tests/Tests.hs
blob: f8a915eced5c09b4d9a0896bdf38e1e1f8f817b4 (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
import Data.Char
import qualified Data.Map as M

import Test.Framework (defaultMain, testGroup)
import Test.Framework.Providers.QuickCheck2
import Test.Framework.Providers.HUnit
import Test.QuickCheck
import Test.HUnit

import Text.Hakyll.CompressCSS
import Text.Hakyll.Util
import Text.Hakyll.Regex
import Text.Hakyll.Context
import Text.Hakyll.File

main = defaultMain tests

tests = [ testGroup "Util group"
            [ testProperty "trim length" prop_trim_length
            -- , testProperty "trim id" prop_trim_id
            -- , testProperty "trim empty" prop_trim_empty
            , testCase "stripHTML 1" test_strip_html1
            , testCase "stripHTML 2" test_strip_html2
            , testCase "stripHTML 3" test_strip_html3
            , testCase "link 1" test_link1
            , testCase "link 2" test_link2
            ]

        , testGroup "Regex group"
            [ testCase "splitRegex 1" test_split_regex1
            , testCase "splitRegex 2" test_split_regex2
            ]

        , testGroup "CompressCSS group" 
            [ testProperty "compressCSS length" prop_compress_css_length
            , testCase "compressCSS 1" test_compress_css1
            , testCase "compressCSS 2" test_compress_css2
            , testCase "compressCSS 3" test_compress_css3
            , testCase "compressCSS 4" test_compress_css4
            ]

        , testGroup "Context group"
            [ testCase "renderDate 1" test_render_date1
            , testCase "renderDate 2" test_render_date1
            , testCase "changeExtension 1" test_change_extension1
            ]

        , testGroup "File group"
            [ testCase "toRoot 1" test_to_root1
            , testCase "toRoot 2" test_to_root2
            , testCase "toRoot 3" test_to_root3
            , testCase "removeSpaces 1" test_remove_spaces1
            , testCase "removeSpaces 2" test_remove_spaces2
            -- , testProperty "havingExtension count" prop_having_extension_count
            , testCase "havingExtension 1" test_having_extension1
            , testCase "havingExtension 2" test_having_extension2
            ]
        ]

-- Test that a string always becomes shorter when trimmed.
prop_trim_length str = length str >= length (trim str)

-- Check that a string which does not start or end with a space is not trimmed.
prop_trim_id str = isAlreadyTrimmed ==> str == (trim str)
  where
    isAlreadyTrimmed :: Bool
    isAlreadyTrimmed = (not $ isSpace $ head str) && (not $ isSpace $ last str)

-- An string of only spaces should be reduced to an empty string.
prop_trim_empty str = (all isSpace str) ==> null (trim str)

-- Strip HTML test cases.
test_strip_html1 = stripHTML "<b>text</b>" @?= "text"
test_strip_html2 = stripHTML "text" @?= "text"
test_strip_html3 =
    stripHTML "<b>Hakyll</b>, a <i>website</i> generator<img src=\"foo.png\" />"
        @?= "Hakyll, a website generator"

-- Link test cases.
test_link1 = link "foo bar" "/foo/bar.html"
           @?= "<a href=\"/foo/bar.html\">foo bar</a>"
test_link2 = link "back home" "/" @?= "<a href=\"/\">back home</a>"

-- Split Regex test cases.
test_split_regex1 = splitRegex "," "1,2,3" @?= ["1", "2", "3"]
test_split_regex2 = splitRegex "," ",1,2," @?= ["1", "2"]

-- CSS compression should always decrease the text length.
prop_compress_css_length str = length str >= length (compressCSS str)

-- Compress CSS test cases.
test_compress_css1 = compressCSS "a {  \n color  : red;  }" @?= "a{color:red}"
test_compress_css2 = compressCSS "img {border  :none;;;;  }"
                   @?= "img{border:none}"
test_compress_css3 =
    compressCSS "p {font-size  : 90%;} h1 {color  :white;;;  }"
    @?= "p{font-size:90%}h1{color:white}"
test_compress_css4 = compressCSS "a { /* /* red is pretty cool */ color: red; }"
                   @?= "a{color:red}"

-- Date rendering test cases.
test_render_date1 =
    M.lookup "date" rendered @?= Just "December 30, 2009"
  where
    rendered = renderDate "date" "%B %e, %Y" "Unknown date"
                          (M.singleton "path" "2009-12-30-a-title.markdown")

test_render_date2 = M.lookup "date" rendered @?= Just "Unknown date"
  where
    rendered = renderDate "date" "%B %e, %Y" "Unknown date" $
                          M.singleton "path" "2009-badness-30-a-title.markdown"

-- changeExtension test cases.
test_change_extension1 = M.lookup "url" rendered @?= Just "foo.php"
  where
    rendered = changeExtension "php" (M.singleton "url" "foo.html")

-- toRoot test cases
test_to_root1 = toRoot "/posts/foo.html" @?= ".."
test_to_root2 = toRoot "posts/foo.html" @?= ".."
test_to_root3 = toRoot "foo.html" @?= "."

-- removeSpaces test cases
test_remove_spaces1 = removeSpaces "$root/tags/random crap.html"
                    @?= "$root/tags/random-crap.html"
test_remove_spaces2 = removeSpaces "another simple example.zip"
                    @?= "another-simple-example.zip"

-- Add an extension, and test that they have that extension
prop_having_extension_count names extension =
    not (any ('.' `elem`) names || any (`elem` extension) "./\\")
    ==> havingExtension fullExtension withExtensions == withExtensions
  where
    fullExtension = '.' : extension
    withExtensions = map (++ fullExtension) names

-- Having extension test cases
test_having_extension1 = havingExtension ".foo" ["file.bar", "file.txt"] @?= []
test_having_extension2 = havingExtension ".foo" ["file.foo", "file.txt"]
                       @?= ["file.foo"]