{-# LANGUAGE TemplateHaskell #-} {-| Unittests for Attoparsec support for unicode -} {- Copyright (C) 2012 Google Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -} module Test.Ganeti.Attoparsec (testAttoparsec) where import Test.HUnit import Test.Ganeti.TestHelper import qualified Data.Attoparsec.Text as A import Data.Attoparsec.Text (Parser) import Data.Text (pack, unpack) -- | Unicode test string, first part. part1 :: String part1 = "äßĉ" -- | Unicode test string, second part. part2 :: String part2 = "ðèق" -- | Simple parser able to split a string in two parts, name and -- value, separated by a '=' sign. simpleParser :: Parser (String, String) simpleParser = do n <- A.takeTill (\c -> A.isHorizontalSpace c || c == '=') A.skipWhile A.isHorizontalSpace _ <- A.char '=' A.skipWhile A.isHorizontalSpace v <- A.takeTill A.isEndOfLine return (unpack n, unpack v) {-# ANN case_unicodeParsing "HLint: ignore Use camelCase" #-} -- | Tests whether a Unicode string is still Unicode after being -- parsed. case_unicodeParsing :: Assertion case_unicodeParsing = case A.parseOnly simpleParser text of Right (name, value) -> do assertEqual "name part" part1 name assertEqual "value part" part2 value Left msg -> assertFailure $ "Failed to parse: " ++ msg where text = Data.Text.pack $ part1 ++ " = \t" ++ part2 testSuite "Attoparsec" [ 'case_unicodeParsing ]