Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / logic.c
1 /** Tests the basic logical operations.
2
3     type: char, int, long
4     storage: static, 
5     attr: volatile
6     values: 5, 350, 31734
7  */
8 #include <testfwk.h>
9
10 static {type}
11 alwaysTrue(void)
12 {
13     return ({type}){values};
14 }
15
16 static {type}
17 alwaysFalse(void)
18 {
19     return 0;
20 }
21
22 static {type}
23 neverGetHere(void)
24 {
25     FAILM("Shouldn't get here");
26     return 0;
27 }
28
29 static int hit;
30
31 static void
32 resetGetHere(void)
33 {
34     hit = 0;
35 }
36
37 static {type}
38 alwaysGetHere(void)
39 {
40     hit++;
41     return 1;
42 }
43
44 static void
45 testLogicalAnd(void)
46 {
47     {type} true = alwaysTrue();
48     {type} false = alwaysFalse();
49
50     ASSERT(true && true && true);
51     ASSERT(true && !false);
52     ASSERT(!false && true);
53
54     /* Test that the evaluation is aborted on the first false. */
55     if (true && false && neverGetHere()) {
56         /* Tested using neverGetHere() */
57     }
58
59     /* Alternate that is similar. */
60     if (true && false) {
61         neverGetHere();
62         /* Tested using neverGetHere() */
63     }
64
65     resetGetHere();
66     /* Test that the evaluation is done left to right. */
67     if (alwaysGetHere() && true && false) {
68         ASSERT(hit == 1);
69     }
70 }
71
72 static void
73 testLogicalOr(void)
74 {
75     {type} true = alwaysTrue();
76     {type} false = alwaysFalse();
77
78     ASSERT(false || false || true);
79     ASSERT(!true || !false);
80     ASSERT(false || true);
81
82     /* Test that the evaluation is aborted on the first hit. */
83     if (false || true || neverGetHere()) {
84         /* Tested using neverGetHere() */
85     }
86
87     resetGetHere();
88     /* Test that the evaluation is done left to right. */
89     if (alwaysGetHere() || true || false) {
90         ASSERT(hit == 1);
91     }
92 }
93
94 static void
95 testNot(void)
96 {
97     {type} true = alwaysTrue();
98     {type} false = alwaysFalse();
99
100     ASSERT(!false);
101     ASSERT(!!true);
102     ASSERT(!!!false);
103 }
104
105 static void
106 testFlagToVariable(void)
107 {
108     {type} true = alwaysTrue();
109     {type} false = alwaysFalse();
110     {type} val = !true;
111
112     ASSERT(!val);
113     val = !!false;
114     ASSERT(!false);
115 }