From 786ded3e43665746814933398d3830df1c771d3b Mon Sep 17 00:00:00 2001 From: VegOwOtenks Date: Fri, 22 Aug 2025 10:54:10 +0200 Subject: [PATCH] fix[test]: quickcheck-instances panics when creating empty arrays --- hon.cabal | 1 + src/Data/Array/Arbitrary.hs | 22 ++++++++++++++++++++++ src/Language/Json.hs | 7 +++---- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 src/Data/Array/Arbitrary.hs diff --git a/hon.cabal b/hon.cabal index 2b54b4f..847184f 100644 --- a/hon.cabal +++ b/hon.cabal @@ -19,6 +19,7 @@ extra-source-files: library exposed-modules: + Data.Array.Arbitrary Language.Json Language.Json.Parser Language.Json.Path diff --git a/src/Data/Array/Arbitrary.hs b/src/Data/Array/Arbitrary.hs new file mode 100644 index 0000000..d1a052a --- /dev/null +++ b/src/Data/Array/Arbitrary.hs @@ -0,0 +1,22 @@ +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE InstanceSigs #-} +{-# LANGUAGE FlexibleContexts #-} +module Data.Array.Arbitrary (ArbitraryArray(..), get) where +import Test.QuickCheck (Arbitrary (arbitrary), Gen) +import Data.Array.IArray (listArray, IArray, Ix) +import Data.List (genericLength) + +newtype ArbitraryArray a i e = ArbitraryArray { getArbitraryArray :: a i e } + deriving stock (Show) + +get :: ArbitraryArray a i e -> a i e +get = getArbitraryArray + +instance (Arbitrary e, Num i, Ix i, IArray a e) => Arbitrary (ArbitraryArray a i e) where + arbitrary :: Gen (ArbitraryArray a i e) + arbitrary = do + xs <- arbitrary + pure . ArbitraryArray $ case xs of + [] -> listArray (1, 0) xs + _ -> listArray (0, genericLength xs - 1) xs + diff --git a/src/Language/Json.hs b/src/Language/Json.hs index d9f7f95..70f77e1 100644 --- a/src/Language/Json.hs +++ b/src/Language/Json.hs @@ -28,8 +28,7 @@ import GHC.Generics ( Generic, Generically(..) ) import Pretty.Serialize (PrettySerialize) import Test.QuickCheck (Arbitrary (arbitrary), Gen, UnicodeString (getUnicodeString), PrintableString (getPrintableString)) import qualified Test.QuickCheck.Gen as Gen -import Test.QuickCheck.Instances.Array () -import Test.QuickCheck.Instances.Natural () +import Data.Array.Arbitrary (ArbitraryArray(getArbitraryArray)) data Value @@ -50,7 +49,7 @@ instance Arbitrary Value where , String . Text.pack . getUnicodeString <$> arbitrary , Boolean <$> arbitrary , Number <$> arbitrary - , Array <$> Gen.scale (`div` 2) arbitrary + , Array . getArbitraryArray <$> Gen.scale (`div` 2) arbitrary , Object . Map.mapKeys (Text.pack . getUnicodeString) <$> Gen.scale (`div` 2) arbitrary ] @@ -64,7 +63,7 @@ instance Arbitrary PrintableValue where , String . Text.pack . getPrintableString <$> arbitrary , Boolean <$> arbitrary , Number <$> arbitrary - , Array <$> Gen.scale (`div` 2) arbitrary + , Array . getArbitraryArray <$> Gen.scale (`div` 2) arbitrary , Object . Map.mapKeys (Text.pack . getPrintableString) <$> Gen.scale (`div` 2) arbitrary ]