/builds/xfbs/passgen/src/tests/entropy.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include "tests.h" |
2 | | #include <math.h> |
3 | | #include <passgen/generate.h> |
4 | | #include <passgen/passgen.h> |
5 | | |
6 | 31 | double entropy(const char *p) { |
7 | 31 | // parse pattern |
8 | 31 | passgen_pattern pattern; |
9 | 31 | passgen_error error; |
10 | 31 | if(0 != passgen_parse(&pattern, &error, p)) { |
11 | 0 | return NAN; |
12 | 0 | } |
13 | 31 | |
14 | 31 | size_t buffer_len = 256; |
15 | 31 | uint8_t buffer[buffer_len]; |
16 | 31 | buffer[0] = 0; |
17 | 31 | passgen_random random; |
18 | 31 | passgen_random_open(&random, NULL); |
19 | 31 | passgen_env env; |
20 | 31 | passgen_env_init(&env, &random); |
21 | 31 | double entropy; |
22 | 31 | int length = passgen_generate_fill_utf8( |
23 | 31 | &pattern, |
24 | 31 | &env, |
25 | 31 | &entropy, |
26 | 31 | &buffer[0], |
27 | 31 | buffer_len); |
28 | 31 | buffer[length] = 0; |
29 | 31 | passgen_pattern_free(&pattern); |
30 | 31 | |
31 | 31 | return entropy; |
32 | 31 | } |
33 | | |
34 | 32 | bool equals(double a, double b) { |
35 | 32 | double epsilon = 0.00001; |
36 | 32 | return (a - epsilon) < b && (a + epsilon) > b; |
37 | 32 | } |
38 | | |
39 | 1 | test_result test_entropy_literal(void) { |
40 | 1 | assert(equals(0.0, 0.0)); |
41 | 1 | assert(equals(1.0, entropy(""))); |
42 | 1 | assert(equals(1.0, entropy("a"))); |
43 | 1 | assert(equals(1.0, entropy("ab"))); |
44 | 1 | assert(equals(1.0, entropy("abc"))); |
45 | 1 | assert(equals(1.0, entropy("abcdefghijklmnopqrstuvwxyz"))); |
46 | 1 | |
47 | 1 | return test_ok; |
48 | 1 | } |
49 | | |
50 | 1 | test_result test_entropy_group(void) { |
51 | 1 | assert(equals(1.0, entropy("()"))); |
52 | 1 | assert(equals(1.0, entropy("(abc)"))); |
53 | 1 | assert(equals(1.0, entropy("(())"))); |
54 | 1 | assert(equals(2.0, entropy("(abc|def)"))); |
55 | 1 | assert(equals(3.0, entropy("(abc|def|hij)"))); |
56 | 1 | assert(equals(4.0, entropy("(abc|def|hij|klm)"))); |
57 | 1 | |
58 | 1 | return test_ok; |
59 | 1 | } |
60 | | |
61 | 1 | test_result test_entropy_range(void) { |
62 | 1 | assert(equals(1.0, entropy("[a]"))); |
63 | 1 | assert(equals(2.0, entropy("[ab]"))); |
64 | 1 | assert(equals(3.0, entropy("[abc]"))); |
65 | 1 | assert(equals(3.0, entropy("[a-c]"))); |
66 | 1 | assert(equals(26.0, entropy("[a-z]"))); |
67 | 1 | assert(equals(10.0, entropy("[0-9]"))); |
68 | 1 | assert(equals(16.0, entropy("[0-9a-f]"))); |
69 | 1 | assert(equals(20.0, entropy("[0-9a-f,.:\\-]"))); |
70 | 1 | |
71 | 1 | return test_ok; |
72 | 1 | } |
73 | | |
74 | 1 | test_result test_entropy_repeat(void) { |
75 | 1 | assert(equals(3.0, entropy("[abc]{1}"))); |
76 | 1 | assert(equals(3.0 * 3.0, entropy("[abc]{2}"))); |
77 | 1 | assert(equals(3.0 * 3.0 * 3.0, entropy("[abc]{3}"))); |
78 | 1 | |
79 | 1 | assert(equals(3.0, entropy("(this|that|other){1}"))); |
80 | 1 | assert(equals(3.0 * 3.0, entropy("(this|that|other){2}"))); |
81 | 1 | assert(equals(3.0 * 3.0 * 3.0, entropy("(this|that|other){3}"))); |
82 | 1 | |
83 | 1 | assert(equals(1.0, entropy("a{1}"))); |
84 | 1 | assert(equals(2.0, entropy("a{1,2}"))); |
85 | 1 | assert(equals(3.0, entropy("a{1,3}"))); |
86 | 1 | |
87 | 1 | assert(equals(1.0, entropy("(a){1}"))); |
88 | 1 | assert(equals(2.0, entropy("(a){1,2}"))); |
89 | 1 | assert(equals(3.0, entropy("(a){1,3}"))); |
90 | 1 | |
91 | 1 | return test_ok; |
92 | 1 | } |