39 Generator deter_nondet(
"data/deterministic_nondet.gen");
42 deter_det.
Write(
"tmp_deterministic_det.gen");
43 deter_nondet.
Write(
"tmp_deterministic_nondet.gen");
46 std::cout <<
"################################\n";
47 std::cout <<
"# deterministic generator \n";
49 std::cout <<
"################################\n";
62 Generator minimal_nonmin(
"data/minimal_nonmin.gen");
64 StateMin(minimal_nonmin, minimal_min);
65 minimal_nonmin.
Write(
"tmp_minimal_nonmin.gen");
66 minimal_min.
Write(
"tmp_minimal_min.gen");
69 std::cout <<
"################################\n";
70 std::cout <<
"# minimal generator \n";
72 std::cout <<
"################################\n";
84 Generator project_g(
"data/project_g.gen");
91 Project(project_g, alph_proj, project_prog);
92 project_g.
Write(
"tmp_project_g.gen");
97 StateMin(project_prog,project_prog_min);
98 project_prog_min.
Write(
"tmp_project_prog.gen");
101 std::cout <<
"################################\n";
102 std::cout <<
"# projected generator \n";
103 project_prog_min.
DWrite();
104 std::cout <<
"################################\n";
116 Generator parallel_g1(
"data/parallel_g1.gen");
117 Generator parallel_g2(
"data/parallel_g2.gen");
121 Parallel(parallel_g1, parallel_g2, parallel_g1g2);
124 parallel_g1.
Write(
"tmp_parallel_g1.gen");
125 parallel_g2.
Write(
"tmp_parallel_g2.gen");
126 parallel_g1g2.
Write(
"tmp_parallel_g1g2.gen");
129 Generator parallel_m1(
"data/wparallel_g1.gen");
130 Generator parallel_m2(
"data/wparallel_g2.gen");
134 Parallel(parallel_m1, parallel_m2, parallel_m1m2);
137 parallel_m1.
Write(
"tmp_parallel_m1.gen");
138 parallel_m2.
Write(
"tmp_parallel_m2.gen");
139 parallel_m1m2.
Write(
"tmp_parallel_m1m2.gen");
142 Generator wparallel_g1(
"data/wparallel_g1.gen");
143 Generator wparallel_g2(
"data/wparallel_g2.gen");
155 Generator boolean_g1(
"data/boolean_g1.gen");
156 Generator boolean_g2(
"data/boolean_g2.gen");
157 Generator lequal_g1(
"data/lequal_g1.gen");
158 Generator lequal_g2(
"data/lequal_g2.gen");
171 Generator boolean_complement_g1=boolean_g1;
174 Generator boolean_complement2_g1=boolean_complement_g1;
178 boolean_g1.
Write(
"tmp_boolean_g1.gen");
179 boolean_g2.
Write(
"tmp_boolean_g2.gen");
180 boolean_union.
Write(
"tmp_union_g1g2.gen");
181 boolean_intersection.
Write(
"tmp_intersection_g1g2.gen");
182 boolean_complement_g1.
Write(
"tmp_complement_g1.gen");
183 boolean_complement2_g1.
Write(
"tmp_complement2_g1.gen");
186 std::cout <<
"################################\n";
187 std::cout <<
"# boolean language operations\n";
189 boolean_intersection.
DWrite();
190 boolean_complement_g1.
DWrite();
191 std::cout <<
"################################\n";
194 std::cout <<
"################################\n";
195 std::cout <<
"# boolean language operations\n";
197 std::cout <<
"Lm(g1) <= Lm(g1) v Lm(g2): OK\n";
199 std::cout <<
"Lm(g1) <= Lm(g1) v Lm(g2): ERR\n";
201 std::cout <<
"Lm(g1) ^ ~Lm(g1) = empty: OK\n";
203 std::cout <<
"(Lm(g1) v Lm(g2)) ^ ~(Lm(g1) v Lm(g2)) != empty: ERR\n";
205 std::cout <<
"Lm(g1) = ~~Lm(g1) : OK\n";
207 std::cout <<
"Lm(g1) != ~~Lm(g1) : ERR\n";
208 std::cout <<
"################################\n";
211 std::cout <<
"################################\n";
212 std::cout <<
"# boolean language operations for empty Lm(g1)\n";
214 std::cout <<
"Lm(g1) <= Lm(g2): OK\n";
216 std::cout <<
"Lm(g1) <= Lm(g2): ERR\n";
218 std::cout <<
"Lm(g2) <= Lm(g1): ERR\n";
220 std::cout <<
"~(Lm(g2) <= Lm(g1)): OK\n";
223 std::cout <<
"Lm(g1) == Lm(g2): ERR\n";
225 std::cout <<
"Lm(g1) != Lm(g2): OK\n";
240 Generator difference_g1(
"data/difference_g1.gen");
241 difference_g1.
Write(
"tmp_difference_g1.gen");
243 Generator difference_g2(
"data/difference_g2.gen");
244 difference_g2.
Write(
"tmp_difference_g2.gen");
250 difference_g1minusg2.
Write(
"tmp_difference_g1minusg2.gen");
253 std::cout <<
"################################\n";
254 std::cout <<
"# language difference Lm(g1)-Lm(g2) \n";
255 difference_g1minusg2.
DWrite();
256 std::cout <<
"################################\n";
268 Generator automaton_g(
"data/automaton_g.gen");
269 automaton_g.
Write(
"tmp_automaton_g.gen");
273 automaton_g.
Write(
"tmp_automaton_gRes.gen");
276 std::cout <<
"################################\n";
277 std::cout <<
"# automaton from generator \n";
279 std::cout <<
"################################\n";
291 Generator concat_g1(
"data/concat_g1.gen");
292 Generator concat_g2(
"data/concat_g2.gen");
293 Generator concat_g3(
"data/concat_g3.gen");
294 Generator concat_g4(
"data/concat_g4.gen");
295 Generator concat_g5(
"data/concat_g5.gen");
296 Generator concat_g6(
"data/concat_g6.gen");
297 concat_g1.
Write(
"tmp_concat_g1.gen");
298 concat_g2.
Write(
"tmp_concat_g2.gen");
299 concat_g3.
Write(
"tmp_concat_g3.gen");
300 concat_g4.
Write(
"tmp_concat_g4.gen");
301 concat_g5.
Write(
"tmp_concat_g5.gen");
302 concat_g6.
Write(
"tmp_concat_g6.gen");
306 std::cout <<
"################################\n";
307 std::cout <<
"# language concatenation\n";
311 concat.
Write(
"tmp_concat_g1g3.gen");
314 concat.
Write(
"tmp_concat_g1g4.gen");
317 concat.
Write(
"tmp_concat_g2g3.gen");
320 concat.
Write(
"tmp_concat_g2g4.gen");
323 concat.
Write(
"tmp_concat_g5g6.gen");
325 std::cout <<
"################################\n";
337 languages_alphabet.
Insert(
"a");
338 languages_alphabet.
Insert(
"b");
345 languages_g.
Write(
"tmp_languagesFull_result.gen");
348 std::cout <<
"################################\n";
349 std::cout <<
"# full language \n";
354 languages_g.
Write(
"tmp_languagesAlphabet_result.gen");
355 std::cout <<
"# alphabet language \n";
360 languages_g.
Write(
"tmp_languagesEmptyString_result.gen");
361 std::cout <<
"# empty string language \n";
366 languages_g.
Write(
"tmp_languagesEmpty_result.gen");
367 std::cout <<
"# empty language \n";
369 std::cout <<
"################################\n";
379 Generator kleene_g1(
"data/kleene_g1.gen");
380 kleene_g1.
Write(
"tmp_kleene_g1.gen");
385 kleene_g1.
Write(
"tmp_kleene_g1Res.gen");
388 std::cout <<
"################################\n";
389 std::cout <<
"# Kleene closure \n";
391 std::cout <<
"################################\n";
398 Generator kleene_g2(
"data/kleene_g2.gen");
399 kleene_g2.
Write(
"tmp_kleene_g2.gen");
404 kleene_g2.
Write(
"tmp_kleene_g2Res.gen");
407 std::cout <<
"################################\n";
408 std::cout <<
"# Kleene closure \n";
410 std::cout <<
"################################\n";
421 Generator prefixclosure_g(
"data/prefixclosure_g.gen");
422 prefixclosure_g.
Write(
"tmp_prefixclosure_g.gen");
425 bool isprefixclosed_g =
IsClosed(prefixclosure_g);
429 prefixclosure_g.
Write(
"tmp_prefixclosure_gRes.gen");
432 bool isprefixclosed_gRes =
IsClosed(prefixclosure_g);
435 std::cout <<
"################################\n";
436 std::cout <<
"# prefix closure \n";
438 std::cout <<
"# argument was prefix closed (test case error!)\n";
440 std::cout <<
"# argument was not prefix closed (expected)\n";
441 if(isprefixclosed_gRes)
442 std::cout <<
"# result is prefix closed (expected)\n";
444 std::cout <<
"# result is not prefix closed (test case error!)\n";
446 std::cout <<
"################################\n";
458 Generator selfloop_g(
"data/selfloop_g.gen");
459 selfloop_g.
Write(
"tmp_selfloop_g.gen");
463 selfloop_alphabet.
Insert(
"e");
464 selfloop_alphabet.
Insert(
"f");
470 SelfLoop(selfloop_gRes,selfloop_alphabet);
471 selfloop_gRes.
Write(
"tmp_selfloop_gRes.gen");
474 std::cout <<
"################################\n";
475 std::cout <<
"# selfloop, each state \n";
479 selfloop_gRes=selfloop_g;
481 selfloop_gRes.
Write(
"tmp_selfloopMarked_gRes.gen");
482 std::cout <<
"# selfloop, marked states \n";
486 selfloop_gRes=selfloop_g;
488 selfloop_gRes.
Write(
"tmp_selfloopInit_gRes.gen");
489 std::cout <<
"# selfloop, init state(s) \n";
491 std::cout <<
"################################\n";
500 std::cout <<
"################################\n";
501 std::cout <<
"# non-blocking test \n";
504 std::cout <<
"# conflict equiv. abstract test 1 \n";
508 nonblocking_g.
Read(
"data/noblo_gae2.gen");
510 nonblocking_g.
Write();
520 nonblocking_gv.
PushBack(
"data/noblo_g2.gen");
521 nonblocking_gv.
PushBack(
"data/noblo_g3.gen");
522 nonblocking_gv.
PushBack(
"data/noblo_g4.gen");
523 nonblocking_gv.
PushBack(
"data/noblo_g5.gen");
525 std::cout <<
"# non-blocking exec test 1\n";
526 bool nonblocking_ok1;
529 std::cout <<
"# non-blocking test: passed (expected)\n";
531 std::cout <<
"# non-blocking test: failed (test case error!)\n";
536 nonblocking_gv.
Clear();
537 nonblocking_gv.
PushBack(
"data/noblo_g5.gen");
538 nonblocking_gv.
PushBack(
"data/noblo_g6.gen");
539 nonblocking_gv.
PushBack(
"data/noblo_g7.gen");
540 nonblocking_gv.
PushBack(
"data/noblo_g8.gen");
541 nonblocking_gv.
PushBack(
"data/noblo_g9.gen");
543 std::cout <<
"# non-blocking exec test 2\n";
544 bool nonblocking_ok2;
547 std::cout <<
"# non-blocking test: passed (expected)\n";
549 std::cout <<
"# non-blocking test: failed (test case error!)\n";
554 nonblocking_gv.
Clear();
555 nonblocking_gv.
PushBack(
"data/noblo_g3.gen");
556 nonblocking_gv.
PushBack(
"data/noblo_g4.gen");
557 nonblocking_gv.
PushBack(
"data/noblo_g5.gen");
558 nonblocking_gv.
PushBack(
"data/noblo_g6.gen");
559 nonblocking_gv.
PushBack(
"data/noblo_g7.gen");
561 std::cout <<
"# non-blocking exec test 3\n";
562 bool nonblocking_ok3;
565 std::cout <<
"# non-blocking test: passed (test case error!)\n";
567 std::cout <<
"# non-blocking test: failed (expected)\n";
572 nonblocking_gv.
Clear();
573 nonblocking_gv.
PushBack(
"data/noblo_g1.gen");
574 nonblocking_gv.
PushBack(
"data/noblo_g3.gen");
575 nonblocking_gv.
PushBack(
"data/noblo_g5.gen");
576 nonblocking_gv.
PushBack(
"data/noblo_g7.gen");
578 std::cout <<
"# non-blocking exec test 4\n";
579 bool nonblocking_ok4;
582 std::cout <<
"# non-blocking test: passed (test case error!)\n";
584 std::cout <<
"# non-blocking test: failed (expected)\n";
589 nonblocking_gv.
Clear();
590 nonblocking_gv.
PushBack(
"data/noblo_g1.gen");
591 nonblocking_gv.
PushBack(
"data/noblo_g2.gen");
592 nonblocking_gv.
PushBack(
"data/noblo_g3.gen");
593 nonblocking_gv.
PushBack(
"data/noblo_g6.gen");
594 nonblocking_gv.
PushBack(
"data/noblo_g7.gen");
596 std::cout <<
"# non-blocking exec test 5\n";
597 bool nonblocking_ok5;
600 std::cout <<
"# non-blocking test: passed (expected)\n";
602 std::cout <<
"# non-blocking test: failed (test case error!)\n";
605 nonblocking_gv.
Clear();
606 nonblocking_gv.
PushBack(
"data/noblo_g1.gen");
607 nonblocking_gv.
PushBack(
"data/noblo_g2.gen");
608 nonblocking_gv.
PushBack(
"data/noblo_g3.gen");
609 nonblocking_gv.
PushBack(
"data/noblo_g4.gen");
610 nonblocking_gv.
PushBack(
"data/noblo_g5.gen");
611 nonblocking_gv.
PushBack(
"data/noblo_g6.gen");
612 nonblocking_gv.
PushBack(
"data/noblo_g7.gen");
614 std::cout <<
"# non-blocking exec test 6\n";
615 bool nonblocking_ok6;
618 std::cout <<
"# non-blocking test: passed (expected)\n";
620 std::cout <<
"# non-blocking test: failed (test case error!)\n";
623 nonblocking_gv.
Clear();
624 nonblocking_gv.
PushBack(
"data/noblo_g1.gen");
625 nonblocking_gv.
PushBack(
"data/noblo_g2.gen");
626 nonblocking_gv.
PushBack(
"data/noblo_g3.gen");
627 nonblocking_gv.
PushBack(
"data/noblo_g4.gen");
628 nonblocking_gv.
PushBack(
"data/noblo_g5.gen");
629 nonblocking_gv.
PushBack(
"data/noblo_g6.gen");
631 std::cout <<
"# non-blocking exec test 7\n";
632 bool nonblocking_ok7;
635 std::cout <<
"# non-blocking test: passed (expected)\n";
637 std::cout <<
"# non-blocking test: failed (test case error!)\n";
640 nonblocking_gv.
Clear();
641 nonblocking_gv.
PushBack(
"data/noblo_g2.gen");
642 nonblocking_gv.
PushBack(
"data/noblo_g4.gen");
643 nonblocking_gv.
PushBack(
"data/noblo_g6.gen");
644 nonblocking_gv.
PushBack(
"data/noblo_g8.gen");
646 std::cout <<
"# non-blocking exec test 8\n";
647 bool nonblocking_ok8;
650 std::cout <<
"# non-blocking test: passed (expected)\n";
652 std::cout <<
"# non-blocking test: failed (test case error!)\n";
656 nonblocking_gv.
Clear();
657 nonblocking_gv.
PushBack(
"data/noblo_yt1.gen");
658 nonblocking_gv.
PushBack(
"data/noblo_yt2.gen");
661 std::cout <<
"# non-blocking exec test 9a\n";
663 Parallel(nonblocking_gv.
At(0),nonblocking_gv.
At(1),parallel12);
664 bool nonblocking_ok9;
667 std::cout <<
"# non-blocking test: passed (test case error!)\n";
669 std::cout <<
"# non-blocking test: failed (expected)\n";
674 std::cout <<
"# non-blocking exec test 9b\n";
677 std::cout <<
"# non-blocking test: passed (test case error!)\n";
679 std::cout <<
"# non-blocking test: failed (expected)\n";
687 std::cout <<
"done.\n";
#define FAUDES_TEST_DIFF()
#define FAUDES_TEST_DUMP(mes, dat)
bool Insert(const Idx &rIndex)
virtual const T & At(const Position &pos) const
void DWrite(const Type *pContext=0) const
void Read(const std::string &rFileName, const std::string &rLabel="", const Type *pContext=0)
void Write(const Type *pContext=0) const
virtual void PushBack(const Type &rElem)
const StateSet & InitStates(void) const
StateSet BlockingStates(void) const
bool StateNamesEnabled(void) const
bool IsClosed(const Generator &rGen)
void ConflictEquivalentAbstraction(vGenerator &rGen, EventSet &rSilentEvents)
void StateMin(const Generator &rGen, Generator &rResGen)
void FullLanguage(const EventSet &rAlphabet, Generator &rResGen)
void LanguageUnion(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void SelfLoop(Generator &rGen, const EventSet &rAlphabet)
bool LanguageDisjoint(const Generator &rGen1, const Generator &rGen2)
bool LanguageInclusion(const Generator &rGen1, const Generator &rGen2)
void KleeneClosure(Generator &rGen)
void PrefixClosure(Generator &rGen)
void Deterministic(const Generator &rGen, Generator &rResGen)
void Automaton(Generator &rGen, const EventSet &rAlphabet)
void AlphabetLanguage(const EventSet &rAlphabet, Generator &rResGen)
void LanguageConcatenate(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
bool LanguageEquality(const Generator &rGen1, const Generator &rGen2)
void LanguageDifference(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void LanguageIntersection(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void Project(const Generator &rGen, const EventSet &rProjectAlphabet, Generator &rResGen)
void EmptyLanguage(const EventSet &rAlphabet, Generator &rResGen)
void Parallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void LanguageComplement(Generator &rGen, const EventSet &rAlphabet)
void EmptyStringLanguage(const EventSet &rAlphabet, Generator &rResGen)
void KleeneClosureNonDet(Generator &rGen)
void SelfLoopMarkedStates(Generator &rGen, const EventSet &rAlphabet)
bool IsNonblocking(const GeneratorVector &rGvec)