Skip to content

Commit 6bddcc3

Browse files
committed
Move JSONTestSuite to own module
1 parent 7d977fd commit 6bddcc3

File tree

4 files changed

+88
-75
lines changed

4 files changed

+88
-75
lines changed

aeson.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ test-suite aeson-tests
166166
ErrorMessages
167167
Functions
168168
Instances
169+
JSONTestSuite
169170
Options
170171
Properties
171172
PropertyGeneric

tests/JSONTestSuite.hs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
module JSONTestSuite (tests) where
2+
3+
import Test.Tasty (TestTree, testGroup)
4+
import Data.Either.Compat (isLeft, isRight)
5+
import Test.Tasty.HUnit ( testCase, assertBool )
6+
import System.Directory (getDirectoryContents)
7+
import System.FilePath ((</>), takeExtension, takeFileName)
8+
import Data.List (sort)
9+
import Control.Monad (forM)
10+
11+
import qualified Data.ByteString.Lazy as L
12+
import qualified Data.HashSet as HashSet
13+
14+
import Data.Aeson
15+
16+
jsonTestSuiteTest :: FilePath -> TestTree
17+
jsonTestSuiteTest path = testCase fileName $ do
18+
payload <- L.readFile path
19+
let result = eitherDecode payload :: Either String Value
20+
assertBool (show result) $ case take 2 fileName of
21+
"i_" -> isRight result
22+
"n_" -> isLeft result
23+
"y_" -> isRight result
24+
_ -> isRight result -- test_transform tests have inconsistent names
25+
where
26+
fileName = takeFileName path
27+
28+
-- Build a collection of tests based on the current contents of the
29+
-- JSONTestSuite test directories.
30+
31+
tests :: IO TestTree
32+
tests = do
33+
let suitePath = "tests/JSONTestSuite"
34+
let suites = ["test_parsing", "test_transform"]
35+
testPaths <- fmap (sort . concat) . forM suites $ \suite -> do
36+
let dir = suitePath </> suite
37+
entries <- getDirectoryContents dir
38+
let ok name = takeExtension name == ".json" &&
39+
not (name `HashSet.member` blacklist)
40+
return . map (dir </>) . filter ok $ entries
41+
return $ testGroup "JSONTestSuite" $ map jsonTestSuiteTest testPaths
42+
43+
-- The set expected-to-be-failing JSONTestSuite tests.
44+
-- Not all of these failures are genuine bugs.
45+
-- Of those that are bugs, not all are worth fixing.
46+
47+
blacklist :: HashSet.HashSet String
48+
-- blacklist = HashSet.empty
49+
blacklist = _blacklist
50+
51+
_blacklist :: HashSet.HashSet String
52+
_blacklist = HashSet.fromList
53+
[ "i_string_UTF8_surrogate_U+D800.json"
54+
, "i_object_key_lone_2nd_surrogate.json"
55+
, "i_string_1st_surrogate_but_2nd_missing.json"
56+
, "i_string_1st_valid_surrogate_2nd_invalid.json"
57+
, "i_string_UTF-16LE_with_BOM.json"
58+
, "i_string_UTF-16_invalid_lonely_surrogate.json"
59+
, "i_string_UTF-16_invalid_surrogate.json"
60+
, "i_string_UTF-8_invalid_sequence.json"
61+
, "i_string_incomplete_surrogate_and_escape_valid.json"
62+
, "i_string_incomplete_surrogate_pair.json"
63+
, "i_string_incomplete_surrogates_escape_valid.json"
64+
, "i_string_invalid_lonely_surrogate.json"
65+
, "i_string_invalid_surrogate.json"
66+
, "i_string_inverted_surrogates_U+1D11E.json"
67+
, "i_string_lone_second_surrogate.json"
68+
, "i_string_not_in_unicode_range.json"
69+
, "i_string_truncated-utf-8.json"
70+
, "i_structure_UTF-8_BOM_empty_object.json"
71+
, "string_1_escaped_invalid_codepoint.json"
72+
, "string_1_invalid_codepoint.json"
73+
, "string_1_invalid_codepoints.json"
74+
, "string_2_escaped_invalid_codepoints.json"
75+
, "string_2_invalid_codepoints.json"
76+
, "string_3_escaped_invalid_codepoints.json"
77+
, "string_3_invalid_codepoints.json"
78+
, "y_string_utf16BE_no_BOM.json"
79+
, "y_string_utf16LE_no_BOM.json"
80+
]

tests/Tests.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import Test.Tasty (defaultMain, testGroup)
88
import qualified DataFamilies.Properties as DF
99
import qualified Properties
1010
import qualified UnitTests
11+
import qualified JSONTestSuite
1112

1213
main :: IO ()
1314
main = do
1415
ioTests <- UnitTests.ioTests
15-
let allTests = DF.tests : Properties.tests : UnitTests.tests : ioTests
16+
jsTests <- JSONTestSuite.tests
17+
let allTests = DF.tests : Properties.tests : UnitTests.tests : jsTests : ioTests
1618
defaultMain (testGroup "tests" allTests)

tests/UnitTests.hs

Lines changed: 4 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ import qualified Data.Aeson.Types
4949
import qualified Data.Aeson.KeyMap as KM
5050
import Data.Attoparsec.ByteString (Parser, parseOnly)
5151
import Data.Char (toUpper, GeneralCategory(Control,Surrogate), generalCategory)
52-
import Data.Either.Compat (isLeft, isRight)
5352
import Data.Hashable (hash)
5453
import Data.HashMap.Strict (HashMap)
55-
import Data.List (sort, isSuffixOf)
54+
import Data.List (isSuffixOf)
5655
import Data.Maybe (fromMaybe)
5756
import Data.Scientific (Scientific, scientific)
5857
import Data.Tagged (Tagged(..))
@@ -63,16 +62,13 @@ import GHC.Generics (Generic)
6362
import GHC.Generics.Generically (Generically (..))
6463
import Instances ()
6564
import Numeric.Natural (Natural)
66-
import System.Directory (getDirectoryContents)
67-
import System.FilePath ((</>), takeExtension, takeFileName)
6865
import Test.Tasty (TestTree, testGroup)
69-
import Test.Tasty.HUnit (Assertion, assertBool, assertFailure, assertEqual, testCase, (@?=))
66+
import Test.Tasty.HUnit (Assertion, assertFailure, assertEqual, testCase, (@?=))
7067
import Text.Printf (printf)
7168
import UnitTests.NullaryConstructors (nullaryConstructors)
7269
import qualified Data.ByteString as S
7370
import qualified Data.ByteString.Base16.Lazy as LBase16
7471
import qualified Data.ByteString.Lazy.Char8 as L
75-
import qualified Data.HashSet as HashSet
7672
import qualified Data.Text.Lazy as LT
7773
import qualified Data.Text.Lazy.Builder as TLB
7874
import qualified Data.Text.Lazy.Encoding as LT
@@ -420,72 +416,7 @@ unescapeString = do
420416
Surrogate -> False
421417
_ -> True
422418

423-
-- JSONTestSuite
424-
425-
jsonTestSuiteTest :: FilePath -> TestTree
426-
jsonTestSuiteTest path = testCase fileName $ do
427-
payload <- L.readFile path
428-
let result = eitherDecode payload :: Either String Value
429-
assertBool fileName $ case take 2 fileName of
430-
"i_" -> isRight result
431-
"n_" -> isLeft result
432-
"y_" -> isRight result
433-
_ -> isRight result -- test_transform tests have inconsistent names
434-
where
435-
fileName = takeFileName path
436-
437-
-- Build a collection of tests based on the current contents of the
438-
-- JSONTestSuite test directories.
439-
440-
jsonTestSuite :: IO TestTree
441-
jsonTestSuite = do
442-
let suitePath = "tests/JSONTestSuite"
443-
let suites = ["test_parsing", "test_transform"]
444-
testPaths <- fmap (sort . concat) . forM suites $ \suite -> do
445-
let dir = suitePath </> suite
446-
entries <- getDirectoryContents dir
447-
let ok name = takeExtension name == ".json" &&
448-
not (name `HashSet.member` blacklist)
449-
return . map (dir </>) . filter ok $ entries
450-
return $ testGroup "JSONTestSuite" $ map jsonTestSuiteTest testPaths
451-
452-
-- The set expected-to-be-failing JSONTestSuite tests.
453-
-- Not all of these failures are genuine bugs.
454-
-- Of those that are bugs, not all are worth fixing.
455-
456-
blacklist :: HashSet.HashSet String
457-
-- blacklist = HashSet.empty
458-
blacklist = _blacklist
459-
460-
_blacklist :: HashSet.HashSet String
461-
_blacklist = HashSet.fromList [
462-
"i_object_key_lone_2nd_surrogate.json"
463-
, "i_string_1st_surrogate_but_2nd_missing.json"
464-
, "i_string_1st_valid_surrogate_2nd_invalid.json"
465-
, "i_string_UTF-16LE_with_BOM.json"
466-
, "i_string_UTF-16_invalid_lonely_surrogate.json"
467-
, "i_string_UTF-16_invalid_surrogate.json"
468-
, "i_string_UTF-8_invalid_sequence.json"
469-
, "i_string_incomplete_surrogate_and_escape_valid.json"
470-
, "i_string_incomplete_surrogate_pair.json"
471-
, "i_string_incomplete_surrogates_escape_valid.json"
472-
, "i_string_invalid_lonely_surrogate.json"
473-
, "i_string_invalid_surrogate.json"
474-
, "i_string_inverted_surrogates_U+1D11E.json"
475-
, "i_string_lone_second_surrogate.json"
476-
, "i_string_not_in_unicode_range.json"
477-
, "i_string_truncated-utf-8.json"
478-
, "i_structure_UTF-8_BOM_empty_object.json"
479-
, "string_1_escaped_invalid_codepoint.json"
480-
, "string_1_invalid_codepoint.json"
481-
, "string_1_invalid_codepoints.json"
482-
, "string_2_escaped_invalid_codepoints.json"
483-
, "string_2_invalid_codepoints.json"
484-
, "string_3_escaped_invalid_codepoints.json"
485-
, "string_3_invalid_codepoints.json"
486-
, "y_string_utf16BE_no_BOM.json"
487-
, "y_string_utf16LE_no_BOM.json"
488-
]
419+
489420

490421
-- A regression test for: https://github.com/bos/aeson/pull/455
491422
data Foo a = FooNil | FooCons (Foo Int)
@@ -839,8 +770,7 @@ monadFixTests = testGroup "MonadFix"
839770
ioTests :: IO [TestTree]
840771
ioTests = do
841772
enc <- encoderComparisonTests
842-
js <- jsonTestSuite
843-
return [enc, js]
773+
return [enc]
844774

845775
tests :: TestTree
846776
tests = testGroup "unit" [

0 commit comments

Comments
 (0)