{"id":13564492,"url":"https://github.com/alfert/propcheck","last_synced_at":"2026-02-21T13:01:16.958Z","repository":{"id":38866779,"uuid":"39197270","full_name":"alfert/propcheck","owner":"alfert","description":"Property based Testing for Elixir (based upon PropEr)","archived":false,"fork":false,"pushed_at":"2025-04-21T20:34:11.000Z","size":865,"stargazers_count":387,"open_issues_count":15,"forks_count":44,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-11-01T08:15:02.171Z","etag":null,"topics":["elixir","propcheck","proper","property-based-testing"],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alfert.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-07-16T13:07:05.000Z","updated_at":"2025-09-27T09:24:36.000Z","dependencies_parsed_at":"2024-05-01T18:14:42.877Z","dependency_job_id":"761489dc-dfc6-4884-a60d-399245323b19","html_url":"https://github.com/alfert/propcheck","commit_stats":{"total_commits":859,"total_committers":22,"mean_commits":39.04545454545455,"dds":0.3853317811408614,"last_synced_commit":"d1b0015ae14c0e0230369f6580f22fab2da8c163"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/alfert/propcheck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfert%2Fpropcheck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfert%2Fpropcheck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfert%2Fpropcheck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfert%2Fpropcheck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alfert","download_url":"https://codeload.github.com/alfert/propcheck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfert%2Fpropcheck/sbom","scorecard":{"id":182983,"data":{"date":"2025-08-11","repo":{"name":"github.com/alfert/propcheck","commit":"270e00c6b202a0329cbc4098121ac7224dee39d8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":4,"reason":"Found 7/17 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/elixir.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/elixir.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/alfert/propcheck/elixir.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/elixir.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/alfert/propcheck/elixir.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/elixir.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/alfert/propcheck/elixir.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/elixir.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/alfert/propcheck/elixir.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/elixir.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/alfert/propcheck/elixir.yml/master?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: ElixirPropertyBasedTesting integration found: lib/basic_types.ex:4","Info: ElixirPropertyBasedTesting integration found: lib/fsm.ex:105","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:11","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:15","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:366","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:376","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:386","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:397","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:514","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:538","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:558","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:590","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:655","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:668","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:682","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:695","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:852","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:860","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:890","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:928","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:962","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1006","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1192","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1196","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1203","Info: ElixirPropertyBasedTesting integration found: lib/properties.ex:4","Info: ElixirPropertyBasedTesting integration found: lib/statem.ex:165","Info: ElixirPropertyBasedTesting integration found: lib/statem_dsl.ex:176","Info: ElixirPropertyBasedTesting integration found: lib/basic_types.ex:4","Info: ElixirPropertyBasedTesting integration found: lib/fsm.ex:105","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:11","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:15","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:366","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:376","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:386","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:397","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:514","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:538","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:558","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:590","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:655","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:668","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:682","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:695","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:852","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:860","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:890","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:928","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:962","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1006","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1192","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1196","Info: ElixirPropertyBasedTesting integration found: lib/propcheck.ex:1203","Info: ElixirPropertyBasedTesting integration found: lib/properties.ex:4","Info: ElixirPropertyBasedTesting integration found: lib/statem.ex:165","Info: ElixirPropertyBasedTesting integration found: lib/statem_dsl.ex:176","Info: ElixirPropertyBasedTesting integration found: test/basic_types_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/broken_ticket_issuer_test.exs:3","Info: ElixirPropertyBasedTesting integration found: test/broken_ticket_issuer_test.exs:4","Info: ElixirPropertyBasedTesting integration found: test/cache_dsl_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/cache_dsl_test.exs:8","Info: ElixirPropertyBasedTesting integration found: test/counter_dsl_test.exs:15","Info: ElixirPropertyBasedTesting integration found: test/counter_dsl_test.exs:16","Info: ElixirPropertyBasedTesting integration found: test/counterstrike_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/counterstrike_test.exs:65","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:34","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:35","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:70","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:71","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:113","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:114","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:157","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:158","Info: ElixirPropertyBasedTesting integration found: test/let_test.exs:206","Info: ElixirPropertyBasedTesting integration found: test/level_tpbt_test.exs:5","Info: ElixirPropertyBasedTesting integration found: test/master_statem_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/master_statem_test.exs:8","Info: ElixirPropertyBasedTesting integration found: test/movie_dsl_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/movie_dsl_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/movie_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/movie_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/parallel_test.exs:8","Info: ElixirPropertyBasedTesting integration found: test/parallel_test.exs:9","Info: ElixirPropertyBasedTesting integration found: test/pingpong_dsl_test.exs:8","Info: ElixirPropertyBasedTesting integration found: test/pingpong_dsl_test.exs:9","Info: ElixirPropertyBasedTesting integration found: test/pingpong_fsm_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/pingpong_fsm_test.exs:9","Info: ElixirPropertyBasedTesting integration found: test/pingpong_statem_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/pingpong_statem_test.exs:8","Info: ElixirPropertyBasedTesting integration found: test/pingpong_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/propcheck_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/propcheck_test.exs:92","Info: ElixirPropertyBasedTesting integration found: test/propcheck_test.exs:100","Info: ElixirPropertyBasedTesting integration found: test/properties_default_opts_function.exs:7","Info: ElixirPropertyBasedTesting integration found: test/properties_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/stack_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/statem_modeldsl_pretty_reports_test.exs:5","Info: ElixirPropertyBasedTesting integration found: test/statem_modeldsl_pretty_reports_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/statem_pretty_reports_test.exs:5","Info: ElixirPropertyBasedTesting integration found: test/statem_pretty_reports_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/store_counter_examples_test.exs:9","Info: ElixirPropertyBasedTesting integration found: test/store_counter_examples_test.exs:23","Info: ElixirPropertyBasedTesting integration found: test/store_counter_examples_test.exs:42","Info: ElixirPropertyBasedTesting integration found: test/targeted_path_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/targeted_tree_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/tree_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/verify_counter_examples_test.exs:7","Info: ElixirPropertyBasedTesting integration found: test/verify_exception_detection_test.exs:4","Info: ElixirPropertyBasedTesting integration found: test/verify_verbose_elixir_syntax_test.exs:6","Info: ElixirPropertyBasedTesting integration found: test/verify_verbose_test.exs:4"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vq52-99r9-h5pw","Warn: Project is vulnerable to: GHSA-9fm9-hp7p-53mf"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T19:12:56.824Z","repository_id":38866779,"created_at":"2025-08-16T19:12:56.824Z","updated_at":"2025-08-16T19:12:56.824Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29681468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T12:30:22.644Z","status":"ssl_error","status_checked_at":"2026-02-21T12:29:55.402Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elixir","propcheck","proper","property-based-testing"],"created_at":"2024-08-01T13:01:32.151Z","updated_at":"2026-02-21T13:01:16.917Z","avatar_url":"https://github.com/alfert.png","language":"Elixir","funding_links":[],"categories":["Testing"],"sub_categories":[],"readme":"# PropCheck - Property based testing for Elixir\n\n`PropCheck` is a testing library, that provides a wrapper around PropEr, an Erlang\nbased property testing framework in the spirit of QuickCheck.\n\n![Elixir CI](https://github.com/alfert/propcheck/workflows/Elixir%20CI/badge.svg)\n[![Module Version](https://img.shields.io/hexpm/v/propcheck.svg)](https://hex.pm/packages/propcheck)\n[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/propcheck/)\n[![Gitter](https://badges.gitter.im/propcheck/community.svg)](https://gitter.im/propcheck/community?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge)\n[![Total Download](https://img.shields.io/hexpm/dt/propcheck.svg)](https://hex.pm/packages/propcheck)\n[![License](https://img.shields.io/hexpm/l/propcheck.svg)](https://hex.pm/packages/propcheck)\n[![Last Updated](https://img.shields.io/github/last-commit/alfert/propcheck.svg)](https://github.com/alfert/propcheck/commits/master)\n\n## Installation\nTo use PropCheck with your project, add it as a dependency to `mix.exs`:\n\n```elixir\ndefp deps do\n  [\n    {:propcheck, \"~\u003e 1.5\", only: [:test, :dev]}\n  ]\nend\n```\n\nFrom PropCheck 1.3.0 onwards, we require at least Elixir 1.7 since in Elixir 1.11 function `get_stracktrace()` is deprecated.\n## Changes\n\nRelevant changes are documented in the [Changelog](changelog.html), on [GitHub\nfollow this link](CHANGELOG.md).\n\n## Basic Usage and Build Configuration\nPropCheck allows to define properties, which are automatically executed via `ExUnit`\nwhen running `mix test`. You find relevant information here:\n\n* Details about the `property` macro are found in `PropCheck.Properties`,\n* Details about how to specify the property conditions are documented in\n  `PropCheck`,\n* The basic data generators are found in `PropCheck.BasicTypes`,\n* For property testing of state-based systems, take a look at\n  `PropCheck.StateM.ModelDSL` for the new DSL (since PropCheck 1.1.0-rc1),\n  which is a layer on top of `PropCheck.StateM`.\n* The new targeted property based testing approach (TBPT) employing an automated\n  search strategy towards more interesting test data is described in\n  `PropCheck.TargetedPBT`.\n\nFor PropCheck, there is only one configuration option. All counter examples found\nare stored in a file, the name of which is configurable in `mix.exs` as part of\nthe `project` configuration:\n\n```elixir\ndef project() do\n  [ # many other options\n    propcheck: [counter_examples: \"filename\"]\n  ]\nend\n```\n\nNote that the path can also be set as part of the application environment:\n\n```\nconfig :propcheck, counter_examples: \"filename\"\n```\n\nIf both the project configuration and the application environment are present, the\napplication environment is chosen.\n\nPer default, the counter examples file is stored in the build directory (`_build`),\nindependent from the build environment, in the file `propcheck.ctex`. The file can\nbe removed using `mix propcheck.clean`. Note that this task is only available if PropCheck\nis also available in `:dev`. Otherwise, `MIX_ENV=test mix propcheck.clean` can be used.\n\n### Setting PropCheck into Verbose Mode\n\nProperties in PropCheck can be run in quiet or verbose mode. Usually, quiet is the default. To\nenable verbose mode without requiring to touch the source code, the environment variable `PROPCHECK_VERBOSE`\ncan be used. If this is set to 1, the `forall` macro prints verbose output.\n\n### Detecting Exceptions and Errors in Tests\n\nPropCheck can attempt to detect and output exceptions in non-verbose mode. This can be done using\nthe `detect_exceptions: true` option for `property` or `forall`, or using the environment variable\n`PROPCHECK_DETECT_EXCEPTIONS`. If this environment variable is set to 1, exception detection is enabled\nglobally.\n\n## Links to other documentation\n\nThe guides for PropEr are an essential set of documents to make full use of `PropCheck`\n\n* [PropEr Home Page](https://proper-testing.github.io/index.html)\n* [PropEr Tutorials](https://proper-testing.github.io/tutorials.html)\n\nElixir versions of most of PropEr's tutorial material can be found in the\n[test folder on GitHub](https://github.com/alfert/propcheck/tree/master/test).\n\nJesper Andersen and Robert Aloi blog about their thoughts and experiences on\nusing QuickCheck which are (mostly) directly transferable to PropCheck (with\nthe notable exception of concurrency and the new state machine DSL from\nQuickCheck with the possibility to add requirement tags):\n\n* [Jesper Andersen's QuickCheck Advice](https://medium.com/@jlouis666/quickcheck-advice-c357efb4e7e6#.b9wpla7oi)\n* [Jesper Andersen's Breaking Erlang Maps (4 part series)](https://medium.com/@jlouis666/breaking-erlang-maps-4-4ebc3c64068c#.4d61kua92)\n* [Roberto Aloi's Notes on Erlang Quickcheck](http://roberto-aloi.com/erlang/notes-on-erlang-quickcheck)\n\nRather new introductory resources are\n\n* [Fred Hebert's PropEr Testing](http://propertesting.com) and\n* Fred Hebert's book [Property-Based Testing With PropEr, Erlang and Elixir](https://pragprog.com/book/fhproper/property-based-testing-with-proper-erlang-and-elixir).\n  This book explains the new approach of targeted property based testing (TPBT) very nicely\n  and is way more approachable then the scientific papers regarding TPBT. Some of the\n  Erlang only examples of the book are ported to Elixir and can be found in the test\n  [test folder on GitHub](https://github.com/alfert/propcheck/tree/master/test).\n\nIn contrast to the book, the free website is concerned with\nErlang only. The Erlang examples translate easily into Elixir (beside\nthat at least a reading knowledge of Erlang is extremely helpful to survive\nin the BEAM ecosystem ...). Eventually I will port some of the examples to\nElixir and PropCheck and certainly like to accept PRs.\n\n## What is not available\n\nPropCheck does not support PropEr's capability to derive automatically type\ngenerators from type specifications. This is due to some shortcomings in PropEr,\nwhere the specification analysis in certain situation attempt to parse the Erlang source\ncode of the file with the type specification. Apparently, this fails if the\ntypes are specified in an Elixir source file.\n\nEffectively this means, that to\nto support this feature from Elixir, the type management system in PropEr needs\nto be rewritten completely. Jesper Andersen argues in his aforementioned blog\npost eloquently that automatically derived type generators are not needed, even\nmore that carefully crafted type generators for specific testing purposes is\nan essential part of the QuickCheck philosophy. Therefore, this missing feature\nis not that bad. For the same reason, automatic `@spec`-checking is of limited\nvalue in PropCheck since type generators for functions specification are also\ngenerated automatically.\n\nPropCheck has only very limited support for parallel testing since it introduces\nno new features for concurrency compared to PropEr.\n\n\n## Contributing\n\nPlease use the GitHub issue tracker for\n\n* bug reports and for\n* submitting pull requests\n\n### Test Policy\nBefore submitting a pull request, please use Credo to ensure code consistency\nand run `mix tests` to check PropCheck itself. `mix tests` is a Mix alias that\nruns regular tests (via `mix test`) and some external tests (via another Mix\nalias `mix test_ext`) which test PropCheck's side effects, like storing\ncounterexamples or proper output format, that can't be easily tested using\nregular tests.\n\n### Rebase Policy\nEnsure that your PR is based on the latest `master` version by rebasing. If your\nfeature branch is `my_feature`, then do the following before publishing a\npull request:\n\n    git checkout master\n    git pull --rebase\n    git checkout my_feature\n    git rebase master\n\nIf your PR implementation takes longer such that another PR is merged before\nyour own PR, then you have to repeat the above sequence. It might be that you\nhave fix some conflicts. But now you cannot push your branch again, because you\nchanged the history of your local branch compared to the one published on GitHub.\nTherefore, you have force-push your branch. Do this with\n\n    git push --force-with-lease\n\nA simple `git push --force` is not allowed, `--force-with-lease` is more friendly\nand thus allowed. See details in the Git documentation.\n\nThe rationale behind this policy is that we want a simple almost linear history,\nwhere each merged PR create a sequence of merge with no parallel work. This history\nwill not show how many active branches are available during development but the\nsequence of incorporating changes to master. That is the important part and we\nwant to see which commit sequence lead to the specific feature. Merges destroy\nthis linearity. But beware, you can do nasty things with `git rebase`, therefore\nstick to the simple procedure explained above to not corrupt your repository.\n\n## License\n\nPropCheck is provided under the GPL 3 License due to its intimate use of PropEr\n(which is licensed under GPL 3). In particular, PropEr's exclusion rule of\nopen source software from copyleft applies here as well [as described in this discussion on GitHub](https://github.com/proper-testing/proper/issues/29#issuecomment-4956226).\n\nPersonally, I would prefer to use the LPGL to differentiate between extending PropEr\nand PropCheck as GPL-licensed software and the use of PropEr/PropCheck, which would\nnot be infected by GPL's copyleft. But as long as PropEr does not change its\nlicensing, we have no options. PropCheck is clearly an extension of PropEr, so it\nis derived work falling under GPL's copyleft. Using LGPL or any other license for\nPropCheck will not help, since GPL's copyleft overrules other licenses or result\nin an invalid or at least questionable licensing which does not help anybody.\n\nFrom my understanding of open source licenses as a legal amateur, the situation is\ncurrently as follows: Since PropCheck is a testing framework, the\nsystem under test is not infected by the copyleft of GPL, since PropCheck is only\na tool used temporarily during development of the system under test. At least,\nif you don't distribute your system together with the test code and the test libs\nas a binary. Another friendly approach is\nto have the tests in a separate project, such that the tests are a real client\nof the system under test. But again, this is my personal take. In question, please\nconsult a professional legal advisor.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falfert%2Fpropcheck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falfert%2Fpropcheck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falfert%2Fpropcheck/lists"}