Skip to content

Commit 12790ba

Browse files
authored
Add proper testing on primitive types (#94)
* Add property based test on primitive msgpack types
1 parent 6f98251 commit 12790ba

4 files changed

Lines changed: 88 additions & 40 deletions

File tree

.github/workflows/checkall.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ jobs:
2121
- name: Compile
2222
run: rebar3 compile
2323
- name: Test
24-
run: rebar3 eunit
24+
run: rebar3 do eunit, proper
2525
- name: Check
2626
run: rebar3 do xref, dialyzer

eqc/msgpack_eqc.erl

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -61,45 +61,6 @@ container_types() ->
6161
[ fix_array(), array16() ].
6262
%% TODO: add map
6363

64-
primitive_types() ->
65-
[null(),
66-
positive_fixnum(), negative_fixnum(),
67-
int8(), int16(), int32(), int64(),
68-
uint8(), uint16(), uint32(), uint64(),
69-
eqc_gen:real(), eqc_gen:bool(),
70-
fix_raw(), raw16(), raw32()
71-
].
72-
%% fix_raw(), raw16(), raw32()]).
73-
74-
positive_fixnum() -> choose(0, 127).
75-
negative_fixnum() -> choose(-32, -1).
76-
77-
int8() -> choose(-16#80, 16#7F).
78-
int16() -> oneof([choose(-16#8000, -16#81),
79-
choose(16#80, 16#7FFF)]).
80-
int32() -> oneof([choose(-16#80000000, -16#8001),
81-
choose(16#10000, 16#7FFFFFFF)]).
82-
int64() -> oneof([choose(-16#8000000000000000, -16#80000001),
83-
choose(16#100000000, 16#7FFFFFFFFFFFFFFF)]).
84-
85-
uint8() -> choose(0, 16#FF).
86-
uint16() -> choose(16#100, 16#FFFF).
87-
uint32() -> choose(16#10000, 16#FFFFFFFF).
88-
uint64() -> choose(16#100000000, 16#FFFFFFFFFFFFFFFF).
89-
90-
null() -> null.
91-
92-
fix_raw() ->
93-
?LET(Integer, choose(0, 31),
94-
?LET(Binary, binary(Integer), Binary)).
95-
96-
raw16() ->
97-
?LET(Integer, uint16(),
98-
?LET(Binary, binary(Integer), Binary)).
99-
100-
raw32() ->
101-
?LET(Binary, binary(65537), Binary).
102-
10364
fix_array() ->
10465
eqc_gen:resize(16, eqc_gen:list(oneof(primitive_types()))).
10566

rebar.config

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,13 @@
1515
{erl_first_files, [
1616
"src/msgpack_ext.erl"
1717
]}.
18+
19+
{project_plugins, [rebar3_proper]}.
20+
21+
{profiles,
22+
[{test, [
23+
{erl_opts, [nowarn_export_all]},
24+
{deps, [proper]}
25+
]
26+
}]
27+
}.

test/prop_msgpack.erl

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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

Comments
 (0)