Changeset 2934

Show
Ignore:
Timestamp:
07/23/08 15:22:27 (1 month ago)
Author:
gcroes
Message:

Identification de quelques bugs dans CopixPPO / CopixRPPO.
Mise en place des tests unitaires associés (reste a corriger)
Ajout d'une méthode "saveIn" dans les PPO

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/project/modules/stable/standard/copixtest/tests/copixtest_copixppotest.class.php

    r1730 r2934  
    113113        $this->assertEquals ($array['p3'], 'V3'); 
    114114    } 
     115     
     116    public function testRPPO (){ 
     117        $array = array ('p1'=>1, 'p2'=>2); 
     118        $array2 = array ('p1'=>1, 'p2'=>2); 
     119        $array['a1'] = $array2; 
     120         
     121        $ppo = _rPPO ($array); 
     122        $this->assertEquals ($array['p1'], $ppo->p1); 
     123        $this->assertEquals ($array['p1'], $ppo['p1']); 
     124        $this->assertEquals ($array['p2'], $ppo->p2); 
     125        $this->assertEquals ($array['p2'], $ppo['p2']); 
     126        $this->assertEquals ($array['a1']['p1'], $ppo->a1['p1']); 
     127        $this->assertEquals ($array['a1']['p1'], $ppo['a1']['p1']); 
     128 
     129        $this->assertEquals ($array['a1']['p1'], $ppo->a1->p1);      
     130    } 
     131     
     132    public function testSaveIn (){ 
     133        //Avec des objets 
     134        $class = new StdClass (); 
     135        $class->p1 = 1; 
     136        $class->p2 = 2; 
     137        $class2 = clone ($class); 
     138         
     139        $ppo = _ppo ($class); 
     140        $ppo->p2 = 4; 
     141        $ppo->p3 = 3; 
     142         
     143        $ppo->saveIn ($class, false); 
     144         
     145        $this->assertFalse (isset ($class->p3)); 
     146        $this->assertEquals ($class->p2, $ppo->p2); 
     147        $this->assertEquals (strtolower (get_class ($class)), 'stdclass'); 
     148         
     149        $ppo->saveIn ($class2); 
     150        $this->assertTrue (isset ($class2->p3)); 
     151        $this->assertEquals ($class2->p2, $ppo->p2); 
     152        $this->assertEquals ($class2->p3, $ppo->p3); 
     153        $this->assertEquals (strtolower (get_class ($class2)), 'stdclass'); 
     154         
     155        //Avec des tableaux      
     156        $array = array ('p1'=>1, 'p2'=>2); 
     157        $array2 = $array; 
     158 
     159        $ppo = _ppo ($array); 
     160        $ppo->p2 = 4; 
     161        $ppo->p3 = 3; 
     162 
     163        $ppo->saveIn ($array, false); 
     164        $this->assertTrue (is_array ($array)); 
     165        $this->assertFalse (isset ($array['p3'])); 
     166        $this->assertEquals ($array['p2'], $ppo->p2); 
     167         
     168        $ppo->saveIn ($array2); 
     169        $this->assertTrue (is_array ($array2)); 
     170        $this->assertTrue (isset ($array2['p3'])); 
     171        $this->assertEquals ($array2['p2'], $ppo->p2); 
     172        $this->assertEquals ($array2['p3'], $ppo->p3); 
     173    } 
     174     
     175    public function _testSaveInNestedLevels (){ 
     176        //Avec des objets 
     177        $class = new StdClass (); 
     178        $class->p1 = 1; 
     179        $class->p2 = 2; 
     180        $class2 = clone ($class); 
     181        $class->c1 = $class2; 
     182         
     183        $ppo = _rPPO (); 
     184        $ppo->p1 = 1; 
     185        $ppo->p2 = 22; 
     186        $ppo->p3 = 3; 
     187        $ppo->c1->p1 = 11; 
     188        $ppo->c1->p2 = 2; 
     189        $ppo->c1->p3 = 33; 
     190 
     191        $ppo->saveIn ($class, false); 
     192        $this->assertFalse (isset ($class->p3)); 
     193        $this->assertEquals ($class->p1, $ppo->p1); 
     194        $this->assertEquals ($class->p2, $ppo->p2); 
     195        $this->assertEquals (strtolower (get_class ($class)), 'stdclass'); 
     196        $this->assertEquals (strtolower (get_class ($class->c1)), 'stdclass'); 
     197        $this->assertEquals ($class->c1->p1, 11); 
     198        $this->assertEquals ($class->c1->p2, 2); 
     199        $this->assertFalse (isset ($class->c1->p3)); 
     200 
     201        $ppo->saveIn ($class); 
     202        $this->assertTrue (isset ($class->p3)); 
     203        $this->assertEquals ($class->p3, 3); 
     204        $this->assertEquals ($class->p1, $ppo->p1); 
     205        $this->assertEquals ($class->p2, $ppo->p2); 
     206        $this->assertEquals (strtolower (get_class ($class)), 'stdclass'); 
     207        $this->assertEquals (strtolower (get_class ($class->c1)), 'stdclass'); 
     208        $this->assertEquals ($class->c1->p1, 11); 
     209        $this->assertEquals ($class->c1->p2, 2); 
     210        $this->assertTrue (isset ($class->c1->p3)); 
     211        $this->assertEquals ($class->c1->p3, 33); 
     212         
     213        //Avec des tableaux      
     214        $array = array ('p1'=>1, 'p2'=>2); 
     215        $array2 = array ('p1'=>1, 'p2'=>2); 
     216        $array['a1'] = $array2; 
     217 
     218        $ppo = _rPPO ($array); 
     219        $ppo['p1']= 1; 
     220        $ppo['p2'] = 2; 
     221        $ppo['p3'] = 3; 
     222        $ppo['a1']['p1'] = 11; 
     223        $ppo['a1']['p2'] = 22; 
     224        $ppo['a1']['p3'] = 33; 
     225                 
     226        $ppo->saveIn ($class, false); 
     227        $this->assertFalse (isset ($array['p3'])); 
     228        $this->assertEquals ($array['p1'], 1); 
     229        $this->assertEquals ($array['p2'], 2); 
     230        $this->assertTrue (is_array ($array)); 
     231        $this->assertTrue (is_array ($array['a1'])); 
     232        $this->assertEquals ($array['a1']['p1'], 11); 
     233        $this->assertEquals ($array['a1']['p2'], 22); 
     234        $this->assertFalse (isset ($array['a1']['p3'])); 
     235 
     236        $ppo->saveIn ($class); 
     237        $this->assertFalse (isset ($array['p3'])); 
     238        $this->assertEquals ($array['p1'], $ppo->p1); 
     239        $this->assertEquals ($array['p2'], $ppo->p2); 
     240        $this->assertEquals ($array['p3'], $ppo->p3); 
     241        $this->assertEquals (is_array ($array)); 
     242        $this->assertEquals (is_array ($array['a1'])); 
     243        $this->assertEquals ($array['a1']['p1'], 11); 
     244        $this->assertEquals ($array['a1']['p2'], 22); 
     245        $this->assertTrue (isset ($array['a1']['p3'])); 
     246        $this->assertEquals ($array['a1']['p3'], 33);        
     247    } 
    115248} 
    116249?> 
  • trunk/utils/copix/core/CopixPPO.class.php

    r2925 r2934  
    136136        return $this; 
    137137    } 
     138     
     139    /** 
     140     * Applique toutes les propriétés de l'objet PPO dans les propriétés de l'objet cible 
     141     *  
     142     */ 
     143    public function saveIn (& $pDest, $pCreateNew = true){ 
     144        //détermine le "type" de l'objet 
     145        if (! ($array = is_array ($pDest))){ 
     146            if (! ($object = is_object ($pDest))){ 
     147                $natural = true; 
     148            } 
     149        } 
     150        $elementVars = array (); 
     151        if ($array || $object){ 
     152            $elementVars = array_keys ($this->_getElementVars ($pDest)); 
     153        } 
     154 
     155        //on parcours chacune des propriétés de l'élément 
     156        foreach (get_object_vars ($this) as $name=>$element){ 
     157            //on regarde si la propriété existe dans la destination 
     158            if (($inArray = in_array ($name, $elementVars)) 
     159                || $pCreateNew){ 
     160                if ($inArray && (is_object ($element) || is_array ($element))){ 
     161                    //la propriété existait déja et c'est un tableau ou un objet,  
     162                    //on reparcours le tout pour y appliquer les changements 
     163                    if ($array){ 
     164                        _ppo ($element)->saveIn ($pDest[$name], $pCreateNew); 
     165                    }else{ 
     166                        _ppo ($element)->saveIn ($pDest->$name, $pCreateNew); 
     167                    } 
     168                    //NOTE : il n'est pas possible d'avoir recours a l'opérateur 
     169                    //  ternaire pour les passages par référence 
     170                }else{ 
     171                    //la propriété n'existait pas => il faut la créer a l'identique 
     172                    //ou la propriété existait sous sa forme naturelle et il faut la remplacer 
     173                    if ($array){ 
     174                        $pDest[$name] = $element; 
     175                    }else{ 
     176                        $pDest->$name = $element; 
     177                    } 
     178                } 
     179            } 
     180        } 
     181    } 
     182     
     183    /** 
     184     * Récupération des clefs/valeur d'un tableau ou des propriétés/valeurs d'un objet 
     185     *  
     186     * @param  array/object $pElement l'élément dont on souhaite connaitre les clefs / valeurs 
     187     * @return array 
     188     */ 
     189    protected function _getElementVars ($pElement){ 
     190        return is_array ($pElement) ? $pElement : get_object_vars ($pElement); 
     191    } 
    138192} 
    139193