File: ImportExport.hs

package info (click to toggle)
haskell-feed 1.3.2.1-4
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 816 kB
  • sloc: haskell: 4,735; xml: 4,315; makefile: 2
file content (44 lines) | stat: -rw-r--r-- 1,459 bytes parent folder | download | duplicates (3)
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
module ImportExport
  ( importExportTests
  ) where

import Prelude.Compat

import Data.Generics (everywhere, mkT)
import Data.Text (strip)
import qualified Data.Text.Lazy.IO as T
import qualified Data.XML.Types as XML
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit ((@=?))
import qualified Text.XML as C

import Text.Feed.Export (xmlFeed)
import Text.Feed.Import (readAtom)
import Text.Feed.Types (Feed)
import Text.RSS.Utils (elementToDoc)

import Paths_feed

importExportTests :: Test
importExportTests =
  testGroup "ImportExport" [testImportExport readAtom "tests/files/import_export_atom.xml"]

testImportExport :: (XML.Element -> Maybe Feed) -> FilePath -> Test
testImportExport readFeed fileName =
  testCase fileName $ do
    input <- T.readFile =<< getDataFileName fileName
    let inputXml = C.parseText_ C.def input
    let Just feed = readFeed $ C.toXMLElement $ C.documentRoot inputXml
    let Just outputXml = elementToDoc $ xmlFeed feed
    let output = C.renderText C.def outputXml
    let input' = C.renderText C.def $ stripXmlWhitespace inputXml
    input' @=? output

stripXmlWhitespace :: C.Document -> C.Document
stripXmlWhitespace = everywhere (mkT stripWhitespaceNodes)
  where
    stripWhitespaceNodes e = e {C.elementNodes = filter (not . isWhite) (C.elementNodes e)}
    isWhite (C.NodeContent t) = strip t == ""
    isWhite (C.NodeComment _) = True
    isWhite _ = False