GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/node/type_cardinality_black.cpp Lines: 210 210 100.0 %
Date: 2021-08-20 Branches: 531 1496 35.5 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Aina Niemetz, Morgan Deters
4
 *
5
 * This file is part of the cvc5 project.
6
 *
7
 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8
 * in the top-level source directory and their institutional affiliations.
9
 * All rights reserved.  See the file COPYING in the top-level source
10
 * directory for licensing information.
11
 * ****************************************************************************
12
 *
13
 * Public box testing of Type::getCardinality() for various Types.
14
 */
15
16
#include <string>
17
18
#include "expr/kind.h"
19
#include "expr/node_manager.h"
20
#include "test_node.h"
21
#include "util/cardinality.h"
22
23
namespace cvc5 {
24
25
using namespace kind;
26
27
namespace test {
28
29
28
class TestNodeBlackTypeCardinality : public TestNode
30
{
31
};
32
33
16
TEST_F(TestNodeBlackTypeCardinality, basics)
34
{
35
2
  ASSERT_EQ(d_nodeManager->booleanType().getCardinality().compare(2),
36
2
            Cardinality::EQUAL);
37
2
  ASSERT_EQ(d_nodeManager->integerType().getCardinality().compare(
38
                Cardinality::INTEGERS),
39
2
            Cardinality::EQUAL);
40
2
  ASSERT_EQ(
41
      d_nodeManager->realType().getCardinality().compare(Cardinality::REALS),
42
2
      Cardinality::EQUAL);
43
}
44
45
16
TEST_F(TestNodeBlackTypeCardinality, arrays)
46
{
47
4
  TypeNode intToInt = d_nodeManager->mkArrayType(d_nodeManager->integerType(),
48
8
                                                 d_nodeManager->integerType());
49
4
  TypeNode realToReal = d_nodeManager->mkArrayType(d_nodeManager->realType(),
50
8
                                                   d_nodeManager->realType());
51
4
  TypeNode realToInt = d_nodeManager->mkArrayType(d_nodeManager->realType(),
52
8
                                                  d_nodeManager->integerType());
53
4
  TypeNode intToReal = d_nodeManager->mkArrayType(d_nodeManager->integerType(),
54
8
                                                  d_nodeManager->realType());
55
4
  TypeNode intToBool = d_nodeManager->mkArrayType(d_nodeManager->integerType(),
56
8
                                                  d_nodeManager->booleanType());
57
  TypeNode realToBool = d_nodeManager->mkArrayType(
58
4
      d_nodeManager->realType(), d_nodeManager->booleanType());
59
4
  TypeNode boolToReal = d_nodeManager->mkArrayType(d_nodeManager->booleanType(),
60
8
                                                   d_nodeManager->realType());
61
4
  TypeNode boolToInt = d_nodeManager->mkArrayType(d_nodeManager->booleanType(),
62
8
                                                  d_nodeManager->integerType());
63
  TypeNode boolToBool = d_nodeManager->mkArrayType(
64
4
      d_nodeManager->booleanType(), d_nodeManager->booleanType());
65
66
2
  ASSERT_EQ(intToInt.getCardinality().compare(Cardinality::REALS),
67
2
            Cardinality::EQUAL);
68
2
  ASSERT_EQ(realToReal.getCardinality().compare(Cardinality::REALS),
69
2
            Cardinality::GREATER);
70
2
  ASSERT_EQ(realToInt.getCardinality().compare(Cardinality::REALS),
71
2
            Cardinality::GREATER);
72
2
  ASSERT_EQ(intToReal.getCardinality().compare(Cardinality::REALS),
73
2
            Cardinality::EQUAL);
74
2
  ASSERT_EQ(intToBool.getCardinality().compare(Cardinality::REALS),
75
2
            Cardinality::EQUAL);
76
2
  ASSERT_EQ(realToBool.getCardinality().compare(Cardinality::REALS),
77
2
            Cardinality::GREATER);
78
2
  ASSERT_EQ(boolToReal.getCardinality().compare(Cardinality::REALS),
79
2
            Cardinality::EQUAL);
80
2
  ASSERT_EQ(boolToInt.getCardinality().compare(Cardinality::INTEGERS),
81
2
            Cardinality::EQUAL);
82
2
  ASSERT_EQ(boolToBool.getCardinality().compare(4), Cardinality::EQUAL);
83
}
84
85
16
TEST_F(TestNodeBlackTypeCardinality, unary_functions)
86
{
87
  TypeNode intToInt = d_nodeManager->mkFunctionType(
88
4
      d_nodeManager->integerType(), d_nodeManager->integerType());
89
  TypeNode realToReal = d_nodeManager->mkFunctionType(
90
4
      d_nodeManager->realType(), d_nodeManager->realType());
91
  TypeNode realToInt = d_nodeManager->mkFunctionType(
92
4
      d_nodeManager->realType(), d_nodeManager->integerType());
93
  TypeNode intToReal = d_nodeManager->mkFunctionType(
94
4
      d_nodeManager->integerType(), d_nodeManager->realType());
95
  TypeNode intToBool = d_nodeManager->mkFunctionType(
96
4
      d_nodeManager->integerType(), d_nodeManager->booleanType());
97
  TypeNode realToBool = d_nodeManager->mkFunctionType(
98
4
      d_nodeManager->realType(), d_nodeManager->booleanType());
99
  TypeNode boolToReal = d_nodeManager->mkFunctionType(
100
4
      d_nodeManager->booleanType(), d_nodeManager->realType());
101
  TypeNode boolToInt = d_nodeManager->mkFunctionType(
102
4
      d_nodeManager->booleanType(), d_nodeManager->integerType());
103
  TypeNode boolToBool = d_nodeManager->mkFunctionType(
104
4
      d_nodeManager->booleanType(), d_nodeManager->booleanType());
105
106
2
  ASSERT_EQ(intToInt.getCardinality().compare(Cardinality::REALS),
107
2
            Cardinality::EQUAL);
108
2
  ASSERT_EQ(realToReal.getCardinality().compare(Cardinality::REALS),
109
2
            Cardinality::GREATER);
110
2
  ASSERT_EQ(realToInt.getCardinality().compare(Cardinality::REALS),
111
2
            Cardinality::GREATER);
112
2
  ASSERT_EQ(intToReal.getCardinality().compare(Cardinality::REALS),
113
2
            Cardinality::EQUAL);
114
2
  ASSERT_EQ(intToBool.getCardinality().compare(Cardinality::REALS),
115
2
            Cardinality::EQUAL);
116
2
  ASSERT_EQ(realToBool.getCardinality().compare(Cardinality::REALS),
117
2
            Cardinality::GREATER);
118
2
  ASSERT_EQ(boolToReal.getCardinality().compare(Cardinality::REALS),
119
2
            Cardinality::EQUAL);
120
2
  ASSERT_EQ(boolToInt.getCardinality().compare(Cardinality::INTEGERS),
121
2
            Cardinality::EQUAL);
122
2
  ASSERT_EQ(boolToBool.getCardinality().compare(4), Cardinality::EQUAL);
123
}
124
125
16
TEST_F(TestNodeBlackTypeCardinality, binary_functions)
126
{
127
4
  std::vector<TypeNode> boolbool;
128
2
  boolbool.push_back(d_nodeManager->booleanType());
129
2
  boolbool.push_back(d_nodeManager->booleanType());
130
4
  std::vector<TypeNode> boolint;
131
2
  boolint.push_back(d_nodeManager->booleanType());
132
2
  boolint.push_back(d_nodeManager->integerType());
133
4
  std::vector<TypeNode> intbool;
134
2
  intbool.push_back(d_nodeManager->integerType());
135
2
  intbool.push_back(d_nodeManager->booleanType());
136
4
  std::vector<TypeNode> intint;
137
2
  intint.push_back(d_nodeManager->integerType());
138
2
  intint.push_back(d_nodeManager->integerType());
139
4
  std::vector<TypeNode> intreal;
140
2
  intreal.push_back(d_nodeManager->integerType());
141
2
  intreal.push_back(d_nodeManager->realType());
142
4
  std::vector<TypeNode> realint;
143
2
  realint.push_back(d_nodeManager->realType());
144
2
  realint.push_back(d_nodeManager->integerType());
145
4
  std::vector<TypeNode> realreal;
146
2
  realreal.push_back(d_nodeManager->realType());
147
2
  realreal.push_back(d_nodeManager->realType());
148
4
  std::vector<TypeNode> realbool;
149
2
  realbool.push_back(d_nodeManager->realType());
150
2
  realbool.push_back(d_nodeManager->booleanType());
151
4
  std::vector<TypeNode> boolreal;
152
2
  boolreal.push_back(d_nodeManager->booleanType());
153
2
  boolreal.push_back(d_nodeManager->realType());
154
155
  TypeNode boolboolToBool =
156
4
      d_nodeManager->mkFunctionType(boolbool, d_nodeManager->booleanType());
157
  TypeNode boolboolToInt =
158
4
      d_nodeManager->mkFunctionType(boolbool, d_nodeManager->integerType());
159
  TypeNode boolboolToReal =
160
4
      d_nodeManager->mkFunctionType(boolbool, d_nodeManager->realType());
161
162
  TypeNode boolintToBool =
163
4
      d_nodeManager->mkFunctionType(boolint, d_nodeManager->booleanType());
164
  TypeNode boolintToInt =
165
4
      d_nodeManager->mkFunctionType(boolint, d_nodeManager->integerType());
166
  TypeNode boolintToReal =
167
4
      d_nodeManager->mkFunctionType(boolint, d_nodeManager->realType());
168
169
  TypeNode intboolToBool =
170
4
      d_nodeManager->mkFunctionType(intbool, d_nodeManager->booleanType());
171
  TypeNode intboolToInt =
172
4
      d_nodeManager->mkFunctionType(intbool, d_nodeManager->integerType());
173
  TypeNode intboolToReal =
174
4
      d_nodeManager->mkFunctionType(intbool, d_nodeManager->realType());
175
176
  TypeNode intintToBool =
177
4
      d_nodeManager->mkFunctionType(intint, d_nodeManager->booleanType());
178
  TypeNode intintToInt =
179
4
      d_nodeManager->mkFunctionType(intint, d_nodeManager->integerType());
180
  TypeNode intintToReal =
181
4
      d_nodeManager->mkFunctionType(intint, d_nodeManager->realType());
182
183
  TypeNode intrealToBool =
184
4
      d_nodeManager->mkFunctionType(intreal, d_nodeManager->booleanType());
185
  TypeNode intrealToInt =
186
4
      d_nodeManager->mkFunctionType(intreal, d_nodeManager->integerType());
187
  TypeNode intrealToReal =
188
4
      d_nodeManager->mkFunctionType(intreal, d_nodeManager->realType());
189
190
  TypeNode realintToBool =
191
4
      d_nodeManager->mkFunctionType(realint, d_nodeManager->booleanType());
192
  TypeNode realintToInt =
193
4
      d_nodeManager->mkFunctionType(realint, d_nodeManager->integerType());
194
  TypeNode realintToReal =
195
4
      d_nodeManager->mkFunctionType(realint, d_nodeManager->realType());
196
197
  TypeNode realrealToBool =
198
4
      d_nodeManager->mkFunctionType(realreal, d_nodeManager->booleanType());
199
  TypeNode realrealToInt =
200
4
      d_nodeManager->mkFunctionType(realreal, d_nodeManager->integerType());
201
  TypeNode realrealToReal =
202
4
      d_nodeManager->mkFunctionType(realreal, d_nodeManager->realType());
203
204
  TypeNode realboolToBool =
205
4
      d_nodeManager->mkFunctionType(realbool, d_nodeManager->booleanType());
206
  TypeNode realboolToInt =
207
4
      d_nodeManager->mkFunctionType(realbool, d_nodeManager->integerType());
208
  TypeNode realboolToReal =
209
4
      d_nodeManager->mkFunctionType(realbool, d_nodeManager->realType());
210
211
  TypeNode boolrealToBool =
212
4
      d_nodeManager->mkFunctionType(boolreal, d_nodeManager->booleanType());
213
  TypeNode boolrealToInt =
214
4
      d_nodeManager->mkFunctionType(boolreal, d_nodeManager->integerType());
215
  TypeNode boolrealToReal =
216
4
      d_nodeManager->mkFunctionType(boolreal, d_nodeManager->realType());
217
218
2
  ASSERT_EQ(boolboolToBool.getCardinality().compare(16), Cardinality::EQUAL);
219
2
  ASSERT_EQ(boolboolToInt.getCardinality().compare(Cardinality::INTEGERS),
220
2
            Cardinality::EQUAL);
221
2
  ASSERT_EQ(boolboolToReal.getCardinality().compare(Cardinality::REALS),
222
2
            Cardinality::EQUAL);
223
224
2
  ASSERT_EQ(boolintToBool.getCardinality().compare(Cardinality::REALS),
225
2
            Cardinality::EQUAL);
226
2
  ASSERT_EQ(boolintToInt.getCardinality().compare(Cardinality::REALS),
227
2
            Cardinality::EQUAL);
228
2
  ASSERT_EQ(boolintToReal.getCardinality().compare(Cardinality::REALS),
229
2
            Cardinality::EQUAL);
230
231
2
  ASSERT_EQ(intboolToBool.getCardinality().compare(Cardinality::REALS),
232
2
            Cardinality::EQUAL);
233
2
  ASSERT_EQ(intboolToInt.getCardinality().compare(Cardinality::REALS),
234
2
            Cardinality::EQUAL);
235
2
  ASSERT_EQ(intboolToReal.getCardinality().compare(Cardinality::REALS),
236
2
            Cardinality::EQUAL);
237
238
2
  ASSERT_EQ(intintToBool.getCardinality().compare(Cardinality::REALS),
239
2
            Cardinality::EQUAL);
240
2
  ASSERT_EQ(intintToInt.getCardinality().compare(Cardinality::REALS),
241
2
            Cardinality::EQUAL);
242
2
  ASSERT_EQ(intintToReal.getCardinality().compare(Cardinality::REALS),
243
2
            Cardinality::EQUAL);
244
245
2
  ASSERT_EQ(intrealToBool.getCardinality().compare(Cardinality::REALS),
246
2
            Cardinality::GREATER);
247
2
  ASSERT_EQ(intrealToInt.getCardinality().compare(Cardinality::REALS),
248
2
            Cardinality::GREATER);
249
2
  ASSERT_EQ(intrealToReal.getCardinality().compare(Cardinality::REALS),
250
2
            Cardinality::GREATER);
251
252
2
  ASSERT_EQ(realintToBool.getCardinality().compare(Cardinality::REALS),
253
2
            Cardinality::GREATER);
254
2
  ASSERT_EQ(realintToInt.getCardinality().compare(Cardinality::REALS),
255
2
            Cardinality::GREATER);
256
2
  ASSERT_EQ(realintToReal.getCardinality().compare(Cardinality::REALS),
257
2
            Cardinality::GREATER);
258
259
2
  ASSERT_EQ(realrealToBool.getCardinality().compare(Cardinality::REALS),
260
2
            Cardinality::GREATER);
261
2
  ASSERT_EQ(realrealToInt.getCardinality().compare(Cardinality::REALS),
262
2
            Cardinality::GREATER);
263
2
  ASSERT_EQ(realrealToReal.getCardinality().compare(Cardinality::REALS),
264
2
            Cardinality::GREATER);
265
266
2
  ASSERT_EQ(realboolToBool.getCardinality().compare(Cardinality::REALS),
267
2
            Cardinality::GREATER);
268
2
  ASSERT_EQ(realboolToInt.getCardinality().compare(Cardinality::REALS),
269
2
            Cardinality::GREATER);
270
2
  ASSERT_EQ(realboolToReal.getCardinality().compare(Cardinality::REALS),
271
2
            Cardinality::GREATER);
272
273
2
  ASSERT_EQ(boolrealToBool.getCardinality().compare(Cardinality::REALS),
274
2
            Cardinality::GREATER);
275
2
  ASSERT_EQ(boolrealToInt.getCardinality().compare(Cardinality::REALS),
276
2
            Cardinality::GREATER);
277
2
  ASSERT_EQ(boolrealToReal.getCardinality().compare(Cardinality::REALS),
278
2
            Cardinality::GREATER);
279
}
280
281
16
TEST_F(TestNodeBlackTypeCardinality, ternary_functions)
282
{
283
4
  std::vector<TypeNode> boolbool;
284
2
  boolbool.push_back(d_nodeManager->booleanType());
285
2
  boolbool.push_back(d_nodeManager->booleanType());
286
4
  std::vector<TypeNode> boolboolbool = boolbool;
287
2
  boolboolbool.push_back(d_nodeManager->booleanType());
288
289
4
  TypeNode boolboolTuple = d_nodeManager->mkTupleType(boolbool);
290
4
  TypeNode boolboolboolTuple = d_nodeManager->mkTupleType(boolboolbool);
291
292
  TypeNode boolboolboolToBool =
293
4
      d_nodeManager->mkFunctionType(boolboolbool, d_nodeManager->booleanType());
294
  TypeNode boolboolToBoolbool =
295
4
      d_nodeManager->mkFunctionType(boolbool, boolboolTuple);
296
  TypeNode boolToBoolboolbool = d_nodeManager->mkFunctionType(
297
4
      d_nodeManager->booleanType(), boolboolboolTuple);
298
299
2
  ASSERT_EQ(boolboolboolToBool.getCardinality().compare(/* 2 ^ 8 */ 1 << 8),
300
2
            Cardinality::EQUAL);
301
2
  ASSERT_EQ(
302
      boolboolToBoolbool.getCardinality().compare(/* 4 ^ 4 */ 4 * 4 * 4 * 4),
303
2
      Cardinality::EQUAL);
304
2
  ASSERT_EQ(boolToBoolboolbool.getCardinality().compare(/* 8 ^ 2 */ 8 * 8),
305
2
            Cardinality::EQUAL);
306
}
307
308
16
TEST_F(TestNodeBlackTypeCardinality, undefined_sorts)
309
{
310
4
  TypeNode foo = d_nodeManager->mkSort("foo", NodeManager::SORT_FLAG_NONE);
311
  // We've currently assigned them a specific Beth number, which
312
  // isn't really correct, but...
313
2
  ASSERT_FALSE(foo.getCardinality().isFinite());
314
}
315
316
16
TEST_F(TestNodeBlackTypeCardinality, bitvectors)
317
{
318
2
  ASSERT_EQ(d_nodeManager->mkBitVectorType(0).getCardinality().compare(0),
319
2
            Cardinality::EQUAL);
320
4
  Cardinality lastCard = 0;
321
132
  for (unsigned i = 1; i <= 65; ++i)
322
  {
323
260
    Cardinality card = Cardinality(2) ^ i;
324
260
    Cardinality typeCard = d_nodeManager->mkBitVectorType(i).getCardinality();
325
130
    ASSERT_TRUE(typeCard.compare(lastCard) == Cardinality::GREATER
326
130
                || (typeCard.isLargeFinite() && lastCard.isLargeFinite()));
327
130
    ASSERT_TRUE(typeCard.compare(card) == Cardinality::EQUAL
328
130
                || typeCard.isLargeFinite());
329
130
    lastCard = typeCard;
330
  }
331
}
332
333
}  // namespace test
334
67840
}  // namespace cvc5