gnuidn 0.2.1 → 0.2.2
raw patch · 4 files changed
+171/−5 lines, 4 filesdep +QuickCheckdep +chelldep +chell-quickcheck
Dependencies added: QuickCheck, chell, chell-quickcheck, gnuidn
Files
- gnuidn.cabal +27/−3
- lib/Data/Text/IDN/IDNA.chs +1/−1
- lib/Data/Text/IDN/Punycode.chs +1/−1
- tests/Tests.hs +142/−0
gnuidn.cabal view
@@ -1,11 +1,11 @@ name: gnuidn-version: 0.2.1+version: 0.2.2 license: GPL-3 license-file: license.txt author: John Millikin maintainer: jmillikin@gmail.com build-type: Simple-cabal-version: >= 1.6+cabal-version: >= 1.8 category: Codec, Text stability: experimental homepage: https://john-millikin.com/software/haskell-gnuidn/@@ -13,6 +13,9 @@ synopsis: Bindings for GNU IDN +extra-source-files:+ tests/*.hs+ source-repository head type: git location: https://john-millikin.com/code/haskell-gnuidn/@@ -20,7 +23,7 @@ source-repository this type: git location: https://john-millikin.com/code/haskell-gnuidn/- tag: haskell-gnuidn_0.2.1+ tag: haskell-gnuidn_0.2.2 library ghc-options: -Wall -O2@@ -44,3 +47,24 @@ other-modules: Data.Text.IDN.Internal++test-suite gnuidn_tests+ type: exitcode-stdio-1.0+ main-is: Tests.hs+ hs-source-dirs: tests++ build-depends:+ base >= 4.0 && < 5.0+ , bytestring+ , chell >= 0.4 && < 0.5+ , chell-quickcheck >= 0.2 && < 0.3+ , gnuidn+ , QuickCheck >= 2.4+ , text++ extra-libraries: idn+ pkgconfig-depends: libidn++ build-tools:+ c2hs+
lib/Data/Text/IDN/IDNA.chs view
@@ -102,7 +102,7 @@ encodeFlags :: Flags -> CInt encodeFlags flags = foldr (.|.) 0 bits where- bitAt f e = if f flags then 0 else fromIntegral (fromEnum e)+ bitAt f e = if f flags then fromIntegral (fromEnum e) else 0 bits = [ bitAt verifySTD3 USE_STD3_ASCII_RULES , bitAt allowUnassigned ALLOW_UNASSIGNED ]
lib/Data/Text/IDN/Punycode.chs view
@@ -76,7 +76,7 @@ outBuf let rc = fromIntegral c_rc- if rc == fromEnum OVERFLOW+ if rc == fromEnum BIG_OUTPUT then return Nothing else if rc == fromEnum SUCCESS then do
+ tests/Tests.hs view
@@ -0,0 +1,142 @@+{-# LANGUAGE TemplateHaskell #-}++-- Copyright (C) 2015 John Millikin <john@john-millikin.com>+-- +-- 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 3 of the License, or+-- 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, see <http://www.gnu.org/licenses/>.++module Main+ ( tests+ , main+ ) where++import qualified Data.ByteString.Char8 as B8+import qualified Data.Text as T+import qualified Data.Text.IDN.IDNA as IDNA+import qualified Data.Text.IDN.Punycode as PC+import qualified Data.Text.IDN.StringPrep as SP+import Test.Chell+import Test.Chell.QuickCheck+import Test.QuickCheck hiding (property)++tests :: [Suite]+tests =+ [ suite_IDNA+ , suite_Punycode+ , suite_StringPrep+ ]++suite_IDNA :: Suite+suite_IDNA = suite "idna"+ [ test_IDNA_toASCII+ , test_IDNA_toUnicode+ ]++test_IDNA_toASCII :: Test+test_IDNA_toASCII = assertions "toASCII" $ do+ let toASCII = IDNA.toASCII+ let defaultFlags = IDNA.defaultFlags+ $expect $ equal+ (toASCII defaultFlags (t "helloworld.com"))+ (Right (b8 "helloworld.com"))+ $expect $ equal+ (toASCII defaultFlags (t "преве́д.com"))+ (Right (b8 "xn--lsa32dhabb1dh.com"))++ -- verifySTD3 permits non-hostname strings.+ $expect $ left (toASCII defaultFlags (t "not valid"))+ $expect $ equal+ (toASCII defaultFlags{IDNA.verifySTD3=False} (t "not valid"))+ (Right (b8 "not valid"))++ -- allowUnassigned permits unassigned codepoints.+ $expect $ left (toASCII defaultFlags (t "\x070E"))+ $expect $ equal+ (toASCII defaultFlags{IDNA.allowUnassigned=True} (t "\x070E"))+ (Right (b8 "xn--7mb"))++test_IDNA_toUnicode :: Test+test_IDNA_toUnicode = assertions "toUnicode" $ do+ let toUnicode = IDNA.toUnicode+ let defaultFlags = IDNA.defaultFlags+ $expect $ equal+ (toUnicode defaultFlags (b8 "helloworld.com"))+ (t "helloworld.com")+ $expect $ equal+ (toUnicode defaultFlags (b8 "xn--lsa32dhabb1dh.com"))+ (t "преве́д.com")++ -- allowUnassigned permits unassigned codepoints.+ $expect $ equal+ (toUnicode defaultFlags (b8 "xn--7mb"))+ (t "xn--7mb")+ $expect $ equal+ (toUnicode defaultFlags{IDNA.allowUnassigned=True} (b8 "xn--7mb"))+ (t "\x070E")++suite_Punycode :: Suite+suite_Punycode = suite "punycode"+ [ test_Punycode_Encode+ , test_Punycode_Decode+ ]++test_Punycode_Encode :: Test+test_Punycode_Encode = assertions "encode" $ do+ $expect (equal+ (PC.encode (t "преве́д") Nothing)+ (b8 "lsa32dhabb1dh"))+ $expect (equal+ (PC.encode (t "преве́д") (Just (== 0)))+ (b8 "lsa32dhabb1Dh"))++test_Punycode_Decode :: Test+test_Punycode_Decode = assertions "decode" $ do+ do+ let dec = PC.decode (b8 "lsa32dhabb1dh")+ $assert (just dec)+ let Just (txt,_) = dec+ $expect (equal txt (t "преве́д"))+ do+ let dec = PC.decode (b8 "lsa32dhabb1Dh")+ $assert (just dec)+ let Just (txt,fn) = dec+ $expect (equal txt (t "преве́д"))+ $expect (equal (fn 0) True)+ $expect (equal (fn 1) False)++suite_StringPrep :: Suite+suite_StringPrep = suite "stringprep"+ [ test_StringPrep_SASL+ ]++test_StringPrep_SASL :: Test+test_StringPrep_SASL = assertions "sasl" $ do+ -- http://www.ietf.org/mail-archive/web/sasl/current/msg02723.html+ -- http://www.ietf.org/mail-archive/web/sasl/current/msg02722.html+ let prep s = SP.stringprep SP.sasl SP.defaultFlags (t s)+ $expect $ equal (prep "x\xADy") (Right (t "xy"))+ $expect $ equal (prep "user") (Right (t "user"))+ $expect $ equal (prep "USER") (Right (t "USER"))+ $expect $ equal (prep "\x2163") (Right (t "IV"))+ $expect $ left (prep "\x7")+ $expect $ left (prep "\x627\x31")+ $expect $ equal (prep "\xAA") (Right (t "a"))++main :: IO ()+main = Test.Chell.defaultMain tests++t :: String -> T.Text+t = T.pack++b8 :: String -> B8.ByteString+b8 = B8.pack