|
| 1 | +-module(prop_msgpack). |
| 2 | +-include_lib("proper/include/proper.hrl"). |
| 3 | +-include("msgpack.hrl"). |
| 4 | + |
| 5 | + |
| 6 | +%%% Primitive Properties %%% |
| 7 | +prop_uint() -> |
| 8 | + ?FORALL( |
| 9 | + UnsignedInt, |
| 10 | + oneof([positive_fixnum(), uint8(), uint16(), uint32(), uint64()]), |
| 11 | + pack_and_unpack(UnsignedInt)). |
| 12 | + |
| 13 | +prop_int() -> |
| 14 | + ?FORALL( |
| 15 | + Int, |
| 16 | + oneof([positive_fixnum(), negative_fixnum(), int8(), int16(), int32(), int64()]), |
| 17 | + pack_and_unpack(Int)). |
| 18 | + |
| 19 | +prop_binary() -> |
| 20 | + ?FORALL( |
| 21 | + Binary, |
| 22 | + oneof([fix_raw(), raw16(), raw32()]), |
| 23 | + pack_and_unpack(Binary)). |
| 24 | + |
| 25 | +prop_primitive() -> |
| 26 | + ?FORALL( |
| 27 | + PrimObj, |
| 28 | + oneof(primitive_types()), |
| 29 | + pack_and_unpack(PrimObj)). |
| 30 | + |
| 31 | + |
| 32 | + |
| 33 | +%%% Helpers %%% |
| 34 | +pack_and_unpack(Obj) -> |
| 35 | + Bin = msgpack:pack(Obj), |
| 36 | + {ok, Obj} = msgpack:unpack(Bin), |
| 37 | + is_binary(Bin). |
| 38 | + |
| 39 | +%%% Generators %%% |
| 40 | +null() -> null. |
| 41 | + |
| 42 | +positive_fixnum() -> choose(0, 127). |
| 43 | +negative_fixnum() -> choose(-32, -1). |
| 44 | + |
| 45 | +int8() -> choose(-16#80, 16#7F). |
| 46 | +int16() -> oneof([choose(-16#8000, -16#81), |
| 47 | + choose(16#80, 16#7FFF)]). |
| 48 | +int32() -> oneof([choose(-16#80000000, -16#8001), |
| 49 | + choose(16#10000, 16#7FFFFFFF)]). |
| 50 | +int64() -> oneof([choose(-16#8000000000000000, -16#80000001), |
| 51 | + choose(16#100000000, 16#7FFFFFFFFFFFFFFF)]). |
| 52 | + |
| 53 | +uint8() -> choose(0, 16#FF). |
| 54 | +uint16() -> choose(16#100, 16#FFFF). |
| 55 | +uint32() -> choose(16#10000, 16#FFFFFFFF). |
| 56 | +uint64() -> choose(16#100000000, 16#FFFFFFFFFFFFFFFF). |
| 57 | + |
| 58 | +fix_raw() -> |
| 59 | + ?LET(Integer, choose(0, 31), |
| 60 | + ?LET(Binary, binary(Integer), Binary)). |
| 61 | + |
| 62 | +raw16() -> |
| 63 | + ?LET(Integer, uint16(), |
| 64 | + ?LET(Binary, binary(Integer), Binary)). |
| 65 | + |
| 66 | +raw32() -> |
| 67 | + ?LET(Binary, binary(65537), Binary). |
| 68 | + |
| 69 | +primitive_types() -> |
| 70 | + [ |
| 71 | + null(), |
| 72 | + positive_fixnum(), negative_fixnum(), |
| 73 | + int8(), int16(), int32(), int64(), |
| 74 | + uint8(), uint16(), uint32(), uint64(), |
| 75 | + proper_types:float(), proper_types:bool(), |
| 76 | + fix_raw(), raw16(), raw32() |
| 77 | + ]. |
0 commit comments