#include <QDebug>
#include <DPtr>
+#include <QStringList>
namespace ELAM {
return d->cclass;
}
+bool Engine::valueExists ( QMap< QString, QVariant > list, QString name )const
+{
+ //simple:
+ if(list.contains(name))return true;
+ //parse for dots
+ QChar dot=d->cclass.dotChar();
+ if(dot.isNull())return false;
+ QStringList nlist=name.split(dot);
+ //split and explore
+ QString n1=nlist.takeFirst();
+ if(!list.contains(n1))return false;
+ QVariant cur=list[n1];
+ while(nlist.size()>0){
+ if(!cur.canConvert<QObject*>())return false;
+ QByteArray n=nlist.takeFirst().toLatin1();
+ QObject*o=cur.value<QObject*>();
+ if(!o)return false;
+ if(!o->dynamicPropertyNames().contains(n)&&o->metaObject()->indexOfProperty(n.data())<0)
+ return false;
+ cur=o->property(n.constData());
+ }
+ return cur.isValid();
+}
+
+QVariant Engine::findValue ( QMap< QString, QVariant > list, QString name )const
+{
+ if(list.contains(name))return list[name];
+ //parse for dots
+ QChar dot=d->cclass.dotChar();
+ if(dot.isNull())return QVariant();
+ QStringList nlist=name.split(dot);
+ //split and explore
+ QString n1=nlist.takeFirst();
+ if(!list.contains(n1))return QVariant();
+ QVariant cur=list[n1];
+ while(nlist.size()>0){
+ if(!cur.canConvert<QObject*>())return QVariant();
+ QByteArray n=nlist.takeFirst().toLatin1();
+ QObject*o=cur.value<QObject*>();
+ if(!o)return QVariant();
+ if(!o->dynamicPropertyNames().contains(n)&&o->metaObject()->indexOfProperty(n.data())<0)
+ return QVariant();
+ cur=o->property(n.constData());
+ }
+ return cur;
+}
+
QVariant Engine::getConstant(QString n) const
{
- if(d->consts.contains(n))return d->consts[n];
- return QVariant();
+ return findValue(d->consts,n);
}
QVariant Engine::getVariable(QString n) const
{
- if(d->vars.contains(n))return d->vars[n];
- return QVariant();
+ return findValue(d->vars,n);
}
QVariant Engine::getValue(QString n) const
bool Engine::hasConstant(QString n) const
{
- return d->consts.contains(n);
+ return valueExists(d->consts,n);
}
bool Engine::hasVariable(QString n) const
{
- return d->vars.contains(n);
+ return valueExists(d->vars,n);
}
bool Engine::hasValue(QString n) const
}
+void ElamTest::dottest()
+{
+ StringEngine ie;
+ ie.characterClasses().setDotChar('.');
+ QObject obj;
+ obj.setObjectName("hello");
+ obj.setProperty("dynamic","juhoo");
+ ie.setVariable("b",QVariant::fromValue(&obj));
+ QVERIFY(ie.hasVariable("b.objectName"));
+ QCOMPARE(ie.getVariable("b.objectName"),QVariant("hello"));
+ QVERIFY(ie.hasVariable("b.dynamic"));
+ QCOMPARE(ie.getVariable("b.dynamic"),QVariant("juhoo"));
+ QString exs="a=b.objectName+' world '+b.dynamic";
+ Expression ex=ie.expression(exs);
+// qDebug()<<"expression:\n"<<ex;
+ QVariant v=ie.evaluate(ex);
+ QCOMPARE(v,QVariant("hello world juhoo"));
+ QCOMPARE(ie.getVariable("a"),QVariant("hello world juhoo"));
+}
+
static QVariant mycount(const QList<QVariant>&args,Engine&)
{
return (qlonglong)args.size();
}
-QTEST_MAIN(ElamTest)
\ No newline at end of file
+QTEST_MAIN(ElamTest)