import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Text.Regex.Posix ((=~))
+import Text.XML.HXT.Core (
+ (>>>),
+ arr,
+ hread,
+ selem,
+ none,
+ runX,
+ txt,
+ xshow)
import LWN.URI (
add_trailing_slash,
try_make_absolute_url,
make_https)
-import LWN.XHTML (XHTML, to_xhtml)
+import LWN.XHTML (XHTML, XML, to_xhtml, to_xml)
newtype Title = Title { getTitle :: String }
newtype Byline = Byline { getByline :: Maybe String }
instance XHTML BodyHtml where
to_xhtml = getBodyHtml
+
+instance XML Title where
+ to_xml (Title t) =
+ selem "h2" [ txt t ]
+
+instance XML Byline where
+ to_xml (Byline (Just bl)) =
+ selem "p" [ selem "em" [ txt bl ] ]
+ to_xml (Byline Nothing) = none
+
+instance XML BodyHtml where
+ to_xml (BodyHtml bh) =
+ (arr $ const bh) >>> hread
+
data Article = Article { title :: Title,
byline :: Byline,
body_html :: BodyHtml }
instance XHTML Article where
to_xhtml (Article t bl b) =
+ "<div>" ++
(to_xhtml t) ++
(to_xhtml bl) ++
- (to_xhtml b)
-
+ (to_xhtml b) ++
+ "</div>"
+instance XML Article where
+ to_xml (Article t bl b) =
+ selem "div" [to_xml t, to_xml bl, to_xml b]
-- | Convert the given article to either a URL or a filesystem
-- path. If the given article exists on the filesystem, we assume
actual <- real_article_path "http://lwn.net/Articles/502979/"
assertEqual "Non-https URL made https" expected actual
+
+
+-- | Compares the output of (xshow . to_xml) and to_xhtml; they should
+-- match.
+test_to_xml :: Assertion
+test_to_xml = do
+ actual_xml' <- runX . xshow $ to_xml input_article
+ let actual_xml = actual_xml' !! 0
+
+ let expected_xml = to_xhtml input_article
+
+ assertEqual
+ "The to_xml function works on a trivial example"
+ expected_xml
+ actual_xml
+ where
+ t = Title "Hello, world!"
+ bl = Byline $ Just "Breaking News"
+ b = BodyHtml "<p>Hello, world!</p>"
+ input_article = Article t bl b
+
+
+
article_tests :: Test
article_tests =
testGroup "Article Tests" [
test_current_bigpage_article_path,
testCase "Numbered article path constructed" test_numbered_article_path,
testCase "Full article path left alone" test_full_article_path,
- testCase "Non-https URL made https" test_non_https_article_path ]
+ testCase "Non-https URL made https" test_non_https_article_path,
+ testCase "The to_xml function works on a trivial example" test_to_xml ]