• Installing
• Versions
• --

# Exhaustive and Randomized Testing #

A library for exhaustive and randomized testing of Dart properties, based on enumerators. It is inspired by Haskell's smallcheck and quickcheck. If you don't know these libraries, have a look at the small demo below to get an idea of what it can be useful for. I also wrote a post that goes into more details.

## Quick Start #

``````import 'dart:collection';
import 'package:propcheck/propcheck.dart';
import 'package:enumerators/combinators.dart' as c;
import 'package:unittest/unittest.dart';

// defines append and reverse
part 'demolib.dart';

/* --- the properties to test --- */

// this should always hold
bool good(List xs, List ys) =>
equals(reverse(append(xs, ys)),
append(reverse(ys), reverse(xs)));

// this should NOT always hold
bool bad(List xs, List ys) =>
equals(reverse(append(xs, ys)),
append(reverse(xs), reverse(ys)));

/* --- how we test them --- */

main() {
// we define an enumeration of lists of integers
final boolsLists = c.listsOf(c.bools);

// 'good' and 'bad' take 2 arguments each so we use forall2
Property goodProperty = forall2(boolsLists, boolsLists, good);

// we test the properties against *every* pair of lists of bools whose
// combined size is <= 10.
group('smallcheck', () {
final sc = new SmallCheck(depth: 10);
test('good', () => sc.check(goodProperty));
});

// we test the properties against random pairs of lists of bools of
// combined size 0, 1, ..., 300.
group('quickcheck', () {
final qc = new QuickCheck(maxSize: 300, seed: 42);
test('good', () => qc.check(goodProperty));
});
}
``````

Output:

``````unittest-suite-wait-for-done
PASS: smallcheck good
Caught falsified after 11 tests
argument 1: [true]
argument 2: [false]

[...]

PASS: quickcheck good
Caught falsified after 5 tests
argument 1: [false]
argument 2: [false, false, true]

[...]

2 PASSED, 2 FAILED, 0 ERRORS
``````

## Try it! #

``````git clone https://code.google.com/p/dart-check/
cd dart-check
pub install
dart example/demo.dart
``````

Enjoy the progress indicator, probably the most elaborate part of this library :)

## Use this package as a library

### 1. Depend on it

``````
dependencies:
propcheck: ^0.3.1

``````

### 2. Install it

You can install packages from the command line:

with pub:

``````
\$ pub get

``````

Alternatively, your editor might support `pub get`. Check the docs for your editor to learn more.

### 3. Import it

Now in your Dart code, you can use:

``````
import 'package:propcheck/propcheck.dart';
``````