|
| 1 | +-module(parallel_crash_tests). |
| 2 | + |
| 3 | +-include_lib("proper/include/proper.hrl"). |
| 4 | + |
| 5 | +-include_lib("eunit/include/eunit.hrl"). |
| 6 | + |
| 7 | + |
| 8 | +%%------------------------------------------------------------------------------ |
| 9 | +%% Helper macros |
| 10 | +%%------------------------------------------------------------------------------ |
| 11 | + |
| 12 | +%% NOTE: Never add long_result to Opts for these macros. |
| 13 | + |
| 14 | +state_is_clean() -> |
| 15 | + get() =:= []. |
| 16 | + |
| 17 | +assertEqualsOneOf(_X, none) -> |
| 18 | + ok; |
| 19 | +assertEqualsOneOf(X, List) -> |
| 20 | + ?assert(lists:any(fun(Y) -> Y =:= X end, List)). |
| 21 | + |
| 22 | +-define(_passes(Test), |
| 23 | + ?_passes(Test, [])). |
| 24 | + |
| 25 | +-define(_passes(Test, Opts), |
| 26 | + ?_assertRun(true, Test, Opts, true)). |
| 27 | + |
| 28 | +-define(_errorsOut(ExpReason, Test), |
| 29 | + ?_errorsOut(ExpReason, Test, [])). |
| 30 | + |
| 31 | +-define(_errorsOut(ExpReason, Test, Opts), |
| 32 | + ?_assertRun({error,ExpReason}, Test, Opts, true)). |
| 33 | + |
| 34 | +-define(_assertRun(ExpResult, Test, Opts, AlsoLongResult), |
| 35 | + ?_test(begin |
| 36 | + ?assertMatch(ExpResult, proper:quickcheck(Test,Opts)), |
| 37 | + proper:clean_garbage(), |
| 38 | + ?assert(state_is_clean()), |
| 39 | + case AlsoLongResult of |
| 40 | + true -> |
| 41 | + ?assertMatch(ExpResult, |
| 42 | + proper:quickcheck(Test,[long_result|Opts])), |
| 43 | + proper:clean_garbage(), |
| 44 | + ?assert(state_is_clean()); |
| 45 | + false -> |
| 46 | + ok |
| 47 | + end |
| 48 | + end)). |
| 49 | + |
| 50 | +-define(_assertCheck(ExpShortResult, CExm, Test), |
| 51 | + ?_assertCheck(ExpShortResult, CExm, Test, [])). |
| 52 | + |
| 53 | +-define(_assertCheck(ExpShortResult, CExm, Test, Opts), |
| 54 | + ?_test(?assertCheck(ExpShortResult, CExm, Test, Opts))). |
| 55 | + |
| 56 | +-define(assertCheck(ExpShortResult, CExm, Test, Opts), |
| 57 | + begin |
| 58 | + ?assertMatch(ExpShortResult, proper:check(Test,CExm,Opts)), |
| 59 | + ?assert(state_is_clean()) |
| 60 | + end). |
| 61 | + |
| 62 | +-define(_fails(Test), |
| 63 | + ?_fails(Test, [])). |
| 64 | + |
| 65 | +-define(_fails(Test, Opts), |
| 66 | + ?_failsWith(_, Test, Opts)). |
| 67 | + |
| 68 | +-define(_failsWith(ExpCExm, Test), |
| 69 | + ?_failsWith(ExpCExm, Test, [])). |
| 70 | + |
| 71 | +-define(_failsWith(ExpCExm, Test, Opts), |
| 72 | + ?_assertFailRun(ExpCExm, none, Test, Opts)). |
| 73 | + |
| 74 | +-define(_failsWithOneOf(AllCExms, Test), |
| 75 | + ?_failsWithOneOf(AllCExms, Test, [])). |
| 76 | + |
| 77 | +-define(_failsWithOneOf(AllCExms, Test, Opts), |
| 78 | + ?_assertFailRun(_, AllCExms, Test, Opts)). |
| 79 | + |
| 80 | +-define(SHRINK_TEST_OPTS, [{start_size,10},{max_shrinks,10000}]). |
| 81 | + |
| 82 | +-define(_shrinksTo(ExpShrunk, Type), |
| 83 | + ?_assertFailRun([ExpShrunk], none, ?FORALL(_X,Type,false), |
| 84 | + ?SHRINK_TEST_OPTS)). |
| 85 | + |
| 86 | +-define(_shrinksToOneOf(AllShrunk, Type), |
| 87 | + ?_assertFailRun(_, [[X] || X <- AllShrunk], ?FORALL(_X,Type,false), |
| 88 | + ?SHRINK_TEST_OPTS)). |
| 89 | + |
| 90 | +-define(_nativeShrinksTo(ExpShrunk, TypeStr), |
| 91 | + ?_assertFailRun([ExpShrunk], none, |
| 92 | + ?FORALL(_X,assert_can_translate(?MODULE,TypeStr),false), |
| 93 | + ?SHRINK_TEST_OPTS)). |
| 94 | + |
| 95 | +-define(_nativeShrinksToOneOf(AllShrunk, TypeStr), |
| 96 | + ?_assertFailRun(_, [[X] || X <- AllShrunk], |
| 97 | + ?FORALL(_X,assert_can_translate(?MODULE,TypeStr),false), |
| 98 | + ?SHRINK_TEST_OPTS)). |
| 99 | + |
| 100 | +-define(_assertFailRun(ExpCExm, AllCExms, Test, Opts), |
| 101 | + ?_test(begin |
| 102 | + ShortResult = proper:quickcheck(Test, Opts), |
| 103 | + CExm1 = get_cexm(), |
| 104 | + ?checkCExm(CExm1, ExpCExm, AllCExms, Test, Opts), |
| 105 | + ?assertEqual(false, ShortResult), |
| 106 | + LongResult = proper:quickcheck(Test, [long_result|Opts]), |
| 107 | + CExm2 = get_cexm(), |
| 108 | + ?checkCExm(CExm2, ExpCExm, AllCExms, Test, Opts), |
| 109 | + ?checkCExm(LongResult, ExpCExm, AllCExms, Test, Opts) |
| 110 | + end)). |
| 111 | + |
| 112 | + |
| 113 | +simple_test_() -> |
| 114 | + [ |
| 115 | + ?_passes(symb_statem:prop_simple()) |
| 116 | + ]. |
| 117 | + |
| 118 | + |
| 119 | +parallel_simple_test_() -> |
| 120 | + [ |
| 121 | + %% {timeout, 20, ?_passes(symb_statem:prop_parallel_simple())} |
| 122 | + ?_passes(symb_statem:prop_parallel_simple()) |
| 123 | + ]. |
0 commit comments