From 060b05b2b47e92168c79db77bfda4b0f2dce3fdb Mon Sep 17 00:00:00 2001
From: Mikhail Glushenkov <the.dead.shall.rise@gmail.com>
Date: Mon, 31 Dec 2012 06:24:43 +0100
Subject: [PATCH] Add unit tests for the UserConstraint parser.

---
 cabal-install/cabal-install.cabal             | 13 ++++
 cabal-install/tests/UnitTests.hs              | 15 +++++
 .../UnitTests/Distribution/Client/Targets.hs  | 59 +++++++++++++++++++
 3 files changed, 87 insertions(+)
 create mode 100644 cabal-install/tests/UnitTests.hs
 create mode 100644 cabal-install/tests/UnitTests/Distribution/Client/Targets.hs

diff --git a/cabal-install/cabal-install.cabal b/cabal-install/cabal-install.cabal
index 731ec5f732..7b341d7019 100644
--- a/cabal-install/cabal-install.cabal
+++ b/cabal-install/cabal-install.cabal
@@ -165,3 +165,16 @@ Executable cabal
     else
       build-depends: base       >= 3,
                      directory  >= 1 && < 1.3
+
+Test-Suite unit-tests
+  type: exitcode-stdio-1.0
+  main-is: UnitTests.hs
+  hs-source-dirs: tests
+  build-depends:
+        base,
+        test-framework,
+        test-framework-hunit,
+        HUnit,
+        cabal-install,
+        Cabal
+  ghc-options: -Wall
diff --git a/cabal-install/tests/UnitTests.hs b/cabal-install/tests/UnitTests.hs
new file mode 100644
index 0000000000..6d5d47a02a
--- /dev/null
+++ b/cabal-install/tests/UnitTests.hs
@@ -0,0 +1,15 @@
+module Main
+       where
+
+import Test.Framework
+
+import qualified UnitTests.Distribution.Client.Targets
+
+tests :: [Test]
+tests = [
+    testGroup "Distribution.Client.Targets"
+        UnitTests.Distribution.Client.Targets.tests
+    ]
+
+main :: IO ()
+main = defaultMain tests
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs b/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs
new file mode 100644
index 0000000000..e641c50a42
--- /dev/null
+++ b/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs
@@ -0,0 +1,59 @@
+module UnitTests.Distribution.Client.Targets (
+  tests
+  ) where
+
+import Distribution.Client.Targets     (UserConstraint (..), readUserConstraint)
+import Distribution.Compat.ReadP       (ReadP, readP_to_S)
+import Distribution.Package            (PackageName (..))
+import Distribution.ParseUtils         (parseCommaList)
+import Distribution.Text               (parse)
+
+import Test.Framework                  as TF (Test)
+import Test.Framework.Providers.HUnit  (testCase)
+import Test.HUnit                      (Assertion, assertEqual)
+
+import Data.Char                       (isSpace)
+
+tests :: [TF.Test]
+tests = [ testCase "readUserConstraint" readUserConstraintTest
+        , testCase "parseUserConstraint" parseUserConstraintTest
+        , testCase "readUserConstraints" readUserConstraintsTest
+        ]
+
+readUserConstraintTest :: Assertion
+readUserConstraintTest =
+  assertEqual ("Couldn't read constraint: '" ++ constr ++ "'") expected actual
+  where
+    pkgName  = "template-haskell"
+    constr   = pkgName ++ " installed"
+
+    expected = UserConstraintInstalled (PackageName pkgName)
+    actual   = let (Right r) = readUserConstraint constr in r
+
+parseUserConstraintTest :: Assertion
+parseUserConstraintTest =
+  assertEqual ("Couldn't parse constraint: '" ++ constr ++ "'") expected actual
+  where
+    pkgName  = "template-haskell"
+    constr   = pkgName ++ " installed"
+
+    expected = [UserConstraintInstalled (PackageName pkgName)]
+    actual   = [ x | (x, ys) <- readP_to_S parseUserConstraint constr
+                   , all isSpace ys]
+
+    parseUserConstraint :: ReadP r UserConstraint
+    parseUserConstraint = parse
+
+readUserConstraintsTest :: Assertion
+readUserConstraintsTest =
+  assertEqual ("Couldn't read constraints: '" ++ constr ++ "'") expected actual
+  where
+    pkgName  = "template-haskell"
+    constr   = pkgName ++ " installed"
+
+    expected = [[UserConstraintInstalled (PackageName pkgName)]]
+    actual   = [ x | (x, ys) <- readP_to_S parseUserConstraints constr
+                   , all isSpace ys]
+
+    parseUserConstraints :: ReadP r [UserConstraint]
+    parseUserConstraints = parseCommaList parse
-- 
GitLab