MyNixOS website logo
Description

Linear time testing with variant of Arbitrary class that always terminates.

Ever found non-terminating Arbitrary instance? Ever wondered what would be a runtime cost of particular Arbitrary instance?

Never let it bother you again: this variant of Arbitrary is automatically generating instances, and allows you to see predictable linear time generators for most types (providing that you have any terminating constructor, that is constructor that does not go deeper into the data structure.)

Usage:

import Test.LessArbitrary

data MyDataType = ...
  deriving (Show, Generic)

instance LessArbitrary MyDataType
instance Arbitrary where
 arbitrary = fasterArbitrary

Introduction

This is way to write arbitrary instances that should terminate in linear time with respect to budget, or throw an error instead when they go over budget and it is unclear how to terminate data structure.

Usage

Just try:

import Test.LessArbitrary

data MyDataType = ...
  deriving (Generic)

instance LessArbitrary MyDataType
instance Arbitrary MyDataType where
  arbitrary = fasterArbitrary

How it is done?

It is simply putting a monad that tracks the cost of constructors generated so far, and throw an error when it goes too far. Goes for mutually recursive data structures with at least one terminating constructor available.

Not to be used on non-terminating lazy data structures.

Documentation build

To build detailed article on implementation, you would need:

  • pandoc
  • xelatex with standard science article packages
    • easiest to get as MacTeX on Mac
    • apt-get install -y texlive-recommended on Ubuntu
  • pandoc-hide-codeblocks filter to hide unnecessary code blocks (optional)

Hacker's guide

Entire Haskell code is in literate markdown less-arbitrary.md. In order to work with it you will need entangled literate programming daemon that synchronizes source files with the literate source.

It is bidirectional.

git clone https://github.com/entangled/entangled --branch develop
cd entangled;
cabal install # or stack install
entangled daemon
Metadata

Version

0.1.8.0

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows