aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-09-01 13:35:40 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-09 19:10:09 -0300
commit2d170a0b8b1519befc4cdad57a0a46ccf8d16e0a (patch)
treebd7b63fd5bc1385412f4dea1f3a10cd5a17f599a /tests
parent869b35c10ef573771532c6f2cb017dbfab315e61 (diff)
Fixed function modification propagation.
Now all modifications on base function will be propagate until a new modification was found. Reviewer: Hugo Parente Lima <hugo.pl@gmail.com> Lauro Moura <lauro.neto@openbossa.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/testmodifyfunction.cpp86
-rw-r--r--tests/testmodifyfunction.h1
2 files changed, 87 insertions, 0 deletions
diff --git a/tests/testmodifyfunction.cpp b/tests/testmodifyfunction.cpp
index 95ba16f40..3f92e3e13 100644
--- a/tests/testmodifyfunction.cpp
+++ b/tests/testmodifyfunction.cpp
@@ -79,6 +79,92 @@ void TestModifyFunction::testOwnershipTransfer()
QCOMPARE(func->ownership(func->ownerClass(), TypeSystem::TargetLangCode, 0), TypeSystem::CppOwnership);
}
+
+void TestModifyFunction::invalidateAfterUse()
+{
+ const char* cppCode ="\
+ struct A {\
+ virtual void call(int *a);\
+ };\
+ struct B : A {\
+ };\
+ struct C : B {\
+ virtual void call2(int *a);\
+ };\
+ struct D : C {\
+ virtual void call2(int *a);\
+ };\
+ struct E : D {\
+ };\
+ ";
+ const char* xmlCode = "\
+ <typesystem package='Foo'> \
+ <primitive-type name='int'/>\
+ <object-type name='A'> \
+ <modify-function signature='call(int*)'>\
+ <modify-argument index='1' invalidate-after-use='true'/>\
+ </modify-function>\
+ </object-type>\
+ <object-type name='B' /> \
+ <object-type name='C'> \
+ <modify-function signature='call2(int*)'>\
+ <modify-argument index='1' invalidate-after-use='true'/>\
+ </modify-function>\
+ </object-type>\
+ <object-type name='D'> \
+ <modify-function signature='call2(int*)'>\
+ <modify-argument index='1' invalidate-after-use='true'/>\
+ </modify-function>\
+ </object-type>\
+ <object-type name='E' /> \
+ </typesystem>";
+ TestUtil t(cppCode, xmlCode, false, 0.1);
+ AbstractMetaClassList classes = t.builder()->classes();
+ AbstractMetaClass* classB = classes.findClass("B");
+ const AbstractMetaFunction* func = classB->findFunction("call");
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+
+ AbstractMetaClass* classC = classes.findClass("C");
+ QVERIFY(classC);
+ func = classC->findFunction("call");
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+
+ func = classC->findFunction("call2");
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+
+ AbstractMetaClass* classD = classes.findClass("D");
+ QVERIFY(classD);
+ func = classD->findFunction("call");
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+
+ func = classD->findFunction("call2");
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+
+ AbstractMetaClass* classE = classes.findClass("E");
+ QVERIFY(classE);
+ func = classE->findFunction("call");
+ QVERIFY(func);
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+
+ func = classE->findFunction("call2");
+ QVERIFY(func);
+ QCOMPARE(func->modifications().size(), 1);
+ QCOMPARE(func->modifications().at(0).argument_mods.size(), 1);
+ QVERIFY(func->modifications().at(0).argument_mods.at(0).resetAfterUse);
+}
+
void TestModifyFunction::testWithApiVersion()
{
const char* cppCode ="\
diff --git a/tests/testmodifyfunction.h b/tests/testmodifyfunction.h
index 40adf127f..95b7b6a7f 100644
--- a/tests/testmodifyfunction.h
+++ b/tests/testmodifyfunction.h
@@ -33,6 +33,7 @@ class TestModifyFunction : public QObject
void testOwnershipTransfer();
void testWithApiVersion();
void testRenameArgument();
+ void invalidateAfterUse();
};
#endif