[Scummvm-cvs-logs] SF.net SVN: scummvm:[50659] tools/branches/gsoc2010-decompiler/decompiler/ test/cfg_test.h
pidgeot at users.sourceforge.net
pidgeot at users.sourceforge.net
Mon Jul 5 00:48:40 CEST 2010
Revision: 50659
http://scummvm.svn.sourceforge.net/scummvm/?rev=50659&view=rev
Author: pidgeot
Date: 2010-07-04 22:48:40 +0000 (Sun, 04 Jul 2010)
Log Message:
-----------
Add test case for new test scripts
Add test case for real-life script (samnmax/script-30)
Modified Paths:
--------------
tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h 2010-07-04 22:27:06 UTC (rev 50658)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h 2010-07-04 22:48:40 UTC (rev 50659)
@@ -361,4 +361,167 @@
delete c;
delete engine;
}
+
+ void testNestedLoops() {
+ Scumm::v6::Engine *engine = new Scumm::v6::Engine();
+ Disassembler *d = engine->getDisassembler();
+ d->open("decompiler/test/do-while-in-while.dmp");
+ std::vector<Instruction> insts = d->disassemble();
+ delete d;
+ ControlFlow *c = new ControlFlow(insts, engine);
+ c->createGroups();
+ Graph g = c->analyze();
+ VertexRange range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ if (gr->_start->_address == 0x0)
+ TS_ASSERT(gr->_type == kWhileCond);
+ if (gr->_start->_address == 0xd)
+ TS_ASSERT(gr->_type == kDoWhileCond);
+ }
+ delete c;
+
+ d = engine->getDisassembler();
+ d->open("decompiler/test/nested-do-while.dmp");
+ insts = d->disassemble();
+ delete d;
+ c = new ControlFlow(insts, engine);
+ c->createGroups();
+ g = c->analyze();
+ range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ if (gr->_start->_address == 0x6)
+ TS_ASSERT(gr->_type == kDoWhileCond);
+ if (gr->_start->_address == 0x10)
+ TS_ASSERT(gr->_type == kDoWhileCond);
+ }
+ delete c;
+
+ d = engine->getDisassembler();
+ d->open("decompiler/test/nested-while.dmp");
+ insts = d->disassemble();
+ delete d;
+ c = new ControlFlow(insts, engine);
+ c->createGroups();
+ g = c->analyze();
+ range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ if (gr->_start->_address == 0x0)
+ TS_ASSERT(gr->_type == kWhileCond);
+ if (gr->_start->_address == 0xa)
+ TS_ASSERT(gr->_type == kWhileCond);
+ }
+ delete c;
+
+ d = engine->getDisassembler();
+ d->open("decompiler/test/nested-while2.dmp");
+ insts = d->disassemble();
+ delete d;
+ c = new ControlFlow(insts, engine);
+ c->createGroups();
+ g = c->analyze();
+ range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ if (gr->_start->_address == 0x0)
+ TS_ASSERT(gr->_type == kWhileCond);
+ if (gr->_start->_address == 0xd)
+ TS_ASSERT(gr->_type == kWhileCond);
+ }
+ delete c;
+
+ d = engine->getDisassembler();
+ d->open("decompiler/test/while-in-do-while.dmp");
+ insts = d->disassemble();
+ delete d;
+ c = new ControlFlow(insts, engine);
+ c->createGroups();
+ g = c->analyze();
+ range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ if (gr->_start->_address == 0x0)
+ TS_ASSERT(gr->_type == kWhileCond);
+ if (gr->_start->_address == 0x10)
+ TS_ASSERT(gr->_type == kDoWhileCond);
+ }
+ delete c;
+
+ d = engine->getDisassembler();
+ d->open("decompiler/test/while-in-do-while2.dmp");
+ insts = d->disassemble();
+ delete d;
+ c = new ControlFlow(insts, engine);
+ c->createGroups();
+ g = c->analyze();
+ range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ if (gr->_start->_address == 0x3)
+ TS_ASSERT(gr->_type == kWhileCond);
+ if (gr->_start->_address == 0x13)
+ TS_ASSERT(gr->_type == kDoWhileCond);
+ }
+ delete c;
+
+ delete engine;
+ }
+
+ // This test requires script-30.dmp from Sam & Max: Hit The Road.
+ // 6e48faca13e1f6df9341567608962744 *script-30.dmp
+ void testSamAndMaxScript30() {
+ Scumm::v6::Engine *engine = new Scumm::v6::Engine();
+ Disassembler *d = engine->getDisassembler();
+ d->open("decompiler/test/script-30.dmp");
+ std::vector<Instruction> insts = d->disassemble();
+ delete d;
+ ControlFlow *c = new ControlFlow(insts, engine);
+ c->createGroups();
+ Graph g = c->analyze();
+ VertexRange range = boost::vertices(g);
+ for (VertexIterator it = range.first; it != range.second; ++it) {
+ Group *gr = GET(*it);
+ switch (gr->_start->_address) {
+ case 0x6:
+ TS_ASSERT(gr->_type == kWhileCond);
+ TS_ASSERT(!gr->_startElse);
+ TS_ASSERT(!gr->_endElse);
+ break;
+ case 0x19:
+ case 0x3A:
+ case 0x4F:
+ case 0x68:
+ case 0x75:
+ case 0x92:
+ TS_ASSERT(gr->_type == kIfCond);
+ TS_ASSERT(!gr->_startElse);
+ TS_ASSERT(!gr->_endElse);
+ break;
+ case 0x8B:
+ TS_ASSERT(gr->_type == kNormal);
+ TS_ASSERT(gr->_startElse);
+ TS_ASSERT(gr->_endElse);
+ break;
+ case 0x91:
+ TS_ASSERT(gr->_type == kNormal);
+ TS_ASSERT(gr->_startElse);
+ TS_ASSERT(!gr->_endElse);
+ break;
+ case 0xA6:
+ TS_ASSERT(gr->_type == kNormal);
+ TS_ASSERT(!gr->_startElse);
+ TS_ASSERT(gr->_endElse);
+ break;
+ default:
+ TS_ASSERT(gr->_type == kNormal);
+ TS_ASSERT(!gr->_startElse);
+ TS_ASSERT(!gr->_endElse);
+ break;
+ }
+ }
+ delete c;
+ delete engine;
+ }
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list