import Database.Groundhog.TH (
groundhog,
mkPersist )
+import System.Console.CmdArgs.Default ( Default(..) )
import Test.Tasty ( TestTree, testGroup )
import Test.Tasty.HUnit ( (@?=), testCase )
import Text.XML.HXT.Core (
PU,
XmlPickler(..),
unpickleDoc,
- xp12Tuple,
+ xp13Tuple,
xpAttr,
xpElem,
+ xpInt,
xpList,
xpOption,
xpPair,
- xpPrim,
xpText,
xpTriple,
xpWrap )
import TSN.Codegen (
tsn_codegen_config,
- tsn_db_field_namer -- Used in a test.
- )
+ tsn_db_field_namer ) -- Used in a test
import TSN.DbImport ( DbImport(..), ImportResult(..) )
-import Xml ( ToFromXml(..), pickle_unpickle )
+import Xml ( ToFromXml(..), pickle_unpickle, unpickleable )
xml_teams :: [NewsTeamXml],
xml_locations :: [NewsLocationXml],
xml_sms :: String,
+ xml_editor :: Maybe String,
xml_text :: String,
xml_continue :: String,
xml_time_stamp :: String }
db_sport :: String,
db_url :: String,
db_sms :: String,
+ db_editor :: Maybe String,
db_text :: String,
db_continue :: String }
deriving (Data, Eq, Show, Typeable)
-- used our named fields.
to_xml (Message {..}) =
MessageXml
- 0
- ""
+ def
+ def
db_mid
- ""
+ def
db_sport
db_url
- []
- []
+ def
+ def
db_sms
+ db_editor
db_text
db_continue
- ""
+ def
-- We don't need the key argument (from_xml_fk) since the XML type
-- contains more information in this case.
- from_xml (MessageXml _ _ c _ e f _ _ g h i _) =
- Message c e f g h i
+ from_xml (MessageXml _ _ c _ e f _ _ i j k l _) =
+ Message c e f i j k l
mkPersist tsn_codegen_config [groundhog|
pickle_msg_id =
xpElem "msg_id" $
xpWrap (from_tuple, to_tuple) $
- xpPair xpPrim (xpAttr "EventId" (xpOption xpPrim))
+ xpPair xpInt (xpAttr "EventId" (xpOption xpInt))
where
from_tuple = uncurryN MsgId
to_tuple m = (db_msg_id m, db_event_id m)
pickle_message =
xpElem "message" $
xpWrap (from_tuple, to_tuple) $
- xp12Tuple (xpElem "XML_File_ID" xpPrim)
+ xp13Tuple (xpElem "XML_File_ID" xpInt)
(xpElem "heading" xpText)
pickle_msg_id
(xpElem "category" xpText)
(xpElem "sport" xpText)
(xpElem "url" xpText)
- (xpList $ pickle_news_team)
- (xpList $ pickle_location)
+ (xpList pickle_news_team)
+ (xpList pickle_location)
(xpElem "SMS" xpText)
+ (xpOption (xpElem "Editor" xpText))
(xpElem "text" xpText)
pickle_continue
(xpElem "time_stamp" xpText)
xml_teams m,
xml_locations m,
xml_sms m,
+ xml_editor m,
xml_text m,
xml_continue m,
xml_time_stamp m)
pickle_continue =
xpWrap (to_string, from_string) $
xpElem "continue" $
- (xpList $ xpElem "P" xpText)
+ xpList (xpElem "P" xpText)
where
from_string :: String -> [String]
from_string = split "\n"
testGroup
"News tests"
[ test_news_fields_have_correct_names,
- test_pickle_of_unpickle_is_identity ]
-
-
-test_pickle_of_unpickle_is_identity :: TestTree
-test_pickle_of_unpickle_is_identity =
- testCase "pickle composed with unpickle is the identity" $ do
- let path = "test/xml/newsxml.xml"
- (expected :: [MessageXml], actual) <- pickle_unpickle "message" path
- actual @?= expected
+ test_pickle_of_unpickle_is_identity,
+ test_unpickle_succeeds ]
test_news_fields_have_correct_names :: TestTree
test_news_fields_have_correct_names =
- testCase "news fields get correct database names" $ do
+ testCase "news fields get correct database names" $
mapM_ check (zip actual expected)
where
-- This is cool, it uses the (derived) Data instance of
map (\x -> tsn_db_field_namer "herp" "derp" 8675309 x 90210) field_names
actual :: [String]
- actual = ["mid", "sport", "url", "sms", "text", "continue"]
+ actual = ["mid", "sport", "url", "sms", "editor", "text", "continue"]
check (x,y) = (x @?= y)
+
+
+-- | Warning, succeess of this test does not mean that unpickling
+-- succeeded.
+test_pickle_of_unpickle_is_identity :: TestTree
+test_pickle_of_unpickle_is_identity = testGroup "pickle-unpickle tests"
+ [ check "pickle composed with unpickle is the identity"
+ "test/xml/newsxml.xml",
+
+ check "pickle composed with unpickle is the identity (with Editor)"
+ "test/xml/newsxml-with-editor.xml" ]
+ where
+ check desc path = testCase desc $ do
+ (expected :: [MessageXml], actual) <- pickle_unpickle "message" path
+ actual @?= expected
+
+
+test_unpickle_succeeds :: TestTree
+test_unpickle_succeeds = testGroup "unpickle tests"
+ [ check "unpickling succeeds"
+ "test/xml/newsxml.xml",
+
+ check "unpickling succeeds (with Editor)"
+ "test/xml/newsxml-with-editor.xml" ]
+ where
+ check desc path = testCase desc $ do
+ actual <- unpickleable path pickle_message
+ let expected = True
+ actual @?= expected