function testProperties()
    {
        $dao = '<?xml version="1.0"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
  <datasources>
    <primarytable name="news" primarykey="news_id" />
    <foreigntable name="news_author" primarykey="author_id" onforeignkey="author_id" />
  </datasources>
</dao>';
        $parser = new testjDaoParser($this->_selector);
        $parser->testParseDatasource(simplexml_load_string($dao));
        foreach ($this->propDatas as $k => $t) {
            //$this->sendMessage("test good property ".$k);
            $xml = simplexml_load_string($t[0]);
            try {
                $p = new jDaoProperty($xml, $parser, $this->_tools);
                $this->assertComplexIdenticalStr($p, $t[1], "test {$k}");
            } catch (jDaoXmlException $e) {
                $this->fail("Exception sur le contenu xml inattendue : " . $e->getMessage() . ' (' . $e->getLocaleKey() . ')');
            } catch (Exception $e) {
                $this->fail("Exception inconnue : " . $e->getMessage());
            }
        }
    }
    function testBadMethods()
    {
        $dao = '<?xml version="1.0"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
  <datasources>
    <primarytable name="news" primarykey="news_id" />
    <foreigntable name="news_author" primarykey="author_id" onforeignkey="author_id" />
  </datasources>
  <record>
    <property name="id" fieldname="news_id" datatype="autoincrement" />
    <property name="subject" datatype="string" />
    <property name="texte" datatype="string" />
    <property name="publishdate" datatype="date" />
    <property name="author_firstname" fieldname="firstname" datatype="string" table="news_author" />
    <property name="author_lastname" fieldname="lastname"  datatype="string" table="news_author" />
  </record>
</dao>';
        $parser = new testjDaoParser($this->_selector);
        $doc = simplexml_load_string($dao);
        $parser->testParseDatasource($doc);
        $parser->testParseRecord($doc, new mysqlDbTools(null));
        foreach ($this->badmethDatas as $k => $t) {
            //$this->sendMessage("test bad method ".$k);
            $xml = simplexml_load_string($t[0]);
            try {
                $p = new jDaoMethod($xml, $parser);
                $this->fail("Pas d'exception survenue !");
            } catch (jDaoXmlException $e) {
                $this->assertEqual($e->getLocaleKey(), $t[1]);
                $this->assertEqual($e->getLocaleParameters(), $t[2]);
            } catch (Exception $e) {
                $this->fail("Exception inconnue : " . $e->getMessage());
            }
        }
    }
    function testBadUpdateMethods2()
    {
        $dao = '<?xml version="1.0"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
  <datasources>
    <primarytable name="news" primarykey="news_id,foo_id" />
  </datasources>
  <record>
    <property name="id" fieldname="news_id" datatype="autoincrement" />
    <property name="id2" fieldname="foo_id" datatype="integer" />
  </record>
</dao>';
        $parser = new testjDaoParser($this->_selector);
        $xml = simplexml_load_string($dao);
        $tools = new mysqlDbTools(null);
        $parser->testParseDatasource($xml);
        $parser->testParseRecord($xml, $tools);
        //$this->sendMessage("test bad update method ");
        $xml = simplexml_load_string('<?xml version="1.0"?>
          <method name="tryupdate" type="update">
            <parameter name="something" />
            <values>
                <value property="foo_id" expr="$something" />
            </values>
          </method>');
        try {
            $p = new jDaoMethod($xml, $parser);
            $this->fail("Pas d'exception survenue !");
        } catch (jDaoXmlException $e) {
            $this->assertEqual($e->getLocaleKey(), 'jelix~daoxml.method.update.forbidden');
            $this->assertEqual($e->getLocaleParameters(), array('foo~bar', '', 'tryupdate'));
        } catch (Exception $e) {
            $this->fail("Exception inconnue : " . $e->getMessage());
        }
    }