1 /********************* */
2 /*! \file attribute_white.h
4 ** Original author: mdeters
5 ** Major contributors: none
6 ** Minor contributors (to current version): barrett, dejan, cconway
7 ** This file is part of the CVC4 prototype.
8 ** Copyright (c) 2009, 2010 The Analysis of Computer Systems Group (ACSys)
9 ** Courant Institute of Mathematical Sciences
10 ** New York University
11 ** See the file COPYING in the top-level source directory for licensing
12 ** information.\endverbatim
14 ** \brief White box testing of Node attributes.
16 ** White box testing of Node attributes.
19 #include <cxxtest/TestSuite.h>
23 #include "context/context.h"
24 #include "expr/node_value.h"
25 #include "expr/node_builder.h"
26 #include "expr/node_manager.h"
27 #include "expr/attribute.h"
28 #include "expr/node.h"
29 #include "theory/theory_engine.h"
30 #include "theory/uf/theory_uf.h"
31 #include "util/Assert.h"
34 using namespace CVC4::kind
;
35 using namespace CVC4::context
;
36 using namespace CVC4::expr
;
37 using namespace CVC4::expr::attr
;
46 typedef Attribute
<Test1
, std::string
> TestStringAttr1
;
47 typedef Attribute
<Test2
, std::string
> TestStringAttr2
;
49 // it would be nice to have CDAttribute<> for context-dependence
50 typedef CDAttribute
<Test1
, bool> TestCDFlag
;
52 typedef Attribute
<Test1
, bool> TestFlag1
;
53 typedef Attribute
<Test2
, bool> TestFlag2
;
54 typedef Attribute
<Test3
, bool> TestFlag3
;
55 typedef Attribute
<Test4
, bool> TestFlag4
;
56 typedef Attribute
<Test5
, bool> TestFlag5
;
58 typedef CDAttribute
<Test1
, bool> TestFlag1cd
;
59 typedef CDAttribute
<Test2
, bool> TestFlag2cd
;
61 class AttributeWhite
: public CxxTest::TestSuite
{
65 NodeManagerScope
* d_scope
;
66 TypeNode
* d_booleanType
;
72 d_nm
= new NodeManager(d_ctxt
);
73 d_scope
= new NodeManagerScope(d_nm
);
75 d_booleanType
= new TypeNode(d_nm
->booleanType());
85 void testAttributeIds() {
86 // Test that IDs for (a subset of) attributes in the system are
87 // unique and that the LastAttributeId (which would be the next ID
88 // to assign) is greater than all attribute IDs.
90 // We used to check ID assignments explicitly. However, between
91 // compilation modules, you don't get a strong guarantee
92 // (initialization order is somewhat implementation-specific, and
93 // anyway you'd have to change the tests anytime you add an
94 // attribute). So we back off, and just test that they're unique
95 // and that the next ID to be assigned is strictly greater than
96 // those that have already been assigned.
98 unsigned lastId
= attr::LastAttributeId
<string
, false>::s_id
;
99 TS_ASSERT_LESS_THAN(VarNameAttr::s_id
, lastId
);
100 TS_ASSERT_LESS_THAN(TestStringAttr1::s_id
, lastId
);
101 TS_ASSERT_LESS_THAN(TestStringAttr2::s_id
, lastId
);
103 TS_ASSERT_DIFFERS(VarNameAttr::s_id
, TestStringAttr1::s_id
);
104 TS_ASSERT_DIFFERS(VarNameAttr::s_id
, TestStringAttr2::s_id
);
105 TS_ASSERT_DIFFERS(TestStringAttr1::s_id
, TestStringAttr2::s_id
);
107 //lastId = attr::LastAttributeId<void*, false>::s_id;
108 //TS_ASSERT_LESS_THAN(theory::uf::ECAttr::s_id, lastId);
110 lastId
= attr::LastAttributeId
<bool, false>::s_id
;
111 TS_ASSERT_LESS_THAN(theory::Theory::PreRegisteredAttr::s_id
, lastId
);
112 TS_ASSERT_LESS_THAN(TestFlag1::s_id
, lastId
);
113 TS_ASSERT_LESS_THAN(TestFlag2::s_id
, lastId
);
114 TS_ASSERT_LESS_THAN(TestFlag3::s_id
, lastId
);
115 TS_ASSERT_LESS_THAN(TestFlag4::s_id
, lastId
);
116 TS_ASSERT_LESS_THAN(TestFlag5::s_id
, lastId
);
117 TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id
, TestFlag1::s_id
);
118 TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id
, TestFlag2::s_id
);
119 TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id
, TestFlag3::s_id
);
120 TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id
, TestFlag4::s_id
);
121 TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id
, TestFlag5::s_id
);
122 TS_ASSERT_DIFFERS(TestFlag1::s_id
, TestFlag2::s_id
);
123 TS_ASSERT_DIFFERS(TestFlag1::s_id
, TestFlag3::s_id
);
124 TS_ASSERT_DIFFERS(TestFlag1::s_id
, TestFlag4::s_id
);
125 TS_ASSERT_DIFFERS(TestFlag1::s_id
, TestFlag5::s_id
);
126 TS_ASSERT_DIFFERS(TestFlag2::s_id
, TestFlag3::s_id
);
127 TS_ASSERT_DIFFERS(TestFlag2::s_id
, TestFlag4::s_id
);
128 TS_ASSERT_DIFFERS(TestFlag2::s_id
, TestFlag5::s_id
);
129 TS_ASSERT_DIFFERS(TestFlag3::s_id
, TestFlag4::s_id
);
130 TS_ASSERT_DIFFERS(TestFlag3::s_id
, TestFlag5::s_id
);
131 TS_ASSERT_DIFFERS(TestFlag4::s_id
, TestFlag5::s_id
);
133 lastId
= attr::LastAttributeId
<bool, true>::s_id
;
134 TS_ASSERT_LESS_THAN(TheoryEngine::RegisteredAttr::s_id
, lastId
);
135 TS_ASSERT_LESS_THAN(TestFlag1cd::s_id
, lastId
);
136 TS_ASSERT_LESS_THAN(TestFlag2cd::s_id
, lastId
);
137 TS_ASSERT_DIFFERS(TheoryEngine::RegisteredAttr::s_id
, TestFlag1cd::s_id
);
138 TS_ASSERT_DIFFERS(TheoryEngine::RegisteredAttr::s_id
, TestFlag2cd::s_id
);
139 TS_ASSERT_DIFFERS(TestFlag1cd::s_id
, TestFlag2cd::s_id
);
141 lastId
= attr::LastAttributeId
<Node
, false>::s_id
;
142 TS_ASSERT_LESS_THAN(theory::PreRewriteCache::s_id
, lastId
);
143 TS_ASSERT_LESS_THAN(theory::PostRewriteCache::s_id
, lastId
);
144 TS_ASSERT_LESS_THAN(theory::PreRewriteCacheTop::s_id
, lastId
);
145 TS_ASSERT_LESS_THAN(theory::PostRewriteCacheTop::s_id
, lastId
);
146 TS_ASSERT_DIFFERS(theory::PreRewriteCache::s_id
, theory::PostRewriteCache::s_id
);
147 TS_ASSERT_DIFFERS(theory::PreRewriteCache::s_id
, theory::PreRewriteCacheTop::s_id
);
148 TS_ASSERT_DIFFERS(theory::PreRewriteCache::s_id
, theory::PostRewriteCacheTop::s_id
);
149 TS_ASSERT_DIFFERS(theory::PostRewriteCache::s_id
, theory::PreRewriteCacheTop::s_id
);
150 TS_ASSERT_DIFFERS(theory::PostRewriteCache::s_id
, theory::PostRewriteCacheTop::s_id
);
151 TS_ASSERT_DIFFERS(theory::PreRewriteCacheTop::s_id
, theory::PostRewriteCacheTop::s_id
);
153 lastId
= attr::LastAttributeId
<TypeNode
, false>::s_id
;
154 TS_ASSERT_LESS_THAN(NodeManager::TypeAttr::s_id
, lastId
);
158 void testCDAttributes() {
159 //Debug.on("boolattr");
161 Node a
= d_nm
->mkVar(*d_booleanType
);
162 Node b
= d_nm
->mkVar(*d_booleanType
);
163 Node c
= d_nm
->mkVar(*d_booleanType
);
165 Debug("boolattr", "get flag 1 on a (should be F)\n");
166 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
167 Debug("boolattr", "get flag 1 on b (should be F)\n");
168 TS_ASSERT(! b
.getAttribute(TestFlag1cd()));
169 Debug("boolattr", "get flag 1 on c (should be F)\n");
170 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
172 d_ctxt
->push(); // level 1
174 // test that all boolean flags are FALSE to start
175 Debug("boolattr", "get flag 1 on a (should be F)\n");
176 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
177 Debug("boolattr", "get flag 1 on b (should be F)\n");
178 TS_ASSERT(! b
.getAttribute(TestFlag1cd()));
179 Debug("boolattr", "get flag 1 on c (should be F)\n");
180 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
182 // test that they all HAVE the boolean attributes
183 TS_ASSERT(a
.hasAttribute(TestFlag1cd()));
184 TS_ASSERT(b
.hasAttribute(TestFlag1cd()));
185 TS_ASSERT(c
.hasAttribute(TestFlag1cd()));
187 // test two-arg version of hasAttribute()
189 Debug("boolattr", "get flag 1 on a (should be F)\n");
190 TS_ASSERT(a
.getAttribute(TestFlag1cd(), bb
));
192 Debug("boolattr", "get flag 1 on b (should be F)\n");
193 TS_ASSERT(b
.getAttribute(TestFlag1cd(), bb
));
195 Debug("boolattr", "get flag 1 on c (should be F)\n");
196 TS_ASSERT(c
.getAttribute(TestFlag1cd(), bb
));
199 // setting boolean flags
200 Debug("boolattr", "set flag 1 on a to T\n");
201 a
.setAttribute(TestFlag1cd(), true);
202 Debug("boolattr", "set flag 1 on b to F\n");
203 b
.setAttribute(TestFlag1cd(), false);
204 Debug("boolattr", "set flag 1 on c to F\n");
205 c
.setAttribute(TestFlag1cd(), false);
207 Debug("boolattr", "get flag 1 on a (should be T)\n");
208 TS_ASSERT(a
.getAttribute(TestFlag1cd()));
209 Debug("boolattr", "get flag 1 on b (should be F)\n");
210 TS_ASSERT(! b
.getAttribute(TestFlag1cd()));
211 Debug("boolattr", "get flag 1 on c (should be F)\n");
212 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
214 d_ctxt
->push(); // level 2
216 Debug("boolattr", "get flag 1 on a (should be T)\n");
217 TS_ASSERT(a
.getAttribute(TestFlag1cd()));
218 Debug("boolattr", "get flag 1 on b (should be F)\n");
219 TS_ASSERT(! b
.getAttribute(TestFlag1cd()));
220 Debug("boolattr", "get flag 1 on c (should be F)\n");
221 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
223 Debug("boolattr", "set flag 1 on a to F\n");
224 a
.setAttribute(TestFlag1cd(), false);
225 Debug("boolattr", "set flag 1 on b to T\n");
226 b
.setAttribute(TestFlag1cd(), true);
228 Debug("boolattr", "get flag 1 on a (should be F)\n");
229 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
230 Debug("boolattr", "get flag 1 on b (should be T)\n");
231 TS_ASSERT(b
.getAttribute(TestFlag1cd()));
232 Debug("boolattr", "get flag 1 on c (should be F)\n");
233 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
235 d_ctxt
->push(); // level 3
237 Debug("boolattr", "get flag 1 on a (should be F)\n");
238 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
239 Debug("boolattr", "get flag 1 on b (should be T)\n");
240 TS_ASSERT(b
.getAttribute(TestFlag1cd()));
241 Debug("boolattr", "get flag 1 on c (should be F)\n");
242 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
244 Debug("boolattr", "set flag 1 on c to T\n");
245 c
.setAttribute(TestFlag1cd(), true);
247 Debug("boolattr", "get flag 1 on a (should be F)\n");
248 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
249 Debug("boolattr", "get flag 1 on b (should be T)\n");
250 TS_ASSERT(b
.getAttribute(TestFlag1cd()));
251 Debug("boolattr", "get flag 1 on c (should be T)\n");
252 TS_ASSERT(c
.getAttribute(TestFlag1cd()));
254 d_ctxt
->pop(); // level 2
256 Debug("boolattr", "get flag 1 on a (should be F)\n");
257 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
258 Debug("boolattr", "get flag 1 on b (should be T)\n");
259 TS_ASSERT(b
.getAttribute(TestFlag1cd()));
260 Debug("boolattr", "get flag 1 on c (should be F)\n");
261 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
263 d_ctxt
->pop(); // level 1
265 Debug("boolattr", "get flag 1 on a (should be T)\n");
266 TS_ASSERT(a
.getAttribute(TestFlag1cd()));
267 Debug("boolattr", "get flag 1 on b (should be F)\n");
268 TS_ASSERT(! b
.getAttribute(TestFlag1cd()));
269 Debug("boolattr", "get flag 1 on c (should be F)\n");
270 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
272 d_ctxt
->pop(); // level 0
274 Debug("boolattr", "get flag 1 on a (should be F)\n");
275 TS_ASSERT(! a
.getAttribute(TestFlag1cd()));
276 Debug("boolattr", "get flag 1 on b (should be F)\n");
277 TS_ASSERT(! b
.getAttribute(TestFlag1cd()));
278 Debug("boolattr", "get flag 1 on c (should be F)\n");
279 TS_ASSERT(! c
.getAttribute(TestFlag1cd()));
281 #ifdef CVC4_ASSERTIONS
282 TS_ASSERT_THROWS( d_ctxt
->pop(), AssertionException
);
283 #endif /* CVC4_ASSERTIONS */
286 void testAttributes() {
287 //Debug.on("boolattr");
289 Node a
= d_nm
->mkVar(*d_booleanType
);
290 Node b
= d_nm
->mkVar(*d_booleanType
);
291 Node c
= d_nm
->mkVar(*d_booleanType
);
292 Node unnamed
= d_nm
->mkVar(*d_booleanType
);
294 a
.setAttribute(VarNameAttr(), "a");
295 b
.setAttribute(VarNameAttr(), "b");
296 c
.setAttribute(VarNameAttr(), "c");
298 // test that all boolean flags are FALSE to start
299 Debug("boolattr", "get flag 1 on a (should be F)\n");
300 TS_ASSERT(! a
.getAttribute(TestFlag1()));
301 Debug("boolattr", "get flag 1 on b (should be F)\n");
302 TS_ASSERT(! b
.getAttribute(TestFlag1()));
303 Debug("boolattr", "get flag 1 on c (should be F)\n");
304 TS_ASSERT(! c
.getAttribute(TestFlag1()));
305 Debug("boolattr", "get flag 1 on unnamed (should be F)\n");
306 TS_ASSERT(! unnamed
.getAttribute(TestFlag1()));
308 Debug("boolattr", "get flag 2 on a (should be F)\n");
309 TS_ASSERT(! a
.getAttribute(TestFlag2()));
310 Debug("boolattr", "get flag 2 on b (should be F)\n");
311 TS_ASSERT(! b
.getAttribute(TestFlag2()));
312 Debug("boolattr", "get flag 2 on c (should be F)\n");
313 TS_ASSERT(! c
.getAttribute(TestFlag2()));
314 Debug("boolattr", "get flag 2 on unnamed (should be F)\n");
315 TS_ASSERT(! unnamed
.getAttribute(TestFlag2()));
317 Debug("boolattr", "get flag 3 on a (should be F)\n");
318 TS_ASSERT(! a
.getAttribute(TestFlag3()));
319 Debug("boolattr", "get flag 3 on b (should be F)\n");
320 TS_ASSERT(! b
.getAttribute(TestFlag3()));
321 Debug("boolattr", "get flag 3 on c (should be F)\n");
322 TS_ASSERT(! c
.getAttribute(TestFlag3()));
323 Debug("boolattr", "get flag 3 on unnamed (should be F)\n");
324 TS_ASSERT(! unnamed
.getAttribute(TestFlag3()));
326 Debug("boolattr", "get flag 4 on a (should be F)\n");
327 TS_ASSERT(! a
.getAttribute(TestFlag4()));
328 Debug("boolattr", "get flag 4 on b (should be F)\n");
329 TS_ASSERT(! b
.getAttribute(TestFlag4()));
330 Debug("boolattr", "get flag 4 on c (should be F)\n");
331 TS_ASSERT(! c
.getAttribute(TestFlag4()));
332 Debug("boolattr", "get flag 4 on unnamed (should be F)\n");
333 TS_ASSERT(! unnamed
.getAttribute(TestFlag4()));
335 Debug("boolattr", "get flag 5 on a (should be F)\n");
336 TS_ASSERT(! a
.getAttribute(TestFlag5()));
337 Debug("boolattr", "get flag 5 on b (should be F)\n");
338 TS_ASSERT(! b
.getAttribute(TestFlag5()));
339 Debug("boolattr", "get flag 5 on c (should be F)\n");
340 TS_ASSERT(! c
.getAttribute(TestFlag5()));
341 Debug("boolattr", "get flag 5 on unnamed (should be F)\n");
342 TS_ASSERT(! unnamed
.getAttribute(TestFlag5()));
344 // test that they all HAVE the boolean attributes
345 TS_ASSERT(a
.hasAttribute(TestFlag1()));
346 TS_ASSERT(b
.hasAttribute(TestFlag1()));
347 TS_ASSERT(c
.hasAttribute(TestFlag1()));
348 TS_ASSERT(unnamed
.hasAttribute(TestFlag1()));
350 TS_ASSERT(a
.hasAttribute(TestFlag2()));
351 TS_ASSERT(b
.hasAttribute(TestFlag2()));
352 TS_ASSERT(c
.hasAttribute(TestFlag2()));
353 TS_ASSERT(unnamed
.hasAttribute(TestFlag2()));
355 TS_ASSERT(a
.hasAttribute(TestFlag3()));
356 TS_ASSERT(b
.hasAttribute(TestFlag3()));
357 TS_ASSERT(c
.hasAttribute(TestFlag3()));
358 TS_ASSERT(unnamed
.hasAttribute(TestFlag3()));
360 TS_ASSERT(a
.hasAttribute(TestFlag4()));
361 TS_ASSERT(b
.hasAttribute(TestFlag4()));
362 TS_ASSERT(c
.hasAttribute(TestFlag4()));
363 TS_ASSERT(unnamed
.hasAttribute(TestFlag4()));
365 TS_ASSERT(a
.hasAttribute(TestFlag5()));
366 TS_ASSERT(b
.hasAttribute(TestFlag5()));
367 TS_ASSERT(c
.hasAttribute(TestFlag5()));
368 TS_ASSERT(unnamed
.hasAttribute(TestFlag5()));
370 // test two-arg version of hasAttribute()
372 Debug("boolattr", "get flag 1 on a (should be F)\n");
373 TS_ASSERT(a
.getAttribute(TestFlag1(), bb
));
375 Debug("boolattr", "get flag 1 on b (should be F)\n");
376 TS_ASSERT(b
.getAttribute(TestFlag1(), bb
));
378 Debug("boolattr", "get flag 1 on c (should be F)\n");
379 TS_ASSERT(c
.getAttribute(TestFlag1(), bb
));
381 Debug("boolattr", "get flag 1 on unnamed (should be F)\n");
382 TS_ASSERT(unnamed
.getAttribute(TestFlag1(), bb
));
385 Debug("boolattr", "get flag 2 on a (should be F)\n");
386 TS_ASSERT(a
.getAttribute(TestFlag2(), bb
));
388 Debug("boolattr", "get flag 2 on b (should be F)\n");
389 TS_ASSERT(b
.getAttribute(TestFlag2(), bb
));
391 Debug("boolattr", "get flag 2 on c (should be F)\n");
392 TS_ASSERT(c
.getAttribute(TestFlag2(), bb
));
394 Debug("boolattr", "get flag 2 on unnamed (should be F)\n");
395 TS_ASSERT(unnamed
.getAttribute(TestFlag2(), bb
));
398 Debug("boolattr", "get flag 3 on a (should be F)\n");
399 TS_ASSERT(a
.getAttribute(TestFlag3(), bb
));
401 Debug("boolattr", "get flag 3 on b (should be F)\n");
402 TS_ASSERT(b
.getAttribute(TestFlag3(), bb
));
404 Debug("boolattr", "get flag 3 on c (should be F)\n");
405 TS_ASSERT(c
.getAttribute(TestFlag3(), bb
));
407 Debug("boolattr", "get flag 3 on unnamed (should be F)\n");
408 TS_ASSERT(unnamed
.getAttribute(TestFlag3(), bb
));
411 Debug("boolattr", "get flag 4 on a (should be F)\n");
412 TS_ASSERT(a
.getAttribute(TestFlag4(), bb
));
414 Debug("boolattr", "get flag 4 on b (should be F)\n");
415 TS_ASSERT(b
.getAttribute(TestFlag4(), bb
));
417 Debug("boolattr", "get flag 4 on c (should be F)\n");
418 TS_ASSERT(c
.getAttribute(TestFlag4(), bb
));
420 Debug("boolattr", "get flag 4 on unnamed (should be F)\n");
421 TS_ASSERT(unnamed
.getAttribute(TestFlag4(), bb
));
424 Debug("boolattr", "get flag 5 on a (should be F)\n");
425 TS_ASSERT(a
.getAttribute(TestFlag5(), bb
));
427 Debug("boolattr", "get flag 5 on b (should be F)\n");
428 TS_ASSERT(b
.getAttribute(TestFlag5(), bb
));
430 Debug("boolattr", "get flag 5 on c (should be F)\n");
431 TS_ASSERT(c
.getAttribute(TestFlag5(), bb
));
433 Debug("boolattr", "get flag 5 on unnamed (should be F)\n");
434 TS_ASSERT(unnamed
.getAttribute(TestFlag5(), bb
));
437 // setting boolean flags
438 Debug("boolattr", "set flag 1 on a to T\n");
439 a
.setAttribute(TestFlag1(), true);
440 Debug("boolattr", "set flag 1 on b to F\n");
441 b
.setAttribute(TestFlag1(), false);
442 Debug("boolattr", "set flag 1 on c to F\n");
443 c
.setAttribute(TestFlag1(), false);
444 Debug("boolattr", "set flag 1 on unnamed to T\n");
445 unnamed
.setAttribute(TestFlag1(), true);
447 Debug("boolattr", "set flag 2 on a to F\n");
448 a
.setAttribute(TestFlag2(), false);
449 Debug("boolattr", "set flag 2 on b to T\n");
450 b
.setAttribute(TestFlag2(), true);
451 Debug("boolattr", "set flag 2 on c to T\n");
452 c
.setAttribute(TestFlag2(), true);
453 Debug("boolattr", "set flag 2 on unnamed to F\n");
454 unnamed
.setAttribute(TestFlag2(), false);
456 Debug("boolattr", "set flag 3 on a to T\n");
457 a
.setAttribute(TestFlag3(), true);
458 Debug("boolattr", "set flag 3 on b to T\n");
459 b
.setAttribute(TestFlag3(), true);
460 Debug("boolattr", "set flag 3 on c to T\n");
461 c
.setAttribute(TestFlag3(), true);
462 Debug("boolattr", "set flag 3 on unnamed to T\n");
463 unnamed
.setAttribute(TestFlag3(), true);
465 Debug("boolattr", "set flag 4 on a to T\n");
466 a
.setAttribute(TestFlag4(), true);
467 Debug("boolattr", "set flag 4 on b to T\n");
468 b
.setAttribute(TestFlag4(), true);
469 Debug("boolattr", "set flag 4 on c to T\n");
470 c
.setAttribute(TestFlag4(), true);
471 Debug("boolattr", "set flag 4 on unnamed to T\n");
472 unnamed
.setAttribute(TestFlag4(), true);
474 Debug("boolattr", "set flag 5 on a to T\n");
475 a
.setAttribute(TestFlag5(), true);
476 Debug("boolattr", "set flag 5 on b to T\n");
477 b
.setAttribute(TestFlag5(), true);
478 Debug("boolattr", "set flag 5 on c to F\n");
479 c
.setAttribute(TestFlag5(), false);
480 Debug("boolattr", "set flag 5 on unnamed to T\n");
481 unnamed
.setAttribute(TestFlag5(), true);
483 TS_ASSERT(a
.getAttribute(VarNameAttr()) == "a");
484 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "b");
485 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "c");
486 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "");
488 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "a");
489 TS_ASSERT(b
.getAttribute(VarNameAttr()) == "b");
490 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "c");
491 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "");
493 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "a");
494 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "b");
495 TS_ASSERT(c
.getAttribute(VarNameAttr()) == "c");
496 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "");
498 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "a");
499 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "b");
500 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "c");
501 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) == "");
503 TS_ASSERT(! unnamed
.hasAttribute(VarNameAttr()));
505 TS_ASSERT(! a
.hasAttribute(TestStringAttr1()));
506 TS_ASSERT(! b
.hasAttribute(TestStringAttr1()));
507 TS_ASSERT(! c
.hasAttribute(TestStringAttr1()));
508 TS_ASSERT(! unnamed
.hasAttribute(TestStringAttr1()));
510 TS_ASSERT(! a
.hasAttribute(TestStringAttr2()));
511 TS_ASSERT(! b
.hasAttribute(TestStringAttr2()));
512 TS_ASSERT(! c
.hasAttribute(TestStringAttr2()));
513 TS_ASSERT(! unnamed
.hasAttribute(TestStringAttr2()));
515 Debug("boolattr", "get flag 1 on a (should be T)\n");
516 TS_ASSERT(a
.getAttribute(TestFlag1()));
517 Debug("boolattr", "get flag 1 on b (should be F)\n");
518 TS_ASSERT(! b
.getAttribute(TestFlag1()));
519 Debug("boolattr", "get flag 1 on c (should be F)\n");
520 TS_ASSERT(! c
.getAttribute(TestFlag1()));
521 Debug("boolattr", "get flag 1 on unnamed (should be T)\n");
522 TS_ASSERT(unnamed
.getAttribute(TestFlag1()));
524 Debug("boolattr", "get flag 2 on a (should be F)\n");
525 TS_ASSERT(! a
.getAttribute(TestFlag2()));
526 Debug("boolattr", "get flag 2 on b (should be T)\n");
527 TS_ASSERT(b
.getAttribute(TestFlag2()));
528 Debug("boolattr", "get flag 2 on c (should be T)\n");
529 TS_ASSERT(c
.getAttribute(TestFlag2()));
530 Debug("boolattr", "get flag 2 on unnamed (should be F)\n");
531 TS_ASSERT(! unnamed
.getAttribute(TestFlag2()));
533 Debug("boolattr", "get flag 3 on a (should be T)\n");
534 TS_ASSERT(a
.getAttribute(TestFlag3()));
535 Debug("boolattr", "get flag 3 on b (should be T)\n");
536 TS_ASSERT(b
.getAttribute(TestFlag3()));
537 Debug("boolattr", "get flag 3 on c (should be T)\n");
538 TS_ASSERT(c
.getAttribute(TestFlag3()));
539 Debug("boolattr", "get flag 3 on unnamed (should be T)\n");
540 TS_ASSERT(unnamed
.getAttribute(TestFlag3()));
542 Debug("boolattr", "get flag 4 on a (should be T)\n");
543 TS_ASSERT(a
.getAttribute(TestFlag4()));
544 Debug("boolattr", "get flag 4 on b (should be T)\n");
545 TS_ASSERT(b
.getAttribute(TestFlag4()));
546 Debug("boolattr", "get flag 4 on c (should be T)\n");
547 TS_ASSERT(c
.getAttribute(TestFlag4()));
548 Debug("boolattr", "get flag 4 on unnamed (should be T)\n");
549 TS_ASSERT(unnamed
.getAttribute(TestFlag4()));
551 Debug("boolattr", "get flag 5 on a (should be T)\n");
552 TS_ASSERT(a
.getAttribute(TestFlag5()));
553 Debug("boolattr", "get flag 5 on b (should be T)\n");
554 TS_ASSERT(b
.getAttribute(TestFlag5()));
555 Debug("boolattr", "get flag 5 on c (should be F)\n");
556 TS_ASSERT(! c
.getAttribute(TestFlag5()));
557 Debug("boolattr", "get flag 5 on unnamed (should be T)\n");
558 TS_ASSERT(unnamed
.getAttribute(TestFlag5()));
560 a
.setAttribute(TestStringAttr1(), "foo");
561 b
.setAttribute(TestStringAttr1(), "bar");
562 c
.setAttribute(TestStringAttr1(), "baz");
564 TS_ASSERT(a
.getAttribute(VarNameAttr()) == "a");
565 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "b");
566 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "c");
567 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "");
569 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "a");
570 TS_ASSERT(b
.getAttribute(VarNameAttr()) == "b");
571 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "c");
572 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "");
574 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "a");
575 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "b");
576 TS_ASSERT(c
.getAttribute(VarNameAttr()) == "c");
577 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "");
579 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "a");
580 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "b");
581 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "c");
582 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) == "");
584 TS_ASSERT(! unnamed
.hasAttribute(VarNameAttr()));
586 TS_ASSERT(a
.hasAttribute(TestStringAttr1()));
587 TS_ASSERT(b
.hasAttribute(TestStringAttr1()));
588 TS_ASSERT(c
.hasAttribute(TestStringAttr1()));
589 TS_ASSERT(! unnamed
.hasAttribute(TestStringAttr1()));
591 TS_ASSERT(! a
.hasAttribute(TestStringAttr2()));
592 TS_ASSERT(! b
.hasAttribute(TestStringAttr2()));
593 TS_ASSERT(! c
.hasAttribute(TestStringAttr2()));
594 TS_ASSERT(! unnamed
.hasAttribute(TestStringAttr2()));
596 a
.setAttribute(VarNameAttr(), "b");
597 b
.setAttribute(VarNameAttr(), "c");
598 c
.setAttribute(VarNameAttr(), "a");
600 TS_ASSERT(c
.getAttribute(VarNameAttr()) == "a");
601 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "b");
602 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "c");
603 TS_ASSERT(c
.getAttribute(VarNameAttr()) != "");
605 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "a");
606 TS_ASSERT(a
.getAttribute(VarNameAttr()) == "b");
607 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "c");
608 TS_ASSERT(a
.getAttribute(VarNameAttr()) != "");
610 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "a");
611 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "b");
612 TS_ASSERT(b
.getAttribute(VarNameAttr()) == "c");
613 TS_ASSERT(b
.getAttribute(VarNameAttr()) != "");
615 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "a");
616 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "b");
617 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) != "c");
618 TS_ASSERT(unnamed
.getAttribute(VarNameAttr()) == "");
620 TS_ASSERT(! unnamed
.hasAttribute(VarNameAttr()));