[Scummvm-cvs-logs] SF.net SVN: scummvm:[42004] tools/branches/gsoc2009-decompiler/decompiler

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Wed Jul 1 19:19:12 CEST 2009


Revision: 42004
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42004&view=rev
Author:   kjdf
Date:     2009-07-01 17:19:12 +0000 (Wed, 01 Jul 2009)

Log Message:
-----------
decompiler: updated tests to run with new Graph

Modified Paths:
--------------
    tools/branches/gsoc2009-decompiler/decompiler/Makefile
    tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h
    tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h

Modified: tools/branches/gsoc2009-decompiler/decompiler/Makefile
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/Makefile	2009-07-01 17:18:54 UTC (rev 42003)
+++ tools/branches/gsoc2009-decompiler/decompiler/Makefile	2009-07-01 17:19:12 UTC (rev 42004)
@@ -68,7 +68,7 @@
 
 test:
 	cxxtest/cxxtestgen.pl --error-printer --abort-on-fail --have-eh -o test_runner.cpp test/test_*.h
-	g++ -g $(DEFINES) $(INCLUDES)  -Icxxtest -o test_runner test_runner.cpp
+	g++ -g $(DEFINES) $(INCLUDES)  -Icxxtest -o test_runner test_runner.cpp graph.cpp misc.cpp
 	./test_runner
 
 

Modified: tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h	2009-07-01 17:18:54 UTC (rev 42003)
+++ tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h	2009-07-01 17:19:12 UTC (rev 42004)
@@ -2,95 +2,78 @@
 #define DATA_GRAPH_H
 
 #include <boost/foreach.hpp>
+#include <list>
 
+#include <graph.h>
+#include <instruction.h>
 
-Graph<int>::Node *findNode(Graph<int> *g, int data) {
-	BOOST_FOREACH (Graph<int>::Node *u, g->_nodes)
-		if (u->_data == data)
+
+unsigned addr(Block *block) {
+	return block->_instructions.front()->_addr;
+}
+
+Block *node(ControlFlowGraph *g, unsigned addr) {
+	BOOST_FOREACH (Block *u, g->_blocks)
+		if (u->_instructions.front()->_addr == addr)
 			return u;
 	return 0;
 }
 
-Graph<int> *makeGraph1() {
-	Graph<int> *g = new Graph<int>;
-	g->addNode(1);
-	g->addNode(2);
-	g->addNode(3);
-	g->addNode(4);
-	g->addNode(5);
-	g->addNode(6);
-	g->addEdge(findNode(g, 1), findNode(g, 2));
-	g->addEdge(findNode(g, 2), findNode(g, 3));
-	g->addEdge(findNode(g, 2), findNode(g, 5));
-	g->addEdge(findNode(g, 3), findNode(g, 4));
-	g->addEdge(findNode(g, 4), findNode(g, 2));
-	g->addEdge(findNode(g, 5), findNode(g, 1));
-	g->addEdge(findNode(g, 5), findNode(g, 6));
+ControlFlowGraph *makeGraph1() {
+	std::list<Instruction*> instructions;
+	instructions.push_back(new        Jump("nop",       1, +1));
+	instructions.push_back(new    CondJump("jumpif +3", 2, +3));
+	instructions.push_back(new        Jump("nop",       3, +1));
+	instructions.push_back(new        Jump("jump -2",   4, -2));
+	instructions.push_back(new    CondJump("jumpif -4", 5, -4));
+	instructions.push_back(new Instruction("ret",       6    ));
+	ControlFlowGraph *g = new ControlFlowGraph;
+	g->addBlocksFromScript(instructions.begin(), instructions.end());
+	g->setEntry(1);
 	return g;
 }
 
-Graph<int> *makeGraph2() {
-	Graph<int> *g = new Graph<int>;
-	g->addNode(15);
-	g->addNode(14);
-	g->addNode(13);
-	g->addNode(12);
-	g->addNode(11);
-	g->addNode(10);
-	g->addNode(9);
-	g->addNode(8);
-	g->addNode(7);
-	g->addNode(6);
-	g->addNode(5);
-	g->addNode(4);
-	g->addNode(3);
-	g->addNode(2);
-	g->addNode(1);
-	g->setEntry(findNode(g, 1));
-	g->addEdge(findNode(g, 1), findNode(g, 2));
-	g->addEdge(findNode(g, 1), findNode(g, 5));
-	g->addEdge(findNode(g, 2), findNode(g, 3));
-	g->addEdge(findNode(g, 2), findNode(g, 4));
-	g->addEdge(findNode(g, 3), findNode(g, 5));
-	g->addEdge(findNode(g, 4), findNode(g, 5));
-	g->addEdge(findNode(g, 5), findNode(g, 6));
-	g->addEdge(findNode(g, 6), findNode(g, 7));
-	g->addEdge(findNode(g, 6), findNode(g, 12));
-	g->addEdge(findNode(g, 7), findNode(g, 8));
-	g->addEdge(findNode(g, 7), findNode(g, 9));
-	g->addEdge(findNode(g, 8), findNode(g, 9));
-	g->addEdge(findNode(g, 8), findNode(g, 10));
-	g->addEdge(findNode(g, 9), findNode(g, 10));
-	g->addEdge(findNode(g, 10), findNode(g, 11));
-	g->addEdge(findNode(g, 12), findNode(g, 13));
-	g->addEdge(findNode(g, 13), findNode(g, 14));
-	g->addEdge(findNode(g, 14), findNode(g, 13));
-	g->addEdge(findNode(g, 14), findNode(g, 15));
-	g->addEdge(findNode(g, 15), findNode(g, 6));
+ControlFlowGraph *makeGraph2() {
+	std::list<Instruction*> instructions;
+	instructions.push_back(new    CondJump("jumpif +4",  1, +4));
+	instructions.push_back(new    CondJump("jumpif +2",  2, +2));
+	instructions.push_back(new        Jump("jump +2",    3, +2));
+	instructions.push_back(new        Jump("nop",        4, +1));
+	instructions.push_back(new        Jump("nop",        5, +1));
+	instructions.push_back(new    CondJump("jumpif +5",  6, +5));
+	instructions.push_back(new        Jump("nop",        7, +1));
+	instructions.push_back(new        Jump("nop",        8, +1));
+	instructions.push_back(new    CondJump("jumpif ",    9, -1));
+	instructions.push_back(new        Jump("-4",        10, -4));
+	instructions.push_back(new    CondJump("jumpif +2", 11, +2));
+	instructions.push_back(new        Jump("nop",       12, +1));
+	instructions.push_back(new        Jump("nop",       13, +1));
+	instructions.push_back(new Instruction("ret",       14    ));
+	ControlFlowGraph *g = new ControlFlowGraph;
+	g->addBlocksFromScript(instructions.begin(), instructions.end());
+	g->setEntry(1);
 	return g;
 }
 
-Graph<int> *makeGraph3() {
-	Graph<int> *g = new Graph<int>;
-	g->addNode(1);
-	g->addNode(2);
-	g->addNode(3);
-	g->addEdge(findNode(g, 1), findNode(g, 2));
-	g->addEdge(findNode(g, 1), findNode(g, 3));
-	g->addEdge(findNode(g, 2), findNode(g, 3));
-	g->addEdge(findNode(g, 3), findNode(g, 2));
+ControlFlowGraph *makeGraph3() {
+	std::list<Instruction*> instructions;
+	instructions.push_back(new    CondJump("jumpif +2", 1, +2));
+	instructions.push_back(new        Jump("nop",       2, +1));
+	instructions.push_back(new        Jump("jump -1",   3, -1));
+	ControlFlowGraph *g = new ControlFlowGraph;
+	g->addBlocksFromScript(instructions.begin(), instructions.end());
+	g->setEntry(1);
 	return g;
 }
 
-Graph<int> *makeGraph4() {
-	Graph<int> *g = new Graph<int>;
-	g->addNode(1);
-	g->addNode(2);
-	g->addNode(3);
-	g->addEdge(findNode(g, 1), findNode(g, 2));
-	g->addEdge(findNode(g, 2), findNode(g, 2));
-	g->addEdge(findNode(g, 2), findNode(g, 3));
-	g->addEdge(findNode(g, 3), findNode(g, 1));
+ControlFlowGraph *makeGraph4() {
+	std::list<Instruction*> instructions;
+	instructions.push_back(new        Jump("nop",       1, +1));
+	instructions.push_back(new    CondJump("jumpif +0", 2, +0));
+	instructions.push_back(new        Jump("jump -2",   3, -2));
+	ControlFlowGraph *g = new ControlFlowGraph;
+	g->addBlocksFromScript(instructions.begin(), instructions.end());
+	g->setEntry(1);
 	return g;
 }
 

Modified: tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h	2009-07-01 17:18:54 UTC (rev 42003)
+++ tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h	2009-07-01 17:19:12 UTC (rev 42004)
@@ -9,66 +9,78 @@
 #include <cxxtest/TestSuite.h>
 
 
-class GraphTestSuite : public CxxTest::TestSuite {
+class GraphInternalTestSuite : public CxxTest::TestSuite {
 
-	Graph<int> *g1, *g2, *g3, *g4;
+	ControlFlowGraph *ga, *gb, *gc, *gd;
 
 public:
 
 	void setUp() {
-		g1 = makeGraph1();
-		g2 = makeGraph2();
-		g3 = makeGraph3();
-		g4 = makeGraph4();
+		ga = makeGraph1();
+		gb = makeGraph2();
+		gc = makeGraph3();
+		gd = makeGraph4();
 	}
 
-	// this tests internal, intermediate results, not part of the api
+
 	void test_intervals() {
-		g1->intervals();
-		TS_ASSERT_EQUALS(findNode(g1, 1)->interval()->_data, findNode(g1, 1)->_data);
+		ga->intervals();
+		TS_ASSERT_EQUALS(addr(node(ga,1)->_interval), 1);
 		for (int i = 2; i <= 6; i++)
-			TS_ASSERT_EQUALS(findNode(g1, i)->interval()->_data, findNode(g1, 2)->_data);
-		g2->intervals();
+			TS_ASSERT_EQUALS(addr(node(ga,i)->_interval), 2);
+
+		gb->intervals();
 		for (int i = 1; i <= 5; i++)
-			TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 1)->_data);
-		for (int i = 6; i <= 12; i++)
-			TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 6)->_data);
-		for (int i = 13; i <= 15; i++)
-			TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 13)->_data);
-		g3->intervals();
-		TS_ASSERT_EQUALS(findNode(g3, 1)->interval()->_data, findNode(g3, 1)->_data);
-		TS_ASSERT_EQUALS(findNode(g3, 2)->interval()->_data, findNode(g3, 2)->_data);
-		TS_ASSERT_EQUALS(findNode(g3, 3)->interval()->_data, findNode(g3, 3)->_data);
-		g4->intervals();
-		TS_ASSERT_EQUALS(findNode(g4, 1)->interval()->_data, findNode(g4, 1)->_data);
-		TS_ASSERT_EQUALS(findNode(g4, 2)->interval()->_data, findNode(g4, 2)->_data);
-		TS_ASSERT_EQUALS(findNode(g4, 3)->interval()->_data, findNode(g4, 2)->_data);
+			TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 1);
+		TS_ASSERT_EQUALS(addr(node(gb,6)->_interval), 6);
+		TS_ASSERT_EQUALS(addr(node(gb,7)->_interval), 6);
+		TS_ASSERT_EQUALS(addr(node(gb,8)->_interval), 8);
+		TS_ASSERT_EQUALS(addr(node(gb,9)->_interval), 8);
+		TS_ASSERT_EQUALS(addr(node(gb,10)->_interval), 8);
+		TS_ASSERT_EQUALS(addr(node(gb,11)->_interval), 6);
+		TS_ASSERT_EQUALS(addr(node(gb,12)->_interval), 6);
+		TS_ASSERT_EQUALS(addr(node(gb,13)->_interval), 6);
+		TS_ASSERT_EQUALS(addr(node(gb,14)->_interval), 6);
+
+		gc->intervals();
+		TS_ASSERT_EQUALS(addr(node(gc,1)->_interval), 1);
+		TS_ASSERT_EQUALS(addr(node(gc,2)->_interval), 2);
+		TS_ASSERT_EQUALS(addr(node(gc,3)->_interval), 3);
+
+		gd->intervals();
+		TS_ASSERT_EQUALS(addr(node(gd,1)->_interval), 1);
+		TS_ASSERT_EQUALS(addr(node(gd,2)->_interval), 2);
+		TS_ASSERT_EQUALS(addr(node(gd,3)->_interval), 2);
 	}
 
+
 	void test_extendIntervals() {
-		g1->intervals();
-		g1->extendIntervals();
+		ga->intervals();
+		ga->extendIntervals();
 		for (int i = 1; i <= 6; i++)
-			TS_ASSERT_EQUALS(findNode(g1, i)->interval()->_data, findNode(g1, 1)->_data);
-		g2->intervals();
-		g2->extendIntervals();
+			TS_ASSERT_EQUALS(addr(node(ga,i)->_interval), 1);
+
+		gb->intervals();
+		gb->extendIntervals();
 		for (int i = 1; i <= 5; i++)
-			TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 1)->_data);
-		for (int i = 6; i <= 15; i++)
-			TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 6)->_data);
-		g2->extendIntervals();
-		for (int i = 1; i <= 15; i++)
-			TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 1)->_data);
-		g3->intervals();
-		g3->extendIntervals();
-		TS_ASSERT_EQUALS(findNode(g3, 1)->interval()->_data, findNode(g3, 1)->_data);
-		TS_ASSERT_EQUALS(findNode(g3, 2)->interval()->_data, findNode(g3, 2)->_data);
-		TS_ASSERT_EQUALS(findNode(g3, 3)->interval()->_data, findNode(g3, 3)->_data);
-		g4->intervals();
-		g4->extendIntervals();
-		TS_ASSERT_EQUALS(findNode(g4, 1)->interval()->_data, findNode(g4, 1)->_data);
-		TS_ASSERT_EQUALS(findNode(g4, 2)->interval()->_data, findNode(g4, 1)->_data);
-		TS_ASSERT_EQUALS(findNode(g4, 3)->interval()->_data, findNode(g4, 1)->_data);
+			TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 1);
+		for (int i = 6; i <= 14; i++)
+			TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 6);
+		gb->extendIntervals();
+		for (int i = 1; i <= 14; i++)
+			TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 1);
+
+		gc->intervals();
+		gc->extendIntervals();
+		TS_ASSERT_EQUALS(addr(node(gc,1)->_interval), 1);
+		TS_ASSERT_EQUALS(addr(node(gc,2)->_interval), 2);
+		TS_ASSERT_EQUALS(addr(node(gc,3)->_interval), 3);
+
+		gd->intervals();
+		gd->extendIntervals();
+		TS_ASSERT_EQUALS(addr(node(gd,1)->_interval), 1);
+		TS_ASSERT_EQUALS(addr(node(gd,2)->_interval), 1);
+		TS_ASSERT_EQUALS(addr(node(gd,3)->_interval), 1);
 	}
 };
 


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