content: {-
    Copyright (c) Meta Platforms, Inc. and affiliates.
    All rights reserved.
  
    This source code is licensed under the BSD-style license found in the
    LICENSE file in the root directory of this source tree.
  -}
  
  module ListTest (main) where
  
  import Test.QuickCheck
  import Test.HUnit
  import TestRunner
  import Util.List
  
  main :: IO ()
  main = testRunner $ TestList
    [ TestLabel "atMostChunksOf" $ TestCase $ do
        result <- quickCheckResult prop_atMostChunksOf
        case result of
          Success{} -> return ()
          _ -> assertFailure "failed"
    , TestLabel "chunkBy" $ TestCase $ do
        result <- quickCheckResult prop_chunkBy
        case result of
          Success{} -> return ()
          _ -> assertFailure "failed"
    ]
  
  prop_atMostChunksOf :: Int -> [Int] -> Bool
  prop_atMostChunksOf n xs =
    n <= 0 || null xs ||
    (  all ((<= n) . length) chunks
    && all (not . null) chunks
    && concat chunks == xs
    && length chunks <= (length xs `div` n + 1)
    )
    where
    chunks = atMostChunksOf n xs
  
  prop_chunkBy :: Int -> [Int] -> Bool
  prop_chunkBy n xs =
    n <= 0 || null xs ||
    all ok chunks && concat chunks == xs
    where
      chunks = chunkBy n id xs
  
      ok [] = False
      ok [_] = True
      ok ys = sum ys <= n
  